How to run a root cause analysis
- 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.
That is the procedure. The call is where it meets your delivery structure.
Talk it throughWhat 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.
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
If you do not have those in place, the call is a good place to work out what comes first.
Talk it throughOn this page
Step by step
Each step is deep-linkable, so you can send a colleague the one that is in dispute.
- 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
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
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
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
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
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
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
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
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.
Bring a real piece of work to the call and we will walk it through these.
Talk it throughWorked example: forty-one minutes blind on checkout
The incident below is invented and every figure in it with it. 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.
Yours will look different. Thirty minutes is enough to see how.
Talk it throughWhere this goes wrong
- 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.
- 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.
- 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.
- 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.
- 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.
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 you recognise one of those already happening, that is a good call to have.
Talk it throughFor 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 →Which mode your team is actually in is the first thing we establish on a call.
Talk it throughWhere this sits in a programme
The procedure is the same whatever you are building. These cover what it runs into when the thing being built is agentic.
If you want this run inside a programme rather than read, that is the conversation.
Talk it throughMore on shipping and supporting
These guides are written to be read in order.
How to write release notes
Release notes serve four audiences with one ship: customers, support, executives, and the on-call developer. Write each for its reader.
How to monitor the first week after a release
The first seven days post-release are when reality contradicts the staging environment. Live monitoring is the structured check that catches it.
Or skip ahead and ask which of these your team needs first.
Talk it throughWant 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.
most start with a fixed-price AI Readiness Audit · £44,000 · 4 weeks · working prototypes
Calendar not loading? Open it on cal.com or email hello@tenhaw.com.
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. Tenhaw does this as an outside facilitator, brought in because it did not build the system under discussion. 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.
Which incidents actually need a root cause analysis?
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 firing, and the third occurrence of the same failure shape. The delivery lead makes the call within one working day and records which trigger fired; everything else becomes a bug ticket with no ceremony. Deciding case by case, in the mood straight after an outage, means the embarrassing incidents get investigated and the boring recurring ones, which cost more in aggregate, never do.
How soon after an incident should you run a root cause analysis?
Freeze the evidence within 24 hours and hold the session within five working days. One named owner copies logs, alert payloads, deploy records and the incident chat into a record that will not rotate away, and everyone involved writes down what they saw before any group meeting. The ninety-minute session then builds one agreed timeline before causes are discussed, and the write-up is published within five working days. Wait two weeks and logs have rotated and everyone has rehearsed a version of events, so what you get is a coherent document that is partly fiction.
What is the difference between a trigger and a root cause?
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 root causes almost always sit in the conditions that 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. 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.
How do you decide if something is a real cause or just context?
Run a counterfactual test on every candidate. 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. 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. Expect two to four contributing causes from a typical incident; a list of eleven is a wish list of everything anyone dislikes about the codebase, and nobody funds a wish list.
How many whys should a five whys analysis actually take?
Usually three or four. Stop when you reach a control 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 it names something outside your control, the control you own is whatever should have contained it, such as a timeout, a circuit breaker or a contract test. Chains of seven whys tend to be creative writing rather than analysis.
How do you stop RCA actions being forgotten?
Raise every action as a ticket during the session, on screen, before anyone leaves; an action that is not a ticket is a sentence. Each one gets a named owner, not a team, and a home where it competes for capacity, which in The Tenhaw Way means the quarter's Bug Budget epic for defects, the Tech Debt epic for missing tests and alerting, or a new epic under an outcome for anything larger. If an action cannot get an owner and a quarter in the room, record it as deliberately declined, with the reason. Then put the actions on the agendas of the next two retrospectives and close them out loud.
Is a root cause analysis the same as a post-mortem?
The names get used interchangeably, and the label matters far less than the bar you hold the session to. Four things decide whether it was worth running, whatever you call it: evidence frozen inside the first 24 hours, one timeline in UTC that names the source of every entry and states both time to detect and time to restore, every candidate cause put through a counterfactual so you finish with two to four rather than eleven, and at least one action that shortens detection. Every action leaves the room as a ticket with a named owner. If it ends as a document, it did not happen.
How do we introduce root cause analysis to a team that has never done one?
Set the mechanics up before the next incident rather than during it. Tenhaw publishes this method in full, and a team can adopt every step of it without hiring anyone. Write the trigger list down and get it agreed, and name the delivery lead for that team as the person who applies it within one working day. Decide where the incident record lives and who owns freezing it inside 24 hours, because logs and dashboards roll at seven or thirty days. Agree who facilitates, which has to be someone who did not build the thing that failed. Then book ninety minutes within five working days, open with the timeline and nothing else, and raise every action as a ticket on screen before anyone leaves.
How do you build an incident timeline everyone agrees on?
Collect separate accounts before the room ever meets. Ask everyone involved to write down what they saw and when they saw it, in their own words, ahead of any group discussion, because ten minutes into a meeting the room has converged on the loudest person's version and the original recollections cannot be recovered. Then open the session with the timeline and nothing else. Timestamp to the minute in UTC, name the source of every entry, and mark four moments: when the condition entered the system, when the failure began, when a person or a control first noticed, and when customers stopped being affected. Circulate it for correction before anyone discusses causes.
Do we still need an alert once the bug itself is fixed?
Yes. Every RCA raises at least one detection action, because fixing the defect closes one hole and leaves you exactly as blind to the next one. 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. Then name who is rostered to answer it, because an alert routed to a channel nobody owns is not detection. In the invented worked example on this page, card declines jump from 2% to 31% and a customer email is the first signal 41 minutes later, so the action is a decline-rate alert at 5% sustained over five minutes.
What should a root cause analysis report include?
A timeline agreed by everyone who was there, with a named source on every entry and both time to detect and time to restore stated. Then two to four contributing causes, each having survived the counterfactual test and each naming a control the team can change rather than a person. Then the detection action, written as the current number, the target and the signal that would have fired. Then every other action as a linked ticket with a named owner and a quarter. Anything that failed the counterfactual sits in a background paragraph and gets no ticket. Publish within five working days, where anyone in the organisation can read it without asking.
What changes in a root cause analysis when AI wrote the code?
On AI-native teams two conditions recur, and both are fixed in the outcome ticket rather than in the codebase. The first is a user journey the ticket never listed, so nothing tested it, and the fix is to add it to the standing list. The second is verification that rested on the model reporting it had finished, and the fix is to require a demonstrated run instead of a claimed one. On 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. Tenhaw's engineers build to a 72-rule engineering handbook, open source and enforced by an agent rather than by memory.
How should past incidents shape the next quarter's plan?
Reread the quarter's RCAs together before you open the next quarter's roadmap. A failure shape that appears twice is not bad luck, it is the tech debt you should be funding, and it will keep recurring until it is carried by something that competes for capacity. Missing tests and alerting 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. Those epic types come from The Tenhaw Way, the operating model behind every Tenhaw engagement. Where an incident exposed a risk you are choosing to live with, put it in the RAID log as an accepted risk with a named owner and a review date.
Is a formal root cause analysis overkill for a small team?
Not at the size it actually runs, one person spending a day freezing evidence and then a ninety-minute session. The written trigger list is what keeps it proportionate, because most incidents never clear the bar and get a bug ticket with no ceremony at all. In small teams the real failure mode is the opposite of overkill. Only the embarrassing outages get investigated, while the small recurring failure that costs more in aggregate never earns anyone's attention, because the call is made in the mood straight after an outage rather than against a threshold agreed in advance. Ninety minutes beats paying for the same incident a third time.