Most nasty incidents are not new. They are a simmering problem from the previous shift that never got mentioned in the handoff. The gap between rotations is where context evaporates.
Handoff is a ritual, not a Slack ping
"You're up, nothing to report" is not a handoff. A real handoff transfers the state of the world: what is fragile right now, what is being watched, and what the outgoing engineer would worry about if they stayed on.
The five-item checklist
- Open incidents — anything active or recently resolved but not trusted.
- Silenced alerts — what is muted, why, and when the mute expires.
- Ongoing changes — deploys, migrations, or experiments in flight.
- Fragile spots — the thing that has been flapping that you have a bad feeling about.
- Follow-ups — tickets the next shift should not let drop.
Generate half of it automatically
The checklist writes part of itself. A query surfaces the silences that outlive their reason and the alerts that fired during the shift:
alerts
| where fired_at > now() - 12h
| stats count() by name, status
| sort count desc
Write it down
Verbal handoffs vanish. We keep a short running handoff note per rotation, so the incoming engineer reads five lines instead of reconstructing twelve hours from memory. It costs the outgoing person two minutes and saves the incoming one an outage.