← All posts
Engineering11 min read

What Is Remediation in Production Systems? Mitigation, Remediation and Resolution, Defined

Remediation means correcting the condition that caused a fault — not reducing its impact, not restoring service, not closing the ticket. The difference between mitigation, remediation, resolution and recovery, and what makes an action safe to automate.

Nati ShalomNati ShalomCo-founder & CTO
.

Executive summary

  • Remediation is the act of correcting the condition that caused a fault. Not reducing its impact, not restoring service, not closing the ticket — correcting the cause. Everything else in the incident vocabulary describes a different job.
  • The word is overloaded across two industries. In security it means closing a vulnerability; in reliability it means correcting a production fault. Same word, different failure model, different tooling, and a search results page that mixes both.
  • Mitigation, remediation, resolution and recovery are four distinct operations, and confusing them is how teams end up with automation that suppresses symptoms indefinitely while the underlying defect stays in production.
  • You already run automated remediation. A Kubernetes controller comparing desired state to actual state and acting on the difference is a remediation loop. Its hard limit is that it can only correct divergence from a state you declared — it has no way to know the declared state itself is wrong.
  • An action is safe to automate when it is diagnosed, bounded, reversible, idempotent, verified and audited. Miss any one of those and you don't have remediation; you have an unlogged change applied during an incident.

The short answer

Remediation is the act of correcting the specific condition that caused a fault, so that the fault stops occurring.
Automated remediation is a system performing that correction without a human executing it — typically detect, diagnose, decide, act, verify.
It is distinct from mitigation, which reduces the impact of a fault without addressing its cause.

The distinction sounds academic until you notice that most of what the industry markets as "auto-remediation" is actually automated mitigation — and that the difference determines whether your automation makes your system healthier over time or quietly hides its defects.

Two industries, one word

If you search for "remediation" you'll get security results: vulnerability remediation, CVE remediation, cloud security posture management, patch management. That's not a mistake in the results — it reflects where the word is most used.

The two meanings are worth separating clearly, because the failure models are different:

Security remediation and production remediation share a word and almost nothing else. The difference that matters most is where the difficulty sits.
Security remediationProduction / incident remediation
The faultA known weakness that could be exploitedA live fault degrading a running system
The clockTime-to-patch, measured in days or weeksTime-to-restore, measured in minutes
DiagnosisMostly given — the CVE names the defectThe hard part — the symptom is several hops from the cause
The actionPatch, upgrade, reconfigure, isolateRoll back, restore config, restart, scale, failover, correct a change
VerificationRescan; the finding is goneRe-measure the symptom; service is healthy
Typical vendorsCSPM / vulnerability managementSRE, incident response, reliability platforms

The critical difference is where the difficulty sits. In security remediation the defect is usually already identified, and the hard part is prioritizing and shipping the fix across a fleet. In production remediation the action is often trivial — one rollback command — and the hard part is knowing that this is the right action, on the right object, right now.

This article is about the second kind. When we say remediation, we mean correcting a live production fault.

Four words that are not synonyms

Incident vocabulary is used loosely, and the looseness has consequences. The four operations, in the order they usually happen:

Mitigation — reduce the impact

Shed load, fail over to a healthy region, open a circuit breaker, scale up to absorb pressure, route traffic away from a bad revision, serve a cached response.

The cause is untouched. Mitigation buys time and protects users, and it is very often the correct first move. It is also, by definition, a temporary state: you are running degraded or in a fallback configuration, and something still has to be corrected.

Remediation — correct the causing condition

Roll back the revision that introduced the fault, restore the security-group rule that was revoked, reinstate the config value that was overwritten, replace the node whose disk is failing.

After remediation, the fault no longer occurs, and the system is back in its intended configuration rather than a fallback one.

Resolution — the incident is closed

The service is healthy, the cause is understood, and the durable fix is either shipped or scheduled. Resolution is a statement about the incident, not about the system.

Recovery — restore what the fault cost you

Drain the backlog, replay the failed messages, reconcile the inconsistent rows, re-run the jobs that didn't fire. Recovery is about the state the outage left behind, and it's the step most likely to be forgotten in the relief of having stopped the bleeding.

