New: Try Voli The Bear, Fast package manager (and not only) for Windows
Updated Jun 19, 2026 Edit on GitHub

After: the Blameless Postmortem

The site is back and every instinct says close the laptop and never speak of this again. That instinct is the single most expensive mistake in the incident - an outage you don't learn from is one you've prepaid for next time.

Every outage is tuition. The only question is whether you let it buy something.

You already paid the cost - stress, downtime, lost sleep. The postmortem is how you collect what you bought: understanding and prevention. Skip it and you paid full price for nothing. This phase covers running that process so it's clear, useful, and safe to participate in.

Start while it's fresh: the timeline

Before any analysis, write down what happened, in order, with timestamps. A live timeline kept during the incident (Phase 2) is mostly assembled already. Otherwise, reconstruct it today while memories are warm - every day you wait, details blur and order scrambles.

A good timeline is purely factual - no blame, no analysis yet, just events:

   13:55  release v2.32.0 merged and auto-deployed to prod
   14:01  v2.32.0 finished rolling out to all pods
   14:03  error-rate alert fires (checkout 500s)
   14:05  incident declared, IC assigned
   14:08  v2.32.0 identified as prime suspect (timing)
   14:12  rollback initiated
   14:17  checkout recovered - user impact ends
   14:40  root cause confirmed: null-pointer on missing promo field

From this you can read the two numbers that measure your response:

  • Time to detect - incident start to alert firing (here, ~2 minutes: 14:01 → 14:03).
  • Time to mitigate - declared to user-impact-ended (here, ~12 minutes: 14:05 → 14:17).

📝 Terminology. MTTR - mean time to recovery/resolve - is the average recovery time across many incidents. One incident gives a data point; MTTR is the trend. Read these off the real timeline, don't fabricate or eyeball them.

💡 Key point. These numbers show where to invest: slow to detect means an alerting gap, fast to detect but slow to mitigate means a tooling or runbook gap. The timeline diagnoses your response, not just the bug.

Root cause vs. contributing factors

The seductive trap of a postmortem is hunting for the one cause - a line of code, a person, a bad command - and going home. Real outages almost never have one cause; they have a chain of individually-survivable things that lined up to let the failure through. Separate the two:

  • Root cause - the technical trigger. "A null-pointer exception when an order arrived without a promo-code field." True, but incomplete by itself.
  • Contributing factors - everything that let that trigger become a customer-facing outage: no canary stage, no test for the missing-field case, no alert until customers were already failing, and a rollback that took twelve minutes because nobody had practiced it.
   ROOT CAUSE          ──► the technical trigger that fired
   (null on promo field)

   CONTRIBUTING FACTORS ──► why the trigger reached users
     • no canary / staged rollout caught it
     • no test covered the missing-field case
     • no alert until customers were already failing
     • rollback was slow (never rehearsed)

   The lesson lives in the contributing factors,
   because that's where you have the most leverage to prevent the NEXT,
   different, outage.

💡 Key point. The contributing factors hold the real value: fixing the null-pointer prevents that exact bug, but fixing "no canary stage" prevents a whole class of outages you haven't hit yet. Push past "what broke?" to "why did it reach our users?"

Blameless: systems fail, not people

A blameless postmortem treats the failure as a property of the system, not a fault of a person.

📝 Terminology. Blameless doesn't mean "no accountability" or "nobody made a mistake" - it means the postmortem fixes the system that allowed the mistake to cause an outage, not identify a human to punish. The question is never "who screwed up?" but "why did our system let a normal human error become a customer-facing outage?"

This isn't just kindness - it's practical: blame destroys the information you need to prevent the next outage. In a culture that hunts for someone to fire:

  • People hide what they actually did, so your timeline is fiction and you can't learn from it.
  • People stop volunteering for risky-but-important work, so the most fragile systems get the least attention.
  • The deepest, most useful insights - "I didn't understand what that flag did" - never get spoken, because saying them is dangerous.

A blameless culture is what makes people tell the truth, the only raw material a postmortem has. Punish truth-telling and get silence; reward it and get the information that prevents the next outage.

In practice: "Maria deployed the bad code" is blame and teaches nothing - anyone could deploy that code tomorrow. "Our pipeline let a change with no test for a common input go to 100% of production with no canary and no fast alert" is blameless and actionable. Same event, different hunt: one for a culprit, one for a fix. The person who pushed the button is almost never the cause - just the last visible step in a chain the system should have caught.

