All posts
engineering process testing

Why we split fast fixes from remediation

CTO
CTO · CTO
April 10, 2026 · 5 min read

Most engineering incidents look urgent because they are urgent. Something regresses, customers feel it, and the team needs service restored quickly. The part we learned over time is that restoration and learning are different kinds of work. They have different clocks, different risk tolerance, and different evidence requirements.

We used to bundle them together. During a live fix, we tried to patch behavior, explain root cause, decide architecture follow-ups, and promise prevention all in one pass. The result was predictable. We shipped quick patches with mixed confidence, and our post-incident conclusions reflected whatever context happened to be visible in that hour.

Now we split the workflow into two explicit tracks. The first track stabilizes production. The second track remediates the system. The split sounds procedural, but it changed our reliability curve more than any single tooling upgrade.

Stabilization work has one job

A stabilization change answers a narrow question: what is the smallest safe change that restores expected behavior now.

That definition is intentionally restrictive. We do not redesign abstractions during stabilization. We do not refactor surrounding code to satisfy style preferences. We do not settle long-running architecture debates while alerts are firing.

The checklist we run is short:

  • confirm the symptom with a reproducible signal
  • pick the lowest-risk intervention that changes that signal
  • deploy with rollback ready and observable
  • verify restoration in production metrics, not only local tests

When we keep the scope tight, review quality improves under pressure. A reviewer can reason about blast radius because the change surface is small. A deploy owner can monitor the right metrics because the objective is clear. A comms owner can update status with confidence because “stabilized” has a concrete meaning.

We also record uncertainty during this phase. If we are not sure whether the selected fix addresses every edge path, we state that in the incident thread instead of speaking in absolutes. Hidden uncertainty is where repeated incidents begin.

Remediation work needs structure, not hope

Once service is stable, adrenaline fades and context starts to decay. This is the point where many teams lose the long-term fix. The incident feels done, new requests arrive, and remediation turns into a vague intention.

We avoid that by opening remediation as first-class work items before closing the incident loop. Each remediation item has:

  • a specific failure mode it addresses
  • an owner
  • a due window
  • an explicit validation method

Without a validation method, remediation is usually a refactor dressed as prevention. We need to know what would prove the system actually changed.

A simple template keeps us honest:

## Remediation item
Failure mode: cache invalidation race after partial deploy
Owner: platform engineering
Due window: this sprint
Validation: integration test that simulates staggered replica rollout

That last line, validation, matters most. If we cannot define a practical validation step, the issue probably needs more diagnosis before implementation.

Different evidence for different decisions

The stabilization decision is based on operational evidence. Error rates, latency, queue depth, failed background jobs, and user-visible behavior. The question is whether the service recovered.

The remediation decision is based on explanatory evidence. Why did this fail here, at this time, under this traffic shape or deployment sequence. The question is whether our model of the system got better.

Mixing those evidence types creates confusion. A service can recover even when root cause is only partially understood. Root cause can be understood while the best long-term fix still needs design time. Treating both states as one binary decision causes two bad outcomes:

  • declaring victory too early because metrics improved
  • delaying recovery while waiting for complete explanation

We separate the decision gates to avoid both.

Gate one closes when production behavior returns to acceptable bounds and monitoring confirms it. Gate two closes when remediation ships and its validation signal passes.

This two-gate model also improves incident writing quality. Stabilization notes capture timeline and operational actions. Remediation notes capture causal analysis and preventive changes. Readers can scan each document for a clear purpose instead of parsing a blended narrative.

Design choices that made the split practical

This process only works if the tooling makes it easy during busy weeks. A few implementation decisions made the difference for us.

First, we keep a standard incident status block that separates “current state” from “next remediation action.” That avoids the common handoff gap where everyone assumes someone else is carrying the long-term fix.

Second, we require remediation tickets to reference the incident failure mode in plain language. Not just “follow-up cleanup,” but a sentence that names the breakage. It sounds minor, but specificity helps future search and trend analysis.

Third, we test where the failure occurred, not only where testing is convenient. If the incident came from asynchronous retry behavior, remediation includes an async-path test. If it came from deployment ordering, remediation includes rollout-condition coverage. Prevention needs to touch the surface that actually failed.

Finally, we track repeat failure classes over time. Not incident count alone, but clusters like “state mismatch during partial deploy” or “schema assumption drift.” Remediation planning gets better when repeated patterns are visible as system categories instead of isolated stories.

Splitting fast fixes from remediation did not reduce the number of incidents overnight. It changed what happened after each one. Recovery became less chaotic, follow-through became more reliable, and our explanations became more useful to the next engineer who inherits the system.

The longer we run this model, the more we see a quiet compounding effect. Operational stability gives us time to think clearly, and clear thinking turns into narrower, more testable prevention work.