The failure mode this vocabulary prevents: a team automates mitigation, calls it remediation, and the underlying defect stays in production for months — quietly absorbed by an automation that restarts, scales or fails over every time it appears. The dashboard is green. The defect is still there, and it's now invisible.

Three kinds of remediation action

Not all correction is the same kind of correction.

Restorative — return the system to a known-good prior state. Roll back a deployment, revert a config change, reinstate a deleted rule, restore a policy. These are the highest-confidence actions in existence, because the prior state is known to have worked and the inverse is well-defined.

Compensatory — counteract the fault's effect without returning to a prior state. Restart a process, scale out, evict a pod, drain a node, fail over. These work on a wide range of faults precisely because they don't require knowing the cause — which is also their weakness. Restarting is a compensatory action that gets described as remediation more often than any other, and usually isn't one.

Corrective — change the system so the fault class stops being possible. Fix the defect, add the constraint, install the admission rule, correct the capacity model. This is where the durable value is, and it is almost never done during an incident.

A mature practice uses all three deliberately: compensate to stop the bleeding, restore to remove the cause, correct so it can't recur.

You already run automated remediation

This is worth stating plainly because it reframes the whole conversation: Kubernetes is a remediation engine.

A controller runs a loop: read desired state, read actual state, compute the difference, act to reduce it. That is a remediation loop, and it's been running in your cluster continuously for years:

  • A container exits; restartPolicy restarts it.
  • A pod dies; the ReplicaSet controller creates a replacement.
  • A node goes NotReady; the node controller evicts its pods and they're rescheduled elsewhere.
  • Load rises; the HPA adds replicas.
  • A node fills up; the kubelet evicts pods to reclaim resources.

Nobody calls this AI, and it resolves an enormous number of faults every day without waking anyone. It's the most successful automated remediation in the industry's history.

And its limit is exact: a controller can only correct divergence from a state you declared. It compares actual against desired and closes the gap. It has no mechanism to consider that the desired state itself is wrong.

If you declare a memory limit below the workload's real working set, the controller will faithfully restart the container forever. If you declare a readiness probe that returns 200 without touching the database, the controller will faithfully route traffic to a pod that can't serve. The loop is working perfectly. The declaration is wrong, and nothing in the loop can notice.

That gap — between "actual differs from declared" and "declared is wrong for reality" — is the entire remaining problem. Closing it requires something the controller doesn't have: diagnosis.

The restart trap

Because restarting is cheap, generic and usually harmless, it has become the default remediation for almost everything. It deserves a specific warning.

Restarting works by discarding state. That makes it effective against a real class of faults — a leaked resource, a corrupted in-memory cache, a wedged connection pool, a deadlock — and it makes it a symptom suppressant for exactly the same class.

The pattern to watch for:

  • A liveness probe restarts a service every few hours. Availability metrics stay green because a restart takes eight seconds and there are twenty-three other replicas.
  • The leak is never fixed, because nothing ever escalates.
  • Restart frequency slowly increases over months as traffic grows.
  • One day it crosses the threshold where restarts outpace warm-up, and you have a total outage with no recent change to blame.

The rule: an automated compensatory action must increment a counter that someone reads. A restart is a legitimate remediation for a known, diagnosed fault class. A restart that fires repeatedly for an undiagnosed reason is an alert that has been silenced by being fixed.

What makes an action safe to automate

