Jump to content

On-Call Rotations Quietly Tax Your Most Senior Engineers

Engineering Culture Silas Whitlock

Equal Pager Shifts Can Hide Unequal Interruptions

Even with a round-robin schedule, legacy-system escalations can keep returning to the same engineers. A standard 5-person rotation appears to distribute on-call duty into equal 168-hour blocks, yet unlogged direct messages for risky recovery validation routinely pull specific legacy maintainers into 3 to 5 off-shift incidents per week.

Audit Actual Incident Participation

Stop equating calendar blocks with operational load. Measure actual participation rather than scheduled coverage, isolate legacy services that depend on individual experts, and allocate protected engineering time within sprints to transfer diagnostic reasoning into deterministic tooling.

Most engineering leadership teams evaluate rotation fairness by auditing pager schedules. When five engineers each hold one 7-day primary shift every five weeks, the spreadsheet looks balanced. The illusion usually holds until a staff engineer requests a transfer or quits. Cross-referencing chat thread timestamps with pager logs inevitably exposes the discrepancy: off-rotation validation requests occur on not far from four out of five legacy alerts.

This hidden burden consists of substantive assistance delivered outside the assigned shift. Senior engineers spend their supposed downtime answering urgent direct messages, diagnosing unfamiliar failure modes across coupled software architecture, and validating risky recovery actions for hesitant primary responders. Because the pager never officially fires for the backup engineer, management sees a healthy rotation while the team's foundational maintainers burn out.

How the Same Legacy Experts Become Everyone’s Backup

Why does a fully credentialed primary responder still need a nanny during a routine outage? Granting an engineer access to dashboards and deployment tools differs entirely from giving them the operational context required to use those tools safely.

Trace a representative escalation path during a legacy-service outage. The primary responder receives an alert and spends 10 to 15 minutes reading dashboard metrics and executing the initial steps of the standard runbook. Then they hit the end of the documented path—often a vague instruction like "verify downstream consumer lag before restarting." Lacking documentation on which internal queue holds unacknowledged messages or how historical workarounds affect state, the responder stalls. They have the command-line permissions to restart the service, but they cannot evaluate whether a process restart will corrupt in-flight transactions.

Instead of triggering the noisy secondary escalation policy, the responder opens a chat client and direct-messages the engineer who wrote the subsystem years ago. They wait for that familiar expert to wake up, read the metrics, and interpret the system's behavior.

These informal direct messages bypass the visible rotation entirely. Automated incident timelines only log the user ID that executed the final deployment or pod restart command, erasing 20 to 45 minutes of backchannel diagnostic coaching delivered via direct messages. The off-rotation burden mechanisms differ along two operational dimensions: visibility in standard pager logs and the required remediation artifact.

  • Unlogged DM diagnostic coaching: Completely invisible in standard pager and audit logs. Eliminating it requires extracting tribal intuition into an explicit decision-tree runbook.
  • Permission-blocked command execution: Partially visible if someone audits infrastructure trails, showing where a senior engineer had to run a restricted command. Fixing it requires IAM or database role scope adjustments for the primary rotation.
  • Undocumented stateful restart validation: Attributed solely to the primary responder who clicks the restart button after receiving a thumbs-up in chat. Removing this bottleneck requires building automated pre-flight state checks into the developer tooling.

The Cost Continues After the Incident Ends

Incident metrics track time to resolution, assuming that once the alert clears, the operational cost hits zero. That math ignores human biology and cognitive context switching. A 12-minute direct-message consult at 02:30 local time rarely registers on timesheets, yet the resulting sleep fragmentation degrades deep-focus architecture and code review capacity across the entire following 8-hour workday.

When teams try to fix this solely through policy, the underlying fragility of the software architecture surfaces immediately. One engineering group attempted to protect architectural migration work by instituting a strict "do not disturb" status for off-rotation staff engineers during sprint weeks. They dropped the policy days later after primary responders simply stalled incident remediation for hours rather than risk executing unverified database failover scripts on their own.

Repeated interruptions create a vicious cycle. Exhausted senior engineers defer complex architecture work, postpone preventative maintenance, and lose the bandwidth required to teach other responders. The expectation of remaining reachable while off rotation solidifies into an unofficial permanent-backup role. When that unsustainable job expectation finally drives the expert out of the organization, mean time to resolution for stateful legacy services routinely expands from under 30 minutes to multi-hour exploratory debugging sessions because recovery reasoning was never separated from the individual.

Measure Who Responds, Including People Off Rotation

You cannot fix shadow escalations with an automated weighted burden score—those algorithms just disguise subjective severity judgments as mathematical precision. Instead, run a biweekly 30-minute review of raw incident timelines, manually tagging any participant who contributed diagnostic decisions outside their scheduled shift.

Measure Who Responds, Including People Off Rotation

Use a consistent 14-day or 28-day review window to compare scheduled pager coverage against actual incident participation. Whenever substantive help is delivered through direct messages, copy that participation directly into the incident timeline. Treat these signals as service-improvement inputs rather than individual performance rankings, because incident complexity and responder roles differ across the engineering culture.

