post-mortem-author

Use after any user-visible incident to write a blameless post-mortem: a sourced timeline, root cause (what and why, not who), impact on users, revenue and SLOs, action items with owners, dates and success criteria, and what went well.

/plugin install qa-process@testland-qa

First time in Claude Code? Add the marketplace with /plugin marketplace add testland/qa

View source (opens in a new tab)
Skill
Category
Foundations
Version
v1.12.10

Overview

Per google-sre-postmortem (opens in new window):

"A postmortem is 'a written record of an incident, its impact, the actions taken to mitigate or resolve it, the root cause(s), and the follow-up actions to prevent the incident from recurring.'"

"Blameless postmortems are a tenet of SRE culture." (google-sre-postmortem (opens in new window))

"Writing a postmortem is not punishment - it is a learning opportunity for the entire company." (google-sre-postmortem (opens in new window))

The blameless framing is load-bearing. Per google-sre-postmortem (opens in new window), the document must "focus on identifying the contributing causes of the incident without indicting any individual or team for bad or inappropriate behavior" - assuming "everyone involved in an incident had good intentions and did the right thing with the information they had."

When to use

Per google-sre-postmortem (opens in new window), common triggers include:

"user-visible downtime, data loss, on-call interventions, extended resolution times, and monitoring failures."

Author a post-mortem after every such incident - not just sev-1. Lower-severity incidents accumulate context that prevents the sev-1.

Step 1 - Author the document

Copy the full section skeleton from references/post-mortem-document-template.md and fill every section. The required sections, in order:

  1. Header - status, severity, authors, dates, reviewers.
  2. Summary - 2-3 sentences: what, who, how long, what was done.
  3. Impact - users affected, revenue (deferred vs lost), SLO debt, reputational.
  4. Timeline - chronological events with UTC timestamps and a source per row.
  5. Root cause - what happened in detail, with the system as the subject, never a person.
  6. Contributing factors - every condition that allowed the incident; list all, since incidents rarely have one cause.
  7. What went well - the positives; per google-sre-postmortem (opens in new window), post-mortems should call these out too.
  8. Action items - the load-bearing section (Step 3).
  9. Lessons learned and Postmortem trigger - what is known now, and which trigger criteria the incident met.

The worked example below fills this skeleton for a real SEV-2.

Step 2 - Blameless review

Per google-sre-postmortem (opens in new window): "Postmortems are not punishment."

Reviewers should:

  • Reject blame language. "Bob deployed without testing" → "The pre-deploy testing didn't cover the null-metadata case."
  • Focus on systems, not individuals. "Why did Bob fix this fast?" → "What enabled fast diagnosis? (Sentry stack trace + the team's incident-response training.)"
  • Surface contributing factors openly. Multiple factors usually contribute; document all.

Step 3 - Action item discipline