Six properties. In practice, whether you can automate an action is decided almost entirely by these, not by how clever the diagnosis was.

  1. Diagnosed. The action is tied to a specific identified cause, not to a symptom class. "5xx rate is elevated, restart the pods" is a guess with a write path attached. "This deployment introduced the fault at 14:19, roll back to the prior revision" is a remediation.
  2. Bounded. The blast radius is limited and enforced before execution — which namespaces, which kinds, which environments, how many objects at most. A limit checked after the fact is not a limit.
  3. Reversible. Every action has a defined inverse, or it is refused. "Roll back to revision 41" is reversible. "Delete the PVC" is not, and nothing should ever execute it autonomously.
  4. Idempotent. Running it twice must be identical to running it once. Incidents produce duplicate triggers — a retried webhook, two detectors firing on the same fault, a leader election flapping. Non-idempotent remediation under duplicate triggers is how automation causes its own incident: three concurrent rollbacks, or a scale action applied four times.
  5. Verified. After acting, re-measure the specific signals the diagnosis predicted would move, inside a bounded window. Three outcomes, three behaviours: verified, and the fault class earns confidence; not verified, and the diagnosis was wrong, so escalate with the failed hypothesis attached; worsened, and roll back automatically while reducing that playbook's confidence.

Without verification you don't have a loop. You have a system that makes changes to production during incidents and assumes they worked, which is strictly more dangerous than a system that does nothing.

  1. Audited. What was proposed, on what evidence, under which policy, executed by what identity, with what result. If you cannot answer those five questions afterwards, the automation will not survive its first post-incident review — and it shouldn't.

The remediation maturity ladder

Most organizations are at level 2 and describe themselves as level 4. The honest version:

The remediation maturity ladder. Level 3 — an alert firing a script unconditionally — is where most auto-remediation lives, and it is the dangerous rung.
LevelWhat it looks likeWho decidesWho acts
0 — TribalA person who knows what to do gets pagedHumanHuman
1 — DocumentedA runbook exists and is mostly currentHumanHuman
2 — ScriptedA script exists; a human decides to run itHumanHuman (one command)
3 — TriggeredAn alert fires a scripted action automatically, unconditionallyRuleMachine
4 — ConditionalThe action runs only if diagnosis and guardrails agree; unproven cases escalateMachine, gatedMachine
5 — Verified & learningLevel 4 plus outcome verification, automatic rollback on failure, and confidence updated per fault classMachine, gated, self-correctingMachine

Level 3 is the dangerous rung, and it's where most "auto-remediation" lives. Unconditional automation is fine when the trigger is reliable and the action is harmless. When the trigger is a symptom with multiple possible causes, an unconditional action is a coin flip executed against production at machine speed — and it will eventually fire during the one incident where it's exactly the wrong thing to do.

The jump from 3 to 4 is not a better script. It's the arrival of two things scripts don't have: a diagnosis the action can be conditioned on, and a gate that can say no.

What should not be automated

Being specific here builds more trust than a list of capabilities.

  • Anything without an inverse. Deleting data, dropping a table, terminating a stateful resource, force-deleting a PVC.
  • Security boundaries. IAM policies, security groups, network policies, secrets, RBAC. Even when the correct action is obvious — especially then, because an automation that can widen a permission is a privilege-escalation path. Route these to a human with the diff pre-filled; the human decision takes two minutes when the evidence is already assembled.
  • Novel fault classes. A fault the system has never seen and verified should produce an escalation carrying the blast radius, the change record and the hypothesis — not an attempt.
  • Anything on an unsettled evidence window. Change records have ingestion lag; CloudTrail's is the well-known one. Acting on a window that hasn't settled means acting on incomplete evidence, and the correct behaviour is to wait or escalate, not to guess.
  • Actions whose failure mode is worse than the fault. Failing over a database to stop a latency blip risks data divergence to fix a symptom users would barely notice.

Worked example: one incident, four verbs

A payments team on EKS. A payments API behind an ALB, backed by RDS Postgres.

Tuesday 11:40. p99 latency rises from 190 ms to 6.2 s. Errors climb to 3%. The application logs fill with connection-acquisition timeouts:

payments-api ERROR TimeoutError: QueuePool limit of size 5 overflow 0 reached, connection timed out, timeout 30.00 — at db/session.py:34 in get_session

The pool is configured for 20 connections. It is behaving as though it has 5.

11:44 — Mitigation. On-call scales the service from 8 replicas to 20. More pods means more pools means more total connections, and p99 falls to 900 ms. Users are mostly fine.

