Skip to content

feat(alertas): las evaluadoras del sistema se pueden apagar una por una

Rafael Bautista requested to merge ti into qa

Las siete viven en código y no tenían forma de pausarse: el único interruptor era alerts_enabled, que apaga TODO. En QA eso obliga a elegir entre aguantar alertas de otras áreas calculadas sobre datos de prueba, o quedarse sin poder probar las propias. Las reglas declarativas ya se pausaban una por una (AlertRule.activa); esto empareja a las de código.

El caso que lo detonó: salió un correo [CRÍTICO] 280 créditos con >30d de atraso desde evaluate_credito_atrasado, a toda el área de Finanzas más los admins, y con dedupe_window de 1 día — o sea, todos los días.

El estado vive en kpi_parameters (alert_eval_<name>_enabled), mismo lugar que alerts_enabled y alert_email_enabled, y el parámetro sólo se crea cuando alguien apaga una: ausente significa encendida, así que ningún entorno cambia de conducta mientras nadie toque el interruptor.

Apagada es apagada también a mano: POST /alerts/run sobre una evaluadora pausada responde 409 en vez de emitir. Dejar que un clic le escribiera a la gente sería la peor sorpresa posible — se apaga justamente para que deje de hacerlo.

Y la corrida REPORTA lo que no corrió (evaluadoras_apagadas). Apagar una es una decisión, pero su efecto —cero alertas de esa familia— es idéntico a «no había nada que avisar»; sin decirlo, en un mes nadie recuerda por qué Finanzas dejó de avisar. Es la misma razón por la que existen las incidencias.

El log ahora dice a quién le llegó y de dónde salió

El detalle por alerta traía conteos. Un conteo no contesta la pregunta que se hace quien lo lee, que es «¿me llegó a mí?» y «¿qué alarma mandó esto?».

  • Destinatarios por nombre, cada uno marcado según lo que recibió: correo, sólo campana, o excluido del correo por la lista de infraestructura. Los inactivos se marcan.
  • _emit_email devuelve a quién le escribió (enviados, excluidos, el asunto), no sólo cuántos.
  • Procedencia: para una regla declarativa, cuál es, qué midió, contra qué umbral y sobre qué tabla; para una built-in, su nombre. Sin esto el renglón nombra la alerta pero no permite llegar a lo que la produjo — que es exactamente lo que pasó con el correo de créditos.
  • Ventana anti-repetición, marca de modo prueba y el enlace de destino.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0116hwhMUGwq5tsrsNxMYoZm

Merge request reports

Loading