Fatiga de alertas: 82 correos en un día de mi monitor de seguridad

¿Cuántas alertas debería enviar un monitor de seguridad que lee una sola persona? Según mis números, alrededor de un correo al día, más el raro que me pide hacer algo. El 1 de noviembre mi monitor pasó 74 correos al servicio de correo entre la medianoche y las 13:32, hora del Pacífico: 55 por bloqueos que ya había hecho, 16 alertas críticas, dos alertas horarias de volumen y una del escáner de mi Mac.12 Mi lectura aquella tarde fue que todos describían escaneos rutinarios que el borde ya había detenido;3 en el caso de las avalanchas críticas, la sección 6 muestra que esa lectura fue demasiado generosa. La solución fue una política, no un umbral: un resumen diario que hace también de latido (heartbeat), los bloqueos al chat en lugar del correo, una alerta crítica incorporada al resumen cuando el borde ya se encargó de ella y el desenlace escrito en cada alerta crítica de la nube. Al día siguiente, un escáner disparó cuatro alertas críticas en menos de seis minutos en mis sitios, y mi monitor no envió ni un correo por ello.4 Ese día aún produjo 19 correos, no uno, y el motivo es la parte más útil de la historia.5

Soy el único lector del correo de mi monitor. Cuando la bandeja de entrada marcó 74, me pregunté si aquello era rutina o algo real, y la respuesta honesta fue que el monitor no podía decírmelo con los asuntos, porque todos decían lo mismo a distinto volumen.1 Un monitor al que su único lector deja de leer ha dejado de monitorear, por mucho que sus detectores sigan detectando. Lo que sigue es el conteo, la política que lo reemplazó, un caso de prueba y los tres puntos donde la versión limpia de la historia se rompe.

TL;DR

  • 74 correos a las 13:32, 82 a la medianoche. Mi propia tabla y el conteo derivado de los logs coinciden en 74 antes de que me quejara (55 por bloqueo, 16 críticos, dos horarios, uno local); el 1 de noviembre completo sumó 81 registrados más un resumen que envié a mano.125
  • 22 de los 74 no están probados. Salieron de código que registraba «sent» (enviado) sin revisar la respuesta del servicio de correo, así que el log prueba que se intentó un traspaso, no que llegara un mensaje.26
  • La literatura ya tenía la regla. El libro de SRE de Google admite tres salidas (alertas, tickets y registro), dice «Every page should be actionable» (toda página debe ser accionable) y llama a las alertas por correo «alert spam»; la alerta de The Joint Commission (el organismo estadounidense que acredita hospitales) cita una estimación según la cual «between 85 and 99 percent of alarm signals do not require clinical intervention» (entre el 85 y el 99 por ciento de las señales de alarma no requieren intervención clínica).78910
  • El caso de prueba funcionó. El 2 de noviembre, una dirección de un proveedor de hosting neerlandés levantó cuatro alertas críticas en 5 minutos y 51 segundos en mis sitios; el monitor la bloqueó una vez, publicó el bloqueo en el chat, incorporó cada crítica al resumen y no envió ningún correo.41112
  • El día siguiente aún envió 19, no uno. Catorce eran alertas críticas de avalancha de WAF en las que algunos eventos no tenían bloqueo ni desafío registrado, y sus asuntos decían «WAF blocks» (bloqueos de WAF) aunque el borde no hubiera bloqueado ninguno de los eventos (dos veces ese día; la noche anterior, uno dijo «104 WAF blocks» cuando el borde no había bloqueado ni desafiado nada); mi primera reformulación, el mismo día en que se hizo el conteo, todavía mezclaba dos conteos en una línea, y la revisión de este post lo detectó.51314
  • Dos señales estaban equivocadas. Una verificación de firma de código en mi Mac llamó minero de criptomonedas sin firmar al propio daemon de Spotlight de Apple, y el «RUNS SHORT 162/207» (faltan ejecuciones) del resumen resultó ser en parte sueño de la Mac, en parte una cadencia real más lenta y en parte, por los tiempos, tres ejecuciones terminadas por el watchdog.151617
  • Qué cambió: un resumen al día lleva el latido, cada bloqueo y el desenlace de cada alerta crítica de la nube, mientras que solo una crítica que no cubre ninguna de las dos incorporaciones, la alerta horaria de volumen y el escáner local siguen enviando correo de inmediato; los 82 correos del 1 de noviembre pasaron a 19 el 2 de noviembre.185

1. La bandeja de entrada el 1 de noviembre

A las 13:32, hora del Pacífico, del 1 de noviembre le escribí a la sesión de agente que opera mi infraestructura: los correos del monitor estaban llenando de spam mi bandeja; ¿había algo que cambiar?, ¿eran cosas rutinarias o amenazas reales?1 La tabla que llevé aquella tarde contaba 74 correos desde la medianoche, por remitente: 55 avisos de uno por bloqueo, 16 alertas críticas, dos alertas horarias de volumen y una crítica del escáner de mi Mac.1

El conteo descansa en una regla, así que la dejo aquí antes de los números. Un correo, para este post, es una línea en el log del monitor que registra un traspaso al servicio de correo. Un script recorrió los seis archivos de log del 31 de octubre al 2 de noviembre y clasificó cada una de esas líneas por flujo y por resultado.5 Cortado a las 13:32, el script coincide con mi tabla flujo por flujo: 55, 16, dos y uno, en total 74.2 El día local completo, hasta la medianoche, sumó 81 correos registrados (55 por bloqueo, 22 críticos, tres horarios, uno local), más un resumen que envié a mano a las 13:48, que no tiene línea de envío en el log del monitor, para un total de 82.51

Dentro de esa coincidencia importan dos detalles. Mi tabla decía «9 before the fold went live at 00:30 PT; the 7 after» (9 antes de que la incorporación entrara en vigor a las 00:30 PT; los 7 después) para las críticas; el log tiene 11 líneas críticas de «sent» antes de las 00:30 y cinco después, y la primera crítica incorporada a un aviso de bloqueo aparece a las 00:54:43, después de que el cambio de la incorporación llegara a las 00:46 PDT, no a las 00:30 que nombraba mi tabla.218 Los totales coinciden; el reparto que anoté a mano se equivocaba por dos. El segundo detalle es mayor. De los 74, 22 (10 por bloqueo, 11 críticos, uno horario) vinieron de remitentes que desechaban la respuesta del servicio de correo y después registraban «sent» sin importar lo que hubiera vuelto.26 Una corrección a las 01:04 PDT de esa mañana, antes de que se atrasaran los relojes, hizo que los remitentes de la mitad en la nube registraran el estado HTTP del servicio y dijeran «sent» solo ante un 2xx; el remitente del escáner local escribe una línea escueta «Critical email sent» (correo crítico enviado), y solo cuando la solicitud no lanzó ningún error.6 Las 22 líneas anteriores prueban que el monitor lo intentó; no prueban que el servicio de correo aceptara nada. Mi log del 31 de octubre juzgaba que los correos de la nube «most likely were» (muy probablemente fueron) entregados, lo cual es una suposición razonable y sigue siendo una suposición.19

Incluso un 2xx prueba menos de lo que sugiere la palabra «sent». La documentación de Resend define su evento email.sent como «Occurs whenever the API request was successful. Resend will attempt to deliver the message to the recipient’s mail server» (ocurre cuando la solicitud a la API tuvo éxito; Resend intentará entregar el mensaje al servidor de correo del destinatario), y enumera la entrega como un evento aparte y posterior.20 La propia llamada de envío responde con un id.21 Cada conteo que sigue es un conteo de traspasos que el servicio de correo aceptó o, para los 22 del 1 de noviembre y los 10 del 31 de octubre, 32 en total, de traspasos que el monitor intentó.5 Ninguno es un conteo de mensajes que yo haya leído.

Por horas, el día parece un acantilado seguido de una meseta.

Gráfico de barras del 1 de noviembre por hora local, con la hora de la 01:00 mostrada dos veces por el fin del horario de verano. Las barras azules son correos enviados: 22 en la hora de la medianoche, luego 8, 5, 5, 4, 2, 4, 3, 4, 4, 3, 3, 3, 3 y 1 hasta la hora de las 13:00. Una línea discontinua a las 13:50 marca el cambio a un correo al día; después, las barras azules marcan 1, 0, 2, 0, 1, 1, 1, 0, 1 y 0. Las barras grises son alertas incorporadas al resumen o suprimidas en lugar de enviadas por correo: entre 1 y 8 por hora antes del cambio y entre 3 y 23 por hora después.

1 de noviembre, hora local: correos por hora frente a alertas que no se convirtieron en correo, con el cambio de política de las 13:50 marcado.22

La primera hora llevó 22 correos, todos del código sin verificar (10 por bloqueo, 11 críticos, uno horario).22 A partir de ahí, los avisos por bloqueo corrieron a razón de uno a cinco por hora, porque el borde seguía bloqueando escáneres y cada bloqueo me escribía una carta. El último correo por bloqueo salió a las 13:25:57; el primer aviso por bloqueo incorporado al resumen aparece a las 14:20:35.22 Después del cambio de las 13:50, los correos bajan a entre cero y dos por hora, mientras las alertas incorporadas y suprimidas suben hasta 23 por hora.22 El tráfico no bajó. Los correos sí.

El día anterior es una mala línea base. Mi log del 1 de noviembre dice «Yesterday had 10» (ayer hubo 10), y el script coincide, pero el log del 31 de octubre empieza a las 22:31, la noche en que volví a armar el monitor, así que esos 10 correos cubren 89 minutos.15 Según mi lectura, los 74 midieron al detector trabajando durante un día completo de ruido de fondo de internet, no un cambio en lo que hacían los escáneres.

2. Para qué servían las alertas

El monitor tiene dos mitades. La mitad en la nube está programada para ejecutarse en mi Mac cada cinco minutos y le pide a Cloudflare los eventos de firewall y los conteos agrupados de solicitudes de cada una de mis zonas: qué direcciones tocaron qué rutas, con qué frecuencia y qué acción tomó el borde en cada evento.1823 La propia descripción que hace Cloudflare de esos datos es el marco correcto: «Security Events displays information about requests actioned or flagged by Cloudflare security products, including features such as Browser Integrity Check» (Security Events muestra información sobre solicitudes sobre las que actuaron o que marcaron los productos de seguridad de Cloudflare, incluidas funciones como Browser Integrity Check).24 La mitad local es un escáner que revisa la propia Mac por niveles cada 10 minutos: los procesos y sus firmas de código, los hooks de agente de la máquina, las herramientas que suplantan binarios del sistema en su ruta, y cosas por el estilo.12

