IncidentsGENERALORG-SPECIFIC

Stop the Harm Before You Understand It

The mandatory distinction: mitigation ends user impact, root cause analysis explains it, and they happen in that order.

The question, the obvious approach, and why it breaks

Every lesson starts where the work starts: an operational problem, a first attempt that is entirely reasonable, and the way production disagrees with it.

The production question

Users are failing right now and you do not know why. Do you debug, or do you act?

The problem

Debugging is the skill engineers are best at and most rewarded for, so it is what they reach for — while the clock that matters is measuring user impact, not understanding.

What teams do first

You cannot fix something you do not understand. Find the cause first, then apply the correct fix, rather than flailing at symptoms.

How it breaks

Understanding takes an unbounded amount of time and user impact accrues the whole way. Some causes are never fully understood, and users cannot wait for that.

How it breaks in production
  • Understanding takes an unbounded amount of time and user impact accrues the whole way. Some causes are never fully understood, and users cannot wait for that.
  • The "correct fix" usually requires writing, reviewing, building and deploying code — which is a slow path, and it is a path that ships new risk during an incident (Change Size: Why Small Changes Are Safer, and When They Are Not).
  • The available mitigations rarely depend on the cause. Rolling back works whether the bug was in the tax module or the serialisation layer.
  • Diagnosis under time pressure is worse diagnosis. The same engineer, working calmly after impact has stopped, reaches a better answer faster.
  • This is the single most recognisable interview red flag in production engineering: a candidate who starts reading code before reducing user impact has told you they will do that at 3am (Production Debugging).
CodeBuildTestArtifactReleaseDeployRunObserveOperateIncidentRecoverLearnImprove

What is actually happening

Underneath the tooling, which is the part that survives a change of tool.

  • Two different activities are being confused because both are called "fixing it". Mitigation changes the system so users stop being harmed. Root cause analysis changes your understanding so it does not happen again. They have different time constraints, different success criteria, and different audiences.
  • The reason they can be separated is that mitigations are cause-agnostic. Rollback, flag disable, failover, load shedding, scaling and traffic draining each cover a broad class of causes because they restore a previously working state or reduce demand, rather than correcting a specific defect.
  • The information you need to mitigate is much smaller than the information you need to explain. To roll back you need: is impact growing, and did something change recently. Two facts, both available in under a minute with the right dashboard (Deploys on the Same Timeline as the Symptom).
  • Time-to-mitigate and time-to-understand are separate measurements, and conflating them hides the improvement that matters. A team can halve user-visible impact without getting one bit better at debugging.
  • The order has one real exception, and it is narrow: when the candidate mitigation could itself cause serious harm — a failover into insufficient capacity, a rollback across a contracted migration, anything touching data — you spend the minutes to check. That is not diagnosing the cause; it is diagnosing the mitigation (Destructive Migrations).

Two activities, two clocks

Almost every argument about this dissolves once the two are named separately. They are not competing approaches to the same task; they are different tasks that happen to share a trigger.

Note the last row. These improve through completely different investments, which is why measuring them as one number hides where the problem is.

MitigationRoot cause analysis
GoalUsers stop being harmedYou understand what happened
Time constraintMinutes; the clock is user impactHours or days; do it properly
Information neededIs impact growing, and what changedEverything you can gather
Typical actionsRoll back, disable flag, fail over, shed load, scaleRead traces, logs, code, diffs; reproduce
Depends on the cause?No — that is what makes it available firstIt is the cause
Done whenThe user-facing signal recoversYou can explain the mechanism and the contributing factors
Improved byBetter levers: rollback speed, flags, tested failoverBetter signals, better instrumentation, better practice

The same incident, both orders

The timeline below shows one incident twice — the action rows are what a diagnose-first responder does, and the alternative is stated in the note. Both responders are working hard and both eventually understand the problem.

What differs is the number of minutes users spend failing, and it is not a small difference.

