Incident runbook
How to declare, work, and close a platform incident. The firm commits to 99.9% monthly availability (43.2 minutes of error budget per 30 days).
Severity targets
| Severity | Acknowledge within | Resolve within | |----------|-------------------|----------------| | SEV1 | 15 minutes | 4 hours | | SEV2 | 1 hour | 24 hours | | SEV3 | 8 hours | 7 days |
The drill clock starts at openedAt. A drill passes only when both the acknowledgment and the resolution land inside their targets.
Declare (SUPER_ADMIN only)
POST /api/statuswith{ "action": "open", "id", "title", "severity" }.- Confirm the public page moves:
GET /api/status(no auth) and/status.
IDs must be unique — replays return 409.
Any open SEV1 reads as an outage; any open SEV2 reads as degraded.
Work
POST /api/statuswith{ "action": "acknowledge", "id" }the moment a- Keep firm data paths untouched: incident records live in the shared
- Page the firm through the normal dispatch channels; do not improvise new
human owns the incident. Re-acks are safe no-ops.
platform namespace, never in firm rows.
recipient lists mid-incident.
Resolve
POST /api/statuswith{ "action": "resolve", "id" }. Skipped- Verify
/statusreturns to operational. Resolved rows stay in history — - Read the drill verdict off the incident timestamps before the retro:
acknowledgments are stamped at resolve time so the clock stays honest.
the page derives state at read time, so nothing can stick on outage.
ack minutes and resolve minutes against the table above.
Client notice
Every successful write returns { incident, notice } alongside the incident. The notice is the client-facing message for that exact event — subject carries severity and title ([SEV1] Incident Opened: ...) for inbox triage; the body carries id, severity, reached-event timestamps, and the /status pointer. Forward it verbatim through the normal dispatch channels; do not reword severity or timestamps.
Rules
- Never resolve what is still broken to make the page green.
- Never store client or firm data in incident titles.
- A corrupt or missing history resolves to operational only when no open
incident exists; absence of evidence is not evidence of health.