Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Write effective blameless postmortems with root cause analysis, timelines, and action items. Use when conducting incident reviews, writing postmortem documents, or improving incident response processes.
.claude/skills/wshobson-postmortem-writing/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 103% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 123% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 139% | 0% |
Comprehensive guide to writing effective, blameless postmortems that drive organizational learning and prevent incident recurrence.
| Blame-Focused | Blameless | | ------------------------ | --------------------------------- | | "Who caused this?" | "What conditions allowed this?" | | "Someone made a mistake" | "The system allowed this mistake" | | Punish individuals | Improve systems | | Hide information | Share learnings | | Fear of speaking up | Psychological safety |
Day 0: Incident occurs
Day 1-2: Draft postmortem document
Day 3-5: Postmortem meeting
Day 5-7: Finalize document, create tickets
Week 2+: Action item completion
Quarterly: Review patterns across incidentsFull template library and detailed worked examples live in references/details.md. Read that file when you need the concrete templates.
### Template 2: 5 Whys Analysis
Payment service experienced 47-minute outage due to database connection exhaustion.
Answer: Database connections were exhausted, causing all new requests to fail.
Evidence: Metrics showed connection count at 100/100 (max), with 500+ pending requests.
Answer: Each incoming request opened a new database connection instead of using the connection pool.
Evidence: Code diff shows direct DriverManager.getConnection() instead of pooled DataSource.
Answer: A developer refactored the repository class and inadvertently changed the connection acquisition method.
Evidence: PR #1234 shows the change, made while fixing a different bug.
Answer: The reviewer focused on the functional change (the bug fix) and didn't notice the infrastructure change.
Evidence: Review comments only discuss business logic.
Answer: We lack automated tests that verify connection pool behavior and lack documentation about our connection patterns.
Evidence: Test suite has no tests for connection handling; wiki has no article on database connections.
| Root Cause | Improvement | Type | | ------------- | --------------------------------- | ---------- | | Missing tests | Add infrastructure behavior tests | Prevention | | Missing docs | Document connection patterns | Prevention | | Review gaps | Update review checklist | Detection | | No canary | Implement canary deployments | Mitigation |
### Template 3: Quick Postmortem (Minor Incidents)
Date: 2024-01-15 | Duration: 12 min | Severity: SEV3
API latency spiked to 5s due to cache miss storm after cache flush.
Full cache flush for minor config update caused thundering herd.
Don't full-flush cache in production; use targeted invalidation.
## Facilitation Guide
### Running a Postmortem Meeting
## Anti-Patterns to Avoid
| Anti-Pattern | Problem | Better Approach |
| ----------------------- | -------------------------- | ------------------------------- |
| **Blame game** | Shuts down learning | Focus on systems |
| **Shallow analysis** | Doesn't prevent recurrence | Ask "why" 5 times |
| **No action items** | Waste of time | Always have concrete next steps |
| **Unrealistic actions** | Never completed | Scope to achievable tasks |
| **No follow-up** | Actions forgotten | Track in ticketing system |
## Best Practices
### Do's
- **Start immediately** - Memory fades fast
- **Be specific** - Exact times, exact errors
- **Include graphs** - Visual evidence
- **Assign owners** - No orphan action items
- **Share widely** - Organizational learning
### Don'ts
- **Don't name and shame** - Ever
- **Don't skip small incidents** - They reveal patterns
- **Don't make it a blame doc** - That kills learning
- **Don't create busywork** - Actions should be meaningful
- **Don't skip follow-up** - Verify actions completed| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 7,551 | 5,842 | -23% | 1 | 1 | 0% | 1,247 | 2,531 | +103% | 0 | 0 | — |
case-02 | pass→pass | 5,144 | 4,127 | -20% | 1 | 1 | 0% | 1,094 | 2,443 | +123% | 0 | 0 | — |
case-03 | pass→pass | 54,902 | 4,842 | -91% | 1 | 1 | 0% | 993 | 2,376 | +139% | 0 | 0 | — |
case-04 | pass→pass | 9,010 | 8,587 | -5% | 1 | 1 | 0% | 1,513 | 3,012 | +99% | 0 | 0 | — |
case-05 | pass→pass | 9,019 | 5,910 | -34% | 1 | 1 | 0% | 1,571 | 2,610 | +66% | 0 | 0 | — |
case-06 | pass→pass | 10,863 | 8,431 | -22% | 1 | 1 | 0% | 1,736 | 2,899 | +67% | 0 | 0 | — |
case-07 | fail→pass | 13,377 | 8,484 | -37% | 1 | 1 | 0% | 2,309 | 3,012 | +30% | 0 | 0 | — |
case-08 | pass→pass | 8,981 | 3,362 | -63% | 1 | 1 | 0% | 1,546 | 2,212 | +43% | 0 | 0 | — |
case-09 | pass→pass | 9,874 | 7,274 | -26% | 1 | 1 | 0% | 1,658 | 2,845 | +72% | 0 | 0 | — |
case-10 | pass→pass | 12,339 | 10,933 | -11% | 1 | 1 | 0% | 2,123 | 3,463 | +63% | 0 | 0 | — |
case-11 | pass→pass | 9,426 | 5,591 | -41% | 1 | 1 | 0% | 1,670 | 2,503 | +50% | 0 | 0 | — |
case-12 | pass→pass | 9,968 | 7,073 | -29% | 1 | 1 | 0% | 1,636 | 2,743 | +68% | 0 | 0 | — |
case-13 | pass→pass | 11,996 | 11,315 | -6% | 1 | 1 | 0% | 2,018 | 3,297 | +63% | 0 | 0 | — |
case-14 | pass→pass | 8,790 | 6,665 | -24% | 1 | 1 | 0% | 1,455 | 2,603 | +79% | 0 | 0 | — |
case-15 | pass→pass | 12,790 | 7,652 | -40% | 1 | 1 | 0% | 2,214 | 2,862 | +29% | 0 | 0 | — |
case-16 | pass→pass | 8,308 | 7,403 | -11% | 1 | 1 | 0% | 1,362 | 2,754 | +102% | 0 | 0 | — |
case-17 | pass→pass | 11,736 | 9,552 | -19% | 1 | 1 | 0% | 2,011 | 3,094 | +54% | 0 | 0 | — |
case-18 | pass→pass | 5,973 | 3,060 | -49% | 1 | 1 | 0% | 984 | 2,045 | +108% | 0 | 0 | — |
case-19 | pass→pass | 9,745 | 10,869 | +12% | 1 | 1 | 0% | 1,623 | 3,253 | +100% | 0 | 0 | — |
case-20 | pass→pass | 6,388 | 4,211 | -34% | 1 | 1 | 0% | 1,019 | 2,301 | +126% | 0 | 0 | — |
case-21 | pass→pass | 9,827 | 2,620 | -73% | 1 | 1 | 0% | 1,710 | 2,027 | +19% | 0 | 0 | — |
case-22 | pass→pass | 11,472 | 10,856 | -5% | 1 | 1 | 0% | 1,909 | 3,309 | +73% | 0 | 0 | — |
case-23 | fail→pass | 33,882 | 2,289 | -93% | 1 | 1 | 0% | 1,475 | 1,953 | +32% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.