Diagnose-first, on a checkout outage that began at 14:04
  1. 14:03changeTimeout config applied to the shared payment gateway
  2. 14:04signalCheckout 5xx rises to ~4% and continues climbing
  3. 14:06signalSymptom alert fires; responder acknowledges
  4. 14:07actionResponder opens logs and begins reading stack traces
  5. 14:14actionFinds an exception in the payment client; starts reading the client code
  6. 14:22actionForms a hypothesis about connection reuse; asks a colleague to confirm
  7. 14:31actionHypothesis contradicted by a trace; starts again
  8. 14:38actionSomeone else notices the 14:03 gateway config change in the audit feed
  9. 14:40actionConfig reverted
  10. 14:42recoveryError rate returns to baseline
  11. 14:50recoveryProbe and support queue confirm recovery; investigation continues calmly

A mitigate-first responder reaches the same revert at roughly 14:09 — from two facts, not from a diagnosis: impact is growing, and the change feed shows a config change one minute before onset. The cause is identical and the understanding arrives at the same quality later; what changes is that users fail for five minutes instead of thirty-eight. Nothing here is a criticism of the responder — this is the ordinary shape of a competent engineer doing the thing they are best at.

changesignalactionrecovery

When mitigation is the risky move

GENERALEvery row is a property of the system rather than of the incident, which means every one of them can be checked and fixed in advance. A team that has done so has more levers available in minute five than one that has not.

The rule has an exception and it is worth being precise about it, because "mitigate first" applied without judgement causes its own incidents. The check is not about the cause of the outage; it is about the consequences of the lever.

Each row below is a mitigation that has, in real systems, made things worse than the symptom it was applied to.

Mitigations with side effects worth the sixty seconds to check
TriggerSymptomCauseResponse
Roll back after a schema migrationOld code errors on every queryThe migration already contracted; the previous version cannot read the schemaCheck migration state before rolling back; expand/migrate/contract exists to keep this option open (Expand, Migrate, Contract)
Fail over to a second regionThe second region saturates and fails tooIt was sized for its own share, not for all trafficKnow your failover capacity before you need it (Capacity During Failover)
Restart to clear a stuck stateIn-flight work is lost; duplicates appear on retryShutdown does not drain, or consumers are not idempotentVerify graceful shutdown and idempotency; prefer replacing instances gradually (Graceful Shutdown)
Purge a queue to stop a poison-message loopLegitimate work is destroyed irrecoverablyThe purge is indiscriminate and irreversibleMove to a dead-letter queue rather than deleting (Dead Letter Queues Are an Operation)
Scale up aggressivelyThe database falls overMore instances means more connections against a fixed budgetCheck the downstream constraint first (The Connection Budget)
Disable a flag mid-transactionUsers with in-progress state get inconsistent behaviourThe flag changes behaviour partway through a multi-step flowDesign flags to be safe to flip at any point; this is a property to build, not to hope for (Feature Flags: Deploy Is Not Release)

How to do it properly

Most important first.

  • Ask "what stops the bleeding" before "what is wrong". Say it out loud in the channel; it reorients everyone else too.
  • Keep a short list of pre-approved mitigations per service, in the runbook, with their side effects written down — decided calmly in advance, not chosen under stress (Runbooks).
  • Invest in making mitigations fast and safe: one-action rollback, flags on risky paths, tested failover, a load-shedding lever. Every one of these shortens every future incident (Reducing Blast Radius).
  • Set a time box on diagnosis before mitigating anyway. "If I do not have a hypothesis in ten minutes, I roll back regardless" is a decision made in advance, when you were thinking clearly.
  • Capture evidence before a destructive mitigation where you can — a heap dump, the current logs, one failing trace — but never let evidence collection extend user impact.
  • Say explicitly when you move from mitigation to investigation. "Impact has stopped; we are now looking at why" changes the tempo for everyone, including the people watching.
  • Track the two clocks separately in the postmortem: time to mitigate and time to understand. They improve through different work (Learning Across Incidents).

How much can this affect

Every production change has a blast radius. Stated as a scale so it is comparable between changes rather than adjectival — and paired with what actually contains it, because a wide scope with a real containment mechanism is a different situation from a wide scope with none.

Blast radius if this is wrongEveryone
One testEveryone
What contains it

Mitigation is itself the containment mechanism; getting the order wrong means nothing is containing anything while you read code.

