Status Uptime
Daily uptime ribbon for the public status page.
Returns days per-day status cells per service, oldest-first.
Each cell is one of operational | degraded | outage | no_data
with an optional summary describing the incident span.
Source is always redis (the daily-rollup cache); cells without
a cached entry default to no_data. The
app.tasks.status_aggregator background loop keeps the cache
fresh every 5 min and backfills 90 days on startup.
Performance: single Redis MGET regardless of days value.
Sub-millisecond at p99 even with the 90-day window — the old
per-request path took ~18 s on cache miss.
All services in SERVICES currently share the same daily roll-
up — we don’t (yet) compute per-service status separately.
Per-service granularity is a documented follow-up; for now the
UI shows the same row for each service which still surfaces
actual outages.