Lo que la mitad en la nube hace con los datos es fácil de explicar. Levanta hallazgos por severidad (crítica, alta, media) y por categoría, y ante una crítica intenta actuar antes de avisar a nadie: cuando una sola dirección está detrás de suficientes eventos, la agrega durante siete días a una lista de bloqueo de toda la cuenta que cada zona aplica en el borde.124 Hasta los cambios del 1 de noviembre, cada una de esas acciones producía además un correo, y también lo producían cada crítica que un límite de dos horas por sitio y categoría no suprimía, el final de cada sesión y cada hora con muchos bloqueos.185 El escáner local levanta sus propios hallazgos y envía él mismo por correo sus críticas.25 Las Alerts de Cloudflare vienen en dos tipos, «Monitors that you define yourself, and Platform Notifications» (monitores que defines tú mismo y notificaciones de la plataforma): consultas programadas a la SQL API y alertas de producto preconfiguradas, ambas configuradas en su panel.26 El mío no es ninguna de las dos: es un script en mi Mac que lee él mismo los eventos de firewall, lo que también significa que el ruido me toca arreglarlo a mí.

3. Lo que la literatura ya decía

Nada de lo que sigue es nuevo, y esa es la parte incómoda. Había leído casi todo y aun así construí el monitor de un correo por evento.

Tres salidas, y el correo no es una de ellas. La introducción de Site Reliability Engineering (el libro de Google sobre ingeniería de confiabilidad de sitios) dice «There are three kinds of valid monitoring output» (hay tres tipos de salida de monitoreo válidos): las alertas, que «Signify that a human needs to take action immediately» (indican que una persona debe actuar de inmediato); los tickets, que «Signify that a human needs to take action, but not immediately.» (indican que una persona debe actuar, pero no de inmediato); y el registro, donde «No one needs to look at this information, but it is recorded for diagnostic or forensic purposes.» (nadie necesita mirar esta información, pero se registra con fines de diagnóstico o forenses).7 La misma página es tajante con el diseño que yo tenía: «a system that requires a human to read an email and decide whether or not some type of action needs to be taken in response is fundamentally flawed» (un sistema que exige que una persona lea un correo y decida si hace falta alguna acción en respuesta tiene un defecto de fondo).7 Ordenados así, mis 55 correos por bloqueo eran registro entregado como alertas. El borde ya había actuado; a una persona no le quedaba nada por hacer.

Toda página debe ser accionable. El capítulo de Rob Ewaschuk sobre monitoreo en el mismo libro define una alerta como «A notification intended to be read by a human and that is pushed to a system such as a bug or ticket queue, an email alias, or a pager» (una notificación pensada para que la lea una persona y que se empuja a un sistema como una cola de bugs o tickets, un alias de correo o un buscapersonas), y su nota al pie sobre las de correo dice «Sometimes known as “alert spam,” as they are rarely read or acted on.» (a veces llamadas «alert spam», porque rara vez se leen o se atienden).9 Las reglas del capítulo para las páginas caben en tres líneas: «Every page should be actionable.» (toda página debe ser accionable) «I can only react with a sense of urgency a few times a day before I become fatigued.» (solo puedo reaccionar con urgencia unas pocas veces al día antes de agotarme) «If a page merely merits a robotic response, it shouldn’t be a page.» (si una página solo merece una respuesta robótica, no debería ser una página).8 Mi respuesta robótica a un correo por bloqueo era borrarlo. El capítulo también nombra el costo del ruido: «When pages occur too frequently, employees second-guess, skim, or even ignore incoming alerts, sometimes even ignoring a “real” page that’s masked by the noise.» (cuando las páginas llegan con demasiada frecuencia, la gente duda, lee en diagonal o incluso ignora las alertas, a veces hasta una página «real» enmascarada por el ruido).27 Y describe un equipo que «spent significant amounts of time triaging the alerts to find the few that were really actionable» (dedicó mucho tiempo a clasificar las alertas para encontrar las pocas realmente accionables), lo cual describe bastante bien mi tarde del 1 de noviembre.28

Síntomas antes que causas, y una prueba para una página. El ensayo anterior de Ewaschuk, que según él sentó las bases de ese capítulo, comprime la prueba en una frase: «Pages should be urgent, important, actionable, and real.» (las páginas deben ser urgentes, importantes, accionables y reales).29 Sobre las causas dice «Include cause-based information in symptom-based pages or on dashboards, but avoid alerting directly on causes» (incluye información sobre causas en páginas basadas en síntomas o en paneles, pero evita alertar directamente sobre causas), bajo una sección titulada «Cause-based alerts are bad (but sometimes necessary)» (las alertas basadas en causas son malas, aunque a veces necesarias).29 Leo un bloqueo del firewall como un hecho a nivel de causa: un escáner tocó una regla. El síntoma que me importa es una ruta sensible servida o un sitio caído, y según mi lectura ninguno de los 74 informó de ninguna de las dos cosas; las solicitudes a rutas de sondeo de ese día no mostraron ningún 2xx en una ruta sensible.3 El ensayo también anticipa el resumen: «A daily (or more frequent) report can work too» (un informe diario, o más frecuente, también puede funcionar), con la advertencia de que «without a system of accountability this amounts to less-spammy email alerts» (sin un sistema de rendición de cuentas, esto equivale a alertas por correo un poco menos molestas).30 Su remedio es una persona: «make sure the oncall person (or someone else) is designated to triage these every day» (asegúrate de que la persona de guardia, u otra, esté designada para clasificarlos cada día).30 En un monitor de una sola persona, esa persona solo puedo ser yo. El campo de desenlace de la sección 4 es un mecanismo de apoyo mío, no suyo: le da a la clasificación diaria algo que revisar, qué fue de cada crítica, pero no hace la clasificación.

Precisión y exhaustividad. El capítulo sobre alertas de The Site Reliability Workbook (el libro de ejercicios que acompaña al de SRE) da el vocabulario para lo que salió mal. La precisión es «The proportion of events detected that were significant.» (la proporción de eventos detectados que fueron significativos). La exhaustividad es «The proportion of significant events detected.» (la proporción de eventos significativos que se detectaron).31 No medí la exhaustividad de mi monitor, que requiere contar los eventos significativos que se le escaparon, y la sección 5 describe uno que se le escapó. Como flujo de correo, su precisión era casi nula: 74 correos y, según mi lectura, ningún mensaje entre ellos me pedía hacer nada. El mismo capítulo nombra el tiempo de reinicio, «How long alerts fire after an issue is resolved. Long reset times can lead to confusion or to issues being ignored.» (cuánto siguen disparándose las alertas después de resolver un problema; los tiempos largos pueden causar confusión o que se ignoren los problemas).31 El tiempo de reinicio se define para alertas que siguen disparándose; un correo por bloqueo se dispara una vez y después no trae ninguna actualización de resolución: nunca dice que el escáner se fue.

La versión hospitalaria del mismo fallo. El propio capítulo de SRE apunta fuera del software, a la gestión de alarmas cardíacas, «for an example of alert fatigue in another context.» (como ejemplo de fatiga de alertas en otro contexto).28 La Sentinel Event Alert de The Joint Commission sobre la seguridad de las alarmas de dispositivos médicos, publicada el 8 de abril de 2013, le pone números: «The number of alarm signals per patient per day can reach several hundred» (el número de señales de alarma por paciente y día puede llegar a varios cientos) e «It is estimated that between 85 and 99 percent of alarm signals do not require clinical intervention» (se estima que entre el 85 y el 99 por ciento de las señales de alarma no requieren intervención clínica).10 La alerta es cuidadosa de una forma que vale la pena copiar: el 85 a 99 por ciento abarca las alarmas que no necesitan intervención, no solo las falsas, y la alerta no separa unas de otras. La consecuencia que registra es aquella en la que yo ya iba a medio camino: el personal clínico «become desensitized or immune to the sounds» (se vuelve insensible o inmune a los sonidos) y «may turn down the volume of the alarm, turn it off, or adjust the alarm settings outside the limits that are safe and appropriate for the patient» (puede bajar el volumen de la alarma, apagarla o ajustarla fuera de los límites seguros y adecuados para el paciente).10 Cuenta 98 eventos relacionados con alarmas entre enero de 2009 y junio de 2012, de los cuales 80 «resulted in death» (terminaron en muerte), y, más allá de los factores informados a su base de datos, señala la fatiga de alarmas como «the most common contributing factor.» (el factor contribuyente más común).10 Lo que me juego yo es muchísimo menos. El mecanismo es el mismo: una persona que aprende que las alarmas no la necesitan lo aprende también para la siguiente que sea real.

NIST, antes y ahora. La revisión de 2012 de la guía de gestión de incidentes del NIST, SP 800-61r2, advertía que «it is not uncommon for an organization to receive thousands or even millions of intrusion detection sensor alerts per day.» (no es raro que una organización reciba miles o incluso millones de alertas de sensores de detección de intrusiones al día).32 La revisión de abril de 2025, SP 800-61r3, que «supersedes SP 800-61r2» (sustituye a SP 800-61r2), elimina esa frase; su línea más cercana es la recomendación de que «The volume of potentially adverse events to be analyzed is generally quite high, so organizations should rely on technical solutions that filter large event datasets down to a subset that is suitable for human viewing and analysis.» (el volumen de eventos potencialmente adversos que analizar suele ser muy alto, así que las organizaciones deberían apoyarse en soluciones técnicas que filtren grandes conjuntos de eventos hasta un subconjunto apto para que lo vean y analicen personas).33 Tomo el filtro como la instrucción y el resumen como un filtro.

Una encuesta de proveedor, presentada como tal. La encuesta de 2023 de Vectra AI, realizada por Sapio Research entre 2.000 analistas de seguridad, informa que «SOC teams receive an average of 4,484 alerts per day, and over two-thirds (67%) of them are ignored.» (los equipos de SOC reciben un promedio de 4.484 alertas al día, y más de dos tercios, el 67 %, se ignoran).34 Es una encuesta de opinión encargada por un proveedor, y el 67 por ciento es lo que dijeron los encuestados, no una medición. La cito para un solo punto: el fallo también se da a pequeña escala. Los analistas dicen que ignoran dos tercios de 4.484 alertas al día, y un lector sin equipo dejó de leer en 74.

4. El rediseño, en forma de reglas

