DEV Community

Cover image for closed loop aiops detect decide act verify
Muskan
Muskan

Posted on • Originally published at zop.dev

closed loop aiops detect decide act verify

TL;DR Most AIOps implementations treat the "Act" phase as the finish line, and that architectural choice turns automated remediation into a liability rather than a guarantee.

The Problem With AIOps That Stops at 'Act'

Most AIOps implementations treat the "Act" phase as the finish line, and that architectural choice turns automated remediation into a liability rather than a guarantee.

Visual TL;DR

The four-phase model, Detect, Decide, Act, Verify, mirrors classical control theory. A thermostat does not simply fire the furnace; it reads the room temperature afterward to confirm the setpoint was reached. AIOps systems that omit the fourth phase are open-loop controllers running in a closed-loop world. The furnace fires.

Silent failure after remediation

Nobody checks the temperature.

The silent failure problem. When a remediation action completes without a verification step, the system marks the incident resolved. Downstream alerting suppresses. On-call engineers stand down. Meanwhile, the underlying condition persists, masked by the action's side effects.

A pod restart clears the OOM signal but the memory leak remains. By the time the next detection cycle fires, the blast radius has grown.

False-positive resolution trap

The false-positive resolution trap. Verification is not simply "did the action execute?" It is "did the action produce the intended system state?" These are different questions. An automated rollback deploys successfully and returns exit code 0. The deployment artifact is correct. The configuration drift that caused the incident lives in a mounted secret the rollback never touched.

The system logs success. Production stays broken.

Compounding cost of open-loop automation

The compounding cost of open-loop automation. Every unverified remediation that silently fails trains the on-call rotation to distrust the system. Engineers begin overriding automated actions preemptively, which eliminates the MTTR benefit that justified the AIOps investment in the first place. We measured this pattern in our first deployment week on a mid-size Kubernetes fleet: within 30 days of data, manual override rates climbed to the point where automation handled fewer incidents than the baseline human workflow.

diagram

The fix is not more detection tooling. It is building Verify as a first-class phase with its own success criteria, defined before the Act phase executes. Define what "resolved" looks like in measurable system state terms, then instrument against that definition specifically.

How the Four-Phase Cycle Actually Works

The four-phase cycle functions as a control-theory feedback loop, where each phase produces a structured output that becomes the input contract for the next phase.

Control theory defines a closed loop as a system where the output feeds back to correct the input. In operational terms, that means Detect does not simply fire an alert. It produces a structured signal: metric name, threshold breached, affected resource identifier, and timestamp. That signal is the Decide phase's input contract.

Detect and Decide phases

Without a defined contract, Decide receives noise and must spend cycles on triage that the detection layer should have already completed.

Detect. Detect is the continuous sampling layer. It reads telemetry streams, compares observed state against defined thresholds, and emits a normalized event when a deviation crosses a configured boundary. The mechanism matters: Detect must distinguish a transient spike from a sustained breach before emitting, or Decide receives false signals that exhaust the action budget on non-events. This phase breaks when sampling intervals are too coarse to catch fast-moving failures, specifically when a service degrades and recovers within the gap between two polling cycles.

Decide. Decide is root cause analysis plus action selection. It receives the structured event, correlates it against topology data and recent change history, and selects a remediation action from a pre-approved playbook. The pre-approval requirement is not optional. Decide must operate within a bounded action space, because an unbounded selector will choose actions whose blast radius exceeds the incident's scope.

Act and Verify phases

In our testing, we saw Decide logic that lacked playbook constraints attempt infrastructure-level restarts for application-layer errors, turning a single degraded pod into a five-minute service interruption.

Act. Act executes the selected action against the live environment. It is the phase most teams over-invest in, because execution is visible and measurable. Act works reliably when the action is idempotent, meaning running it twice produces the same outcome as running it once. It breaks when the action has side effects that accumulate, specifically scaling operations that add capacity without removing it on subsequent triggers.

Verify. Verify re-samples the affected system state after a defined settling window, typically 90 to 120 seconds post-action, and compares it against the resolution criteria that Decide recorded before Act executed. If the state matches, the loop closes. If it does not, Verify re-triggers Detect with an escalation flag, not a fresh anomaly signal. That distinction prevents the loop from re-running the same failed action indefinitely.

diagram

Phase Output to Next Phase Failure Condition
Detect Normalized event with resource ID and breach duration Sampling interval misses fast-moving failures
Decide Selected action plus pre-recorded resolution criteria Unbounded action space exceeds incident blast radius
Act Execution receipt with idempotency token Non-idempotent action accumulates side effects
Verify Closed confirmation or escalation flag Settling window too short, state appears resolved prematurely

Configuring the settling window

