A rota can distribute responsibility, but equal shift counts do not guarantee equal burden. Review nighttime pages, incident effort, recovery time, and reliable backup alongside the schedule.

A job that is shared

On-call work is a job that belongs to a team, not to one hero. A rotation turns ‘whoever was last awake’ into a defined roster and a schedule, so responsibility is explicit and no one is assumed to carry the whole queue indefinitely. The schedule itself — a weekly handoff, a backup/secondary on-call, a follow-the-sun structure across sites — is how you keep the obligation sustainable without letting it turn into a possession. Don’t let the urgency of tonight’s page decide who owns tomorrow; the rotation decides on purpose, ahead of time.

Handoff is half the craft

Handoff is where a rotation most often breaks. When the incoming person inherits a blank slate, what should be a handoff becomes a re-investigation. Two habits close that gap: a written handoff (what is broken, what has been tried, what the next person should own) and an overlap window so the incoming engineer is shadowed by the outgoing one before they leave. A rotation that swaps names but not context turns the same incident into a fresh one every week. The craft is not the schedule; it is the continuity the schedule protects.

Rehearse before the bell rings

The time to rehearse is before the pager rings, not during. Run the runbook in quiet hours, drill the restore path (not just the diagnosis), and map each alert to a decision tree so a cold Sunday-morning page is a checklist rather than a riddle. Rehearsal improves the team’s options under pressure: the cheap, repeatable steps taken calmly in daylight are what keep the team from improvising during the real incident. That rehearsal is the difference between ‘we will figure it out’ and a boring, repeatable process.

When it breaks

Single-person coverage looks simple until it breaks the person. One engineer holding the pager for months stops sleeping well, dreads every notification, and eventually burns out or quits; Google’s SRE guidance emphasizes sustainable workload and staffing. The fix is a bounded rotation with a maximum tour length and a real off-call week where the previous primary is not the silent backup.

A broken escalation chain fails differently. If the secondary never acknowledges, contacts are stale, or paging the manager reaches a mailbox nobody reads, a 3 a.m. incident waits while the primary debugs alone. Rehearse the chain like a restore: page the secondary in business hours and confirm a human answers within minutes.

Alert fatigue is the third failure. Hundreds of noisy, unactionable alerts teach the team the pager lies, so the one real page is swiped away with the rest. Every alert needs an owner, a runbook link, and a threshold tuned after the last false positive.

Missing handoffs complete the set. The name changes on Monday with no written state, so Tuesday repeats Monday’s investigation from scratch. Require a short note — symptoms, tried steps, next move — plus a fifteen-minute overlap before the old primary goes dark.

The fictional rota cycles five people across twenty consecutive weeks with distinct primary and secondary responders. The first five weeks include two invented special-coverage weeks; repeating the cycle gives each person four turns per role, without proving equal burden.
Keep both roles covered through every week. Static illustration of the source and its limits. Reported fixture outcomes were not rerun for this graphic.

Check it quickly

Use this paper-model exercise before publishing a schedule. It assigns fictional primary and secondary responders for twenty consecutive weeks. Two invented special-coverage weeks remain staffed; they are not assertions about any country’s holidays. A real continuously operated service still needs coverage when an engineer is on leave.

  1. Save the snippet as rota_probe.py in an empty directory.
  2. Run python3 rota_probe.py with Python 3.9 or newer; it touches no network or files. Run without -O, -OO, or a nonzero PYTHONOPTIMIZE setting so the assertions execute.
  3. Check the weekly assignments, role counts, and final PASS line.
from collections import Counter
from datetime import date, timedelta

TEAM = ["ana", "ben", "cara", "dev", "elin"]  # fictional names
START = date(2027, 8, 2)
WEEKS = 20
SPECIAL_WEEKS = {START + timedelta(weeks=1), START + timedelta(weeks=4)}
rota = [(START + timedelta(weeks=i), TEAM[i % 5], TEAM[(i + 1) % 5])
        for i in range(WEEKS)]
assert len(rota) == WEEKS
assert len({week for week, _, _ in rota}) == WEEKS
assert all(primary != secondary for _, primary, secondary in rota)
assert all(primary in TEAM and secondary in TEAM for _, primary, secondary in rota)
assert all(b[0] - a[0] == timedelta(days=7) for a, b in zip(rota, rota[1:]))
assert all(a[1] != b[1] for a, b in zip(rota, rota[1:]))
primary_counts = Counter(primary for _, primary, _ in rota)
secondary_counts = Counter(secondary for _, _, secondary in rota)
assert set(primary_counts.values()) == {4}
assert set(secondary_counts.values()) == {4}
for week, primary, secondary in rota:
    marker = " special-coverage" if week in SPECIAL_WEEKS else ""
    print(f"{week}: primary={primary} secondary={secondary}{marker}")
assert sum(week in SPECIAL_WEEKS for week, _, _ in rota) == 2
print("primary:", dict(sorted(primary_counts.items())))
print("secondary:", dict(sorted(secondary_counts.items())))
print("PASS: 20 covered weeks, distinct backup, four turns per role; special weeks remain staffed")

Every week has distinct primary and secondary names, including both marked weeks. Each engineer receives four turns in each role, and adjacent weeks have different primaries. These assertions passed in Python 3.12.14 during this review. They establish the stated roster properties only; equal counts do not measure equal overnight interruptions, overlapping incidents, availability, time zones, compensation, or recovery time. Obtain team agreement on those constraints and test the actual escalation contacts before activating a real rota.

Further reading

Sources