Shipping and supporting

How to run a root cause analysis

An RCA is not a blame exercise. It is an investigation into the system that allowed the failure, so the next one does not happen the same way.

steps
9
named failure modes
5
definition-of-done criteria
6

How to run a root cause analysis, in one paragraph

A root cause analysis is the structured investigation you run after a failure that reached users, or came close enough that luck was the control. It asks what in the system allowed the failure, not who typed the wrong thing. A good one produces a timeline nobody disputes, two to four contributing causes that each name a control you own, a measurable cut in how fast you would detect it next time, and actions that exist as tickets on the quarter's Bug Budget or Tech Debt epic. If it ends as a document, it did not happen.

What these are. The delivery operating model our engagements install alongside client teams: the method underneath the agentic work rather than the agentic work itself, published in full and free to use. It is written for the person running a quarter, not for a buyer, so if you are evaluating us, read the five priced engagements or the case studies instead.

When to use this

Run one when a defect reached production and affected users, when live monitoring produced a rollback call, or when a near miss was caught by a person noticing rather than by a control firing. A failure shape that has now happened three times earns one even when each occurrence looked small.

Time to run it once
Five working days, evidence frozen inside the first 24 hours
What you need
  • A frozen evidence record: logs, alerts, deploy records and the incident chat
  • The RAID log
  • The delivery tracker
9 steps

Step by step

Each step is deep-linkable, so you can send a colleague the one that is in dispute.

  1. 1

    Set the triggers before you need them

    Agree the trigger list in advance and apply it without debate: anything that reached users, any rollback called during live monitoring, any severity-one defect, any near miss caught by a person rather than by a control, and the third occurrence of the same failure shape. The delivery lead for that team makes the call within one working day and records which trigger fired. Everything else gets a bug ticket on the Bug Budget epic and no ceremony. Deciding case by case, in the mood immediately after an outage, is how the embarrassing incidents get investigated and the boring recurring ones never do.

  2. 2

    Freeze the evidence within 24 hours

    Name one owner for the incident record and give them a day.

    Copy logs, dashboard screenshots, alert payloads, deploy records, feature-flag changes, support tickets and the incident chat into the record itself, rather than linking out to systems that roll at seven or thirty days. Then ask everyone involved to write down separately, before any group meeting, what they saw and when they saw it, in their own words. Separate accounts captured first are your only defence against the room converging on the loudest person's version inside the first ten minutes, and once that has happened you cannot recover the original recollections.

  3. 3

    Build one agreed timeline in UTC

    Book ninety minutes within five working days.

    Invite the people who were there, plus a facilitator who was not. Open with the timeline and nothing else. Mark four moments: when the condition entered the system, when the failure began, when a human or a control first noticed, and when customers stopped being affected. Timestamp to the minute in UTC and name the source of every entry. Failure to notice is your time to detect. Failure to recovery is your time to restore. Circulate the timeline for correction before anyone discusses causes, so the argument about causes is not a disguised argument about the times.

  4. 4

    Separate the trigger from the conditions

    Draw two columns.

    The trigger is the change that lit the fuse: a deploy, a traffic spike, an expiring certificate, a third party altering a response shape. The conditions are what made the system flammable: no timeout, no fallback, an alert routed to a channel with no rota, a test suite that never covered that journey. For each condition, ask what should have contained this and write the answer next to it. A rollback removes the trigger and leaves every condition standing, which is why the same incident returns wearing different clothes. Nearly every action you raise should come out of the conditions column, not the trigger.

  5. 5

    Ask why until you reach a control

    Take each condition and ask why it was there, stopping when you reach something the team can change: a standard, a test, an alert, a gate, a default, a runbook. If an answer names a person, you are not finished, ask why the system let one person's attention be the control. If an answer names something outside your control, a supplier's API or a cloud region, then the control you own is whatever should have contained it: a timeout, a circuit breaker, a cached fallback, a contract test. Three or four whys usually gets there. Chains of seven tend to be creative writing.

  6. 6

    Test every cause against a counterfactual

    For each candidate cause ask one question: if this alone had been different and nothing else had changed, would the incident still have happened? If yes, it is context and belongs in a background paragraph rather than in the causes list. If no, it is a contributing cause and it earns exactly one action. Run the test out loud so the room hears which items fail it. This is the step that stops an RCA becoming a list of everything anyone dislikes about the codebase. Expect two to four contributing causes. If you have eleven, you have written a wish list, and nobody funds a wish list.

  7. 7

    Produce at least one detection action

    Every RCA raises a detection action, no exceptions.

    Write three things down: the current time to detect taken from the timeline, the target you are committing to, and the specific signal that would have fired. Name it precisely, an error-rate threshold on a stated endpoint, a synthetic journey run every five minutes, a support-contact spike, a queue depth. Then say who is rostered to answer it, because an alert routed to a channel nobody owns is not detection. If a customer told you before your systems did, state that plainly. Fixing this defect without shortening detection leaves you equally blind to the next one.

  8. 8

    Convert findings into linked, budgeted tickets

    An action that is not a ticket is a sentence.

    Raise every one during the session, on screen, before people leave. Defects go to this quarter's Bug Budget epic. Missing tests, alerting and hardening go to the Tech Debt epic. Anything large enough to need product prioritisation becomes an epic under an outcome, with a quarter and a planned currency share, competing for capacity like any other epic. Give each ticket a named owner, not a team. If an action cannot get an owner and a quarter in the room, record it as deliberately declined, with the reason and who declined it, instead of listing it and quietly dropping it.

  9. 9

    Publish it, then close actions in the open

    Publish within five working days, in the same place every time, readable by anyone in the organisation rather than only the people on the call. Put the actions on the agendas of the next two retrospectives and close them out loud there. Where the failure exposed a standing risk you are choosing to live with, add it to the RAID log as an accepted risk with a named owner and a review date, so it stays visible rather than being resolved by silence. Before you open the next quarter's roadmap, reread the quarter's RCAs together: a failure shape that appears twice is the tech debt you should be funding.

