CreaRack-SL

57 correos de "cambio de Primary" en 7 días sin un relevo real — reconexión tras micro-corte

Cuándo

15-09-2026 (v1.132.11, task #304). Detectado por volumen de correo: 57 avisos de “cambio de Primary” en 7 días para una flota donde no hubo 57 relevos reales.

Síntomas visibles

Cada vez que el Agente Sentinel se reconectaba tras un micro-corte de red (sin cambiar de máquina), el sistema enviaba el correo de “cambio de Primary” como si un Agente distinto hubiera tomado el rol. El equipo recibía docenas de avisos sin que hubiera pasado nada operativamente relevante — ruido que entierra el aviso real cuando sí hay un relevo entre máquinas distintas.

Causa raíz

La reconexión del mismo Agente rellenaba from_agent_id con el último Primary registrado en el historial, no necesariamente con el Agente que tenía el rol justo antes de la reconexión. Cuando ambos valores (el histórico y el actual) coincidían en el mismo agent_id físico, el código igualmente dejaba disparar el correo porque no comprobaba si el cambio era de máquina o solo una reconexión.

Fix aplicado

eba1b755 — el correo de “cambio de Primary” solo sale cuando el Sentinel cambia de máquina (comparación explícita del agent_id físico antes/después). La fila del historial de cambios se sigue guardando siempre, cambie o no de máquina — solo se silencia el correo, no el registro.

  • terminal/fleet_events.py — condición de envío del correo.
  • terminal/fleet_lifecycle.py — guardado del historial, sin condicionar.
  • Test: tests/api/test_fleet_primary_noise_304.py (153 líneas).

Lecciones

Un evento de infraestructura (aquí, reconexión de red) puede disparar una notificación pensada para un evento de negocio (relevo de Primary) si el código no distingue explícitamente ambos casos. El volumen de correo (57 en 7 días) fue la señal que destapó el problema — sin ese conteo habría quedado como “ruido de fondo aceptado”.

Preventivos futuros

Cualquier notificación basada en un cambio de estado de la flota de Agentes debe comparar el identificador físico antes/después, no solo la presencia de una fila nueva en el historial.

Véase también

  • [[decision—20260919—agente-reload-targets-rest-en-vez-de-subir-tope-websocket]]
  • [[incident—20260917—agente-tanda-trafico-equipo-mudo-ccib]]
  • [[incident—20260917—notificacion-agente-retraso-transaction-on-commit]]