The settling window in Verify is the most commonly misconfigured parameter. Set it below the system's natural stabilization time and Verify reads a transitional state, not a steady state. The loop closes on a false positive. Set it correctly by measuring, in the first 30 days of production data, how long each remediation action takes to produce observable metric change.

That measurement becomes the per-action settling window, stored as configuration alongside the playbook entry itself.

The Real Gains: Where Closed-Loop AIOps Cuts MTTR

Manual handoffs between detection and remediation are where MTTR accumulates, and eliminating them compounds resolution speed across every incident in the queue.

Handoff Point Manual Workflow Closed-Loop Automation
Alert triage delay ~8 minutes per incident (engineer context-switch) Eliminated; triage runs at machine speed via correlation rules
Ownership routing Added latency proportional to team count and time-of-day gaps Bypassed; pre-approved playbooks map action to resource class
Remediation execution Engineer reads docs, confirms target, runs command manually Executes playbook entry in under 10 seconds
Post-action confirmation Incident closed based on engineer's subjective belief Binary confirmation via re-sampling actual state against resolution criteria

The mechanism is straightforward. Each handoff in a manual workflow carries a latency cost: the time an alert sits in a queue before an engineer acknowledges it, the time that engineer spends reconstructing context, and the time spent executing a remediation step that a closed-loop system would have run autonomously. None of those costs are large individually. Across 200 incidents per month, they become the dominant driver of total resolution time.

Four handoff points measured

We call this the Handoff Tax. The Handoff Tax is the cumulative latency introduced by every human decision point between anomaly detection and confirmed resolution, measured in minutes per incident and multiplied by incident volume. On a mid-size Kubernetes fleet running 15 services, we measured four discrete handoff points in the baseline manual workflow: alert triage, ownership routing, remediation execution, and post-action confirmation. Removing all four through closed-loop automation cut the per-incident clock from first signal to verified resolution.

Alert triage delay. In a manual workflow, an alert fires and waits. The on-call engineer reads it, assesses severity, and decides whether to act. This step alone consumed an average of 8 minutes per incident in our production environment, because engineers context-switch from whatever work preceded the page. Closed-loop Detect-to-Decide automation eliminates this step entirely by running triage against pre-defined correlation rules at machine speed.

Ownership routing friction. Multi-team environments route alerts through a coordination layer before the right engineer even sees the incident. That routing adds latency proportional to team count and time-of-day coverage gaps. Automated Decide logic with pre-approved playbooks bypasses routing because the system already knows which action applies to which resource class.

Execution speed vs. consistency

Remediation execution lag. A human executing a remediation step reads documentation, confirms the target resource, and runs the command. Automated Act phases execute the same playbook entry in under 10 seconds. The speed difference is not the primary gain. The consistency is.

Humans introduce variation; automated execution does not.

Post-action confirmation gaps. Manual workflows close incidents when the engineer believes the problem is resolved. That belief is subjective. Closed-loop Verify re-samples actual system state against recorded resolution criteria, producing a binary confirmation rather than an opinion.

[diagram could not be rendered]

The Risks Nobody Talks About: Autonomous Action in Production

Autonomous remediation in production fails in two specific ways: the Act phase triggers cascading failures through unconstrained action scope, and the Verify phase closes the loop on a false positive while the underlying fault persists undetected.

Cascading failures and blast radius

The cascading failure pattern follows a predictable sequence. Act executes a remediation action, that action perturbs a dependency, the dependency's degradation triggers a second detection event, and the loop fires again on the new signal. Each iteration compounds the blast radius. We saw this in production on a 12-service Kubernetes cluster where an automated pod restart on a memory-saturated service caused a downstream connection pool to exhaust, which triggered three additional detection events within 90 seconds.

The original incident resolved. Four new ones opened. Net system state was worse after automation than before it.

The mechanism behind cascading failures is action scope without a ceiling. When Act executes against a live dependency graph, any action that touches a shared resource, a connection pool, a message queue, a database connection limit, propagates state changes to every consumer of that resource. The fix is a concept we call the Blast Radius Score. The Blast Radius Score is a pre-computed integer assigned to each playbook action, representing the count of downstream services that share a resource with the remediation target, weighted by their current traffic load.

Act must reject any action whose Blast Radius Score exceeds a configured threshold before execution. This works when the dependency graph is current and accurate. It breaks when services are added without updating topology metadata, because Act scores against stale data and underestimates propagation risk.

False positives in Verify

Unconstrained action chaining. Closed-loop systems that permit Act to trigger a second action based on the output of the first, without human review, compound errors at machine speed. By sprint 3 of one deployment we observed a chain of four automated actions executed in 40 seconds, none individually harmful, collectively producing a 6-minute service degradation. The safeguard is a single-action-per-loop-iteration rule. Each loop cycle executes exactly one playbook entry.

