Skip to main content

Incident Response & Postmortems

Introduction

Alerting Philosophy got you a pager that rings rarely and means it. So now it's 3 a.m., it rang, and it was real: checkout is throwing errors for a third of your users. Someone is awake, staring at a dashboard, adrenaline up. What happens in the next thirty minutes is the difference between a footnote and a headline, and it splits cleanly into two phases. First you respond: you stop the damage, fast and coordinated. Then, days later and calm, you learn: you write down what happened so this exact failure can never surprise you the same way again.

Most teams are bad at both, and in the same revealing way: they improvise. The response is five engineers all SSH-ing into the same box, three theories running in parallel, nobody updating the customers, and one exhausted hero who eventually fixes it alone and tells no one how. The learning, if it happens, is a meeting that finds someone to blame and changes nothing. This lesson is the opposite of improvising: a small, boring, battle-tested structure for the firefight, and a blameless ritual for turning every fire into a system that's a little harder to burn.

Two ways to run an incident, side by side. On the left, chaos: five engineers all diving into the same failing service at once, a tangle of crossing arrows, nobody talking to customers, labeled everyone debugging, no one leading. On the right, command: one calm figure at the center, the Incident Commander, who is not touching the code but is coordinating three clear streams — an Operations lead applying the fix, a Communications lead posting to a status page, and a scribe keeping the timeline — labeled one coordinator, clear roles. Law band: the commander does not debug; they hold the whole picture so everyone else can do one job well.

Incident Command: One Person Coordinates

The structure that tames the chaos was not invented in tech. It's the Incident Command System, built by California firefighters in the 1970s to coordinate the mess of agencies fighting a wildfire, and it works for outages for the same reason: the enemy of a crisis is not the fire, it's confusion. The core move is to split coordinating from doing:

  • The Incident Commander (IC) owns the incident and, crucially, does not debug. Their whole job is to hold the big picture: who is doing what, what have we tried, what's the current theory, is it getting better or worse, do we need more people. The instant the IC dives into a log file, no one is flying the plane. This is the single most counterintuitive rule in incident response and the one that separates calm outages from chaotic ones.
  • The Operations lead and any subject-matter experts are the ones who actually touch the system: reading logs, forming theories, applying the fix. They report to the IC.
  • The Communications lead owns the outside world: the status page, the updates to leadership and customers, so the engineers never have to stop working to answer "is it fixed yet?"
  • A scribe keeps a timestamped log of what happened and when, which becomes the spine of the postmortem later.

On a small incident, one person may wear several of these hats — but the roles still exist, and someone is explicitly the IC. And declare early: the cost of declaring an incident that turns out to be minor is a few minutes of a few people's attention; the cost of declaring one twenty minutes too late is those twenty minutes of unmanaged damage. When in doubt, declare. A severity label (a customer-facing outage is not a slow dashboard) just tells everyone how many of these roles to fill and how loudly to escalate.

Stop the Bleeding First

Here is the reflex that feels wrong to every engineer and is right every time: mitigate before you diagnose. Your instinct, trained by a career of debugging, is to understand the problem before you touch it. In an incident, that instinct is a trap. Every minute you spend reading logs to find the root cause is a minute your users are still down, and the user does not care why checkout is broken. They care that it's broken.

So the first question in any incident is not "what caused this?" but "what's the fastest way to make it stop?" — and the answer is almost always one of a handful of blunt, reversible instruments you already built: roll back the deploy that started it (even if you're not sure it's the cause), fail over to a healthy replica or region, flip the feature flag off, or shed load with the tools from Load Shedding & Graceful Degradation. These restore service without requiring you to understand anything. Once the bleeding has stopped and users are back, the incident is no longer an emergency — it's an investigation, and investigations are done calmly, off the clock, with everyone rested. Restore first, understand second. The root cause will still be there in an hour; your users' patience will not.

Now run one yourself. The console below drops you into a live outage with the impact climbing every second. Declare it, put one person in command, mitigate before you go hunting, and keep people informed — and watch what each decision does to the curve, the coordination, and the trust. Then try the tempting trap of diagnosing first, and watch the damage balloon.

Mitigate before you diagnose, drawn as two timelines of the same outage. Top, the wrong order: the team spends a long red stretch labeled hunting for the root cause while users stay down the whole time, and only right at the end applies the fix — the outage is long. Bottom, the right order: the team immediately rolls back or fails over, a short green step labeled stop the bleeding, so users are back almost at once, and only THEN, off the clock, investigates why in a calm blue stretch. A callout reads the user doesn't care why — they care that it's fixed. Law band: restore service first, understand it second.
Run a live incident. Checkout is failing and the impact is climbing every second. Make the command decisions — declare it, assign an Incident Commander, mitigate by rolling back before you go hunting for the cause, and post a status update — and watch the impact curve bend down, coordination hit 100, and trust hold. Or try the tempting trap, find the root cause first, and watch the damage balloon while you investigate. The lesson you can only feel under a ticking clock: stop the bleeding first, and let one person coordinate.

Communicate Like It's Part of the Fix

During an incident, silence is its own outage. Every minute customers stare at a broken checkout with no acknowledgment, they lose trust faster than the bug itself costs you, and internally, leadership with no information starts pulling engineers off the fix to ask for status. The cure is deliberate over-communication, and it has two audiences.

Inside, everything happens in one place — a single incident channel that is the unarguable source of truth. Not three Slack threads, a DM, and a hallway conversation; one channel, where the timeline lives and every decision is written down as it's made. Outside, a status page with honest, regular updates on a predictable cadence — "we're aware, we're investigating, here's the impact, next update in 30 minutes" — even when the update is that there's no update. Customers forgive outages; they do not forgive being ignored during one. This is the Communications lead's entire job, and it's why the role exists: so that keeping the world informed never competes with fixing the thing.