Signal Collection Method Operational Response
Off-rotation participation Log incident ID, service name, responder handle, and scheduled status across a 14-day or 28-day window, capturing substantive DM help in the timeline. Rebalance immediate sprint commitments and enforce recovery rest buffers for unscheduled responders.
After-hours interruption episodes Calculate wake-ups against each responder's local 09:00 to 17:30 working window rather than a single headquarters timezone, separating distinct wake-up counts from total active keyboard time. Audit alert thresholds and isolate services causing sleep fragmentation regardless of resolution speed.
Escalation concentration Categorize blocked recovery steps by service into explicit buckets: missing IAM/database permissions, undocumented dependencies, or ambiguous restart sequencing. Prioritize sprint deliverables to remove the exact recovery step triggering the handoff.

Tracking escalation concentration matters because alert volume and expert dependence answer entirely different questions. A noisy stateless web tier might fire twenty alerts a week that any junior engineer can resolve in two minutes. A quiet legacy daemon might fail thrice a month, yet require the same principal engineer every single time. You must distinguish legitimate specialist escalation from routine operational dependence by evaluating frequency and failure novelty: paging a domain creator for an uncatalogued race condition after a kernel upgrade is a healthy escalation boundary, whereas consulting that same engineer three times a month to verify whether a stalled legacy worker queue can be safely flushed without replaying customer transactions indicates a broken operational handoff.

Turn Expert Rescues Into Repeatable Recovery

Once your timeline audit highlights the services driving off-rotation rescues, resist the urge to simply reshuffle the on-call calendar. Rotating names alone leaves the technical dependency intact. You have to fix the recovery tooling and documentation before expanding the responder pool.

Do not task junior responders with updating documentation during their chaotic on-call week. They lack the architectural context to write safe boundary conditions. Instead, reserve 4 to 8 hours of protected engineering time per two-week sprint specifically for decomposing top repeat-escalation services. Pair the legacy expert with a secondary responder and treat runbook decision trees, safer recovery tooling, and permission fixes as tracked sprint deliverables with an explicit owner.

Meanwhile, protect the humans keeping the system alive today. Enforce an explicit 8-to-10-hour rest buffer the following morning whenever an off-rotation engineer is paged into an overnight incident lasting longer than 30 minutes.

When the pair sits down to extract a backchannel rescue into a repeatable process, ban the practice of pasting raw bash history into a wiki page. A transcript of commands tells the next responder what the expert typed, but conceals why it was safe to type it. Structure executable runbooks around five mandatory fields:

  1. Observable symptoms: The exact alert names, log signatures, or metric anomalies that trigger this workflow.
  2. Exact read-only diagnostic commands: Queries or CLI invocations that inspect system state without mutating data.
  3. Explicit decision thresholds: Concrete numerical or state boundaries that dictate the next branch in the tree.
  4. Safe recovery actions: The exact mutation commands to run once the pre-flight thresholds are satisfied.
  5. Hard stop conditions: Specific system states where automated or primary recovery must abort and escalation becomes mandatory.

Work Through a Legacy-Service Escalation

Consider a stalled legacy billing worker that repeatedly pulls the same senior engineer into unscheduled rescues. The primary responder can see the consumer lag alert firing, and they have the Kubernetes permissions to delete the pod, but restarting the worker safely depends on understanding internal queue state to avoid replaying customer transactions.

Step one occurs during the incident review: stop treating the recovery as an invisible favor. The incident commander updates the ticket timeline to log both the primary responder and the senior engineer, explicitly marking the senior engineer's DM consultation as off-rotation participation and categorizing the blocker under ambiguous restart sequencing.

Step two happens during protected sprint time: isolate the exact dependency. By interviewing the senior engineer, the team discovers that her recovery decision hinged on a single undocumented check: verifying whether the dead-letter table contained uncommitted batch IDs with timestamps older than 300 seconds before issuing a worker kill signal. If zero rows return, a restart is safe; if rows exist, restarting replays billing events.

Work Through a Legacy-Service Escalation

Step three converts this tribal check into deterministic workflow:

-- Run against billing-db-replica before restarting billing-worker
SELECT count(*) AS stuck_batches 
FROM billing_dead_letter_queue 
WHERE status = 'UNCOMMITTED' 
  AND created_at < NOW() - INTERVAL '300 seconds';
-- Decision Threshold: 
-- If stuck_batches = 0, proceed with pod restart.
-- Hard Stop: If stuck_batches > 0, DO NOT RESTART. Page billing-storage tier.

The infrastructure lead grants read-only replica access to the entire on-call pool and embeds this exact query, threshold, and stop condition into the alert runbook. Finally, the team validates the handoff: during a 45-minute staging rehearsal, the next scheduled responder executes the queue-state verification query and completes the worker restart while the legacy expert observes on mute with hands off the keyboard.

Never Miss an Update

Fresh insights every week.

No spam. Unsubscribe anytime.

Your Thoughts

Share your thoughts.

Join the Discussion

Manage your preferences