Postmortem Anti-Pattern: Stopping the Root Cause at 'Human Error'
Why 'human error' is never a root cause: diagnose the shallow-RCA failure mode and trace past the operator to the system conditions that recur.
- #postmortems
- #incident-response
- #sre
- #troubleshooting
Stuck on this Post Mortems with AI error? Get the free incident triage checklist
A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.
Overview
“Root cause: human error” is where a postmortem stops thinking. It names the last person to touch the system, prescribes “be more careful” or “add a training reminder,” and closes the incident feeling resolved. It is the single most common way root-cause analysis fails, and it is deceptively satisfying because it gives a clean answer that requires no expensive change to the system.
The problem is that human error is not a cause — it is a symptom of the conditions the operator was working in. A person ran the wrong command because two environments looked identical in the terminal. A deploy skipped a check because the check was easy to skip and nothing enforced it. Stopping at the human leaves every one of those conditions in place, so the next person, working under the same design, makes the same “mistake.” Blameless postmortem practice exists precisely to push past the operator to the system, and a postmortem that terminates at human error has abandoned that discipline. This guide covers how to recognize the anti-pattern and how to trace a shallow root cause down to the systemic factors that actually recur.
Symptoms
- A root cause that names a person or action — “engineer ran the wrong script,” “operator forgot to drain the node.”
- Action items that are behavioral: “remind the team to double-check,” “add to onboarding,” “be more careful with production.”
- The Five Whys stopping at the first human decision instead of continuing into why that decision was easy to make wrongly.
- Recurrence by a different person — the same class of mistake happens again with someone new, proving the individual was never the cause.
- No changes to tooling, guardrails, or defaults coming out of the postmortem.
- Counterfactual, hindsight-laden language: “they should have known,” “it was obvious that.”
- A short postmortem that feels complete but leaves reviewers unable to name a single system change that would prevent recurrence.
Common Root Causes
- Hindsight bias. Knowing the outcome makes the “correct” action look obvious, so the analysis blames the person for not seeing what is only clear in retrospect.
- The Five Whys stopped early. The technique is only as good as its depth; stopping at “human made a mistake” skips the whys that matter.
- A blameful culture. If naming a person closes incidents faster and satisfies management, the process optimizes for a scapegoat over a fix.
- Missing systems-thinking framing. Without prompts to look for design conditions, contributing factors, and local rationality, analysts default to the nearest human.
- Comfort of a cheap fix. “Add training” costs nothing and requires no engineering; a real guardrail costs a sprint, so the shallow answer wins.
- No distinction between trigger and cause. The human action was the trigger that day; the cause is the condition that made that trigger dangerous.
Diagnostic Workflow
When a postmortem’s root cause names a person or an action, apply the local-rationality test before accepting it:
Ask: given what this person knew, saw, and was under at the time,
would a competent, well-intentioned engineer plausibly do the same?
If yes -> the person is not the cause. Keep digging into the system.
Then continue the Five Whys past the human decision instead of stopping there:
Why did the outage happen? -> the wrong command ran in production.
Why did the wrong command run? -> prod and staging terminals looked identical.
Why did they look identical? -> no visual/enforced distinction between envs.
Why no distinction? -> the tooling never required one.
Why never required? -> no guardrail owner; it was assumed "be careful" was enough.
Notice the shift: each “why” after the human moves toward a system condition you can engineer away. Next, run the substitution test — the clearest check for shallow RCA:
Substitution test: would another competent engineer, dropped into the
same situation with the same information and tooling, likely act the same?
If yes, replacing the person changes nothing -> fix the situation, not the person.
Finally, separate trigger from cause. The human action was the trigger on that day; the cause is the standing condition that made the trigger able to cause harm. Your action items must target the condition, or the incident recurs with a new name attached.
Example Root Cause Analysis
Incident: A production database was dropped during a routine maintenance task, causing a two-hour outage.
Shallow root cause (the anti-pattern): “Human error — the engineer ran the drop against production instead of staging. Action item: remind engineers to verify their environment.”
Applying the diagnostic workflow:
- Local rationality: the engineer believed they were on staging. Would another competent engineer make the same error here? Yes — so the person is not the cause.
- Keep asking why: Why did they think it was staging? The two shells were configured identically, with no prompt color, no hostname banner, no confirmation step.
- Why no distinction? The tooling did not enforce one; environment identity relied entirely on the operator’s memory.
- Why did a drop reach production so easily? There was no guard requiring an extra confirmation for destructive operations against production, and no restriction on who could run them from a normal shell.
- Trigger vs cause: running the command was the trigger; the absence of any environment guardrail or destructive-action confirmation was the cause.
Contributing factors (systemic): identical shell prompts across environments; no confirmation gate on destructive production operations; broad direct access to production databases; a maintenance runbook that assumed rather than verified the target environment.
Real action items: distinct, unmistakable prompts per environment; a required typed confirmation for destructive operations in production; scoped access so routine maintenance cannot run irreversible commands directly; a runbook step that programmatically asserts the target before proceeding. None of these mention being careful — they make the mistake hard to make.
Prevention Best Practices
- Adopt the substitution test as a gate. No postmortem closes with a human root cause until you have confirmed another competent engineer would likely act the same — and then treated that as proof the system is the cause.
- Keep asking why past the human decision. The first human action is a trigger; the root cause is two to four whys deeper, in the design.
- Ban behavioral action items as the primary fix. “Be more careful” and “add training” may supplement a fix but can never be the whole one; require at least one systemic change per incident.
- Separate trigger from cause explicitly in your template, so authors cannot conflate the two.
- Engineer the guardrail, not the vigilance. Prefer confirmations, defaults, scoped access, and enforced checks over asking humans to remember.
- Watch for recurrence by different people as your signal that a past root cause was shallow.
- Keep it blameless. A culture that punishes the named operator guarantees future postmortems will hunt for a scapegoat instead of a cause.
Quick Reference
# "Human error" is a symptom, not a root cause.
Substitution test:
Would another competent engineer, same info + tooling, act the same?
YES -> fix the system, not the person.
Trigger vs cause:
trigger = the action that day (human ran X)
cause = the standing condition that made X harmful (no guardrail)
Red flags for shallow RCA:
- root cause names a person or action
- action items are "be careful" / "add training" / "remind the team"
- Five Whys stopped at the first human decision
- no tooling / guardrail / default changed
- the same mistake later recurs with a different person
Depth check: can you name one system change that prevents recurrence?
No -> you stopped too early.
Conclusion
Stopping a root cause at “human error” feels like an answer but changes nothing: the operator was the trigger, and the standing system conditions that made the trigger dangerous are still in place for the next person. The fix is discipline in the analysis — apply the substitution test, separate trigger from cause, and keep asking why until each answer points to a design condition you can engineer away. Behavioral fixes like training and vigilance can supplement a real guardrail but can never replace it. A postmortem earns its keep only when it produces at least one systemic change that would stop the incident regardless of who is at the keyboard next time.
Fixed it? Get 500 Post Mortems with AI & DevOps AI prompts — free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.
Did this fix your issue?
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.