Mystery DigitalTalk to us
The Anatomy of a Useful Postmortem (Illustrated With a Composite Incident)
ReliabilityIncident Response

The Anatomy of a Useful Postmortem (Illustrated With a Composite Incident)

Devon Achterberg · 2025-11-20 · 3 min read

Every engineering org has a postmortem template. Most of them produce documents that are accurate, blameless, and useless — a faithful timeline of what happened, followed by action items nobody prioritizes, followed by the same category of incident six months later with a different root cause but an identical failure signature. The gap isn't process discipline. It's that most postmortems stop at "what happened" and never rigorously get to "why did our systems allow this."

The incident below is a composite, built from patterns we've seen repeatedly across enterprise clients — not a specific client's outage — used here to illustrate what a postmortem that actually changes system behavior looks like.

The incident

A checkout service degrades to 12% error rate for 34 minutes during a regional traffic peak. Customer-facing impact: an estimated 2,200 failed checkout attempts. On-call is paged by an automated alert 6 minutes after the error rate crosses threshold; mitigation (a rollback of a connection-pool configuration change deployed 40 minutes earlier) resolves the issue 28 minutes after the page.

Where most postmortems stop

A typical writeup would end here: "A configuration change reduced the database connection pool size, which caused connection exhaustion under peak load. The change was rolled back. Action item: review connection pool sizing before future deploys." That's a true statement and a nearly worthless action item — it relies on a human remembering to do a manual review, indefinitely, forever, which is precisely the kind of control that erodes under deadline pressure.

Where a useful postmortem keeps going

Contributing factor, not root cause, framing. "Connection pool misconfiguration" is a contributing factor. The root cause is that the deployment pipeline had no automated check capable of catching it — the change passed code review because reviewers don't have production traffic context, passed CI because load isn't part of the test suite, and passed canary because the canary window (90 seconds) was shorter than the time it took connection exhaustion to manifest under real peak concurrency.

The five-whys, taken past the comfortable stopping point. Why did the pool size regress? An engineer reduced it to fix a local resource-constraint issue in staging. Why did that change ship to production unchanged? Environment-specific configuration wasn't distinguished from shared defaults in the config schema. Why didn't monitoring catch it before peak traffic? Connection pool utilization wasn't an alerted metric — only downstream symptoms (error rate, latency) were. Why did detection take 6 minutes? The alert threshold was tuned for sustained degradation, not the sharp step-function pattern this failure produced. Each of these is a distinct, independently fixable system gap, and none of them is "the engineer should have known better."

Action items with owners, dates, and a mechanism, not a habit. "Review connection pool sizing before deploys" becomes: add connection pool utilization as a first-class alerted metric with a threshold tuned to the actual exhaustion curve (owner, date); split environment-specific and shared configuration in the schema so staging tuning can't silently ship to production (owner, date); add a load-shaped synthetic check to the canary window so exhaustion-pattern regressions are caught before the 90-second window closes (owner, date). Every action item names a system change that makes the failure structurally harder to repeat, not a process change that makes it merely inadvisable.

The metric that tells you if your postmortem process is working

Track recurrence — not of identical incidents, but of the same category of contributing factor across postmortems over a rolling twelve months. If "insufficient canary window" or "missing alert on a leading indicator" shows up in postmortem three and postmortem eleven, your postmortems are documenting history accurately and changing nothing. That recurrence rate, reviewed quarterly against your own archive, is a better leading indicator of engineering maturity than almost any uptime number, because uptime tells you whether you got unlucky this quarter — recurrence tells you whether you're actually learning.

← Back to blog