Worked example

Worked example: forty-one minutes blind on checkout

An online retailer ships a payment-provider config change at 09:12 UTC. Card declines rise from 2% to 31%. The first signal is a customer email at 09:53, so time to detect is 41 minutes. Rollback is called at 10:04 and customers are clear at 10:11, so time to restore is 59 minutes. Trigger: the config change. Conditions: no alert on decline rate, and no contract test covering the provider's new error code. Counterfactual on "the change went out on a Friday": the incident happens on any day of the week, so that is context, not a cause. Two actions leave the session as tickets. First, a decline-rate alert at 5% sustained over five minutes, target time to detect under five minutes, owned by a named engineer, on the quarter's Tech Debt epic. Second, a contract test on the provider's error codes, same epic, same quarter. The Friday deploy question goes in the background paragraph and gets no ticket.

Failure modes

Where this goes wrong

  1. 01

    Stopping at human error.

    "The engineer skipped the check" describes the last thing that happened, not why the system depended on someone remembering. It feels conclusive, which is exactly why teams stop there, and it produces the one action nobody can implement: be more careful.

  2. 02

    Running it two weeks late.

    Logs have rotated, dashboard retention has closed, and everyone has rehearsed a version of events that makes sense to them. What you get is a coherent document that is partly fiction, and it reads well enough that nobody challenges it.

  3. 03

    Actions with no ticket, no owner and no quarter.

    They read like commitments inside the document and are invisible by week three, because they never entered the roadmap and so never competed for capacity against anything else.

  4. 04

    Treating the rollback as the fix.

    Reverting restores service and removes the trigger while every condition that let the trigger matter survives. The incident returns with a different trigger, and the team concludes that RCAs do not work.

  5. 05

    Only investigating the incidents that were embarrassing.

    Small recurring failures cost more in aggregate and never clear the bar for attention, which is why a written trigger threshold beats judgement in the moment.

Definition of done

Done means

  • The timeline is agreed by everyone who was in the incident, every entry names its source, and it states both time to detect and time to restore.
  • Every contributing cause survived the counterfactual test and names a control the team can change, not a person.
  • At least one action shortens time to detect, with the current number, the target and the specific signal all written down.
  • Every action is a ticket with a named owner, linked to the quarter's Bug Budget epic, the Tech Debt epic or a new epic carrying a quarter and a currency share, or is recorded as deliberately declined with a reason.
  • The document is published within five working days, where anyone in the organisation can read it without asking.
  • The actions are on the agenda of the next two retrospectives and closed there in front of the team, rather than in private.
If your team is AI-native

For AI-augmented teams the failing control is usually a story's acceptance criteria, or the human review that waved the change through, so the actions land in the definition of done and the test suite. For AI-native teams the unit of work is the outcome ticket, and two conditions recur: a user journey that was never listed in the ticket, and verification that rested on the model reporting it had finished. Fix both in the ticket itself, by adding the journey to the standing list and by requiring a demonstrated run rather than a claimed one. Ask one extra question in every AI-native RCA: what did the ticket fail to say?

The two delivery modes, side by side →

Questions

How is an RCA different from live monitoring?

Live monitoring is the scheduled watch over a change after it ships: customer impact, support volume, the FAQ and the support macro, and the continue, watch or rollback call. It runs on every release, whether or not anything is wrong. An RCA is triggered by what live monitoring finds, or by an incident that arrives with no warning at all. Live monitoring asks whether this release is behaving. An RCA asks why the system allowed it not to, and it ends in funded tickets rather than a call.

Who should run the session?

Someone who did not build the thing that failed and does not manage the people who did. Their job is the method rather than the investigation: holding the timeline until it is agreed, applying the counterfactual test to every candidate cause, and stopping the room whenever an answer names a person instead of a control. Keep the room to the people who were there plus that facilitator. Once it becomes a stakeholder audience, people start performing rather than remembering, and you lose the detail you came for.

What if the cause sits with a supplier we do not control?

Then you have found the trigger and you still owe the conditions. You cannot action a third party's deploy schedule, but you can action the timeout you did not set, the fallback you did not build, the contract test you did not write, and the alert that would have told you their response had changed shape. Raise the commercial conversation separately, and log the dependency in the RAID log as an accepted risk with a review date, but do not let a supplier's name become the reason no ticket was raised.

Is this supposed to be blameless?

Blameless means the cause is never a person, not that names vanish from the timeline. Write plainly that an engineer ran the deploy at 09:12, because the timeline is worthless without it. What you never write is that the engineer was the cause. If the honest finding is that one person's memory was the only thing standing between a change and production, then the missing control is a gate, and the action is to build it.

Want help installing this?

These guides are free and you owe us nothing for using them. If you would rather have operators install the operating model alongside your teams and stay until it sticks, that is what our engagements do.

30 minutesWith James personallyNo obligation

Most organisations start with a fixed-price Agent-Readiness Audit · £30k–£90k · 6–8 weeks