If the subsequent Verify fails, the escalation flag routes to an engineer, not back to Act.

Symptom resolution without root cause

False-positive resolution in Verify. Verify re-samples system state after the settling window and compares it against recorded resolution criteria. The failure mode is a metric that returns to threshold briefly during recovery, then degrades again after the loop closes. Verify reads the transient recovery as confirmation. The underlying fault, a memory leak, a misconfigured retry backoff, a saturated upstream, continues accumulating.

The next detection event arrives minutes or hours later, with no record that the prior loop ran on the same root cause. We measured this pattern producing repeat incidents on the same resource within 4 hours in 3 of 8 monitored services during the first deployment week.

Symptom-level resolution masking structural faults. Automated remediation resolves symptoms faster than manual workflows. That speed is also the risk. A human engineer who restarts a pod three times in one shift notices the pattern and investigates the root cause. The closed loop restarts the pod, closes the incident, and resets its own memory.

Without cross-loop correlation, the system accumulates resolved incidents that share a root cause signature without ever surfacing the underlying structural fault.

[diagram could not be rendered]

diagram

Failure Mode Trigger Condition Structural Fix
Cascading blast radius Act touches shared resource without scope ceiling Blast Radius Score threshold blocks high-propagation actions
Action chaining Act permitted to fire second action on its own output Single-action-per-loop-iteration rule, escalate on Verify failure
False-positive Verify Metric recovers transiently during settling window Require sustained threshold compliance across two consecutive re-samples
Symptom-loop recurrence No cross-loop correlation on root cause signature Index closed incidents by resource ID and

Building a Verify Phase That Actually Confirms Resolution

The Verify phase closes the loop, and a premature close is operationally worse than no automation at all because the system records a resolution that did not happen.

Condition / Rule Requirement Threshold / Detail
Multi-Signal Confirmation Sustained compliance across consecutive re-samples At least 2 re-samples on at least 2 independent signal types
Confidence score to close loop Numeric score aggregating signal count, re-sample consistency, time elapsed ≥ 0.85 on a 0–1 scale
Confidence score below threshold Loop stays open, re-samples again < 0.85
Re-entry after failed Verify Hold for one full settling window; escalate to Act only if degradation worsened Must not immediately re-trigger Act
Human escalation trigger 1 Verify fails twice consecutively on the same resource 2 consecutive failures
Human escalation trigger 2 Confidence score never crosses threshold after repeated cycles 4 re-sample cycles
Human escalation trigger 3 New detection event fires on a different service while loop is in Verify Cascade signature — inspect dependency graph

Most Verify implementations re-sample a single metric once after a fixed settling window. That design fails because individual metrics recover transiently during fault propagation. A memory-saturated pod restarts, heap usage drops below threshold for 45 seconds, Verify reads compliance, and the loop closes. The underlying leak resumes accumulating.

Multi-signal confirmation rule

The next detection event arrives with no record linking it to the prior loop. We call the design principle that prevents this the Multi-Signal Confirmation Rule: Verify must require sustained compliance across at least two consecutive re-samples on at least two independent signal types before it records resolution.

Kubernetes resource requests are the declared CPU and memory minimums that the scheduler uses to place pods, and they serve as one of those independent signal types. Verify should cross-check request utilization against error rate and latency p99, not just the metric that originally triggered detection. A pod whose memory returns to baseline while its p99 latency remains elevated has not resolved. It has shifted failure mode.

Confidence scoring and thresholds

Confidence thresholds. Verify needs a numeric confidence score, not a binary pass. The score aggregates signal count, re-sample consistency, and time elapsed since the Act phase completed. A threshold of 0.85 or higher on a 0-to-1 scale, computed from three signals across two re-samples, produces a confirmation that withstands post-incident audit. Below 0.85, the loop does not close.

It holds open and re-samples again after the next interval.

Re-entry and escalation conditions

Re-entry conditions. If Verify fails its first re-sample, the loop must not immediately re-trigger Act. Re-triggering Act on a failed Verify creates the action-chaining pattern described earlier, where four automated actions execute in under a minute and produce compounding state changes. The correct re-entry condition is a hold: wait one full settling window, re-sample again, and only escalate to Act if the degradation signal has worsened, not merely persisted.

Human escalation triggers. Three conditions must route immediately to an engineer rather than back into the loop.

  • Verify fails twice consecutively on the same resource.
  • the confidence score has not crossed 0.85 after four re-sample cycles.
  • a new detection event fires on a different service while the current loop is still in the Verify phase.

That third condition is the cascade signature. An engineer needs to inspect the dependency graph before any further automated action runs.

[diagram could not be rendered]

[diagram could not be rendered]

Implementing Closed-Loop AIOps Without Automating Yourself Into an Outage

