Saying "this is a blameless postmortem" does not make it one. Blamelessness is produced by how the room is run, question by question, not by a disclaimer on the first slide.
Blame is a bug in the process, not the people
When someone fears being named as the cause, they stop volunteering the details you most need. The engineer who ran the command that triggered the outage is your best witness — unless you have made it unsafe for them to talk.
Facilitation moves that work
- Ask "how", not "why" — "how was it possible to deploy without a check?" invites system analysis; "why did you deploy?" invites defense.
- Replace names with roles in the timeline — "the on-call engineer", not "Sam" — so the story is about the system's affordances.
- Assume good judgment — everyone acted reasonably given what they knew at the time. If a reasonable person made that choice, the system made it easy to.
Build the timeline from data, not memory
Memory under stress is unreliable and defensive. A timeline reconstructed from telemetry is neither:
events
| where incident_id == "INC-2043"
| project ts, actor_role, action, signal
| sort ts asc
End with system changes, not promises
"We'll be more careful" is not an action item. "Add a pre-deploy check that blocks this class of change" is. A good postmortem ends with edits to the system that would have caught the problem, so the next tired engineer cannot make the same mistake.