Interpretable AIOps: Root-Cause Analysis On-Call Can Actually Trust
The pager goes off: "Anomaly detected — checkout p99 up 280%, anomaly score 0.97." You stare at it. The model is confident something is wrong. You already knew something was wrong; that's why you're awake. What you need — which service, which hop, which deploy, what to do next — the alert doesn't say, and now you're doing the entire diagnosis by hand, at 3 a.m., with an AIOps tool watching you work. This is the central disappointment of most AIOps in production: it has automated the part that was already easy and left the hard part untouched. This article is about building the hard part — root-cause analysis that on-call can actually trust — and why interpretability, not detection accuracy, is the property that earns that trust.


The pager goes off: "Anomaly detected — checkout p99 up 280%, anomaly score 0.97." You stare at it. The model is confident something is wrong. You already knew something was wrong; that's why you're awake. What you need — which service, which hop, which deploy, what to do next — the alert doesn't say, and now you're doing the entire diagnosis by hand, at 3 a.m., with an AIOps tool watching you work. This is the central disappointment of most AIOps in production: it has automated the part that was already easy and left the hard part untouched. This article is about building the hard part — root-cause analysis that on-call can actually trust — and why interpretability, not detection accuracy, is the property that earns that trust.
Detection Is the Easy Half
Anomaly detection is a solved-enough problem. Throw a reasonable model at a latency or error-rate time series and it will tell you, fairly reliably, that the current behavior is unusual. That capability feels like AIOps, but it answers a question on-call almost never has. By the time you're paged, you know the system is misbehaving. The expensive, sleep-destroying work is everything downstream of that: forming a hypothesis about the cause, finding the evidence that supports or kills it, and deciding what to do.
The left side of that picture is where most tools stop. An alert fires, it carries an impressive-looking score, and then a human does all the real work: correlating dashboards, reading logs, checking the deploy timeline, guessing at the culprit, and disconfirming guesses one at a time. The alert added urgency, not insight. The right side is the goal — a ranked hypothesis that arrives with its evidence attached, so the human's job collapses from "investigate from scratch" to "evaluate a specific claim." That shift, from detection to interpretable diagnosis, is the entire value proposition.
Why On-Call Doesn't Trust AIOps
Ask any seasoned on-call engineer why they ignore the AIOps panel during a real incident, and you'll hear some version of the same three complaints. It cries wolf — too many alerts, too little signal, so they've learned to tune it out. It's a black box — when it does say something, there's no way to tell why, so they can't act on it without re-verifying everything themselves, which defeats the point. And it's confidently wrong — it states conclusions with the same authority whether it's sure or guessing, so a wrong call costs more trust than a right one earns.
Notice that none of these is a complaint about model accuracy. They're all complaints about interpretability and calibration. A diagnosis system can be highly accurate and still untrusted if it can't show its reasoning, can't express uncertainty, and can't be acted on without redoing the work. Trust is not a function of how often the system is right; it's a function of whether a human can tell, in the moment, whether to believe it this time. That is the property we have to engineer for.
From Signals to a Hypothesis With a Name
The architecture that produces a trustworthy hypothesis has two halves: live correlation and a labeled memory of the past.
Correlation comes first. The system ingests the same signals an engineer would — Envoy stats (5xx, connection-pool overflow, outlier ejections), OpenTelemetry traces (especially span-level latency attribution: is the time at the gateway hop or the upstream hop?), and Kubernetes events (OOMKills, pod churn, deploy markers). Individually each is ambiguous; co-occurring, they form a failure signature — a characteristic fingerprint of what's happening right now.
A signature alone tells you the shape of the failure, not its name. The name comes from the second half: an incident knowledge base of past, labeled events, each stored as signature → cause → what resolved it. The current signature is matched against this history by similarity, and that is what lets the system say not just "connections are pooling and a canary is churning" but "this looks like the canary-memory-regression pattern we've seen four times before, and here's how it resolved." The output is a small, ranked list of hypotheses, each with a confidence score and its evidence chain — the thing on-call can read in seconds and either accept or rule out.
The Confidence Score Is Not Decoration
Here is the design decision that does more for trustworthiness than any modeling choice: the confidence score must gate what the system is allowed to do. It is not a number to display next to a conclusion — it is the control that determines how strong a claim the system is even permitted to make.
At low confidence, the system says nothing about cause. It surfaces the correlated evidence — "here's what changed" — and explicitly declines to name a culprit. This is exactly where genuinely novel failures land, and staying silent about cause is the correct, honest behavior: a system that guesses a name for an unprecedented failure is worse than one that admits it doesn't recognize the pattern. At medium confidence, it names the leading hypothesis and the fastest check that would confirm or kill it — pointing the human at a disconfirming test rather than an answer to accept on faith. Only at high confidence does it propose a specific, reversible remediation — and even then, for a human to approve, never to execute unattended.
This gating is what makes the system safe to trust, because it makes the system's confidence legible and consequential. On-call learns quickly that a high-confidence call comes with a concrete recommendation and a strong evidence chain, while a low-confidence one is honest about being a shrug. The score stops being decoration and becomes a contract.
Render the Narrative — Never Free-Generate It
There is a strong temptation, especially now, to hand the explanation to a language model: feed it the signals and let it write a fluent root-cause narrative. Resist it. If you let a model freely compose the rationale, you will eventually get a beautifully written, completely convincing explanation that does not match what the evidence actually shows — a hallucinated audit trail, which is strictly worse than no audit trail, because it looks authoritative while being wrong, and an on-call engineer acting on it under pressure has no easy way to catch the fabrication.
The discipline is to make the structured record the source of truth and the prose a strict projection of it. The hypothesis, the confidence, the matched past incidents, and the evidence chain are computed and stored as structured data. The human-readable narrative is template-rendered from exactly those fields — it can only say what the record contains. The explanation can therefore never drift from the decision. This is the difference between a system that explains its reasoning and one that performs the appearance of reasoning; for anything touching a regulated or high-stakes system, only the former is admissible.
Every Incident Sharpens the Next
The reason a labeled knowledge base is worth the trouble is that it compounds. A diagnosis system built this way gets better at judgment over time the same way a senior SRE does — by accumulating memory of what actually happened.
The loop is simple and self-reinforcing. An incident occurs and forms a signature. The system proposes a ranked hypothesis. A human confirms or corrects it — and that resolution labels the data. The outcome is stored back as signature → cause → what worked, and the next time a similar signature appears, the match is stronger and the confidence better calibrated. Crucially, a wrong hypothesis is valuable signal too: it prunes the bad signature-to-cause pairing so the system doesn't repeat the mistake. Over enough incidents, the knowledge base stops being a static lookup and becomes the institution's accumulated incident judgment — the thing that usually walks out the door when a senior engineer leaves.
This is also why the human-in-the-loop isn't a temporary scaffolding to be removed once the model is "good enough." The human confirmations are the label stream that makes the system better; remove the human and you sever the feedback that produces the trust in the first place.
What This Doesn't Solve
Honesty about the boundaries is part of what makes the rest credible.
The cold-start problem is real: a fresh knowledge base has no history to match against, so early hypotheses are weak and the system spends most of its time in the low-confidence "here are the signals" mode. That's the correct behavior, but it means the value accrues over months, not on day one. Label quality is load-bearing: if engineers confirm hypotheses lazily or mislabel resolutions, you're teaching the system the wrong lessons, and a knowledge base of bad labels is worse than none. And genuinely novel failures — the truly new outage, the unprecedented interaction — will always score low and belong to humans, by design. The system's job there is not to guess, but to lay out the evidence clearly and get out of the way.
None of these is a reason not to build it. They're the reasons to build it honestly — with confidence gating that respects the cold start, label discipline that protects the knowledge base, and a humility about novel failures baked into the architecture.
Augment On-Call, Don't Add to the Noise
The bar for AIOps should not be "can it detect anomalies" — that's the easy half, and the half on-call already has covered by being awake. The bar is whether it can answer why, and what now, in a form a tired human can trust at 3 a.m.: a ranked hypothesis, scored honestly, carrying its evidence, gating its own authority by its confidence, explaining itself from the record rather than performing an explanation, and getting sharper with every incident it sees.
Build that, and AIOps stops being one more panel to ignore and becomes the thing that hands on-call a head start. Build the other thing — the confident black box that cries wolf — and you've just added a louder alarm to a room that already had too many.
If you work on AIOps, incident response, or observability for distributed systems, I'd like to compare notes — find me on LinkedIn or drop a comment below.
This article discusses automated incident diagnosis at the architecture level; the examples are illustrative patterns, not production data.
