The escalation/approval dispatchers spawn a notification's recipient every
cooldown window for as long as it stays pending. These spawns carry no
task_id, so the PM respawn breaker never sees them — a single wedged
alert/escalation whose recipient never resolves it respawns that recipient
forever. Observed live: fe-pm's unacked alerts kept main-pm/fe-pm spawning
every ~2-3 min for 6+ hours.
Two guards, both gating the spawn after the existing cooldown:
- A hard per-(agent, notification) attempt cap (notification_spawn_max_attempts,
default 5): once a notification has respawned its target that many times
without being acknowledged, stop and log once. The count is id-scoped and
survives map pruning (re-stamp), so a fresh escalation is unaffected.
- A live-work check before spawning: skip when the notification has expired,
is stale past notification_spawn_max_age_seconds (default 6h — wedged or
reloaded from before a restart), or its related task is already terminal.
Fail-open — a failed task fetch or unparseable field never suppresses a
real escalation.
Co-authored-by: Renn F <rennf93@users.noreply.github.com>