The problem: a utility puts AI in front of customers. New tariffs, four operating companies, rules that change on a schedule. After it ships, the knowledge base has no owner and no quality bar, so the failures land in a call — a superseded rule, the wrong state's tariff. A knowledge failure, not a model failure.
The solution: a monitor that reads which documents the agent pulled, not what it said, and flags the sourcing that was wrong. Every finding names a check that re-runs the same way every time.
This page is that monitor, built on an Xcel-shaped corpus to prove the approach. The scores below are measured. The dashboard runs on a test agent replaying that corpus — not Xcel's systems.
flowchart TD
KB["Governed knowledge base: 30 documents, four operating companies"]
IDX["Retrieval index carrying governance metadata"]
AGENT["Served agent: retrieval naive on purpose"]
TALK["Customer interaction"]
TRACE["Trace: which documents reached the context"]
PROV["Retrieval provenance: deterministic"]
RAT["Model rationale: not"]
CHECKS["Checks read the evidence, not the answer"]
FINDING["Finding names the cause"]
SCORE["Scored against 240 labeled interactions"]
KB --> IDX
IDX --> AGENT
AGENT --> TALK
TALK --> TRACE
TRACE --> PROV
TRACE --> RAT
PROV --> CHECKS
CHECKS --> FINDING
FINDING --> SCORE
classDef kb fill:#1F5E9322,stroke:#1F5E93,stroke-width:1.5px
classDef agent fill:#C64A1122,stroke:#C64A11,stroke-width:2px
classDef trace fill:#6D3FC422,stroke:#6D3FC4,stroke-width:1.5px
classDef det fill:#0E7C6622,stroke:#0E7C66,stroke-width:1.5px
classDef prob fill:#8A5A0B22,stroke:#8A5A0B,stroke-width:1.5px
classDef finding fill:#B03A2622,stroke:#B03A26,stroke-width:2px
class KB,IDX kb
class AGENT,TALK agent
class TRACE trace
class PROV,CHECKS det
class RAT prob
class FINDING,SCORE finding
The utility runs customer-facing AI across four operating companies. Once it shipped, nobody owned the knowledge it answers from. That is the gap this was built against, and it is the gap regulators are starting to name.
Four pieces, each small on purpose. The corpus is real governance, the agent is deliberately weak, and the monitor reads the weak agent's trails.
Two questions get asked about any agent answer: why was this document retrieved, and why did the agent use it. They are not the same question, and the contract keeps them apart.
| Why this doc was retrieved | Why the agent used it | |
|---|---|---|
| Nature | Deterministic | Probabilistic |
| Source | Scores, filters, ranking | Model reasoning |
| Available | Always | Only if the model exposes a trace |
| Auditable | Re-runs identically | No. Not repeatable |
The monitor lives entirely in the left column. It reads the evidence, which documents made it into the context and under what metadata, so a finding can name the cause rather than describe the symptom. That column re-runs to the same result every time. The right column does not.
Five knowledge failures a utility actually has. Each one is a check over provenance, and each one names the document that caused it.
240 labeled interactions, half of them multi-turn transcripts. Every one carries its expected outcome, so the monitor is scored rather than demonstrated. Precision first, because a monitor that cries wolf gets switched off long before it finds anything.
| Check | Precision | Recall |
|---|---|---|
| scope | 1.0 | 1.0 |
| authority | 0.857 | 1.0 |
| freshness | 0.8 | 0.842 |
| contradiction | 0.5 | 0.667 |
Three gaps are known and named, because a score with no stated limit is a claim nobody can check.
The two false alarms are one case, and it is a genuine question rather than a defect. A not-yet-in-force deposit document reached the context, and the agent answered without quoting from it. Flagging it says the retrieval was wrong. Not flagging it says the answer was fine. The checks read retrieval, so they flag it. Which is correct belongs to the rubric, not to the check.
The 0.944 above is an offline score against a frozen set. The same checks now run as a sweep inside AESOP, against a test agent replaying the corpus, and fill a dashboard. Nothing new is being judged — the checks that scored the fixture are the checks that fill the board.
It reads the kind of retrieval trace a LangChain retriever on Databricks Vector Search already returns — the documents pulled and their metadata — so it plugs onto that stack by consuming what it produces, not by re-platforming anything.
It runs with no model call. The checks are re-derived from each interaction's retrieval trace, so a finding is not a model's opinion about an answer. It is arithmetic over what the retrieval did, and it re-runs to the same result every time.
flowchart TD
LIVE["Test agent replaying the Xcel-shaped corpus"]
ITRACE["Interaction trace: retrieval provenance"]
DET["Deterministic checks: entity, stale"]
PROV["Provenance checks: grounded, in-scope, authoritative, consistent"]
FIND["Findings, each named to a check"]
DELTA["Deterministic prevalence delta"]
DASH["Dashboard: counters, feed, breakdowns, trend"]
REPAIR["Fix the knowledge base, rate bends down"]
LIVE --> ITRACE
ITRACE --> DET
ITRACE --> PROV
DET --> FIND
PROV --> FIND
FIND --> DELTA
DELTA --> DASH
DASH --> REPAIR
REPAIR --> LIVE
classDef agent fill:#C64A1122,stroke:#C64A11,stroke-width:2px
classDef trace fill:#6D3FC422,stroke:#6D3FC4,stroke-width:1.5px
classDef det fill:#0E7C6622,stroke:#0E7C66,stroke-width:1.5px
classDef finding fill:#B03A2622,stroke:#B03A26,stroke-width:2px
classDef dash fill:#1F5E9322,stroke:#1F5E93,stroke-width:1.5px
class LIVE agent
class ITRACE trace
class DET,PROV det
class FIND,DELTA finding
class DASH,REPAIR dash
The loop closes on repair. A knowledge-base fix lands, the next sweep re-derives the findings, and the rate moves. That is the whole point of running it live rather than once.
Open an agent's Monitor page in AESOP and the board reads the agent's record back to you. It is newest-first, it cuts by where the failure happened, and it trends over time so a fix is visible rather than claimed.
The timeframe selector leads with two windows before the rolling ones, because the two questions an owner actually asks are "how is this agent doing" and "did my last change help."
A monitor that only runs once is a screenshot. This one you can run in front of someone. A Run conversations button replays curated, order-preserving deployment traffic a batch at a time, so the board visibly fills as you watch.
The severity on the board stops at major. It never says critical. That is a deliberate limit, and it is the same one the frozen rubric already names.
The provenance layer proves a retrieval was wrong. Stale, out of scope, wrong authority. It does not prove a safety-critical consequence. A stale late fee and a stale safe-distance are the exact same check firing at wildly different stakes, and the monitor alone cannot tell them apart. So the top tier reads major, because that is what the evidence supports. "Critical" is reserved for a consequence the provenance layer cannot see on its own, and claiming it here would be overreach.