blameless-post-mortem
Facilitate a blame-free post-mortem after an incident or near-miss.
Consumes the incident-commander skeleton, derives or fills the root
cause, writes the corrective-action plan, and drafts an
incident-learnings memory candidate. Systems and processes are
examined — never individuals.
When to use
- An incident or outage is resolved and the team needs a structured
write-up.
- A near-miss happened and a post-mortem is being drafted (near-miss
mode — same flow, different severity framing).
- The
incident-commander hands off a post-mortem skeleton (empty
root cause is accepted — do not block on it).
- German triggers: "Post-mortem", "Nachbesprechung", "was ist
schiefgelaufen?", "Vorfallsanalyse".
Do NOT use when:
Procedure
1. Consume the incident-commander skeleton
Read the incoming skeleton. Per
docs/contracts/analysis-memory-loop.md § 5:
- Accept any skeleton, complete or not.
- Extract:
SEV, State, Started, Timeline, Mitigation,
Root cause (may be unknown or TBD).
- Do NOT stall or reject on an empty root cause.
If no skeleton is provided, reconstruct from the user's description:
severity, timeline, impact, mitigation state.
2. Derive the root cause (if unresolved)
If root cause is unknown or TBD, invoke
root-cause-frameworks. That
skill returns ranked candidates with confidence levels — do NOT force
a verdict. If root cause remains unresolved after the analysis pass,
mark the post-mortem status: draft and continue. A draft post-mortem
can still produce memory candidates (note the open question in the
candidate summary).
3. Write the blame-free report
Sections in order — no individuals named, systems and processes only:
- Summary — one paragraph, blame-free, what happened and the
business impact.
- Timeline — reference the skeleton timeline; do NOT rebuild it.
- Impact — users affected, duration, data, revenue, SLA.
- Detection — how the incident was discovered (monitoring, user
report, alert, manual).
- Root cause — the confirmed or highest-confidence candidate;
state confidence level if draft.
- Contributing factors — conditions that made the root cause
possible (tooling gaps, process gaps, system state).
- What went well — at least one item; omitting this is a smell.
- What went wrong — process, tooling, signals, communication
gaps. No individual blame.
Near-miss mode: same sections; set SEV: near-miss. Add two
extra questions after "what went wrong":
- "What would have made this worse?"
- "Which control caught it — luck or a designed control?"
4. Corrective actions (folded-in phase)
For each identified gap, propose a corrective action. Reuse
risk-officer mitigation framing: owner role, size, residual-risk
note. Four action types:
| Type |
Purpose |
| Immediate |
Stop recurrence now (config fix, kill switch, revert) |
| Preventive |
Remove the root cause (architectural or process change) |
| Detection |
Catch it sooner next time (alert, dashboard, runbook) |
| Process |
Address human/coordination gaps (oncall rotation, docs) |
Each action MUST have:
- Owner role (eng, ops, PO, support — never "the team")
- Closure criterion — specific, testable condition marking the
action done
- Regression signal — a test, monitor, or alert that proves the
fix held
An action without a closure criterion is a wish, not a plan.
5. Memory write-back
Per docs/contracts/analysis-memory-loop.md § 2:
Run the dedup pre-check — find_duplicate(...) from
scripts/memory_lookup.ts over the same key-space (incident type,
affected paths, decision area); a memory:lookup query over the
same keys is the CLI equivalent.
Match found — propose a frequency / supersedes update to
the existing entry; do NOT create a new candidate.
No match — draft a REDACTED incident-learnings candidate to
/memory propose:
type: incident-learnings
summary: one-line pattern (no customer names, no secrets, no
project-rooted paths)
evidence_paths: ≥ 2 file paths (for admission gate)
decision_surface: ≥ 3 decisions this pattern changes (if
possible)
last_validated: today
review_after_days: 90
applicable_scope: project
NEVER auto-promote. The human drives promotion via /memory promote. If the candidate fails the admission gate
(check_memory_proposal.ts), surface the gap to the user.
If the lookup surfaces stale entries (past review_after_days),
surface them explicitly — never silently use stale data.
Output
The post-mortem produces, in order:
- Post-mortem document — sections 1–8 from step 3; status
final or draft if root cause is unresolved.
- Corrective-action table — each action with type, owner,
closure criterion, regression signal.
- Memory candidate — the drafted
incident-learnings JSONL
snippet for /memory propose (or the frequency-update proposal if
a duplicate was found).
Do NOT
- Do NOT blame individuals — name systems, processes, signals, tooling.
- Do NOT auto-promote to curated memory — the gate is human-driven.
- Do NOT skip the dedup pre-check before drafting a memory candidate.
- Do NOT ship raw PII, customer names, secrets, or project-rooted
paths in the memory candidate (redact per the contract).
- Do NOT reject or stall on an incomplete skeleton — mark
draft and
continue.
- Do NOT rebuild the timeline from scratch — reference the skeleton's
timeline.
Gotchas
- Incomplete skeleton →
status: draft, not a rejection. Draft
post-mortems still produce memory candidates with the open question
noted.
- Near-miss → a mode within this skill, not a separate flow.
Severity is
near-miss; the extra two questions apply.
- Corrective actions without closure criteria are non-actionable.
Always require a specific, testable done condition.
- Stale memory entries must be surfaced as stale, never merged
into the findings. Never silently reuse stale data.
See also
1---2name: blameless-post-mortem3description: Use after an incident or outage is resolved — blame-free facilitation, root cause, corrective actions, memory write-back — even for a near-miss. Consumes the incident-commander skeleton.4---56# blameless-post-mortem78> Facilitate a blame-free post-mortem after an incident or near-miss.9> Consumes the `incident-commander` skeleton, derives or fills the root10> cause, writes the corrective-action plan, and drafts an11> `incident-learnings` memory candidate. Systems and processes are12> examined — never individuals.1314## When to use1516- An incident or outage is resolved and the team needs a structured17 write-up.18- A near-miss happened and a post-mortem is being drafted (near-miss19 mode — same flow, different severity framing).20- The `incident-commander` hands off a post-mortem skeleton (empty21 root cause is accepted — do not block on it).22- German triggers: "Post-mortem", "Nachbesprechung", "was ist23 schiefgelaufen?", "Vorfallsanalyse".2425Do NOT use when:2627- The incident is still active — route to28 [`incident-commander`](../incident-commander/SKILL.md) first.29- The goal is root-cause analysis only, no write-up needed — route30 to [`root-cause-frameworks`](../root-cause-frameworks/SKILL.md).31- The concern is a future risk, not a past event — route to32 [`risk-officer`](../risk-officer/SKILL.md).3334## Procedure3536### 1. Consume the incident-commander skeleton3738Read the incoming skeleton. Per39[`docs/contracts/analysis-memory-loop.md § 5`](../../docs/contracts/analysis-memory-loop.md):4041- Accept any skeleton, complete or not.42- Extract: `SEV`, `State`, `Started`, `Timeline`, `Mitigation`,43 `Root cause` (may be `unknown` or TBD).44- Do NOT stall or reject on an empty root cause.4546If no skeleton is provided, reconstruct from the user's description:47severity, timeline, impact, mitigation state.4849### 2. Derive the root cause (if unresolved)5051If root cause is `unknown` or TBD, invoke52[`root-cause-frameworks`](../root-cause-frameworks/SKILL.md). That53skill returns ranked candidates with confidence levels — do NOT force54a verdict. If root cause remains unresolved after the analysis pass,55mark the post-mortem `status: draft` and continue. A draft post-mortem56can still produce memory candidates (note the open question in the57candidate summary).5859### 3. Write the blame-free report6061Sections in order — no individuals named, systems and processes only:62631. **Summary** — one paragraph, blame-free, what happened and the64 business impact.652. **Timeline** — reference the skeleton timeline; do NOT rebuild it.663. **Impact** — users affected, duration, data, revenue, SLA.674. **Detection** — how the incident was discovered (monitoring, user68 report, alert, manual).695. **Root cause** — the confirmed or highest-confidence candidate;70 state confidence level if draft.716. **Contributing factors** — conditions that made the root cause72 possible (tooling gaps, process gaps, system state).737. **What went well** — at least one item; omitting this is a smell.748. **What went wrong** — process, tooling, signals, communication75 gaps. No individual blame.7677**Near-miss mode:** same sections; set `SEV: near-miss`. Add two78extra questions after "what went wrong":7980- *"What would have made this worse?"*81- *"Which control caught it — luck or a designed control?"*8283### 4. Corrective actions (folded-in phase)8485For each identified gap, propose a corrective action. Reuse86`risk-officer` mitigation framing: owner role, size, residual-risk87note. Four action types:8889| Type | Purpose |90|---|---|91| **Immediate** | Stop recurrence now (config fix, kill switch, revert) |92| **Preventive** | Remove the root cause (architectural or process change) |93| **Detection** | Catch it sooner next time (alert, dashboard, runbook) |94| **Process** | Address human/coordination gaps (oncall rotation, docs) |9596Each action MUST have:9798- **Owner role** (eng, ops, PO, support — never "the team")99- **Closure criterion** — specific, testable condition marking the100 action done101- **Regression signal** — a test, monitor, or alert that proves the102 fix held103104An action without a closure criterion is a wish, not a plan.105106### 5. Memory write-back107108Per [`docs/contracts/analysis-memory-loop.md § 2`](../../docs/contracts/analysis-memory-loop.md):1091101. Run the dedup pre-check — `find_duplicate(...)` from111 `scripts/memory_lookup.ts` over the same key-space (incident type,112 affected paths, decision area); a `memory:lookup` query over the113 same keys is the CLI equivalent.1142. **Match found** — propose a `frequency` / `supersedes` update to115 the existing entry; do NOT create a new candidate.1163. **No match** — draft a REDACTED `incident-learnings` candidate to117 `/memory propose`:118 - `type: incident-learnings`119 - `summary`: one-line pattern (no customer names, no secrets, no120 project-rooted paths)121 - `evidence_paths`: ≥ 2 file paths (for admission gate)122 - `decision_surface`: ≥ 3 decisions this pattern changes (if123 possible)124 - `last_validated`: today125 - `review_after_days`: 90126 - `applicable_scope`: `project`1271284. NEVER auto-promote. The human drives promotion via `/memory129 promote`. If the candidate fails the admission gate130 (`check_memory_proposal.ts`), surface the gap to the user.131132If the lookup surfaces stale entries (past `review_after_days`),133surface them explicitly — never silently use stale data.134135## Output136137The post-mortem produces, in order:1381391. **Post-mortem document** — sections 1–8 from step 3; status140 `final` or `draft` if root cause is unresolved.1412. **Corrective-action table** — each action with type, owner,142 closure criterion, regression signal.1433. **Memory candidate** — the drafted `incident-learnings` JSONL144 snippet for `/memory propose` (or the frequency-update proposal if145 a duplicate was found).146147## Do NOT148149- Do NOT blame individuals — name systems, processes, signals, tooling.150- Do NOT auto-promote to curated memory — the gate is human-driven.151- Do NOT skip the dedup pre-check before drafting a memory candidate.152- Do NOT ship raw PII, customer names, secrets, or project-rooted153 paths in the memory candidate (redact per the contract).154- Do NOT reject or stall on an incomplete skeleton — mark `draft` and155 continue.156- Do NOT rebuild the timeline from scratch — reference the skeleton's157 timeline.158159## Gotchas160161- **Incomplete skeleton** → `status: draft`, not a rejection. Draft162 post-mortems still produce memory candidates with the open question163 noted.164- **Near-miss** → a mode within this skill, not a separate flow.165 Severity is `near-miss`; the extra two questions apply.166- **Corrective actions without closure criteria** are non-actionable.167 Always require a specific, testable done condition.168- **Stale memory entries** must be surfaced as stale, never merged169 into the findings. Never silently reuse stale data.170171## See also172173- [`incident-commander`](../incident-commander/SKILL.md) — produces the174 skeleton this skill consumes; run first during live incidents.175- [`root-cause-frameworks`](../root-cause-frameworks/SKILL.md) — RCA176 engine invoked in step 2 when root cause is unresolved.177- [`risk-officer`](../risk-officer/SKILL.md) — mitigation framing178 reused for corrective actions (owner, size, residual-risk).179- [`docs/contracts/analysis-memory-loop.md`](../../docs/contracts/analysis-memory-loop.md)180 — produce → propose → promote → retrieve contract this skill binds to.