Raxx · internal docs

internal · gated

RCA — Console Billing summary shows "temporarily unavailable" in production

Incident ID: 2026-07-25-console-billing-summary-unavailable Date: 2026-07-25 Severity: SEV-3 (non-blocking degradation — single feature impact, no data loss, no customer-facing exposure; console.raxx.app is operator-only) Duration: Unknown start (present since deploy of #765/#770, first observed and fixed same session) — fix window ~90m from investigation start to PR open Blast radius: Operator (Kristerpher) — console.raxx.app /billing, /billing/dashboard, /billing/customers pages; no customer-facing impact Author: sre-agent

Summary

console.raxx.app/billing rendered "Billing summary is temporarily unavailable" on every load. The Console→Raptor internal call (GET /api/_internal/billing/summary) was being rejected with HTTP 401 by Raptor's FLAG_SESSION_AUTH_MIDDLEWARE before the route's own X-Admin-Service-Token check ever ran. Fix: add /api/_internal/billing/ to the middleware's exemption prefix list. Same for the sibling /api/_internal/billing/alert-config* routes and the /billing/dashboard sub-panels (net-new subscriptions, live sessions, highlights, MRR sparkline) which share the same upstream 401.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Cherry-pick the hotfix commit from main to release and develop per ADR-0115 emergency hotfix path step 4 operator 2026-07-26 (see hotfix PR)
2 Correct RAPTOR_INTERNAL_BASE_URL on raxx-console-prod from bare https://api.raxx.app to the hashed herokuapp origin for raxx-api-prod per the standing cross-service rule operator (heroku config:set, prod write — see escalation note below) 2026-07-28
3 Evaluate a CI lint (analogous to route-migration-parity in docs/ops/runbooks/raptor.md) that fails when a new Blueprint under backend_v2/api/routes/ uses X-Admin-Service-Token/HMAC auth but is not present in session_auth.py's _EXEMPT_PREFIXES/_EXEMPT_EXACT — this is the 5th recurrence of the same failure class operator to decide/scope
4 Add Sentry/log-based alerting on ERROR in billing_summary / ERROR in billing_customer_dashboard (or a synthetic probe of console.raxx.app/api/billing/summary) so future regressions of this class are caught within minutes, not on next manual page load operator to decide/scope

Action items 3 and 4 were not filed as tracked GitHub issues in this session per the standing "fix, don't file" policy — the fix itself is landed in the same PR. Operator should decide whether to formally track items 2–4.

References