El cambio entró a las 13:50 del 1 de noviembre, 18 minutos después de mi mensaje, y un segundo cambio a las 14:00 endureció una de sus condiciones.18 Lo escribí como reglas, cada una con el motivo de su existencia.

Regla 1: un resumen al día, y es el latido. La primera ejecución del monitor después de las 07:00, hora local, envía un correo que cubre la ventana desde el resumen anterior.1835 La propia descripción del resumen dice qué reemplaza el correo: «One email a day … in place of an email per auto-block and per WAF-handled CRITICAL.» (un correo al día… en lugar de un correo por cada bloqueo automático y por cada CRITICAL resuelta por el WAF).35 Empieza con la salud de las ejecuciones (ejecuciones registradas, ejecuciones iniciadas y terminadas, fallos, correos críticos enviados y suprimidos), y luego trae los bloqueos automáticos con zona, motivo y operador de red, cada crítica y lo que fue de ella, los hallazgos por severidad y categoría, las rutas sondeadas y los hallazgos sin resolver del escáner local.12 El motivo del resumen es la bandeja de entrada. El motivo de enviarlo a diario está en la misma descripción: «The digest is also the heartbeat: it goes out on a quiet day too» (el resumen también es el latido: sale incluso en un día tranquilo).35 Un flujo de alertas que solo habla cuando pasa algo no puede mostrarme la diferencia entre un día tranquilo y un monitor muerto. Un resumen que siempre llega sí puede: el silencio significa avería, no calma. Las propias notas del programa registran por qué me importa: a principios de 2026 el monitor estuvo muerto durante meses y nada lo notó.35

Regla 2: los bloqueos van al chat, no al correo. Las notas de diseño lo dicen en cuatro palabras: «Per block: Slack only.» (por bloqueo: solo Slack).3 Un bloqueo es el borde actuando en mi nombre. En los términos del libro de SRE es registro: queda anotado, sirve más adelante y no requiere que una persona actúe.7 El chat conserva el flujo en vivo para los momentos en que quiero mirarlo, y el resumen conserva el registro.

Regla 3: incorporar una crítica al resumen cuando el borde ya se encargó de ella. Una crítica sigue intentando bloquear primero; después, el monitor decide si merece un correo.3 Dos condiciones la incorporan al resumen en su lugar, revisadas en este orden. La primera: la propia dirección del hallazgo, y cada dirección del hallazgo apta para bloqueo automático, ya está en la lista de bloqueo activa, así que el borde ya está deteniendo esas direcciones.314 Esa verificación no mira ninguna otra dirección y se ejecuta antes de examinar la muestra, así que una avalancha incorporada por ella aún puede contener eventos sin bloqueo ni desafío registrado, de direcciones por debajo del umbral de bloqueo; esta rama dice que los objetivos del respondedor están bloqueados, no que cada evento se haya mitigado. La segunda se aplica a una avalancha de WAF, una ráfaga de eventos de firewall en una zona: solo la incorpora cuando cada evento de la muestra, sea de bot o no, tiene un bloqueo o un desafío registrado, y la muestra está completa. «A solved or bypassed challenge, log, allow and skip all count as unmitigated.» (un desafío resuelto o eludido, log, allow y skip cuentan todos como no mitigados).3 Las definiciones de Cloudflare explican por qué esos cuatro cuentan en contra de la incorporación: después de un desafío, «If successful, Cloudflare accepts the matched request» (si se supera, Cloudflare acepta la solicitud que coincidió), y una acción log solo «Records matching requests in the Cloudflare Logs.» (registra las solicitudes coincidentes en los Cloudflare Logs).36 Un hallazgo de escáner persistente, que solo cuenta eventos que el borde bloqueó o desafió, se incorpora por la regla del WAF por ese motivo, o por la regla de la lista de bloqueo cuando su dirección ya está en la lista, como ocurrió con el del 2 de noviembre.3 Todo lo demás se envía por correo de inmediato.

Regla 4: el desenlace va en el hallazgo. La política es que cada crítica de la mitad en la nube lleve un desenlace registrado: incorporada porque la dirección está en la lista de bloqueo, incorporada porque el borde bloqueó o desafió cada evento muestreado, enviada por correo, suprimida (dentro del límite de un correo por sitio y categoría cada dos horas) o con fallo de correo.337 El registro no está a la altura de la política. De las críticas fechadas el 1 de noviembre en UTC, 118 no llevan desenlace: 117 se levantaron antes de que el campo existiera, y una crítica de la nube, a las 14:13 PST, llegó después; su ejecución fue una de las tres de la sección 7 que terminaron unos cuatro minutos después de empezar, y se detuvo durante el bloqueo automático, antes de que se escribiera un desenlace. Las críticas del escáner local nunca llevan uno; las tres del 2 de noviembre no tienen ninguno.3738 Desde el 3 de noviembre, el monitor escribe «pending» (pendiente) en una crítica antes de que se ejecute el bloqueo automático, así que una ejecución cortada a la mitad deja un estado visible en lugar de un vacío.14 El resumen imprime el desenlace junto a cada crítica de la nube, bajo un encabezado que lo promete: «Every CRITICAL and what became of it» (cada CRITICAL y qué fue de ella).12 El campo de desenlace es mi mecanismo, no el de Ewaschuk. Su condición para un informe diario es una persona designada para clasificarlo cada día, y aquí esa persona soy yo; el campo le da a esa clasificación algo que revisar.30 Con el desenlace en cada línea, el resumen responde la pregunta que hice el 1 de noviembre, rutina o algo real, crítica por crítica, aunque «enviada por correo» o «incorporada» dice adónde fue una crítica, no que algo se haya resuelto.

Regla 5: la alerta horaria de volumen se queda. Otra vez las notas: «Hourly volume alert (responder): still immediate, at most once an hour» (alerta horaria de volumen del respondedor: sigue siendo inmediata, como mucho una vez por hora).3 Un bloqueo aislado es rutina; un montón repentino de bloqueos en una hora es lo más parecido a un síntoma que tiene la mitad en la nube, un cambio en lo que internet me está haciendo. Se disparó una vez el 2 de noviembre.5

Regla 6: las críticas del escáner local siguen enviando correo de inmediato. Las notas de diseño las mantienen inmediatas porque se supone que son raras.3 Yo las mantengo por un segundo motivo: nada se interpone entre mi Mac y un hallazgo local como el borde se interpone entre mis sitios y un escáner. Una lista de bloqueo puede detener una dirección; nada fuera de la Mac detiene un proceso dentro de ella. El costo de esa regla aparece en la sección 7.

El día en que las reglas entraron en vigor, recortaron el flujo de correo de 74 correos antes de las 13:32 a siete registrados en el resto del día (seis críticos y una alerta horaria), más el resumen que envié a mano.52 El pronóstico que escribí aquella tarde decía «Under today’s traffic that would have been 0 immediate emails instead of 16.» (con el tráfico de hoy, habrían sido 0 correos inmediatos en lugar de 16).1 No se cumplió, y la sección 6 explica por qué.

5. El caso de prueba: 2 de noviembre, de 11:03 a 11:21

La primera prueba real de las reglas llegó a la mañana siguiente: una dirección de un proveedor de hosting neerlandés pasó un escáner de vulnerabilidades por mi sitio.12 Esto es lo que escribió el monitor, textual de su log en hora local del Pacífico, con la dirección reemplazada por «[the address]» y las líneas intermedias omitidas.4

[2026-11-02 11:03:53] [INFO] New finding [critical]: Request flood from [the address] on blakecrosley.com
[2026-11-02 11:04:02] [RESPOND] [INFO] Block notification: Slack posted, email folded into the daily digest
[2026-11-02 11:04:03] [INFO] Critical alert folded into the daily digest (IP on the block ledger): Request flood from [the address] on blakecrosley.com
[2026-11-02 11:04:04] [INFO] New finding [critical]: Scanner from [the address] on blakecrosley.com
[2026-11-02 11:04:05] [RESPOND] [INFO] Skip: [the address] already has active real block in blakecrosley.com (dedup)
[2026-11-02 11:04:05] [INFO] Critical alert folded into the daily digest (IP on the block ledger): Scanner from [the address] on blakecrosley.com
[2026-11-02 11:09:22] [INFO] New finding [critical]: 726 WAF blocks in 5 minutes
[2026-11-02 11:09:23] [INFO] Critical alert folded into the daily digest (IP on the block ledger): 726 WAF blocks in 5 minutes
[2026-11-02 11:09:44] [INFO] New finding [critical]: Persistent scanner: [the address] blocked 743 times today
[2026-11-02 11:09:47] [RESPOND] [INFO] Block notification: Slack posted, email folded into the daily digest
[2026-11-02 11:09:47] [INFO] Critical alert folded into the daily digest (IP on the block ledger): Persistent scanner: [the address] blocked 743 times today

Minuto a minuto:

  • 11:03:53. El detector de avalanchas de solicitudes levanta una crítica contra la dirección. Ocho segundos después, a las 11:04:01, el respondedor la agrega a la lista de bloqueo, y a las 11:04:02 el aviso de bloqueo va al chat con su correo incorporado al resumen.4
  • 11:04:03. La crítica misma se incorpora: la dirección ya está en el registro de bloqueos, así que el borde ya está haciendo el trabajo que un correo me pediría hacer.4
  • 11:04:04. Un segundo detector, la verificación de escáneres, levanta su propia crítica para la misma dirección. La solicitud de bloqueo del respondedor se omite por duplicada, y la crítica se incorpora un segundo después.4
  • 11:09:22. El detector de avalanchas de WAF levanta una tercera crítica para la zona. Su infractor está en el registro, y se incorpora.411 Solo decide la incorporación por lista de bloqueo: ocho de los eventos muestreados no tenían bloqueo ni desafío registrado y la muestra estaba topada, así que la incorporación por WAF por sí sola la habría enviado por correo.11
  • 11:09:44. La verificación de escáner persistente, que cuenta los eventos que el borde bloqueó o desafió de una sola dirección en todas mis zonas, levanta la cuarta, registrada en otro de mis sitios: 743 eventos bloqueados o desafiados de esa dirección ese día.12 El respondedor escribe la dirección en la lista por segunda vez (un defecto, más abajo), publica en el chat e incorpora la crítica a las 11:09:47.411
  • 11:14:58 y 11:20:40. Dos críticas más de avalancha de WAF para la misma zona; ambas se incorporan de la misma manera.11