Phase the rollout across three gates, and you will capture MTTR gains without handing autonomous remediation a loaded weapon pointed at your production dependency graph.

Three-gate rollout sequence

The four-phase cycle, Detect, Decide, Act, Verify, is a control theory feedback loop. Each phase introduces a distinct failure surface. The safest adoption sequence activates one phase at a time, validates it under production load, and only unlocks the next phase after 30 days of clean telemetry. Skipping gates is how teams end up with four automated actions executing in under a minute on a live service.

Gate 1: Detect and Decide, read-only. Wire your observability stack into the Detect phase and let Decide produce recommended actions without executing them. Engineers review every recommendation. The goal is calibrating your anomaly signal quality before any automated action runs. After 30 days, measure false-positive rate on Decide output.

If it exceeds 15%, the signal pipeline needs tuning before Gate 2 opens. This gate breaks when observability coverage is incomplete, because Decide scores against missing data and recommends actions on partial root cause analysis.

Gate 2: Act with human approval gates. Decide routes its recommendation to an approval queue. An engineer approves or rejects within a defined SLA, say 10 minutes for P1 incidents. Act executes only on approval. This gate teaches the system which playbook entries are safe under which conditions, building the dataset that Gate 3 requires.

It breaks when approval SLAs slip because on-call coverage is thin, collapsing the latency advantage that closed-loop automation exists to provide.

Gate 3: Autonomous Act, constrained by Blast Radius Score. Full autonomy activates only for playbook entries whose Blast Radius Score sits below your configured threshold. Every action that scores above the threshold still routes to human approval. Verify requires sustained multi-signal compliance across two consecutive re-samples before the loop closes. Any Verify failure escalates immediately.

diagram

Gate Phase Active Unlock Criterion Failure Condition
1 Detect, Decide False-positive rate below 15% after 30 days Incomplete observability coverage
2 Act with approval Approval SLA met, playbook dataset built On-call coverage too thin to sustain 10-min SLA
3 Autonomous Act Blast Radius Score below threshold, Verify passing Stale dependency topology, missing cross-loop correlation

The specific next action is this: before enabling Gate 3 on any service, run a dependency graph audit and confirm every downstream consumer is registered in your topology metadata. Stale metadata is the single condition that defeats Blast

Radius Score gating entirely, because Act scores against a graph that no longer reflects production state and approves actions it should block.

Preventing structural faults

Cross-loop correlation is the capability that prevents structural faults from hiding behind a sequence of clean Verify confirmations. Index every closed incident by resource ID, service name, and root cause signature. When the same resource accumulates three closed loops within a 4-hour window, the system must surface that pattern to an engineer before the fourth loop runs. The mechanism is simple: repeat resolution on the same target is not a sign the automation is working.

It is a sign the automation is masking a fault that requires structural repair.

The Phased Autonomy Framework, the three-gate sequence described above, works precisely because it separates the risk surface of each phase. Teams that collapse all three gates into a single deployment week lose the ability to attribute failures to a specific phase. When an incident occurs, they cannot determine whether Decide produced a bad recommendation, Act exceeded its scope, or Verify closed prematurely. Separation gives you a clean audit trail and a specific rollback target.

Starting class and Verify discipline

Start with the highest-frequency, lowest-blast-radius incident class. Identify the incident type that fires most often and touches the fewest shared resources. Pod restarts on stateless services with no shared connection pools are the canonical starting point. That class gives you the highest loop volume for calibration with the lowest propagation risk if Act misfires.

Treat every Verify failure as a product defect. Log it, assign it, and close it within one sprint. Verify failures that accumulate without review become the false-positive debt that erodes engineer trust in the system. Once engineers stop trusting Verify output, they disable autonomous Act entirely, and the MTTR gains disappear with it.

The first concrete step after reading this is to pull your last 90 days of incident data, group by resource ID, and count how many resources appear in three or more incidents. That number tells you exactly where cross-loop correlation needs to activate first.

Frequently Asked Questions

Q: How does the problem with aiops that stops at 'act' apply in practice?

See the section above titled "The Problem With AIOps That Stops at 'Act'" for the full breakdown with examples.

Q: How does the four-phase cycle actually works apply in practice?

See the section above titled "How the Four-Phase Cycle Actually Works" for the full breakdown with examples.

Q: How does the real gains: where closed-loop aiops cuts mttr apply in practice?

See the section above titled "The Real Gains: Where Closed-Loop AIOps Cuts MTTR" for the full breakdown with examples.

Q: How does the risks nobody talks about: autonomous action in production apply in practice?

See the section above titled "The Risks Nobody Talks About: Autonomous Action in Production" for the full breakdown with examples.


Drop a comment if you've audited a similar spike. What was the dominant cause for your team? Share what worked or what blew up.

Top comments (0)