OnCallRotation — 12-Week Schedule + Fairness Scoring
24 engineers × 12-week on-call schedule. Primary + secondary + follow-the-sun coverage. Fairness scored on 4 axes (weekend equity, holiday equity, page-load equity, time-zone alignment). Surfaces 4 engineers carrying disproportionate weekend duty + 1 timezone-coverage gap (no APAC primary 03:00-09:00 UTC).
What it is
The shape behind every fair on-call program. Most teams build the schedule once, then never audit fairness — until burnout produces a single resignation that explains the year of weekend coverage they were quietly absorbing.
What’s in it
- 24 engineers × 12-week schedule as a 24×12 colored matrix (P1 primary / P2 secondary / WE weekend / H holiday).
- 3 regions — NA (PT/ET), EMEA (CET/GMT/UTC+5:30), APAC (SGT/JST). Each engineer’s TZ explicit.
- 4-axis fairness scoring per engineer:
- Weekend equity — count of weekend duties vs team mean
- Holiday equity — same for holidays
- Page-load equity — total duty weeks vs team mean
- Time-zone alignment — does primary coverage fit local working day
- Worst-offender findings:
- E07 (Olu) — 4 weekend duties vs 2.5 team mean
- E13 (Diego) — 4 weekend duties + carrying both primary + secondary in same week
- E17 (Cesar) — 5 weekend duties — most in the team
- E23 (Aaliyah) — 3 weekend duties
- Recommendations per engineer — explicit swap suggestions (“carrying 2 more weekend duties than the team mean — swap with an engineer below mean”).
Why this shape
Google SRE Workbook ch. 9 explicitly addresses on-call fairness as both an ethical and a long-term-reliability issue. PagerDuty schedule guidance recommends max 25% of weeks per engineer. ILO Convention 47 (40-hour week) + EU Working Time Directive 2003/88/EC apply to on-call hours under recent CJEU rulings. The hardest finding to fix without OnCallRotation: knowing WHICH engineers are carrying the disproportionate load before they leave.
How it ships
Single HTML file, ~18KB. Zero dependencies. 24 engineers × 12-week schedule × 4-axis fairness in 200 lines of vanilla JavaScript.