Cuatro críticas en 5 minutos y 51 segundos, seis hasta las 11:20, todas registradas en sus hallazgos como incorporadas porque la dirección estaba bloqueada.11 Una dirección bloqueada, con su entrada en la lista escrita dos veces porque la verificación de duplicados funcionaba entonces por sitio (corregido el 3 de noviembre), y otras cuatro solicitudes de bloqueo omitidas por duplicadas.414 Correos: cero. El log no registra ningún correo enviado entre las 11:03 y las 11:21; la única crítica de esa ventana que ni se incorporó ni se envió por correo, suprimida a las 11:03:13, era una avalancha en otro sitio desde otra dirección.4

El siguiente resumen lo llevó como dos filas en la tabla de bloqueos automáticos (el primer bloqueo, con su zona, motivo y operador de red, y la nueva inserción del escáner persistente) y seis filas en la tabla de todas las críticas, cada una marcada «blocked» (bloqueada) o «blocked earlier» (bloqueada antes).12 Según mi lectura, ese es el peso justo para un escáner que el monitor bloqueó ocho segundos después de su primer hallazgo, ocho minutos después de que empezara el escaneo: unas pocas líneas que puedo leer con el café, no una página.4

Hay algo que el caso de prueba no muestra, encontrado el 3 de noviembre. El mismo escáner también estaba enviando mensajes al formulario de contacto de mi sitio, mensajes a los que mi aplicación respondió con un 200, como mucho 31 correos propios, el tema del post que lo acompaña, y la verificación de avalanchas de formularios del monitor no levantó ningún hallazgo en vivo; al reproducirla sobre datos completos para los cinco minutos hasta las 11:03:23, la misma verificación levanta el hallazgo, con severidad alta (una línea del resumen, no un correo ni un bloqueo), a partir de 39 envíos, 23 de ellos rechazados.39 La ejecución en vivo le había pedido a Cloudflare una ventana que terminaba en el instante de la consulta, 37 segundos después de iniciar la ejecución, antes de que los eventos más recientes hubieran llegado por completo: contó 1.914 solicitudes de la dirección en esa ventana, donde la reproducción sobre datos completos cuenta 2.143.439 Ese retraso está medido sobre todas las solicitudes de la dirección, no sobre los envíos al formulario que cuenta la verificación; según mi lectura, el mismo retraso mantuvo esos envíos por debajo del umbral de la verificación en vivo. Además, cada ejecución miraba exactamente cinco minutos hacia atrás mientras las ejecuciones arrancaban con unos 5,6 a 5,8 minutos de separación, así que una parte de cada intervalo nunca se escaneaba.3917 La corrección entró ese mismo día: cada ventana empieza ahora donde terminó la anterior y termina 90 segundos antes de la ejecución, salvo que el registro anterior falte, tenga menos de un minuto o más de 15 minutos de antigüedad, como después de que la Mac duerma, en cuyo caso la ejecución vuelve a una simple mirada de cinco minutos hacia atrás.39 Reproducir la ventana del 2 de noviembre con el código modificado da los mismos hallazgos, así que el cambio no alteró la detección en una ventana fija. Una reproducción no puede poner a prueba el encadenamiento de ventanas ni el retraso, que solo actúan en ejecuciones en vivo; las ejecuciones en vivo a partir del 3 de noviembre son su prueba.39

6. Qué sigue enviando correo, y por qué

El 2 de noviembre fue el primer día completo con las reglas nuevas, y envió 19 correos, no uno: 14 críticos, una alerta horaria de volumen, un resumen y tres del escáner local.5 No salió ningún correo por bloqueo; en su lugar, 108 avisos de bloqueo se incorporaron al resumen, 177 críticas se incorporaron y otras 37 quedaron suprimidas por el límite de dos horas, todo contado por día local; los conteos de desenlaces más adelante en este post van por fecha UTC, y por eso esas cifras difieren.5

Gráfico de barras apiladas de correos por día local y por flujo. 31 de octubre, un día parcial desde las 22:31: 10 correos, 4 por bloqueo y 6 críticos. 1 de noviembre: 82, formados por 55 por bloqueo, 22 críticos, 3 horarios de volumen, 1 resumen enviado a mano y 1 del escáner local. 2 de noviembre: 19, formados por 14 críticos, 1 horario de volumen, 1 resumen y 3 del escáner local, sin ningún correo por bloqueo.

Correos por día local y por flujo; el 31 de octubre solo cubre los 89 minutos posteriores al inicio del log.5

Cada crítica de la nube que se envió por correo desde el cambio de las 13:50 hasta el final del 2 de noviembre, 20 en total (seis en el resto del 1 de noviembre, catorce el 2 de noviembre), fue una avalancha de WAF en resumegeni.com o blakecrosley.com en la que al menos un evento no tenía bloqueo ni desafío registrado.13 La incorporación por WAF rechazó cada una correctamente según su propia regla: había un evento sin mitigar en la muestra, así que el monitor no podía afirmar que el borde se hubiera encargado.3 En esas avalanchas ninguna dirección tenía suficientes eventos para ser apta para bloqueo automático, así que la incorporación por lista de bloqueo no tenía ninguna dirección que revisar.13 El resumen nombra al grupo de la misma manera: «a CRITICAL that was neither blocked nor already handled by the WAF» (una CRITICAL que ni se bloqueó ni había resuelto ya el WAF).12

Los asuntos de esos correos contaban otra historia, y eso era un defecto. El resumen de la avalancha decía «N WAF blocks in 5 minutes» (N bloqueos de WAF en 5 minutos), pero N contaba cada evento de firewall que no venía de bots en la ventana, fuera cual fuera la acción que tomó el borde.13 Dos ejemplos de los hallazgos, en hora local:

Cuándo (PT) Sitio Lo que decía el asunto Bloqueados Desafiados Sin mitigar
1 nov., 16:51 blakecrosley.com «104 WAF blocks in 5 minutes» 0 0 117 de 117 eventos
1 nov., 22:45 resumegeni.com «108 WAF blocks in 5 minutes» 18 62 99 de 179 eventos

El primer correo afirmaba 104 bloqueos cuando el borde no había bloqueado nada.13 Según mi lectura, un asunto que dice «bloqueos» sobre eventos sin ningún bloqueo registrado es peor que el ruido: le dice al único lector que el sistema se encargó de algo de lo que quizá no se encargó. Mi primera corrección, el 3 de noviembre, el día en que se hicieron estos conteos, también estaba mal. Mantenía el conteo sin bots para N y contaba bloqueados, desafiados y el resto sobre todos los eventos, así que la ráfaga de las 16:51 habría dicho 104 WAF events in 5 minutes: 0 blocked, 0 challenged, 117 through, dos poblaciones en una línea. La revisión de este post lo detectó, y lo volví a corregir ese mismo día.14 El resumen de la avalancha, y con él el asunto del correo, cuenta ahora una sola población, cada evento de firewall muestreado, y dice N WAF events in 5 minutes: B blocked, C challenged, U unmitigated (S from non-bot user agents); un desafío de JavaScript cuenta como desafiado, y el motivo del bloqueo automático dice N WAF events from this address in 5 min.14 Para la ráfaga de las 16:51 eso da 117 WAF events in 5 minutes: 0 blocked, 0 challenged, 117 unmitigated (104 from non-bot user agents).1314 La incorporación por WAF ya se basaba en los eventos sin mitigar, así que el asunto y la decisión cuentan ahora lo mismo. La corrección cambia lo que dicen los 14 asuntos. No cambia cuántos se enviaron, y 19 sigue siendo el número honesto del 2 de noviembre.

El pronóstico que escribí el 1 de noviembre falló porque su premisa estaba equivocada. Decía que las reglas nuevas «would have been 0 immediate emails instead of 16» (habrían sido 0 correos inmediatos en lugar de 16), partiendo de la creencia de que, en las siete críticas posteriores a las 00:30 de esa mañana, «Cloudflare had already blocked every one of those requests.» (Cloudflare ya había bloqueado cada una de esas solicitudes).1 Los hallazgos dicen otra cosa también sobre esas: las cinco que el log muestra enviadas por correo después de las 00:30 registran como mucho un bloqueo y nueve desafíos cada una, frente a 76 a 89 eventos en sus resúmenes.13 Y en cada una de las seis críticas que se enviaron por correo aquella tarde y noche, el borde había bloqueado o desafiado solo una parte de los eventos (ninguno en la ráfaga de las 16:51), así que incluso la regla de las 13:50, que solo incorporaba cuando los bloqueos y desafíos cubrían cada evento sin bots, habría enviado todas por correo.131 Diez minutos después del cambio de las 13:50, un segundo cambio hizo que la incorporación por WAF contara cada evento, viniera o no de un user agent de bot, y que solo confiara en una muestra completa; endureció la regla, pero no es la razón por la que falló el pronóstico.183 El pronóstico contaba los bloqueos en los que yo creía; la regla contaba los eventos que estaban ahí.

Lo que no sé es si esos 14, las críticas del 2 de noviembre que se enviaron por correo, merecían un correo. Los hallazgos registran cuántos eventos quedaron sin mitigar, es decir, sin bloqueo ni desafío registrado, pero no qué acciones llevaban: una regla log, un skip, un allow o un desafío que un cliente resolvió.13 Un evento sin mitigar tampoco es una solicitud que llegó a mi sitio. Cloudflare dice «A single HTTP request can generate one or more security events when it triggers security features» (una sola solicitud HTTP puede generar uno o más eventos de seguridad cuando activa funciones de seguridad), y enumera log y skip como acciones que no terminan la evaluación de reglas como lo hace un bloqueo, así que, según mi lectura, otra regla aún puede actuar sobre la misma solicitud.2436 El tutorial de GraphQL de Cloudflare muestra el campo action y valores de ejemplo como "log" y "block", pero no enumera todos los valores que el campo puede tomar.23 El panel de Security Events de Cloudflare también muestrea: «For large volumes of traffic, Cloudflare uses sampling to return results faster.» (para grandes volúmenes de tráfico, Cloudflare usa muestreo para devolver resultados más rápido).24 Hasta que el monitor registre las acciones detrás de cada evento sin mitigar y vincule los eventos con las solicitudes, no puedo decir cuáles de esos correos describían tráfico que el borde dejó pasar, y la respuesta decide si merecen un correo.

Los tres correos locales del 2 de noviembre son el otro tema abierto. Informan una «Browser -> shell chain» (cadena de navegador a shell) a las 13:50 en la que una shell lanzó curl, y siguen sin resolver en los hallazgos.40 No he verificado si eran las herramientas de agente que estaba usando aquella tarde o algo más, así que no los cuento como falsas alarmas.