The Blameless Postmortem

The fire is out. Days later, calm, you write the postmortem — the document that turns one painful night into permanent organizational memory. Its power comes almost entirely from one word: blameless.

Picture the two futures. In a blame culture, the postmortem asks "whose fault was it?", finds the engineer who pushed the bad config, and makes an example of them. The lesson everyone actually learns is not don't push bad configs — it's don't get caught. People start hiding mistakes, minimizing incidents, and quietly working around the reporting, and your organization goes blind to its own weaknesses right up until the next one takes you down. In a blameless culture, you begin from the assumption that everyone acted reasonably given what they knew at the time, and you ask a completely different question: not who did this but how did our system let a single reasonable action cause an outage? People tell you the whole unvarnished truth, because telling it is safe, and that truth is the only raw material real improvement is made of.

This isn't softness; it's the harder, more useful path. As the culture's founding idea puts it, human error is a starting point, not a conclusion. "An engineer made a mistake" is never the end of a good postmortem — it's the first clue in the investigation of a system that made that mistake easy to make and easy to turn into a disaster. The document itself is mechanical: a timeline of what happened, the impact (users, duration, revenue, error budget spent from SLIs, SLOs & Error Budgets), the contributing factors, what went well, and where you got lucky. But the culture is what makes anyone tell you the parts that matter.

Why postmortems are blameless, drawn as a fork with two futures from one failure — a bad config took us down. The left path, BLAME (red): whose fault was it, then the person hides it, then so does the next one, ending in a red box, it happens again. The right path, BLAMELESS (green): how did we allow it, then people share the truth, then we add a guardrail, ending in a green box, it can't recur. Law band: human error is where you start looking, not where you stop.

Root Cause Is a System, Not a Person

Blamelessness leads directly to a better kind of answer. When you stop hunting for a guilty human, you're forced to hunt for a broken system, and complex outages never have a single tidy cause anyway — they have a chain of contributing factors that all had to line up, the same shape as the cascades you took apart in Cascading Failures. The discipline is to keep asking "and why did the system allow that?" until your answers stop being about people and start being about guardrails.

"An engineer pushed a bad config" is where lazy postmortems stop, and the fix they write down — be more careful — is not a fix at all, because it changes nothing about the system and relies on humans being perfect, which they are not. Keep climbing. Why did a bad config reach production? There was no validation. Why did it take the whole site down instead of one canary box? There was no canary deploy. Why did it stay down for forty minutes? There was no one-click rollback. Now you have three real fixes — add config validation, add a canary stage, add fast rollback — each of which makes this class of failure impossible or survivable no matter who's at the keyboard. The engineer was the trigger; the missing guardrails were the cause. Fix the system, and you've protected yourself against not just this mistake but every future engineer who would have made it.

Root cause is a system, not a person, drawn as a ladder of whys. At the bottom rung, the lazy stop: an engineer pushed a bad config, with a red X over be more careful as a non-fix. Each rung up asks why the system allowed it — why did a bad config reach production (no validation) — why did it take everything down (no canary) — why did it stay down (no fast rollback) — and each lands on a real, systemic fix: add config validation, add a canary deploy, add one-click rollback. To the right, an action-items card lists those three fixes, each with an owner and a due date and a checkbox, under the heading owned, dated, tracked. Law band: a postmortem's worth is its action items done, not its blame assigned.

Action Items, or It Didn't Happen

A postmortem full of brilliant insight and no follow-through is theater — an expensive way to feel like you learned something before the identical outage happens again. The entire cash value of the ritual is in its action items, and they have to be built to survive contact with a busy roadmap:

  • Owned. Every action item has exactly one name on it. "The team will add validation" is a wish; "Priya adds config validation" is a commitment.
  • Dated and tracked. It goes into the same backlog as everything else, with a due date and a priority, and someone checks that reliability work actually ships and doesn't lose every sprint to features. This is exactly what the error budget from SLIs, SLOs & Error Budgets is for: when the budget is spent, these are the tickets that jump the queue.
  • Real, not aspirational. A guardrail you add, not a behavior you promise. Prefer make the mistake impossible over ask people not to make it.

And write them for the near misses too — the incident that almost happened, the alert that caught it just in time, is a free lesson with no outage attached, and the cheapest postmortem you'll ever get. A team that writes blameless postmortems, fixes the system instead of the person, and actually closes its action items earns a quietly rare property: it has the same outage exactly once.

Key Takeaways

  • Respond, then learn. The firefight and the postmortem are two different disciplines with two different tempos; do both, and don't confuse them.
  • One person coordinates, and they don't debug. The Incident Commander holds the picture while Operations fixes and Communications talks. Declare early — a false alarm is cheap, a late declaration is not.
  • Mitigate before you diagnose. Roll back, fail over, flip the flag — restore service first, understand it second, because the user cares that it's broken, not why.
  • Postmortems are blameless, or they're lies. Blame makes people hide; blamelessness makes them share. Human error is a starting point, not a conclusion.
  • The root cause is a missing guardrail, and the fix is an owned, dated action item. Climb from the person to the system, and a postmortem with no closed action items is just an expensive feeling.

You now know how to survive an incident and how to make the next one rarer. But some incidents can't be mitigated by a rollback or a failover, because the damage is already permanent: the data is corrupted, the region is underwater, the database is gone. For those, "restore service" is not a one-click button — it's a plan you had to build in advance, measured by two numbers that decide how much data and how much time you can afford to lose. That is Disaster Recovery: RTO & RPO.