How we measure reliability.
Every number here — for Metrobus and Metrorail alike — is derived from the same real-time feeds the agency publishes, scored against ground truth we reconstruct ourselves. No schedules taken at face value, no agency-supplied grades. This is what the data actually shows.
Expected wait the headline
The single most honest number for a rider: how long you actually wait at a stop or platform you arrive at randomly, once vehicles bunch and gaps open up. It is not half the scheduled headway — irregularity makes the real wait longer.
Where h̄ is the mean headway (time between buses) and CV is its coefficient of variation — the random-incidence wait. A perfectly even route waits half a headway; a bunched one waits much more. System-level summaries of this number are per-route medians, not ridership-weighted — they describe the typical route, not the typical rider's trip.
The metrics
- Mean headwayAverage observed time between consecutive vehicles at a stop or platform, per direction.
- Headway regularityCoefficient of variation of headways. Lower is steadier; high values mean bunching and long gaps.
- On-timeShare of arrivals within a window of schedule — measured per mode. Bus: 1 minute early to 5 minutes late. Rail: 2 minutes early to 5 minutes late — the early side is looser than bus because an early train, unlike an early bus, doesn't leave you behind.
- Schedule deviationMedian minutes off schedule. Positive means running late.
- Detour rateShare of trips that left their scheduled path — surfaced, not hidden. (Bus; rail runs fixed track.)
- GradeAn A–F letter summarizing punctuality, on an absolute scale, not a curve. Each mode is calibrated to its own realistic range: a C is a median route/line, an A is genuinely strong, an F is the real bottom. Because the on-time window and the achievable range differ by mode, a rail letter is not directly comparable to a bus letter — each is graded within its own mode's reasonable tolerance. Expected wait is still the headline number.
- TrendThe arrow by a grade is week-over-week: average on-time over the last 7 days vs the 7 before. ↑ improving, ↓ declining, → steady (small swings are treated as steady, not noise). We compare full weeks so day-of-week differences cancel out, and we show nothing until there's enough history to be honest — no arrow on a route we've only watched a few days.
- Data gapsWhen the problem is on our side, we withhold rather than publish: days where our own measurement was broken are flagged and excluded from grades, stats, and trends instead of being passed off as data. Currently flagged: bus, 2026-06-21 through 2026-07-27, when a schedule-matching fault on our pipeline (around WMATA's June 29 network redesign) corrupted bus ground truth; and rail, 2026-07-27 through 2026-08-05, when our arrival matching decayed to roughly a quarter of its normal volume and a mid-service-day schedule reload cost a further evening. Under-matched arrivals inflate observed headways and therefore expected wait, so those days would have read worse than the service actually was. Flagged days can never be retroactively graded: we keep raw vehicle positions for only three days, so the underlying arrivals are gone.
Our forecast vs the agency's the moat
On each bus route detail page we publish our arrival predictions head-to-head against WMATA's own TripUpdates feed, both scored against the same ground-truth arrivals we derive. We hold ourselves to the same bar we hold the agency. Where we're more accurate, we say so; where we're not yet, the number shows it. For rail we currently score the agency's own predictions against our ground truth; we don't publish a competing rail forecast we can't yet beat.
How we reconstruct arrivals
We never trust a feed's own "arrived" claim — we derive the moment of arrival ourselves, differently for each mode because the feeds differ:
- BusEach position is map-matched to the route geometry; an arrival is logged when a bus crosses a stop's location along that line. Off-route running is detected and flagged rather than dropped.
- RailMetrorail reports a train's status at each platform, so an arrival is the observed moment a train is stopped at a platform — an exact event, not an interpolation. Schedule deviation is measured against the published timetable for that trip and stop.
Routes and lines with too little data to score honestly are left ungraded rather than guessed.
What else we capture
- Service alertsWMATA's bus and rail disruption feeds, captured continuously — when an alert appeared, what it affected, and when it cleared.
- BikeshareCapital Bikeshare station availability (bikes, e-bikes, open docks) across the system, polled on the feed's own refresh contract.
Where the data comes from
Vehicle positions, trip updates, alerts, and schedules are read continuously from WMATA's public GTFS and GTFS-Realtime feeds (bus and rail); bikeshare from the public GBFS feed. Everything is scored against ground truth we reconstruct ourselves.
Independent · derived from GTFS-Realtime & GBFS · not affiliated with WMATA or Capital Bikeshare.