7. Dos señales falsas

El minero de criptomonedas que era Spotlight

A las 10:03 del 1 de noviembre, el escáner local levantó una crítica, «High CPU unsigned process - possible crypto miner» (proceso sin firmar con CPU alta, posible minero de criptomonedas), contra spotlightknowledged, el propio daemon de Spotlight de Apple, al 74,9 por ciento de CPU, y dos segundos después registró «Critical email sent».15 El bug era mío. La verificación buscaba la frase «valid on disk» en la salida del comando que muestra la firma de código, codesign -d. Las notas del escáner registran ahora el fallo en una cláusula: la frase es una «which only codesign -v prints, so every process read as unsigned» (que solo imprime codesign -v, así que cada proceso se leía como sin firmar).25 Una lista de exclusiones había ocultado el fallo hasta que un daemon de un framework de Apple tuvo un pico, y mi log de ese día lo dice.1 El hallazgo lleva ahora su resolución: «false positive, Apple platform binary» (falso positivo, binario de la plataforma de Apple).41

Costó un correo, el único correo local del 1 de noviembre.5 Las 16 críticas locales anteriores, del 31 de octubre y el 1 de noviembre, marcaron Xcode, el Python de Homebrew, mis propias compilaciones de apps, cambios en hooks, shims de gestores de versiones en la ruta, un patrón de gusano de IA que coincidía con las instrucciones de agente de otro proyecto y una verificación de event taps que coincidía con su propia consulta; produjeron 15 intentos de envío, y todos fallaron.5251915 El servicio de correo está detrás de Cloudflare, que respondió al user agent predeterminado de Python con el error 1010 antes de leer la clave; lo reproduje con una clave deliberadamente mala.19 La página de Cloudflare sobre el error nombra a ese cliente directamente, en su nota sobre hosts de Pages y Workers: «a User-Agent header that Browser Integrity Check treats as a non-browser client (for example, the default Python urllib user agent).» (un encabezado User-Agent que Browser Integrity Check trata como un cliente que no es navegador, por ejemplo el user agent predeterminado de urllib de Python).42 Un remitente roto me ahorró 15 correos sobre mis propias herramientas y mis propios cambios.15 Las notas del escáner dicen la lección más amplia sin rodeos: «most of the CRITICALs it raised in its first live days were its own noise.» (la mayoría de las CRITICAL que levantó en sus primeros días en vivo eran su propio ruido).25 Aun así mantengo inmediatas las críticas locales, y corrijo cada falsa en su verificación en lugar de silenciar el flujo.

RUNS SHORT 162/207

El primer resumen programado, en la mañana del 2 de noviembre, llevaba el asunto «Mon Nov 2: 71 blocks on 15 zones, 11 criticals emailed, RUNS SHORT 162/207» (lunes 2 de nov.: 71 bloqueos en 15 zonas, 11 críticas enviadas por correo, faltan ejecuciones 162/207).16 La regla del resumen era aritmética simple: el número esperado de ejecuciones son los minutos de la ventana divididos entre cinco, y el asunto señala el déficit.35 La ventana fue de las 13:48 del 1 de noviembre a las 07:05 del 2 de noviembre, 1036,5 minutos, o sea 207 franjas de cinco minutos; el log registró 162 ejecuciones.17

Mi log del 2 de noviembre explicó el hueco en una línea: «The RUNS SHORT line is the Mac asleep» (la línea RUNS SHORT es la Mac dormida), sin falla en el monitor.43 Esa línea acierta en que el monitor no falló (ninguna ejecución del 2 de noviembre quedó sin terminar) y se equivoca sobre la causa, tanto el 2 de noviembre como en la ventana que describía el número. El análisis de huecos entre ejecuciones reparte las 45 franjas faltantes, de forma aproximada, en unas 25 perdidas por la cadencia, unas 16 por el sueño, más o menos una más en un hueco largo después de una ejecución que terminó antes de tiempo, y tres ejecuciones que nunca se registraron.17

Causa Franjas, aproximadas Evidencia
La cadencia real 25 160 huecos ordinarios entre ejecuciones, mediana de 5,60 minutos, nunca por debajo de 5,35; suman 926,0 minutos, 185 franjas de cinco minutos
Sueño 16 tres huecos de más de 10 minutos, 93,0 minutos en total, dentro de los periodos de reposo por inactividad del registro de energía, con ejecuciones que se reanudan durante breves despertares de mantenimiento
Un hueco largo tras una parada temprana 1 el cuarto hueco de más de 10 minutos, 10,0 minutos después de la ejecución de las 14:19 que terminó antes de tiempo
Ejecuciones que nunca se registraron 3 165 inicios de ejecución frente a 162 ejecuciones registradas
Detrás de esas tres tres ejecuciones terminaron unos cuatro minutos después de empezar sin línea de cierre registrada, por los tiempos el watchdog de 240 segundos, todas el 1 de noviembre: dos por la tarde y una a última hora de la noche

El registro de energía muestra reposo por inactividad a las 23:21:30 y despertar completo a las 00:30:05, y de nuevo reposo por inactividad a las 06:01:20 y despertar completo a las 06:30:28.44 Las tres ejecuciones empezaron a las 14:09, 14:19 y 23:10 del 1 de noviembre; cada una terminó unos cuatro minutos después sin línea de cierre registrada, lo que según mi lectura es el watchdog (el proceso vigilante que mata ejecuciones colgadas) de 240 segundos. Una cuarta ejecución terminó 28 segundos después de empezar sin causa visible.1738 En el día calendario del 2 de noviembre empezaron 242 ejecuciones frente a 288 franjas de cinco minutos, 46 de menos, y ninguna quedó sin terminar; solo dos huecos pasaron de 10 minutos, 35,8 minutos en total, así que también ese día la mayor parte del déficit fue la cadencia, no el sueño.17

La suposición equivocada era mía, en el resumen: un programador configurado a cinco minutos entregaba una ejecución cada 5,6 a 5,8 minutos más o menos, incluso con la Mac despierta, así que la aritmética de cinco minutos llamaría corto a un día sano.17 No he determinado por qué la cadencia en vigilia va lenta. Reemplacé la aritmética el 3 de noviembre. La salud de las ejecuciones informa ahora las ejecuciones registradas, la mediana de minutos entre ellas y el hueco más largo con su hora, y el asunto solo señala un hueco de más de 20 minutos. La vista previa de esa mañana decía «about one every 5.6 min» (aproximadamente una cada 5,6 min), y su asunto terminaba en «RUN GAP 31 min at 05:56» (hueco de 31 min a las 05:56).14 Un hueco es un síntoma sobre el que puedo actuar: la Mac se durmió o el monitor se detuvo. Una proporción frente a una cadencia que el programador nunca entregó no era ninguna de las dos cosas.

Las reglas que me quedé

  1. Cuenta el correo antes de cambiarlo, por flujo y con una regla explícita. Mi tabla y el conteo del log coincidieron en 74 solo porque primero anoté qué contaba como correo.12
  2. Registra «sent» solo cuando el servicio de correo dice que sí. De 22 de mis 74 correos puedo probar un intento y nada más.26
  3. Un bloqueo que el borde ya hizo es una línea de log, no una alerta. Las tres salidas del libro de SRE lo ponen ahí, y pasar 55 correos por bloqueo al chat no me hizo perder nada sobre lo que hubiera actuado.75
  4. Envía un resumen diario aunque no haya pasado nada. Un resumen que siempre llega es el latido; su ausencia es la alerta.35
  5. Incorpora una crítica al resumen solo con una condición que el borde demuestre. Las mías son que las direcciones bloqueables del hallazgo ya estén en la lista de bloqueo y una muestra completa en la que cada evento tenga un bloqueo o un desafío registrado, y la segunda es la razón por la que 14 aún se enviaron por correo el 2 de noviembre.313
  6. Escribe el desenlace en cada crítica de la nube. Un informe diario del que nadie responde es, en palabras de Ewaschuk, «less-spammy email alerts» (alertas por correo un poco menos molestas); el desenlace en cada línea es lo que revisa mi clasificación diaria.3012
  7. Haz que el asunto diga lo que hizo el borde. «104 WAF blocks» en una ráfaga con cero bloqueos fue mi peor línea de la semana.13
  8. Informa huecos, no proporciones frente a un horario. Un temporizador de cinco minutos entregaba una ejecución cada 5,6 minutos más o menos, así que 162/207 parecía una caída y era sobre todo un reloj.17
  9. Corrige una falsa alarma en su verificación, no en la bandeja de entrada. Una salida de comando mal leída convirtió el daemon de Spotlight de Apple en un minero de criptomonedas; la corrección fue a la verificación.25

Qué podría cambiar

  • Si los eventos sin mitigar resultan ser desafíos resueltos, eso por sí solo no convertiría en ruido las críticas de avalancha de WAF que aún se envían por correo. Cuando un cliente supera un desafío, «Cloudflare accepts the matched request» (Cloudflare acepta la solicitud que coincidió): la solicitud sigue adelante, y eso no demuestra que fuera inofensiva ni que nada requiera respuesta. Incorporar esas críticas exigiría evidencia de solicitudes vinculada a los mismos eventos que mostrara que nada en ellos necesitaba a una persona, y completar un desafío no es, por sí solo, esa evidencia. Si resultan ser reglas log o skip, la pregunta es si esas reglas hacen lo que yo pretendía, y cada correo vale la pena leerlo hasta que lo sepa. El monitor todavía no registra cuál de los dos casos es.1336
  • Si los correos críticos de un día vuelven a acercarse a las decenas, el límite de dos horas por sitio y categoría está haciendo el trabajo que debería hacer una regla, y la regla necesita otra revisión.3
  • Si el resumen deja de llegar, algo entre el monitor y mi bandeja de entrada se detuvo: el monitor, la Mac en la que corre, el remitente o la ruta de entrega, ya que un envío aceptado todavía no es uno entregado. Ese es el único silencio que el diseño trata como señal para ir a mirar.3520
  • Si el escáner local levanta una crítica que no puedo explicar con mis propias herramientas, el correo inmediato fue la decisión correcta; los tres hallazgos de cadena de shell sin resolver del 2 de noviembre son la prueba abierta de eso.40
  • Si agrego un lector, las páginas y los tickets dejan de ir a la misma persona, y la separación del libro de SRE entre alertas y tickets necesitaría una cola de tickets, no mi bandeja de entrada.7

Conclusiones clave

