Most engineering organizations do postmortems. Fewer do postmortems that produce lasting change. The difference isn't in the quality of the writing or the length of the action item list — it's in the organizational infrastructure around the postmortem process: how action items are tracked, how the effectiveness of changes is measured, and how the organization learns across incidents rather than just within them.
This is the operational side of postmortems that most guides skip.
Why Postmortem Action Items Don't Get Done
Postmortem action items have a specific failure mode: they're created in the heat of incident resolution, assigned in the postmortem meeting, and then quietly deprioritized as the next sprint of feature work absorbs everyone's attention. Six months later, the same incident pattern recurs, someone asks "didn't teams have an action item for this?", and the answer is yes — it's still open.
The failure isn't people being irresponsible. It's an organizational system that doesn't keep postmortem action items visible or impose consequences for leaving them open.
The root cause: action items compete with feature work and lose. In most engineering organizations, feature work is the primary measure of progress. Reliability improvements don't show up in a product changelog. Postmortem action items aren't in the sprint board (usually). Completing an action item doesn't get celebrated the same way shipping a feature does.
Fixing this requires changing the system, not telling people to do better.
The Action Item Tracking System
The minimum viable postmortem tracking system:
Every action item gets a ticket. Not a line item in a document — an actual ticket in your project management system (Jira, Linear, GitHub Issues). The ticket has an assignee, a due date, and links back to the postmortem.
Postmortem action items are visible in sprint planning. The backlog of open postmortem action items should be a standing input to every sprint planning session. The engineering manager or SRE team lead brings the list: "these are the open reliability action items from the past 90 days, sorted by recurrence risk."
SLO budget governs action item priority. When a service is burning error budget, postmortem action items for that service automatically get higher priority. The error budget mechanism makes reliability investment a mathematical consequence of reliability failure, not a negotiation.
Closure requires evidence of effectiveness. Closing a postmortem action item should require demonstrating that the fix works — not just that it was implemented. "We added the circuit breaker" is implementation. "The circuit breaker has been in production for 30 days and has triggered twice, preventing cascading failures that our monitoring detected" is effectiveness. The evidence requirement creates accountability for results, not just activity.
The Postmortem Meta-Review: Learning Across Incidents
Individual postmortems capture learning about a single incident. The meta-review extracts patterns across many incidents — the systemic issues that appear repeatedly in different incidents and point to root causes that no single postmortem names.
Run a meta-review quarterly:
Postmortem Meta-Review — Q1 2026
Incidents reviewed: 23 postmortems
Pattern 1: Missing alerts (appeared in 9 of 23 incidents)
- 9 incidents included "we didn't know X was happening until Y happened"
- Alert gaps: staging to production config differences, new service endpoints,
and third-party dependency health
- Proposed systemic fix: alert coverage review as part of service checklist
Pattern 2: Incorrect timeout configuration (appeared in 6 of 23 incidents)
- 6 incidents involved timeouts that were either too short (causing cascades)
or not configured (allowing hung connections)
- No standard timeout configuration exists in the frameworks
- Proposed systemic fix: timeout configuration template in service scaffold
Pattern 3: Deployment-caused incidents (appeared in 11 of 23 incidents)
- 11 incidents were caused by or significantly worsened by a recent deployment
- Only 4 of those 11 had a canary deployment; the other 7 were direct deploys
- Proposed systemic fix: require canary for all services with >$1K/hour revenue exposure
Action items from meta-review:
[ ] SRE: Create alert coverage checklist — due 2026-04-15
[ ] Platform: Add timeout template to service scaffold — due 2026-05-01
[ ] Engineering Leadership: Require canary for high-revenue services — due 2026-04-30The meta-review is where SRE demonstrates the systemic value that individual postmortems can't — showing patterns across incidents that individual service teams are too close to see.
Measuring Postmortem Effectiveness
How do you know if postmortems are working? Measure the outcomes:
Incident recurrence rate. For incidents where a postmortem was written, what percentage had the same root cause recur within 6 months? Declining recurrence rate over time is the primary measure of postmortem effectiveness.
Mean time to detection (MTTD) trend. Many postmortems include action items about improving detection (better alerts, better dashboards). Are detection times improving over time?
Action item completion rate. What percentage of postmortem action items are closed within the committed timeline? Tracking this over time reveals whether the organizational system for action item follow-through is working.
Incident severity distribution. Are P1/P2 incidents (the most severe) declining as a fraction of total incidents? This suggests systemic reliability improvements from postmortem action items are preventing the worst incidents.
# Postmortem effectiveness metrics query
def compute_postmortem_metrics(postmortem_db, incident_db, lookback_days=180):
postmortems = postmortem_db.get_postmortems(days=lookback_days)
metrics = {}
# Action item completion rate
all_action_items = [ai for pm in postmortems for ai in pm.action_items]
due_items = [ai for ai in all_action_items if ai.due_date < datetime.utcnow()]
closed_items = [ai for ai in due_items if ai.status == "closed"]
metrics["action_item_completion_rate"] = len(closed_items) / len(due_items) if due_items else 0
# Recurrence detection
recurrences = 0
for pm in postmortems:
subsequent_incidents = incident_db.get_incidents_with_root_cause(
pm.root_cause,
after=pm.created_at
)
if subsequent_incidents:
recurrences += 1
metrics["recurrence_rate"] = recurrences / len(postmortems) if postmortems else 0
return metricsThe One-Page Postmortem vs. The Deep Dive
Not every incident warrants the same postmortem depth. A classification system:
Tier 1 (P1 incidents, novel failure modes, significant customer impact): Full postmortem. 5 whys root cause analysis, complete timeline, detailed contributing factors, systemic action items. Reviewed in all-hands or engineering leadership meeting. Published organization-wide.
Tier 2 (P2 incidents, known failure modes with new context, moderate impact): Standard postmortem. Root cause, timeline, 2-3 action items. Reviewed in team meeting. Published to engineering slack.
Tier 3 (P3 incidents, known failure modes, limited impact): One-paragraph summary + one action item. No review meeting required. Documented in incident tracker.
Trying to do full Tier 1 postmortems for every incident is a path to postmortem fatigue — people start filling in templates mechanically because the overhead is too high relative to the incident severity. Matching depth to severity keeps the process sustainable.
AI-Assisted Postmortem Writing
The most time-consuming part of postmortem writing is the timeline reconstruction — scrolling through Slack, correlating with monitoring, piecing together who said what when. AI tooling handles this well.
The workflow that works:
def generate_postmortem_draft(incident_channel: str, incident_id: str) -> str:
# 1. Gather all raw materials
slack_messages = get_incident_channel_messages(incident_channel)
alert_events = get_alerts_for_incident(incident_id)
deployment_events = get_deployments_around_incident(incident_id)
metric_annotations = get_metric_annotations(incident_id)
# 2. Ask Claude to synthesize into a structured draft
prompt = f"""
You are helping write a blameless postmortem for a production incident.
Raw materials:
- Slack channel messages: {format_messages(slack_messages)}
- Alert events: {format_alerts(alert_events)}
- Deployments: {format_deployments(deployment_events)}
Please produce a postmortem draft with:
1. Summary (2-3 sentences)
2. Timeline (chronological, factual, no interpretation)
3. Root cause analysis (using "because" statements that point to system conditions)
4. Contributing factors
5. Proposed action items (3-5, specific and assigned)
Be factual. Do not assign blame to individuals. Focus on system conditions.
"""
return claude.complete(prompt)The AI draft is the starting point, not the final product. A human engineer reviews for accuracy, adds technical depth the AI couldn't infer, adjusts the root cause analysis, and signs off. The time savings on timeline reconstruction alone — often 1-2 hours for complex incidents — makes postmortem writing significantly less onerous.
*Zak Hassan is a Staff SRE specializing in reliability culture, incident management, and AI-powered operations. Find him at zakhassan.com or on LinkedIn.*
Topic Paths