This is mitigation, and it is the right first move — and it carries a risk that has to be named out loud. Twenty replicas multiplied by their pools is now pushing toward the RDS instance's max_connections. The mitigation for one fault is moving the system toward a different, worse one. Mitigations frequently do this, which is why they must be temporary by design.

11:52 — Diagnosis. Blast radius from declared state: the Deployment, its ReplicaSet, its container image, the config it reads. Mutating changes inside that radius over the last 48 hours:

2026-08-25T09:12Z Deployment/payments-api image: payments-api:2.8.4 → payments-api:2.9.0 · actor: assumed-role/argocd-controller · changelog: "upgrade ORM 1.4 → 2.0"

The ORM major upgrade renamed the pool configuration key. The application's config still sets the old key name, which the new version silently ignores — falling back to a library default of 5. No error, no warning, no failed startup. Valid config, silently unread.

The reason it took two days to surface is that 5 connections per pod is sufficient at normal traffic. Tuesday's mid-morning peak was the first time it wasn't.

11:58 — Remediation. Roll back to 2.8.4. The causing condition is removed; the pool is 20 again. Scale back to 8 replicas, which also removes the connection pressure the mitigation introduced. p99 returns to 190 ms.

Note this is a restorative action: a known-good prior state with a well-defined inverse. That's why it's the safest thing on the menu and why it's the right autonomous candidate.

Later that day — Resolution. Fix 2.9.0 to use the new key name, and add the durable check:

Fail startup if a recognized configuration section contains keys the active library version does not consume. A silently ignored config key is a defect, not a warning.

Plus a monitor on pool saturation, so the next occurrence of this class alerts on the cause instead of on latency.

And — Recovery. 340 payment requests failed during the window. They're identified from the error logs and replayed, and reconciliation confirms none were double-charged.

Four operations, four different jobs. Mitigation protected users and created a second risk. Remediation removed the cause. Resolution made the class impossible. Recovery repaired what the fault cost. Automation that stopped at 11:44 would have left a system that was green, over-provisioned, running the wrong revision, and one config upgrade away from exhausting its database connections.

Where DataAgent fits

Everything above is vocabulary and engineering practice; none of it requires buying anything. Here is what we built, clearly marked.

DataAgent is a remediation-first platform, and the phrase is meant in exactly the sense defined above: the product is the correction, not the description. Concretely, the machinery that maps onto the six safety properties:

  • Diagnosed — TIDE, a versioned graph of entities, configuration, relationships and drift history read from control-plane state, plus SURGE, which produces a causal chain rather than a correlation. Actions are conditioned on an identified, timed, attributable change. In the worked example, that's what turns "connection timeouts" into "the 2.9.0 upgrade silently stopped reading the pool config."
  • Bounded and gated — STEER applies trust thresholds before execution: environment, scope of change, confidence. The Trust Ladder means a fault class earns autonomy through verified successes rather than being granted it on day one, and source watermarking respects data-freshness lag so autonomy is never granted on an unsettled evidence window.
  • Reversible and dry-runnable — review the resolution plan, dry-run it in your environment, then let it execute. Operator-controlled CLI, full audit trail, safe rollback.
  • Verified and learning — RAPS executes the verified playbook; WAKE applies reinforcement from verified outcomes, so a fix that fails verification reduces that playbook's confidence instead of silently passing.
  • Mitigate and diagnose in parallel — this is the ordering choice that matters most in practice. A deterministic circuit breaker fires immediately using guardrail-controlled actions you define, stabilizing without waiting for root-cause analysis, while the full RCA builds in the background. The analysis waits for your engineers, not the other way around — which is precisely the 11:44-versus-11:52 gap in the worked example, closed.

The Fault Ladder is the discipline connecting them: Detect, Enrich, Diagnose, Gate, Act, Learn. A fault enters at the bottom and graduates up; anything that hasn't earned autonomy routes to a human, with the reason stated.

Publicly stated: 80% of errors autonomously solved, a 99% MTTR reduction — hours to seconds — and no extra observability stack required. AWS-native, in-cluster, running standalone or alongside your existing tools. No rip-and-replace, no vendor lock-in.