Si operas un monitor para ti mismo

  • Dejé de leer en algún punto antes de los 74 correos en medio día, una cifra que mi bandeja de entrada alcanzó a primera hora de la tarde.1
  • Un resumen diario que también llega en días tranquilos es un latido gratis; un monitor que solo habla cuando hay eventos no puede avisarte de que murió.35
  • Tus logs pueden decir «sent» de correo que nunca salió. Revisa el código antes de fiarte del conteo.619

Si construyes uno

  • Actúa primero y después decide si avisar: bloquea, y luego incorpora la alerta al resumen si la lista de bloqueo o el borde ya la cubren.3
  • Registra el desenlace de cada crítica en el hallazgo e imprímelo en el resumen, para que la persona que, según Ewaschuk, debe clasificar un informe diario tenga algo que revisar; en mi monitor esa persona soy yo.3012
  • Nombra los eventos por lo que el borde registró para ellos (bloqueados, desafiados, sin mitigar), cuenta una sola población por línea y nunca los nombres por lo que esperabas que hiciera el borde.1314
  • Mide el programador que tienes. El mío ejecutaba cada 5,6 minutos con un temporizador de cinco.17

Si eres quien lee la bandeja de entrada

  • Pregunta de cada alerta si es «urgent, important, actionable, and real» (urgente, importante, accionable y real); lo que no pase la prueba va a un resumen o a un log.29
  • Mi pronóstico del primer día falló: decía cero críticas inmediatas, y el día siguiente envió 14.15

Preguntas frecuentes

¿Qué es la fatiga de alertas?

La fatiga de alertas es lo que les pasa a las personas que reciben demasiadas alarmas que no necesitan nada de ellas: se vuelven, en palabras de The Joint Commission, «desensitized or immune to the sounds» (insensibles o inmunes a los sonidos), y empiezan a bajar el volumen de las alarmas o a apagarlas.10 El libro de SRE de Google describe lo mismo en operaciones, donde la gente «second-guess, skim, or even ignore incoming alerts, sometimes even ignoring a “real” page that’s masked by the noise.» (duda, lee en diagonal o incluso ignora las alertas, a veces hasta una página «real» enmascarada por el ruido).27 Mi propio caso tardó un día: 74 correos a las 13:32, ninguno de los cuales, según mi lectura de aquella tarde, me pedía actuar.1

¿Cuántas alertas de seguridad al día son demasiadas?

Para una persona, la respuesta honesta del capítulo de SRE es unas pocas: «I can only react with a sense of urgency a few times a day before I become fatigued.» (solo puedo reaccionar con urgencia unas pocas veces al día antes de agotarme).8 La encuesta de proveedor de Vectra informa que los equipos reciben un promedio de 4.484 alertas al día y que, según su propio relato, ignoran el 67 por ciento.34 Para mi monitor de una sola persona, la respuesta práctica es un resumen al día más las alertas que necesitan a una persona ahora; el 2 de noviembre eso todavía fueron 19, y trato las 14 críticas de avalancha de WAF entre ellas como una pregunta abierta y no como un costo asumido.513

¿Las alertas de seguridad deben ir en un resumen diario o en tiempo real?

Las dos cosas, repartidas según lo que tenga que hacer la persona. Todo lo que el monitor considera ya resuelto (una dirección que puso en la lista de bloqueo, o una avalancha en la que cada evento muestreado se bloqueó o desafió) va al resumen; el resto sale de inmediato, dentro del límite de dos horas.3 Ewaschuk admite que un informe diario «can work too» (también puede funcionar), con una condición: sin rendición de cuentas «amounts to less-spammy email alerts» (equivale a alertas por correo un poco menos molestas), y quiere a alguien «designated to triage these every day» (designado para clasificarlos cada día).30 En mi monitor ese soy yo, y mi resumen imprime qué fue de cada crítica de la nube para que la clasificación tenga algo que revisar.12

¿Qué es una alerta de latido (heartbeat)?

Un latido es un mensaje que llega según un horario, pase algo o no, de modo que su ausencia significa que algo se rompió. Mi resumen diario es el latido: «it goes out on a quiet day too» (sale incluso en un día tranquilo), así que un monitor que dejó de ejecutarse aparece como un correo que falta.35 Lo mismo ocurre con un envío fallido o una entrega perdida, así que un resumen que falta es una señal para revisar el monitor, el equipo en el que corre, el remitente y la ruta de entrega.20 Su sección de salud de las ejecuciones también informa el hueco más largo entre ejecuciones y señala en el asunto cualquier hueco de más de 20 minutos.14

¿Por qué las alertas del WAF de Cloudflare inundan mi correo?

Las mías inundaban porque cada bloqueo y cada crítica se convertían en su propio mensaje, y internet escanea cada zona pública todo el día.5 Las Alerts de Cloudflare, «Monitors that you define yourself, and Platform Notifications» (monitores que defines tú mismo y notificaciones de la plataforma), pueden entregarse por correo y se configuran en su panel; un monitor que construyes tú mismo sobre su API, como el mío, no es ninguna de las dos cosas, y hereda cualquier envío de correo por evento que le hayas programado.26 Revisa también qué cuenta una alerta: entre las acciones de Cloudflare están log y skip, que no terminan la evaluación de reglas como lo hace un bloqueo, y un desafío que un cliente resuelve termina con Cloudflare aceptando la solicitud, así que «eventos de WAF» y «bloqueos de WAF» son números distintos.36 Mis asuntos confundían los dos hasta el 3 de noviembre.1314

¿Un 2xx de la API de correo significa que la alerta se entregó?

No. El evento email.sent de Resend «Occurs whenever the API request was successful. Resend will attempt to deliver the message to the recipient’s mail server» (ocurre cuando la solicitud a la API tuvo éxito; Resend intentará entregar el mensaje al servidor de correo del destinatario), y la entrega es un evento aparte.20 Un 2xx significa que el servicio aceptó el mensaje. Registra el código de estado y trata la entrega como una pregunta distinta.6

Relacionado en este sitio: Por qué el spam venció a mi formulario de contacto con límite de tasa sigue al mismo escáner del 2 de noviembre desde el lado del formulario de contacto; Lo que ejecuto antes de dormir es la verificación nocturna de producción, la otra rutina que corre mientras no miro; Lo que realmente falla cuando ejecutas agentes de IA sin supervisión nombra los modos de fallo de las sesiones de agentes desatendidas, cada uno con una señal de detección; Cada hook es una cicatriz rastrea cada uno de mis hooks de agente hasta el fallo que lo produjo, el mismo hábito que corregir una falsa alarma en su verificación; El modo auto de Claude Code no es una frontera de seguridad sostiene que el muro alrededor de un agente importa más que su clasificador; y Observabilidad de agentes de IA defiende la necesidad de ver lo que los agentes hacen con el disco, la CPU y la red.

Fuentes

