Skip to content
Back to skills

Post Mortem Author

ASecurity

Build-an-X workflow that produces a blameless post-mortem from an incident - captures the timeline (chronological event sequence with sources), root cause analysis (what + why, not who), impact (users / revenue / SLO debt), action items (with owners + due dates + measurable success criteria), and \"what went well\" (intentional). Per Google SRE: \"Blameless postmortems are a tenet of SRE culture.\" Use after every user-visible incident, not just severe ones.

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 12, 2026
testinggotestingdebugginggit

Security analysis

A100/100

Pro scans all 13 files and shows the line behind each finding

Scanned October 12, 2026

npx -y skills add testland/qa --skill post-mortem-author --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Post Mortem Author?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Post Mortem Author
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/testland-post-mortem-author/badge)](https://www.skillsdirectory.com/skills/testland-post-mortem-author)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: post-mortem-author
description: "Build-an-X workflow that produces a blameless post-mortem from an incident - captures the timeline (chronological event sequence with sources), root cause analysis (what + why, not who), impact (users / revenue / SLO debt), action items (with owners + due dates + measurable success criteria), and \"what went well\" (intentional). Per Google SRE: \"Blameless postmortems are a tenet of SRE culture.\" Use after every user-visible incident, not just severe ones."
---

# post-mortem-author

## Overview

Per [google-sre-postmortem][gsp]:

[gsp]: https://sre.google/sre-book/postmortem-culture/

> "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][gsp])

> "Writing a postmortem is not punishment - it is a learning
> opportunity for the entire company." ([google-sre-postmortem][gsp])

The blameless framing is load-bearing. Per
[google-sre-postmortem][gsp], 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][gsp], 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](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][gsp], 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][gsp]: "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:

```markdown
## 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) | Event | Source |
|------------|-------|--------|
| 14:00 | Deploy of v1.4.5 to canary (5% traffic) | CD pipeline log |
| 14:23 | First Sentry alert: NullPointerException at WebhookHandler:42 | Sentry |
| 14:30 | Canary window ends within thresholds; promoted to 100% | CD pipeline |
| 14:42 | PagerDuty SLO burn-rate alert; incident declared SEV-2 | PagerDuty |
| 14:58 | Rollback complete; error rate returning to baseline | Datadog |

**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.**

| ID | Action | Owner | Priority | Due | Success criterion |
|----|--------|-------|----------|-----|-------------------|
| AI-1 | Unit test for `partially_funded` with null metadata | Bob | P1 | 2 days | Test in `WebhookHandlerTest.kt` fails against the bug, passes after |
| AI-2 | Tighten canary error-rate threshold 1.5x -> 1.3x | SRE | P2 | 1 sprint | `canary-thresholds.yml` updated; one normal canary passes |
| AI-3 | Staging fixture covering all Stripe event types | Bob | P2 | 1 sprint | Staging "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-pattern                                                          | Why it fails                                                              | Fix |
|-----------------------------------------------------------------------|---------------------------------------------------------------------------|-----|
| Blame language                                                         | Defeats 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 date                                  | Nobody acts; same incident recurs.                                       | All four fields required (Step 3). |
| Skipping post-mortems for "small" incidents                            | Lower-severity context that prevents big incidents is missed.            | Author per [google-sre-postmortem][gsp] trigger criteria (Step 1). |
| Post-mortem stored in private docs                                     | Org 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 incident                           | Memory 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][gsp] - 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.

Files in this skill

  • .tessl-plugin/plugin.json597 B
  • SKILL.md9.4 KB
  • evals/card-outage-director-wants-the-name-in-the-record/criteria.json9.2 KB
  • evals/card-outage-director-wants-the-name-in-the-record/task.md7.7 KB
  • evals/cert-expiry-nobody-wrote-up-until-the-auditor-asked/criteria.json10.5 KB
  • evals/cert-expiry-nobody-wrote-up-until-the-auditor-asked/task.md10.5 KB
  • evals/dropped-webhook-events-while-the-suite-stayed-green/criteria.json9.8 KB
  • evals/dropped-webhook-events-while-the-suite-stayed-green/task.md10.8 KB
  • evals/overnight-auth-blip-the-lead-wants-it-logged-and-closed/criteria.json9.3 KB
  • evals/overnight-auth-blip-the-lead-wants-it-logged-and-closed/task.md7.6 KB
  • evals/quarter-end-rollup-where-everything-says-closed/criteria.json8.8 KB
  • evals/quarter-end-rollup-where-everything-says-closed/task.md11.6 KB
  • references/post-mortem-document-template.md2.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.