Page the next person when nobody answers #16
Reference in New Issue
Block a user
Delete Branch "escalation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #6 — and closes the thing this whole line of work was opened for. Until now an unacknowledged incident re-paged the same topic every
notify_repeatforever, which is a louder version of the same silence: if the person on call is asleep, out of signal, or has left, nothing else happened.The ladder
Each level has a timeout and targets; a target is a named person or whoever the rota says is on call today — the kind that keeps working when the rota changes and nobody remembers to edit the policy.
The incident stays open throughout: running out of people to wake is not somebody answering.
Decisions worth arguing with
nobody reachable, and the ladder moves on. Stalling on a rung that cannot ring would be this feature's own failure mode wearing its clothes.It rides the notifier's existing 30-second tick and outbox rather than adding a second scheduler, and runs before delivery so a level due on a tick is paged on that tick.
Verified
make fmt lint test helm-lintgreen with-raceagainst Postgres 17, plus eleven new tests. They back-dateescalation_level_atthe way the dead-man tests back-datereceived_at— the sweeper reads a stored timestamp, so moving the timestamp is moving the clock.Also driven against a live server with a real ntfy stand-in: alice paged → nobody answers → bob paged → nobody answers → fallback topic paged once, with the timeline reading
level 2: bobthenescalation exhausted: paged terdut-oncall-all. Then a second incident acknowledged before its timeout, which woke nobody else.Three of my own test bugs surfaced on the way and are worth noting because they were all "the test was wrong, not the code": reminders need a
RepeatEveryin the config to run at all, snooze takes a duration string rather than minutes, andnotifyTSalready puts the admin on call.Not in here
No UI. The team-settings screens for escalation, integrations and dead-man switches are all still missing, and they're one piece of work rather than three.
https://claude.ai/code/session_01RHPj4ggeFdEjKKfm4SHbD7