Mitigation, remediation, resolution, recovery — at a glance

Four operations, four jobs. Stopping after mitigation leaves a green dashboard and a live defect.
MitigationRemediationResolutionRecovery
GoalReduce impactCorrect the causeClose the incidentRepair the aftermath
Cause addressedNoYesYes, durablyn/a
Typical actionsScale, fail over, shed load, circuit-break, rerouteRoll back, restore config, replace node, reinstate ruleShip the fix, add the constraint or gateReplay, reconcile, re-run, backfill
System state afterDegraded or fallbackIntended configurationIntended, plus a new guardConsistent
Safe to automate?Often — usually bounded and reversibleRestorative actions yes; anything irreversible or security-adjacent noRarely — this is design workSometimes, with strict idempotency
Failure if you stop hereDefect stays in production, hiddenRecurs on the next similar changeAftermath left inconsistent

FAQ

What does remediation mean in DevOps?

Correcting the condition that caused a production fault, so the fault stops occurring — as opposed to mitigation, which reduces impact without touching the cause. In DevOps and SRE contexts it usually means an action against live infrastructure: rolling back a revision, restoring a configuration value, reinstating a rule, replacing a failing node. Note that in security the same word means closing a vulnerability, which is a different job with a different clock.

What is the difference between remediation and mitigation?

Mitigation reduces the impact of a fault while leaving the cause in place — scaling up, failing over, shedding load, opening a circuit breaker. Remediation corrects the cause so the fault stops happening. Mitigation is usually the right first action because it's fast and protects users; the risk is stopping there, because a mitigated fault is an undetected fault with the alarm turned off.

Is auto-remediation the same as self-healing infrastructure?

"Self-healing" is the marketing term and it usually describes the narrow case: a system detecting divergence from a declared desired state and correcting it, which is what a Kubernetes controller does. Automated remediation is broader — it includes cases where the desired state itself is wrong, which requires diagnosis rather than reconciliation. A self-healing system restarts a failed pod. It cannot notice that the memory limit it's restarting against is set too low.

Is restarting a service actually remediation?

Sometimes. Restarting is a compensatory action that works by discarding state, so it genuinely remediates faults caused by bad in-process state — a leak, a wedged pool, a corrupted cache. For anything else it suppresses the symptom, and because it's cheap and usually harmless it becomes the default response to everything. The test: if the restart fires repeatedly for a reason nobody has diagnosed, it isn't remediation, it's a silenced alert.

What can't be safely automated?

Anything without a defined inverse (deleting data, terminating stateful resources), anything touching a security boundary (IAM, security groups, network policy, secrets, RBAC), any fault class the system hasn't seen and verified before, and any action based on an evidence window that hasn't settled. The right behaviour in all of those is to escalate with the evidence assembled — which makes the human decision fast — rather than to attempt something.

How do I know an automated remediation actually worked?

By re-measuring the specific signals the diagnosis predicted would move, within a bounded window, and acting on all three possible outcomes: verified, not verified, and worsened. A system that acts and then assumes success has added an unlogged change to your incident timeline, which is worse than no automation. Verification is also what lets confidence be earned per fault class over time instead of granted by decree.

Key takeaways

  • Remediation corrects the cause; mitigation reduces the impact. Automation that conflates them hides defects in production indefinitely.
  • The word is shared with security, where it means closing a vulnerability. Different failure model, different clock, different tooling.
  • Kubernetes controllers are already automated remediation — and their limit is exact: they correct divergence from declared state and cannot notice that the declaration is wrong.
  • Six properties decide whether an action is safe to automate: diagnosed, bounded, reversible, idempotent, verified, audited. Verification is the one most often skipped and the one that makes the rest safe.
  • Most teams are at "an alert fires a script" and describe themselves as autonomous. The jump isn't a better script — it's a diagnosis the action can be conditioned on, and a gate that can say no.

See remediation-first in your own stack

Install an agent and watch DataAgent map your topology. No credentials, no commitment.

Keep reading

Essential Cookies keep the site working and cannot be switched off. Everything else is off until you turn it on.