Action items must have:

  • Owner (one named person; not "the team").
  • Due date (concrete; not "next sprint when we have time").
  • Priority (P0/P1/P2/P3; ties to the action's importance).
  • Success criterion (measurable; "X done" not "we'll think about X").

The action items are the post-mortem's value. Without them, the document is paperwork.

Step 4 - Approval + closure

The post-mortem isn't "done" until:

  1. Reviewers (eng manager, SRE lead, Product) sign off.
  2. Action items are added to the team's tracker (Jira / Linear / GitHub issues).
  3. P1/P2 action items have a target completion before the next release.

The post-mortem is "closed" when all action items ship - typically 2-4 weeks. A 6-month-old open post-mortem is a process failure.

Step 5 - Storage

docs/postmortems/
├── INC-1234-stripe-webhook-2026-05-04.md
├── INC-1235-cache-invalidation-2026-05-12.md
├── INC-summary-2026-Q2.md       ← rollup
└── README.md

Markdown + git. Quarterly rollup identifies patterns:

## Q2 2026 incident summary

**Total incidents:** 12
**SEV-1:** 1
**SEV-2:** 6
**SEV-3:** 5

**Patterns:**
- 4 of 12 (33%) were "test gap" - the failing condition wasn't
  in the test suite. Action: invest in
  test-coverage-targeter
  + property-based testing.
- 3 of 12 (25%) involved canary metrics; 2 of those proceeded
  through canary gate. Action: review thresholds (per AI-2 from
  INC-1234).
- ...

Worked example - INC-1234 Stripe webhook failure (SEV-2)

The skeleton from Step 1, filled for a real incident.

Summary. A v1.4.5 deploy introduced a null-metadata crash in the Stripe webhook handler; ~12,400 customers (4.3% of MAU) hit failed checkout completions for 23 minutes until rollback.

Impact. ~$140,000 in delayed (not lost) orders; 32% of the monthly availability budget burned; 47 support tickets.

Timeline (excerpt).

Time (UTC)EventSource
14:00Deploy of v1.4.5 to canary (5% traffic)CD pipeline log
14:23First Sentry alert: NullPointerException at WebhookHandler:42Sentry
14:30Canary window ends within thresholds; promoted to 100%CD pipeline
14:42PagerDuty SLO burn-rate alert; incident declared SEV-2PagerDuty
14:58Rollback complete; error rate returning to baselineDatadog

Root cause (what, not who). The v1.4.5 handler added a path for Stripe's payment_intent.partially_funded event that called payment.metadata.get("internal_id"); for ~3% of events metadata was null, the exception was uncaught, the handler returned 500, and Stripe stopped retrying, so fulfillment never triggered. The canary stage saw the error rate rise (0.4% vs 0.3% baseline) but stayed under the 1.5x rollback threshold, so prod-canary-validator returned PROCEED with WARNING and the gate was acked.

Contributing factors. (1) test gap - no unit test for the null-metadata case; (2) canary threshold too lenient for a low baseline; (3) staging carries almost no Stripe webhook traffic, so the new event type was never exercised pre-deploy.

Action items.

IDActionOwnerPriorityDueSuccess criterion
AI-1Unit test for partially_funded with null metadataBobP12 daysTest in WebhookHandlerTest.kt fails against the bug, passes after
AI-2Tighten canary error-rate threshold 1.5x -> 1.3xSREP21 sprintcanary-thresholds.yml updated; one normal canary passes
AI-3Staging fixture covering all Stripe event typesBobP21 sprintStaging "events by type" metric shows all types > 0

What went well. Sentry caught the regression at 14:23, well before the PagerDuty page; rollback finished in 7 minutes, inside RTO. Diagnosis came from the Sentry stack trace alone, with no production debugging.

Anti-patterns

Anti-patternWhy it failsFix
Blame languageDefeats the blameless principle; team stops authoring post-mortems honestly.Per Google SRE: focus on contributing causes, not individuals (Step 2).
Action items without owner / due dateNobody acts; same incident recurs.All four fields required (Step 3).
Skipping post-mortems for "small" incidentsLower-severity context that prevents big incidents is missed.Author per google-sre-postmortem (opens in new window) trigger criteria (Step 1).
Post-mortem stored in private docsOrg learning capped at the team.Public to org (per Google SRE pattern).
One-shot post-mortem with no follow-up"Closed" but action items stale; recurrence likely.Track action items in tracker (Step 4); post-mortem closed only when all done.
Post-mortem authored 2+ weeks after incidentMemory faded; details lost.Author within 5 business days.

Limitations

  • Honesty depends on culture. A team that fears blame will produce sanitized post-mortems. Leadership must reinforce blamelessness in word and action.
  • Post-mortems don't prevent the next incident. They prevent the same class of incident. Pair with proactive practices (chaos testing, threat modeling).
  • Time investment. A SEV-2 post-mortem typically takes 4-8 hours to author + 2-4 hours of review. Budget accordingly.

References

  • gsp (opens in new window) - Google SRE blameless post-mortem definition, triggers, blamelessness principle, learning-opportunity framing.
  • prod-canary-validator - sibling: canary verdict; post-mortems often surface threshold tuning needs.

Deep reference for the post-mortem-author SKILL.md. The full per-incident section skeleton to copy when authoring a blameless post-mortem. Fill every section; the Action items table is load-bearing - a post-mortem without owned, dated, measurable action items is paperwork.

Store one markdown file per incident under a stable directory (for example docs/postmortems/) with an incident-ID-and-date filename.

# Post-mortem - `INC-XXXX` - <one-line title>

**Status:** Draft | Review | Approved | Action items closed
**Severity:** SEV-n
**Authors:** <incident commander>, <lead investigator>
**Date authored:** YYYY-MM-DD   **Incident date:** YYYY-MM-DD
**Reviewers:** <eng manager>, <SRE lead>, <product>

## Summary
2-3 sentences: what happened, who was affected, how long, what was done.

## Impact
- **Users affected:** count and % of MAU.
- **Revenue impact:** amount (state deferred vs lost).
- **SLO debt:** % of the monthly availability budget burned.
- **Reputational:** support tickets, social reach.

## Timeline
Chronological events, one row each, with a UTC timestamp and a source link.

| Time (UTC) | Event | Source |
|------------|-------|--------|
| ... | ... | ... |

## Root cause
What happened, in detail. Not who. The system is the grammatical subject.

## Contributing factors
Every condition that allowed the incident (test gap, threshold too lenient,
missing staging traffic, ...). List all; incidents rarely have a single cause.

## What went well
The positives - what mitigated faster than expected. Per
[Google SRE, Postmortem Culture](https://sre.google/sre-book/postmortem-culture/),
post-mortems should call these out too.

## Action items
| ID | Action | Owner | Priority | Due | Success criterion |
|----|--------|-------|----------|-----|-------------------|
| AI-1 | ... | one named person | P0-P3 | concrete date | measurable "done" condition |

## Lessons learned
What the team knows now that it did not before.

## Postmortem trigger
Which trigger criteria this incident met (user-visible, duration, revenue, SLO).

Two fields carry the most weight. Root cause must read as a property of the system, never of a person. Action items must each have one named owner, a concrete due date, a priority, and a measurable success criterion; without all four the item does not get acted on and the same incident recurs.

  • Card payments failed for 38 minutes on Friday - write-up due Monday
  • Seven weeks on, the auditor wants a record of the July 23 edge outage
  • We dropped 4,900 settlement events overnight - write-up goes to our partner today
  • Two things off last week's ops log, both need closing out
  • Q3 incident summary for the compliance pack - due Friday
Blog

Related reading