🪖 War story. The most psychologically safe team I've seen had a ritual: whoever was "closest to" an incident often volunteered to write the postmortem, and the group reframed any "I messed up" into "what about the system made that mistake so easy, and so costly?" New engineers, braced to be blamed, were stunned to get helped instead. That team shipped faster because people weren't afraid - fear makes people slow, defensive, and quiet, and quiet is fatal to learning.

⚠️ Watch for blame in disguise. "Why didn't you test it?" is blame wearing a process costume; "what would have made it easy to catch this in testing?" is genuinely blameless. Same concern, different result - one makes the person defend themselves, the other makes the team think about the system. Listen for the accusatory "you" and reframe toward the system.

Turn the incident into prevention

A postmortem that ends in understanding but no changes is a diary entry, not an investment. What matters is a short list of action items, concrete, owned, and tracked like any other work:

  • Specific and verifiable - "add a canary stage that holds at 5% for 10 minutes before full rollout," not "be more careful with deploys."
  • Owned - a named person, not "the team" (which means no one).
  • Tracked - a real ticket with a due date, reviewed like any other work, not a bullet in a doc nobody reopens.

The strongest action items remove the contributing factors, since each defuses a whole class of future outages. They fall into three families:

  • Better alerts - if you were slow to detect, add or tune an alert so next time you know in seconds, not from customers. (Detection gaps come straight off your "time to detect" number.)
  • Tests & canaries - a test for the input that broke; a canary/staged rollout so a bad deploy hits 5% of traffic, trips an alert, and auto-rolls-back before it reaches everyone.
  • Guardrails - the strongest of all: make the failure structurally impossible. A schema constraint that rejects the bad data, a type that can't be null, a deploy gate that blocks releases without canary coverage - it beats "remember to be careful" because it doesn't depend on anyone remembering.

💡 Key point. Prefer guardrails over vigilance. "We'll remember to check this next time" is the weakest action item - it relies on humans being more reliable than they are. Convert "remember to…" into "the system won't let you…" and one outage becomes permanent protection.

⚠️ The graveyard of good intentions. The most common postmortem failure isn't bad analysis - it's great analysis whose action items never get done. Unowned, undated, untracked items quietly die, and six months later the same outage recurs. Put them in the same backlog as your feature work, with owners and dates, and review them. An action item that isn't tracked didn't happen.

Every outage is tuition - make it buy something

Look at the arc of this guide: calm in the first five minutes, bleeding stopped before diagnosing, the incident run with one coordinator, clear comms, and a live timeline. Now you close the loop - a clear-eyed, blameless postmortem that converts the wreckage into prevention.

That last step compounds. A team that does this turns each outage into permanent improvements - better alerts, real tests, structural guardrails - so the system gets more resilient and incidents get rarer and shorter. A team that skips it pays the same tuition over and over, reliving the same outage with different dates.

You already paid for the lesson - in stress, downtime, sleep. The postmortem is how you collect what you bought. Don't leave it on the table.

Make the outage buy something. That's the difference between a team that gets paged at 2am forever and a team that, slowly, stops.

Recap

  1. Timeline first, while it's fresh - purely factual, with timestamps; read your time to detect and time to mitigate off it (and don't fabricate the numbers).
  2. Root cause vs. contributing factors - the trigger is rarely the whole story; the leverage lives in the factors that let the trigger reach users.
  3. Blameless means systems fail, not people - not out of niceness but because blame destroys the clear information a postmortem runs on. Punish candor, get silence.
  4. Watch for blame in disguise - reframe "why didn't you…?" into "what would have made this easy to catch?"
  5. Turn it into prevention - specific, owned, tracked action items; prefer guardrails (make it impossible) over vigilance (remember to be careful).
  6. Every outage is tuition. You've already paid. The postmortem is how you collect what it bought.

Watch it animated: root-cause analysis


← Guide overview

Before the quiz: without looking back, say (or jot down) the core idea of this phase in your own words.

Check your understanding 3 questions

1. Why write the incident timeline live, during the incident?

2. What is the difference between root cause and contributing factors?

3. What does blameless really mean, and why is it non-negotiable?