Postmortems

A blameless postmortem template and a fully worked fictional example, so an agent can draft one from an incident timeline in minutes.

Updated 2026-11-11Raw markdown

Strategy sections
On this page

Use this page after any SEV1 or SEV2, any near miss that could have been one, and any incident that happened twice. A postmortem exists to change the system so the same thing cannot hurt users again. It is not a report card on people.

Rules for a useful postmortem

  • Blameless: describe what people saw and why their action made sense at the time. Use roles, not names.
  • Draft within 2 business days while memory is fresh. Review within 5.
  • Every action item has an owner, a ticket and a due date.
  • Prefer fixes that remove a class of failure (automation, guardrails) over "be more careful".
  • No secrets, customer data or raw logs with identifiers in the document.

How an agent drafts one

  1. Collect the timeline from the incident channel, alert history, deploy history and CloudTrail (read-only).
  2. Convert every time to UTC and sort.
  3. Fill the template below. Mark anything inferred as (inferred).
  4. Propose 3 to 6 action items, ranked by how much risk each removes.
  5. Hand the draft to the incident commander. Do not publish it yourself.

Template

## Summary
<2-3 sentences: what broke, who was affected, for how long, how it was fixed.>

## Impact
- Duration: <start> to <end> UTC (<N> min)
- Users affected: <count or percent, segment>
- SLO impact: <budget consumed>
- Data impact: <none / describe>

## Timeline (UTC)
| Time | Event |
| --- | --- |
| HH:MM | First bad data point |
| HH:MM | Alert fired / report received |
| HH:MM | Incident declared, IC assigned |
| HH:MM | Mitigation applied |
| HH:MM | Resolved |

## Root cause and contributing factors
<What happened, in causal order. Ask "why" until you reach something you can change.>

## Detection
<How we found out. Could we have found out sooner? Did monitoring work?>

## What went well
## What went poorly
## Where we got lucky

## Action items
| Action | Type | Owner | Ticket | Due |
| --- | --- | --- | --- | --- |
| | prevent / detect / mitigate / process | | PROJ-123 | |

Worked example (fictional)

Summary

For 47 minutes, about 30 percent of API requests to the orders service returned 503. A new release passed smoke tests, but the production configuration pointed the service at a connection pool size that the database could not serve under peak load. Rolling back the release restored service.

Impact

  • Duration: 14:02 to 14:49 UTC (47 min)
  • Users affected: roughly 30 percent of order submissions failed; clients retried, so 4 percent were lost
  • SLO impact: 65 percent of the monthly availability budget consumed
  • How that was worked out: \(\text{budget used} = \dfrac{\text{duration} \times \text{error fraction}}{\text{budget}}\). With a 99.95 percent SLO the 30-day budget is 21.6 minutes, and \(47 \times 0.30 = 14.1\) minutes is 65 percent of it.
  • Data impact: none; failed requests were never committed

Timeline (UTC)

Time Event
13:55 Release promoted to production
14:02 5xx rate rises from 0.1 percent to 28 percent
14:09 Fast-burn SLO alert pages on-call
14:12 Incident declared, SEV2, IC assigned
14:21 Deploy history shows the 13:55 release; rollback proposed
14:38 Rollback approved and run
14:49 Error rate at baseline, incident resolved

Root cause and contributing factors

  • The release raised the per-task database pool from 10 to 50. With 20 tasks at peak, that exceeded the database connection limit.
  • Smoke tests ran on one candidate task at low load, so they could not catch it.
  • The config change lived in the same MR as a code change, and review focused on the code.
  • Rollback took 17 minutes after it was proposed because nobody on the call had prod deploy rights.

Action items

Action Type Owner Ticket Due
Alert when database connections exceed 80 percent of the limit detect Service team PROJ-123 +7 d
Pipeline check: total pool size times max tasks under the database limit prevent Platform team PROJ-124 +14 d
Give on-call the prod rollback permission mitigate Platform lead PROJ-125 +3 d
Separate config-only changes into their own MR process Service team PROJ-126 +14 d

Pitfalls

  • "Human error" as a root cause. Ask what made the error easy.
  • Action items with no owner. They never happen.
  • Postmortems nobody reads. Share a three-line summary in the team channel and review open action items monthly.