← Back to Engineering Blog
πŸ—“οΈ Sep 12, 2024⏱️ 5 min read

Blameless Post-Mortems: Fixing Systems, Not People

Why punitive engineering cultures encourage technicians to hide mistakes, and how establishing a blameless post-mortem framework restored delivery velocity after a major outage.

πŸŽ™οΈ Listen to ArticleREADY
AI Audio Synthesis Narrator
Share Post:

β€œIf an engineer makes a mistake that takes down a system, firing the engineer doesn’t fix the flaw. It just guarantees that the next person who discovers a bug will hide it.”

In late 2024, in my current role as Associate Director, Cloud Architecture & AI, a major Sev-1 incident occurred during a routine midnight maintenance window.

A mid-level DevOps engineer executed a deployment script intended for a staging environment. Due to an unvalidated environment variable in his terminal session, the script executed against production, clearing the BGP routing table on a core transit gateway.

Enterprise client connectivity went dark for 42 minutes.


The Punitive Reflex

The corporate reaction was immediate and predictable.

Before the post-incident review was even scheduled, executive emails began demanding accountability: β€œWho executed this script? Why weren’t they supervised? What disciplinary action is being taken?”

The reaction inside the engineering team was instant paralysis.

Engineers stopped volunteering for maintenance windows. Pull requests sat unmerged for days because nobody wanted to be the last person to sign off on a change. Team members began quietly obfuscating log outputs and hiding minor configuration drift out of fear that any mistake would lead to termination.

Our delivery velocity plummeted. By focusing on who made the mistake, we had accidentally created a culture of fear.


The Mess: The Illusion of β€œHuman Error”

In traditional management, β€œhuman error” is treated as the root cause of an outage.

It is a comfortable diagnosis because it absolves the system of responsibility. You blame the operator, discipline them, and pretend the problem is solved.

But human error is never the root causeβ€”it is the starting point of an investigation.

# The script that caused the outage: missing environment variable validation
export TARGET_ENV=${ENV:-"production"} # Defaulted to production when $ENV was unset!
ansible-playbook -i inventories/$TARGET_ENV destroy_routing.yml

When we analyzed the incident, the systemic flaws were obvious:

  1. Dangerous Defaults: The Ansible script defaulted to production if the $ENV variable was missing from the shell environment.
  2. Missing Dry-Run Gate: The pipeline executed destructive routing changes without enforcing a mandatory check or diff preview pass.
  3. Single-Sign-Off Privilege: A single engineer could execute destructive changes against production without a second peer approving the run in real-time.

Firing the engineer would have solved none of these problems. The next engineer who ran that script with an uninitialised terminal variable would have caused the exact same 42-minute outage.


The Solution: The Blameless Post-Mortem Framework

We halted all disciplinary discussions and instituted a mandatory Blameless Post-Mortem Framework.

We brought the engineer who executed the script into the lead role of the post-mortem investigation. We told him: β€œWe know you didn’t intend to break production. Help us understand why the system allowed you to break it.”

# Blameless Incident Post-Mortem Structure

## Incident Overview

- **Date/Time:** 2024-09-10 00:14 UTC
- **Duration:** 42 minutes
- **Impact:** Core Transit Gateway BGP table cleared; 14 spoke VNets unreachable.

## Timeline of Events (Facts Only - No Names)

- 00:12 UTC: Engineer initiates routine routing update script.
- 00:14 UTC: Script executes against production environment due to default shell variable.
- 00:18 UTC: Automated telemetry detects loss of BGP neighbor adjacencies.
- 00:35 UTC: Emergency rollback playbook executed from backup state.
- 00:56 UTC: BGP adjacencies restored; traffic normalized.

## Systemic Root Causes

1. Ansible script inventory fallback defaulted to production.
2. Deployment pipeline lacked pre-execution state backup triggers.
3. Terminals lacked visual production environment indicators.

## Action Items (Preventative Engineering)

- [x] Fix Ansible script to fail hard if `$ENV` is undefined.
- [x] Add mandatory 2-person approval gate in GitHub Actions for production runs.
- [x] Implement automated pre-change BGP table snapshots in Cloudflare KV.

We completely redesigned our deployment pipelines based on the post-mortem findings:

  • Explicit Fail-Safe Defaults: Scripts were rewritten to abort immediately if environment variables were not explicitly passed.
  • Dual-Control Gates: Destructive actions in CI/CD now require two independent peer approvals before the execution token is issued.
  • Pre-Change Snapshots: Automated hooks now snapshot BGP routing tables to Cloudflare KV before any routing payload is pushed.

The Impact

  • Cultural Recovery: Restored team trust and deployment velocity; PR review cycles returned to under 4 hours.
  • Systemic Hardening: Eliminated single-point-of-failure deployment vulnerabilities across all production pipelines.
  • Open Learning: Published the post-mortem internally across all engineering guilds, preventing similar variable-default bugs in three other project teams.

Key Takeaway

Build Resilient Systems, Not Fearful Teams.

When an outage occurs, resist the urge to find someone to blame. Ask why your architecture allowed a single command to cause damage. A blameless culture encourages engineers to report bugs early, share failure analysis openly, and build automated guardrails that make production resilient against human error.


Architecture and decisions: mine. Debugging sessions at odd hours: mine. AI assistance: structure, syntax, first draft. β€” Sachin

SKS

Sachin Kumar Sharma

Associate Director (Infrastructure & Cloud Architecture Strategy) | 20+ Yrs Exp

Architecting resilient multi-cloud enterprise landing zones, SDN overlay fabrics, DevSecFinOps automation pipelines, and autonomous Agentic AI platforms.

πŸ“¬

πŸ“¬ Stay Updated on Tech Releases

Sign up to get notified when I publish new production war stories, agentic AI architecture blueprints, or open-source infrastructure tools.

⚑ Theme Adaptive Shift
Switching layouts matching domain reading affinity...