Incident Response and Blameless Postmortems
Things break. What separates good teams from bad ones isn’t preventing every incident — it’s how
fast they recover and how much they learn.
Prerequisites: Availability, Monitoring & Alerting
Time to read: ~16 minutes
The premise
🚨 You cannot prevent all incidents. At scale, something is always failing,
deploys break things, dependencies go down, and humans make mistakes. Accepting this changes the goal:
not “zero incidents” (impossible, and pursuing it makes teams hide problems), but fast recovery and
continuous learning.
This connects directly to MTTR: you improve
availability far more by recovering fast than by trying to fail never. Incident response is the
practice of recovering fast, and postmortems are the practice of learning so the same thing doesn’t
recur.
The incident lifecycle
DETECT → RESPOND → MITIGATE → RESOLVE → LEARN
Detect. An alert fires (or, worse, a customer reports it — which
means your monitoring missed it). 🚨 Detection time is part of your MTTR — a problem you notice in
30 seconds is far cheaper than one you find out about from Twitter an hour later.
Respond. Someone acknowledges and takes ownership. 🚨 Declare an incident explicitly — don’t
let a problem simmer while everyone assumes someone else is handling it. Declaring it activates the
process, assigns roles, and starts communication.
Mitigate — stop the bleeding first. 🚨 The single most important principle: mitigate before you
diagnose. Restore service first, understand the root cause later.
❌ Spend 40 minutes debugging why the deploy broke, while users suffer.
✅ Roll back the deploy in 2 minutes (service restored), THEN debug at leisure.
Rolling back, failing over, shedding load, or toggling a feature flag
off restores service in seconds. Understanding why can wait until users are unaffected. Confusing
mitigation with resolution is the most common incident-response mistake — engineers instinctively
want to fix the root cause, which keeps the outage going.
Resolve. The underlying issue is actually fixed (the mitigation was temporary).
Learn. The postmortem — below.
Incident roles
For anything beyond a minor blip, assign roles so the response doesn’t devolve into chaos:
- Incident Commander (IC) — 🚨 coordinates, does not fix. Their job is to run the incident:
delegate, track, decide, keep everyone aligned. The most common failure is the IC diving into
debugging and nobody steering. The IC stays hands-off deliberately.
- Operations/Responders — the people actually investigating and mitigating.
- Communications lead — updates stakeholders and customers (status page), so responders aren’t
interrupted every two minutes with “any update?”
- Scribe — records the timeline as it happens (crucial for the postmortem — memory is unreliable).
For a small team one person wears several hats, but the IC/fixer separation matters even then — the
person coordinating shouldn’t also be head-down in a terminal.
Communication during an incident
🚨 Silence during an outage is worse than bad news. Customers and stakeholders imagine the worst
when they hear nothing.
- A status page — public, updated regularly, honest. “We’re investigating elevated errors on
checkout. Next update in 30 minutes.” Even “no new information, still working” is valuable.
- Internal channel — a dedicated incident channel (Slack), so everyone has one source of truth and
the timeline is captured.
- Regular cadence — update on a schedule (every 15–30 min) even without news, so people aren’t
refreshing anxiously.
- Honesty — don’t downplay. Overpromising recovery times and missing them destroys trust more than
the outage itself.
The blameless postmortem
🚨 The most important cultural practice in reliability, and a strong thing to advocate in an
interview.
After a significant incident, write a postmortem: a document analyzing what happened, why, and what to
change.
“Blameless” is the load-bearing word. The postmortem focuses on systems and processes, not
individuals.
❌ Blameful: "Bilal deleted the production database."
→ Bilal (and everyone watching) learns: hide mistakes, don't volunteer information.
→ The next person who fat-fingers something covers it up. You learn nothing. It recurs.
✅ Blameless: "A production database was deleted because the staging and production consoles
looked identical, there was no confirmation step for destructive actions, and
there was no guardrail preventing deletion of a database with active connections."
→ The FIXES are obvious: distinguish the environments, add confirmation, add guardrails.
→ People report problems honestly because they won't be punished.
🚨 The core insight: a good person following the available information made a mistake, which means
the system allowed the mistake. If you fix the person (fire them, shame them), the next person in
the same system makes the same mistake. If you fix the system, it can’t happen again. Blame optimizes
for hiding; blamelessness optimizes for learning.
A postmortem contains:
- Timeline — what happened, when (from the scribe’s record).
- Impact — how many users, how long, what was lost.
- Root cause(s) — often plural; usually a chain of contributing factors, not one culprit.
- What went well — detection, mitigation, response (learn from successes too).
- What went poorly — where the response was slow or wrong.
- Action items — 🚨 specific, assigned, and tracked. A postmortem with no follow-through is
theatre. Each action item has an owner and a deadline, and someone verifies they’re done.
The “Five Whys” is a common root-cause technique — keep asking “why” until you reach systemic
causes rather than stopping at the surface. 🚨 But avoid the trap of a single linear root cause; real
incidents usually have multiple contributing factors, and “human error” is never a root cause — it’s a
starting point for asking why the system permitted it.
Severity levels
Not every incident warrants a full war room. Tier by impact:
- SEV1 (critical) — major outage, data loss, security breach. All hands, IC, war room, customer
comms. Rare.
- SEV2 (major) — significant degradation, a core feature down. Formal response, but scoped.
- SEV3 (minor) — limited impact, a non-critical feature. Handle during business hours.
Severity determines the response intensity, who gets paged, and whether a postmortem is required
(usually SEV1/SEV2 always, SEV3 optionally).
Preparing before the incident
🚨 The best incident response is prepared, not improvised at 3am:
- Runbooks — for known failure modes, a documented “if this alert, do this.” Written when calm,
used when panicking. → Monitoring
- A well-defined rollback — the fastest mitigation is often “undo the last change,” so make
rollback fast and safe. → Deployment Strategies
- Feature flags — turn off a broken feature in seconds, no deploy.
→ Feature Flags
- Chaos engineering / game days — practice incidents deliberately, so the real one isn’t the first
time. → Chaos Engineering
- On-call training and escalation paths — people know what to do and who to escalate to.
⚖️ Trade-offs
| Practice |
Gain |
Cost |
| Mitigate before diagnose |
Fast recovery (lower MTTR) |
Root cause found later; temporary fixes |
| Formal incident roles |
Coordinated response, no chaos |
Overhead for minor issues |
| Blameless postmortems |
Honest reporting, real learning |
Requires genuine cultural commitment |
| Regular status comms |
Maintains trust |
Someone must own communication |
| Runbooks / chaos prep |
Fast, practiced response |
Ongoing effort to write and maintain |
In the real world
- Google’s SRE incident-management practice (Incident Commander model, blameless postmortems)
is the industry template, and the free SRE book’s chapters on incident response and postmortem
culture are the definitive reference.
- GitLab’s public postmortem of their 2017 data-loss incident — where an engineer deleted the
wrong directory and five backup mechanisms had silently failed — is a masterclass in blameless
analysis: the write-up focuses entirely on the systemic failures (broken backups, confusing tooling,
fatigue), not the engineer, and they published it openly. It’s worth reading.
- The mitigate-before-diagnose lesson shows up in nearly every major incident retro: the outages
that dragged on were usually ones where responders tried to understand the root cause before
restoring service, and the fast recoveries were ones where they rolled back or failed over first and
investigated after.
🚨 Interview traps
- Diagnosing before mitigating. Restore service first; understand later.
- Not separating the Incident Commander (coordinates) from responders (fix).
- Blameful postmortems — they teach people to hide mistakes.
- “Human error” as a root cause — it’s never the end of the analysis, only the start.
- Postmortems with no tracked action items — theatre.
- Silence during an outage — communicate on a cadence, honestly.
- No runbooks or fast rollback — improvising the response at 3am.
🎙️ Soundbites
- “Mitigate before you diagnose — restore service first, understand the root cause later. The outages
that drag on are the ones where people try to fix the root cause while users suffer, instead of just
rolling back.”
- “The Incident Commander coordinates but doesn’t fix — the most common failure is the IC diving into
debugging and nobody steering the response.”
- “Postmortems are blameless because a good person following the available information made the
mistake, which means the *system allowed it. Fix the person and the next person makes the same
mistake; fix the system and it can’t recur. Blame just teaches people to hide problems.”*
- “‘Human error’ is never a root cause — it’s the start of asking why the system let a human error
cause an outage. The fix is usually a guardrail, a confirmation step, or better tooling.”
- “Silence during an outage is worse than bad news. I’d update the status page on a fixed cadence,
honestly, even when the update is ‘still working, no new information.’”
🛠️ Try it
1. Run a game day. Deliberately break something in a staging environment (kill a service, corrupt
a config) and have the team respond as if it were real — declare the incident, assign an IC, mitigate,
resolve. Practicing when it’s not real is how you’re calm when it is, and you’ll discover your
runbooks have gaps.
2. Write a blameless postmortem. Take a real incident (yours or a public one) and write the
postmortem: timeline, impact, root causes (plural), what went well/poorly, action items with owners.
Then reread it and remove every trace of blame — rewrite “X did Y” as “the system allowed Y.” Feel
the difference.
3. Practice mitigate-before-diagnose. In a test environment, break something with an obvious
rollback. Time two approaches: debug-then-fix vs rollback-then-debug. The rollback restores service in
seconds; the debugging keeps it broken for minutes. That gap is your MTTR difference.
4. Audit your rollback. For a real deploy, time how long a rollback actually takes and whether it’s
safe (does it handle a schema change? a half-migrated state?). If rollback is slow or risky, that’s a
reliability gap — the fastest mitigation isn’t available.
Check yourself
1. Why mitigate before you diagnose?
Because the goal during an incident is to restore service to users as fast as possible, and understanding
*why* something broke takes far longer than stopping the harm. If a deploy caused the outage, rolling it
back takes two minutes and immediately restores service; diagnosing the exact bug in the deploy might
take forty minutes, during which users continue to suffer. So you mitigate first — roll back, fail over,
shed load, toggle a feature flag off — to stop the bleeding, *then* investigate the root cause at
leisure with users unaffected. Confusing mitigation with resolution is the most common incident-response
mistake: engineers instinctively want to find and fix the real cause, which keeps the outage running.
This is also why fast, safe rollback and feature flags are such valuable reliability tools — they make
the fastest mitigation available. Recovering fast (low MTTR) improves availability more than trying to
never fail.
2. Why does the Incident Commander coordinate rather than fix?
Because someone needs to run the incident, and that job is incompatible with being head-down debugging.
The IC's role is to maintain the overall picture: delegate tasks, track what's been tried, make
decisions (do we roll back? escalate? call in another team?), ensure communication is happening, and
keep everyone aligned toward mitigation. If the IC dives into fixing, nobody is steering — responders
duplicate work or go down rabbit holes, no one decides between competing approaches, stakeholders get
no updates, and the response becomes chaotic. The person with the deepest technical knowledge of the
failing system should be *investigating*, not coordinating, precisely so their attention isn't split.
Even on a small team where one person wears multiple hats, the discipline of separating "who's steering"
from "who's fixing" — even mentally — keeps the response coherent under pressure.
3. What makes a postmortem "blameless," and why does it matter?
Blameless means the analysis focuses on systems, processes, and contributing factors rather than
attributing fault to individuals — "the tooling made staging and production indistinguishable and had
no confirmation for destructive actions," not "Bilal deleted the database." It matters because of a
fundamental insight: a competent person, acting reasonably on the information available to them, made
the mistake — which means the *system permitted* the mistake. If you respond by blaming or punishing
the person, you don't fix the system, so the next person in the same situation makes the same error;
worse, you teach everyone that mistakes get punished, so people hide problems, don't volunteer
information, and cover up incidents — destroying the honesty that learning depends on. Blameless
postmortems optimize for honest reporting and systemic fixes (guardrails, confirmations, better
tooling) that actually prevent recurrence. Blame optimizes for hiding, which guarantees recurrence.
4. Why is "human error" never an acceptable root cause?
Because it stops the analysis exactly where the useful learning begins. "A human made a mistake" is
true of almost every incident and tells you nothing actionable — you can't prevent humans from ever
erring. The productive questions start *after* that observation: why did the system allow a human error
to cause an outage? Why was there no confirmation step for a destructive action? Why did the tooling
make it easy to run the command against production instead of staging? Why did no guardrail catch it?
Why was the person tired, or rushing, or misinformed? Each "why" moves from the individual toward
systemic, fixable causes — a missing confirmation, an ambiguous UI, an absent safety check, an
overloaded on-call schedule. Treating "human error" as the root cause leads to useless remedies
("be more careful," "we told them not to"); treating it as the *start* leads to guardrails that make
the mistake impossible or harmless next time.
5. What preparation makes incident response fast rather than improvised?
Several things done while calm, before the incident. **Runbooks** — documented "if this alert fires, do
this" procedures for known failure modes, written when you can think clearly and used when you're
panicking at 3am. **Fast, safe rollback** — since undoing the last change is often the quickest
mitigation, rollback must be quick and handle edge cases like schema changes. **Feature flags** — to
disable a broken feature in seconds without a deploy. **Practiced response** via chaos engineering and
game days, so the real incident isn't the first time the team has run the process, declared an
incident, or used the tooling. **Clear on-call rotations and escalation paths**, so people know their
role and who to escalate to. **Good monitoring** so detection is fast (detection time is part of MTTR).
And **a defined incident process** with roles and severity levels, so the response has structure rather
than devolving into a scramble. The common thread: everything you can decide, document, or rehearse in
advance is one less thing to figure out under pressure while users are affected.
Further reading