Incident Postmortem
A blameless postmortem written within 48 hours of resolution: impact, timeline, root cause, contributing factors, what went well, and dated action items with owners.
id template/postmortemv1.0.0placeholders 11
Skeleton
# Postmortem — {{incident_title}}
Severity: {{severity}} · Declared: {{declared_at}} · Resolved: {{resolved_at}} · Author: {{author}}
## Impact
{{impact}}
## Timeline
{{timeline}}
## Root cause
{{root_cause}}
## Contributing factors
{{contributing_factors}}
## What went well
{{went_well}}
## Action items
| Action | Owner | Due | Status |
|---|---|---|---|
{{action_rows}}
Rendered example
# Postmortem — Schema URLs served the HTML fallback
Severity: SEV3 · Declared: 2026-09-03T22:58Z · Resolved: 2026-09-03T23:25Z · Author: incident commander
## Impact
Every /schemas/*.json URL returned the HTML fallback for about 45 minutes after the v0.3.0 deploy. Atom validation from the published URLs was impossible during that window; no users reported it.
## Timeline
- 22:40 v0.3.0 deploy completes.
- 22:58 Post-deploy curl finds content-type text/html on /schemas/skill-v1.json.
- 23:10 PR #51 opened: prebuild copies schemas/ into the web build.
- 23:25 Deploy of #51 completes; URLs serve application/json.
## Root cause
The web build never copied schemas/ into its public directory, so the static host served its fallback page.
## Contributing factors
The previous site returned 200 for every path, so a status-code-only check passed.
## What went well
The post-deploy check inspected content-type, not just status, and caught it within 20 minutes.
## Action items
| Action | Owner | Due | Status |
|---|---|---|---|
| Assert content-type in the post-deploy check for every documented JSON URL | repo owner | 2026-09-10 | open |
Placeholders
| Name | Required | What goes here | Example |
|---|---|---|---|
{{incident_title}} | yes | One line naming what broke. | Schema URLs served the HTML fallback |
{{severity}} | yes | SEV1, SEV2, or SEV3. | SEV3 |
{{declared_at}} | yes | ISO-8601 timestamp. | 2026-09-03T22:40Z |
{{resolved_at}} | yes | ISO-8601 timestamp. | 2026-09-03T23:25Z |
{{author}} | yes | Who wrote it (usually the incident commander). | incident commander |
{{impact}} | yes | Who was affected, how, for how long. Numbers where they exist. | Every /schemas/*.json URL returned HTML for 45 minutes after the v0.3.0 deploy. |
{{timeline}} | yes | Timestamped events from first signal to resolution, one per line. | 22:40 deploy completes; 22:58 curl check finds text/html; 23:10 PR #51 opened… |
{{root_cause}} | yes | The one thing that, had it been different, would have prevented the incident. Not a person. | schemas/ was never copied into the web build. |
{{contributing_factors}} | yes | Conditions that made it likelier or worse. | The old site served 200 for every path, so the check passed on status code alone. |
{{went_well}} | yes | What limited the damage. | Content-type check caught it within 20 minutes. |
{{action_rows}} | yes | One table row per action: concrete, owned, dated. | | Add a content-type assertion to the post-deploy check | repo owner | 2026-09-10 | open | |
Rules for the finished document
- Blameless: root cause is a condition, never a person.
- Write it within 48 hours of resolution.
- Every action item has an owner and a date.
Produced by
- skill/incident-response — incident-response
postmortemincidentsre
Author convergent-systems-key. Source ai-atoms. License CC-BY-4.0. Structure is the common blameless-postmortem form; the 48-hour rule comes from persona/incident-commander's job to be done.