What can go wrong

Failure modes, including of the mitigation
  • The mitigation appears to work and did not — the symptom was already recovering, or a different action taken at the same moment was the real cause of improvement.
  • The mitigation causes a second incident: failover into a region without capacity, a rollback into a schema that no longer exists, a restart that drops in-flight work (Capacity During Failover).
  • Mitigation destroys the evidence and the cause is never established, so it recurs.
  • Mitigation becomes the permanent state: the flag stays off for a year and the feature is quietly dead, or a service runs permanently at triple capacity to mask a leak.
  • The team stops after mitigation. Impact ended, everyone went to bed, nothing was learned, and the same incident arrives next month (Postmortems).
  • Repeated mitigation of the same symptom treated as operational normality rather than as an unfixed defect (Toil).
Misreads this invites
  • "Mitigating without understanding is guessing." It is applying a known-safe action with a known effect. Guessing is changing code you do not understand while users fail.
  • "We rolled back, so the incident is resolved." Impact has stopped. The incident is resolved when you know why and have decided what to change (Postmortems).
  • "Mitigation means we skip the root cause." It means you postpone it to when it can be done properly. Skipping it is a different failure, and the one this lesson is most often misread as endorsing.
  • "It recovered after we acted, so our action fixed it." Post hoc reasoning during an incident is extremely common; check that the recovery is attributable (Reconstructing What Actually Happened).

Operating it

Evidence is the signal, not the intention. Rollback is sometimes 'you cannot, and that is the point'.

How you know it worked
  • User-facing signals recovered — symptom alert cleared, probe passing, support queue quiet — and the recovery lines up in time with the action you took.
  • The postmortem records mitigation time and understanding time as two different numbers.
  • Temporary mitigations have owners and expiry dates, and the list of currently active ones is short and known.
How you get back
  • Every mitigation needs a known way back, decided before it is applied. A failover you cannot fail back from has replaced one incident with another.
  • If a mitigation does not move the symptom within a stated window, undo it before trying the next. Layered mitigations make the system impossible to reason about and make the postmortem guesswork.
  • Temporary mitigations are technical debt with an operational cost. Track them, review them, and remove them deliberately — the ones that persist unnoticed are the ones that surprise someone later.
What to automate, and what stays human
  • Automate the mitigation *mechanisms* so they are fast, reliable and reversible: a rollback that is one action, a kill switch that does not need a deploy (The Agent Kill Switch).
  • Automate a narrow set of pre-agreed automatic mitigations where the signal is unambiguous and the action is safe — halting a rollout on canary failure is the clearest example (Canary Analysis: Compared Against What?).
  • Automate the record: which mitigation was applied, when, by whom, and what the symptom did afterwards.
  • Do not automate broad mitigations on ambiguous signals. An automatic failover triggered by a monitoring glitch is a self-inflicted outage, and it happens (The Automation Trap).
What this costs
  • Mitigating first sometimes destroys the evidence needed to explain the incident, which means it may recur. The trade is usually right anyway: a recurring incident you mitigate quickly is better than a long one you understand.
  • Cause-agnostic mitigations are blunt. Rolling back removes good changes along with the bad one; shedding load fails requests deliberately.
  • Building fast mitigation levers is engineering work spent on machinery that does nothing on a normal day.

Where this applies

This domain is unusually tool- and organisation-dependent. These labels say what each claim is specific to, and what a different platform, provider or organisation does instead.

  • GENERALThe ordering is not a preference; it follows from mitigations being cause-agnostic while diagnosis is unbounded. That holds on any stack and at any scale.
  • ORG-SPECIFICWhat you are *permitted* to do without approval varies. Where an emergency change requires recorded sign-off, the mitigation path has to be pre-authorised in advance — otherwise the approval step becomes part of your time-to-mitigate, discovered during the outage (Change Management).

Where the depth lives

This domain teaches delivery and operation, and hands the mechanism off to the domain that owns it.

Observability & Performanceincident-debuggingsymptom-to-signal
Domains that do not exist yet
  • Testing & Reliability Engineering — game days that practise reaching for a mitigation lever, which is a habit rather than knowledge.