Todas las horas de los datos propios del autor son hora local del Pacífico salvo que se indique UTC; el 1 de noviembre se pasó de PDT a PST a las 02:00. Las páginas públicas se consultaron el 3 de noviembre de 2026, a las horas UTC indicadas.


  1. Log de operaciones del autor (Captain’s Log) del 1 de noviembre de 2026: el mensaje de las 13:32 PT; la tabla de 74 correos desde la medianoche por flujo (55 por bloqueo, 16 críticos, 2 horarios de volumen, 1 local); la regla de incorporación de las 13:50 (bloqueos y desafíos que cubren cada evento sin bots); el reparto de críticas como «9 before the fold went live at 00:30 PT; the 7 after», con la creencia de que «Cloudflare had already blocked every one of those requests»; «Yesterday had 10»; el primer resumen enviado a mano a las 13:48 PT; el pronóstico «Under today’s traffic that would have been 0 immediate emails instead of 16»; y la nota de que la lista de exclusiones había ocultado el bug de firma de código. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  2. Datos del autor: el conteo de correos derivado por script de los logs del monitor, cortado a las 13:32 PT del 1 de noviembre: 74 (55 por bloqueo, 16 críticos, 2 horarios de volumen, 1 local), de los cuales 22 (10 por bloqueo, 11 críticos, 1 horario) vinieron de los remitentes que registraban «sent» incondicionalmente; 81 para el día local completo. El listado de líneas del mismo script sitúa 11 líneas críticas de «sent» antes de las 00:30 y 5 después, y la primera crítica incorporada a un aviso de bloqueo a las 00:54:43. ↩↩↩↩↩↩↩↩↩

  3. Notas de diseño del autor para el monitor, sección de notificaciones, a 3 de noviembre de 2026: «Every one described routine mass-scanning the edge had already stopped»; «Per block: Slack only»; las dos condiciones de incorporación y su orden; «A solved or bypassed challenge, log, allow and skip all count as unmitigated»; la alerta horaria de volumen mantenida como inmediata; las críticas del escáner local mantenidas como inmediatas porque se supone que son raras. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  4. Datos del autor: el log del monitor del 2 de noviembre de 2026, de 11:03 a 11:21 PT: las líneas citadas en la sección 5 (dirección reemplazada), las escrituras en la lista de bloqueo a las 11:04:01 y 11:09:46 con vencimiento a siete días, cuatro solicitudes de bloqueo duplicadas omitidas, las publicaciones en el chat y ninguna línea de correo en la ventana salvo una avalancha suprimida en otro sitio a las 11:03:13; la ejecución que levantó la primera crítica empezó a las 11:02:46 y la ventana de su detector terminó a las 11:03:23, 37 segundos después, y el motivo de su bloqueo contó 1.914 solicitudes de la dirección en esa ventana. Las primeras solicitudes del escaneo llegaron al sitio a las 10:56 PT, ocho minutos antes del bloqueo (el log de operaciones del autor del 2 de noviembre y los conteos de solicitudes por minuto de Cloudflare para la dirección). ↩↩↩↩↩↩↩↩↩↩↩↩↩

  5. Datos del autor: el conteo de correos derivado por script de los seis logs del monitor del 31 de octubre al 2 de noviembre de 2026 (la mitad en la nube y el escáner local), un correo por cada línea que registra un traspaso al servicio de correo. Por día local: 31 de octubre (el log empieza a las 22:31), 10 (4 por bloqueo, 6 críticos, todos de los remitentes que registraban «sent» incondicionalmente; 3 críticas suprimidas por el límite de dos horas; 13 envíos locales fallidos); 1 de noviembre, 81 registrados (55 por bloqueo, 22 críticos, 3 horarios de volumen, 1 local; 2 envíos locales fallidos) más un resumen enviado a mano; 2 de noviembre, 19 (14 críticos, 1 horario de volumen, 1 resumen, 3 locales). No enviados por correo el 2 de noviembre: 108 avisos de bloqueo y 177 críticas incorporados al resumen, 37 críticas suprimidas. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  6. Código del autor: los remitentes del monitor tal como se armaron el 31 de octubre de 2026, que descartaban la respuesta de la solicitud de correo y después registraban «sent» incondicionalmente, y el cambio del 1 de noviembre a las 01:04 PDT, antes de que se atrasaran los relojes, tras el cual los remitentes de la mitad en la nube registran el estado HTTP del servicio de correo y dicen «sent» solo ante un 2xx; el remitente del escáner local escribe una línea escueta «Critical email sent», y solo cuando la solicitud no lanzó ningún error. ↩↩↩↩↩↩

  7. Benjamin Treynor Sloss, “Introduction,” capítulo 1 de Site Reliability Engineering: How Google Runs Production Systems (Google, publicado por O’Reilly Media), consultado a las 14:19:33Z: los tres tipos de salida de monitoreo válidos (alertas, tickets, registro), citados, y el pasaje que califica de «fundamentally flawed» (con un defecto de fondo) las alertas de leer un correo y decidir. ↩↩↩↩↩↩

  8. Rob Ewaschuk, “Monitoring Distributed Systems,” capítulo 6 de Site Reliability Engineering (Google, O’Reilly Media), consultado a las 14:18:54Z: «Every page should be actionable», la línea sobre la urgencia y la línea sobre la respuesta robótica, citadas. ↩↩↩

  9. Ewaschuk, “Monitoring Distributed Systems,” consultado a las 14:18:54Z: la definición de una alerta y la nota al pie 22 sobre las alertas por correo («alert spam»), citadas. ↩↩

  10. The Joint Commission, “Medical device alarm safety in hospitals,” Sentinel Event Alert número 50, 8 de abril de 2013, leído en la captura de la Wayback Machine del 13 de noviembre de 2024, consultado a las 14:21:49Z (la URL del propio editor respondió 403): señales de alarma por paciente y día; la estimación del 85 al 99 por ciento, que la alerta atribuye a la AAMI y que abarca las alarmas que no necesitan intervención clínica sin separar las falsas; los pasajes sobre la desensibilización y sobre bajar el volumen; 98 eventos relacionados con alarmas entre enero de 2009 y junio de 2012, 80 de ellos con resultado de muerte; y «the most common contributing factor», citado de la lista de factores de la alerta más allá de los informados a su base de datos de Sentinel Events, que es distinta de la propia lista de factores informados de la base de datos. ↩↩↩↩↩

  11. Datos del autor: los seis hallazgos críticos del escáner del 2 de noviembre en el archivo de hallazgos del monitor (11:03:53 avalancha de solicitudes, 11:04:04 escáner, 11:09:22 avalancha de WAF, 11:09:44 escáner persistente, 11:14:58 y 11:20:40 avalancha de WAF), todos registrados como incorporados porque la dirección estaba en la lista de bloqueo; la avalancha de WAF de las 11:09:22 también registra ocho eventos muestreados sin bloqueo ni desafío registrado, y un conteo de eventos de firewall igual al límite de muestra del monitor, así que su muestra estaba topada. ↩↩↩↩↩↩

  12. Datos del autor: el siguiente resumen tal como lo generó el modo de vista previa del programa de resúmenes el 3 de noviembre de 2026 (ventana del lunes 2 de noviembre a las 07:05 al martes 3 de noviembre a las 06:17 PST; la vista previa no envía nada): sus secciones, los niveles de 10 minutos del escáner local, la lista de bloqueo de toda la cuenta aplicada en cada zona durante siete días, la tabla de bloqueos automáticos con el operador de red (un proveedor de hosting neerlandés para el escáner del 2 de noviembre), el texto del encabezado «Criticals that emailed you» y la tabla «Every CRITICAL and what became of it». ↩↩↩↩↩↩↩↩↩↩↩↩

  13. Datos del autor: cada crítica registrada como enviada por correo desde el cambio de las 13:50 PST del 1 de noviembre, cuando empieza el campo de desenlace, hasta el final del 2 de noviembre PST, 20 en total (15 fechadas el 1 y el 2 de noviembre UTC y cinco fechadas el 3 de noviembre UTC, enviadas a las 16:42, 17:58, 20:34, 21:07 y 23:08 PST), del archivo de hallazgos con los detalles que decidieron cada una: todas avalanchas de WAF en resumegeni.com o blakecrosley.com con eventos sin bloqueo ni desafío registrado; las seis del 1 de noviembre con los eventos sin bots que el borde bloqueó o desafió (el conteo acted de los hallazgos) por debajo del conteo de eventos (5 de 83, 95 de 153, 0 de 104, 67 de 128, 54 de 135, 80 de 108); dos del 2 de noviembre sin ninguno bloqueado (05:55 PST, 26 desafiados; 12:06 PST, 204 desafiados); para las 20, el log del monitor no muestra ninguna dirección individual con suficientes eventos para un bloqueo; las dos filas tabuladas en la sección 6 (2026-11-02T00:51:04Z y 06:45:59Z); el texto del resumen que contaba cada evento de firewall sin bots como un «WAF block»; para la ráfaga de las 16:51, 104 eventos sin bots y 117 eventos en total, ninguno bloqueado ni desafiado; y, para las cinco críticas que el log muestra enviadas por correo entre las 00:30 y las 13:32 PT del 1 de noviembre, los conteos de bloqueados y desafiados de los hallazgos (0 y 0 frente a 79 eventos, 0 y 9 frente a 81, 1 y 0 frente a 89, 1 y 9 frente a 84, 0 y 5 frente a 76); los hallazgos no registran qué acciones llevaban esos eventos. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  14. Código y datos del autor, 3 de noviembre de 2026: la plantilla de resumen de avalancha de WAF del monitor, reescrita primero esa mañana como N WAF events in 5 minutes: B blocked, C challenged, U through con N el conteo sin bots, y después, tras la revisión de este post, como N WAF events in 5 minutes: B blocked, C challenged, U unmitigated (S from non-bot user agents) sobre cada evento muestreado, con los desafíos de JavaScript contados como desafiados; su motivo de bloqueo automático N WAF events from this address in 5 min; el desenlace «pending» escrito en una crítica antes de que se ejecute el bloqueo automático, que el resumen imprime como una ejecución cortada antes de que terminara la ruta de alerta; el conjunto de direcciones de la incorporación por lista de bloqueo (la propia dirección del hallazgo y las direcciones aptas para bloqueo automático) y su lugar antes de la incorporación por WAF; la verificación de duplicados del bloqueo automático, que hasta entonces funcionaba por sitio y por eso escribió dos veces en la lista la dirección del 2 de noviembre, pasada a funcionar por dirección ese día (las notas de diseño del monitor para esa versión y el log de operaciones del 3 de noviembre); la regla de salud de las ejecuciones del resumen (ejecuciones registradas, mediana de minutos entre ejecuciones, hueco más largo con su hora, señal en el asunto solo para un hueco de más de 20 minutos); y la vista previa de esa mañana, que decía «about one every 5.6 min» y «RUN GAP 31 min at 05:56». ↩↩↩↩↩↩↩↩↩↩↩

  15. Datos del autor: el log del escáner local del 1 de noviembre de 2026: el hallazgo crítico de las 10:03:04 contra spotlightknowledged de Apple al 74,9 por ciento de CPU y la línea «Critical email sent» de las 10:03:06; las dos críticas anteriores de ese día (00:48:55, los shims de la ruta), cada una seguida de un envío fallido; y las 14 críticas del log del 31 de octubre, entre ellas el patrón de gusano de IA a las 22:52:57 y cinco hallazgos «Claude hook modified» a las 22:41, cuatro de ellos seguidos de un envío fallido (los hooks se habían cambiado el 24 de octubre, como registra el log de operaciones del 31 de octubre). ↩↩↩↩

  16. Datos del autor: el registro de estado del programa de resúmenes después del resumen del 2 de noviembre: asunto «Mon Nov 2: 71 blocks on 15 zones, 11 criticals emailed, RUNS SHORT 162/207», ventana de 2026-11-01T21:48:49Z a 2026-11-02T15:05:17Z, 162 ejecuciones; el log del monitor registra el envío a las 07:05:19 PST. ↩↩

  17. Datos del autor: un análisis por script de los huecos entre ejecuciones sobre los logs del monitor del 1 y el 2 de noviembre de 2026. Para la ventana del resumen del 2 de noviembre (1036,5 minutos, 207 franjas de cinco minutos): 165 inicios de ejecución, 4 sin «run complete» antes del siguiente inicio; 160 huecos ordinarios, mediana de 5,60 minutos, media de 5,79, mínimo de 5,35, que suman 926,0 minutos (185 franjas); 4 huecos de más de 10 minutos, 103,0 minutos en total. Para el día calendario del 2 de noviembre (de medianoche a medianoche, 1440 minutos, 288 franjas de cinco minutos): 242 inicios, 46 menos que las franjas, ninguno sin terminar; 239 huecos ordinarios, mediana de 5,62 minutos, que suman 1374,7 minutos (unas 275 franjas); 2 huecos de más de 10 minutos, 35,8 minutos en total. La descomposición es aritmética aproximada a partir de estas cifras: unas 25,2 franjas de cadencia (los 160 huecos ordinarios abarcan 185,2 franjas de cinco minutos y contienen 160 ejecuciones), unas 15,6 franjas en los tres huecos de sueño (93,0 minutos, 18,6 franjas, tres ejecuciones), alrededor de 1,0 franja en el hueco de 10,0 minutos tras la ejecución de las 14:19, y 3 ejecuciones no registradas, unas 45 en total. ↩↩↩↩↩↩↩↩↩

  18. Datos del autor: el historial de configuración del monitor, leído de su repositorio: armado el 31 de octubre a las 22:44 PDT (un correo por crítica y por fin de sesión); 1 de noviembre, 00:46 PDT (una crítica incorporada al correo de bloqueo); 1 de noviembre, 13:50 PST (resumen activado a las 07:00, correo por bloqueo desactivado, críticas resueltas por el borde incorporadas); 1 de noviembre, 14:00 PST (sin cambio de configuración; el código de la incorporación por WAF cambió para contar cada evento y exigir una muestra completa). ↩↩↩↩↩↩↩

  19. Log de operaciones del autor (Captain’s Log) del 31 de octubre de 2026: los envíos del escáner local que fallaban por el error 1010 de Cloudflare ante el user agent predeterminado de Python, reproducido con una clave mala; el conteo de 13 envíos fallidos frente a 14 críticas esa noche; los correos de la nube que «most likely were» entregados. ↩↩↩↩

  20. Resend, “Event Types,” documentación de webhooks, consultada a las 14:23:37Z: la definición de email.sent, citada, y email.delivered como evento aparte. ↩↩↩↩

  21. Resend, “Send Email,” referencia de la API, consultada a las 14:18:59Z: el cuerpo de la respuesta es un id. ↩

  22. Datos del autor: el 1 de noviembre de 2026 por hora local, del mismo script, con la hora de la 01:00 separada para PDT y PST: correos por hora (22 en la hora de la medianoche, todos sin verificar), alertas incorporadas o suprimidas por hora, el último correo por bloqueo a las 13:25:57 y el primer aviso por bloqueo incorporado a las 14:20:35. ↩↩↩↩

  23. Cloudflare, “Querying Firewall Events with GraphQL,” documentación de Analytics, consultada a las 14:19:01Z: los campos de la consulta, incluido action, y una salida de ejemplo con "log" y "block"; la página no enumera todos los valores de acción. ↩↩

  24. Cloudflare, “Security Events,” documentación del WAF, consultada a las 14:23:10Z: la definición de los eventos de seguridad, la frase de que una solicitud puede generar varios eventos y la frase sobre el muestreo, citadas. ↩↩↩

  25. Notas de diseño del autor para el escáner local, «Check fixes and false positives»: «most of the CRITICALs it raised in its first live days were its own noise», la tabla de falsos positivos (el Python de Homebrew, Xcode, las compilaciones de apps del autor, la autocoincidencia de event taps, los shims de gestores de versiones, el patrón de gusano de IA en las instrucciones de agente de otro proyecto) y la entrada sobre firma de código, citada; el escáner envía por correo sus propias críticas. ↩↩↩↩↩

  26. Cloudflare, “Cloudflare Alerts,” documentación de Notifications, consultada a las 14:19:00Z: las dos categorías de alertas, citadas; los Monitors como consultas programadas a la SQL API y las Platform Notifications como alertas de producto preconfiguradas, ambas creadas desde el panel, con entrega por correo en todos los planes. ↩↩

  27. Ewaschuk, “Monitoring Distributed Systems,” consultado a las 14:18:54Z: el pasaje sobre las páginas que llegan con demasiada frecuencia, citado. ↩↩

  28. Ewaschuk, “Monitoring Distributed Systems,” consultado a las 14:18:54Z: el caso de estudio de un equipo que clasificaba alertas, y la nota al pie 24 que remite a la gestión de alarmas cardíacas «for an example of alert fatigue in another context», citada. ↩↩

  29. Rob Ewaschuk, “My Philosophy on Alerting,” Google Doc, leído desde su exportación HTML, consultado a las 14:18:55Z: la nota del documento de que sus ideas sientan las bases del capítulo del libro de SRE, «Pages should be urgent, important, actionable, and real», y el pasaje sobre las alertas basadas en causas y el título de su sección, citados. ↩↩↩

  30. Ewaschuk, “My Philosophy on Alerting,” consultado a las 14:18:55Z: el pasaje sobre el informe diario, su salvedad sobre la rendición de cuentas y su llamado a designar a una persona para clasificar el informe cada día, citados. ↩↩↩↩↩↩

  31. Steven Thurgood, con Jess Frame, Anthony Lenton, Carmela Quinito, Anton Tolchanov y Nejc Trdin, “Alerting on SLOs,” capítulo 5 de The Site Reliability Workbook (Google, O’Reilly Media), consultado a las 14:18:55Z: las definiciones de precisión, exhaustividad (recall) y tiempo de reinicio, citadas. ↩↩

  32. NIST, SP 800-61 Revision 2, Computer Security Incident Handling Guide (2012, sustituida), consultada a las 14:18:58Z: la frase de «thousands or even millions», citada. ↩

  33. NIST, SP 800-61 Revision 3 (abril de 2025), consultada a las 14:18:57Z: su declaración de que sustituye a la r2, y la recomendación R1 en Adverse Event Analysis, citadas. ↩

  34. Vectra AI, “2023 State of Threat Detection” (encuesta de proveedor; de marzo a abril de 2023, encargada por Vectra, trabajo de campo de Sapio Research, 2.000 analistas de seguridad en organizaciones de más de 1.000 empleados en diez mercados), consultada a las 14:22:49Z: 4.484 alertas al día y el 67 por ciento ignoradas, según lo informado por los encuestados. ↩↩

  35. Código del autor: la descripción del programa de resúmenes («One email a day … in place of an email per auto-block and per WAF-handled CRITICAL»; «The digest is also the heartbeat: it goes out on a quiet day too»; el periodo de meses en que el monitor estuvo muerto a principios de 2026) y, a 2 de noviembre, su regla de ejecuciones esperadas como minutos de la ventana divididos entre cinco. ↩↩↩↩↩↩↩↩↩

  36. Cloudflare, “Actions reference,” documentación de Ruleset Engine, consultada a las 14:19:01Z: las acciones block, challenge, skip y log, las definiciones de challenge y de log, citadas, y skip y log enumeradas como no terminales. ↩↩↩↩

  37. Datos del autor: hallazgos críticos por desenlace registrado y categoría del archivo de hallazgos del monitor, por fecha UTC. 1 de noviembre: 129, de los cuales 118 no llevan desenlace: 117 levantados antes de que se registraran desenlaces (entre ellos las categorías de procesos, hooks y cadena de suministro del escáner local, que nunca llevan uno), y una crítica de escáner de la nube a las 14:13 PST, posterior al cambio, cuya última línea registrada de la ejecución es el bloqueo automático que disparó (el log del monitor del 1 de noviembre). 2 de noviembre: 236 (160 incorporadas porque la dirección estaba bloqueada, 1 incorporada porque el WAF la resolvió, 58 suprimidas, 14 enviadas por correo, 3 locales sin desenlace). ↩↩

  38. Datos del autor: el log del monitor del 1 de noviembre de 2026: tres ejecuciones (iniciadas a las 14:09:49, 14:19:46 y 23:10:31) cuyas últimas líneas caen unos cuatro minutos después del inicio, sin ninguna línea de watchdog, timeout o kill registrada, que el autor interpreta como el watchdog de 240 segundos del monitor (el código mata una ejecución a los 240 segundos), y una ejecución iniciada a las 14:36:06 que termina a las 14:36:34 sin «run complete». ↩↩

  39. Reproducción del autor, 3 de noviembre de 2026, de la propia verificación de avalanchas de formularios del monitor sobre datos completos de Cloudflare de 18:58:23 a 19:03:23 UTC del 2 de noviembre (de 10:58:23 a 11:03:23 PST), que levanta el hallazgo que la ejecución en vivo pasó por alto, con severidad alta (que el monitor envía al resumen, no al correo ni a la lista de bloqueo), a partir de 39 envíos con 23 rechazados, y cuenta 2.143 solicitudes de la dirección donde la ejecución en vivo contó 1.914; las dos causas tal como se leen en el código del monitor ese día (la ventana de cada ejecución terminaba en el instante en que preguntaba el detector, antes de que los datos más recientes de Cloudflare hubieran llegado por completo, y las miradas de cinco minutos hacia atrás en ejecuciones iniciadas con más de cinco minutos de separación dejaban sin escanear parte de cada intervalo) y la corrección hecha ese día (las ventanas en vivo se encadenan a partir de un registro del final de la ventana anterior y terminan 90 segundos antes; un registro faltante, uno de menos de 60 segundos o uno de más de 15 minutos vuelve a una mirada de cinco minutos hacia atrás; las reproducciones nunca leen el registro), con una reproducción de la misma ventana con el código modificado que da hallazgos idénticos, lo que muestra que el cambio dejó intacta la detección en una ventana fija y no pone a prueba el encadenamiento ni el retraso; los envíos del escáner al formulario de contacto según el log de operaciones del autor del 2 de noviembre. La reproducción con el código del 3 de noviembre está guardada con el resto de la evidencia de este post: sus comandos exactos, la ventana que leyó y la salida completa del detector para la ventana de la ejecución y para los minutos del formulario de 18:58 a 19:05 UTC, ejecutada a las 15:55:04 UTC del 3 de noviembre. La primera reproducción, hecha antes ese mismo 3 de noviembre con el código tal como estaba antes de la corrección, está registrada en mis notas del programa con los mismos conteos; su salida en bruto no se guardó. ↩↩↩↩↩

  40. Datos del autor: el log del escáner local del 2 de noviembre de 2026 y la vista previa del resumen del 3 de noviembre: tres hallazgos críticos «Browser -> shell chain» a las 13:50 PST, una shell que lanza curl, sin resolver en el archivo de hallazgos. ↩↩

  41. Datos del autor: la resolución registrada en el hallazgo de spotlightknowledged del 1 de noviembre en el archivo de hallazgos, citada. ↩

  42. Cloudflare, “Error 1010,” documentación de soporte, consultada a las 14:19:00Z: la definición del error y el ejemplo de urllib de Python, citados; la página da ese ejemplo para solicitudes a hostnames *.pages.dev y *.workers.dev y a dominios personalizados de Pages. ↩

  43. Log de operaciones del autor (Captain’s Log) del 2 de noviembre de 2026: la línea de RUNS SHORT, citada. ↩

  44. Datos del autor: el registro de energía de la Mac (líneas de Sleep y Wake desde el 1 de noviembre a las 13:40 PST): reposo por inactividad a las 23:21:30 y despertar completo a las 00:30:05; reposo por inactividad a las 06:01:20 y despertar completo a las 06:30:28. ↩

Artículos relacionados

Observabilidad de agentes de IA: monitorear lo que no puedes ver

Los agentes de IA consumen disco, CPU y red sin ninguna visibilidad para el operador. Tres capas de observabilidad cierr…

29 min de lectura

Durante la noche

Entre medianoche y las 6am, Googlebot rastrea 21.000 páginas, Bingbot 10.000 y la verificación 15.000. El sitio está más…

8 min de lectura

El Bucle Ralph: Cómo ejecuto agentes de IA autónomos durante la noche

Construí agentes autónomos con stop hooks, presupuestos de generación y memoria en archivos. Los fracasos y lo que produ…

12 min de lectura