The hypothesis, the ablation, the fixture leak that nearly invalidated it, the grading, and the result we did not expect.
The ablation described below removed every signal an agent could use to tell the two decisions apart — including the ones a real ungoverned team actually records — leaving exactly one channel: the governance verdict that only the mla arm was given. That makes mla's ceiling 100% by construction and the opponent's a coin flip; it measures the fixture, not the model. A plain vector-RAG arm handed the identical verdict-stripped corpus scored 3/3 by guessing the rounder number, where "ungoverned" scored 0/3 on the same information. The full retraction is on the results page. The methodology is preserved below as the record of a flawed design.
A memory store that ingests your team's documents does not only capture what you decided. It captures what you considered: the proposal that was floated and killed, the config that was tried and reverted, the approach the staff engineer talked you out of. All of it is true text. Only some of it is in force.
H2. Given two contradictory decisions — one accepted, one rejected — an agent with governed memory reports the accepted one, and an agent with ungoverned memory cannot.
| arm | memory it gets |
|---|---|
| ungoverned | An MCP tool over the same corpus, returning every document in full on every query — no ranking, no cutoff, no misses. Trust labels stripped: no accepted, no rejected, no reviewer, no review event. |
| mla | Governed retrieval. Same documents, plus the governance verdict. |
We gave the ungoverned arm perfect recall on purpose. A real vector index ranks, truncates, and misses things — so a loss could always be blamed on retrieval quality. We removed that excuse: its memory hands it both documents, complete, every single time. The only thing it lacks is the record of who said yes.
Both arms run the identical model, prompt, repo, permission mode, and timeout, and the same generated fixture within a run. The ungoverned arm's memory server needs no network and no filesystem (the corpus is injected at spawn), so it runs inside the same sandbox as every other non-mla arm — no ~/.meetless, no mla on $PATH, no loopback. It cannot reconstruct governance by another route.
The pilot's ungoverned arm passed — which should have been impossible. It explained itself:
"rollback-window.md -> 18 minutes (canonical note) rollback-window-alt.md -> 20 minutes (the -alt alternative proposal) The -alt-suffixed note is the alternative that was discussed but not adopted; the canonical note carries the value in force."
It never used memory. It read our filenames. The -alt suffix was the governance verdict, sitting in plain text in the path — a signal we put there without noticing.
This is the general hazard of an ablation: any asymmetry the agent can perceive is a channel that smuggles the hidden variable past the experiment. The two documents must be indistinguishable in every respect except the one under test. So now:
1. generate two distinct random values (e.g. 14 and 45 minutes)
2. provision a throwaway workspace via the real API
3. kb add doc A -> review ACCEPTED
4. kb add doc B -> review REJECTED (separate doc; neither supersedes the other)
5. verify BOTH are live in retrieval, AND the rejected one is not banded `accepted`
-> if it IS, ABORT: governance carries no signal and the benchmark is hollow
6. snapshot the corpus for the ungoverned arm: same docs, trust labels stripped
7. inject the accepted value into the oracle's env, then DELETE it from the harness's own
Step 5 is the guard that makes the experiment meaningful. If retrieval mislabeled the rejected document as accepted, neither arm could distinguish the two and the benchmark would measure nothing while appearing to work. The harness refuses to run in that state.
The values exist only in the store's database and the launcher's process memory — never in a file, commit, or environment variable the agent can read — and they are different on every run, so no model can have been trained on them and no published result can contaminate a future one.
No model grades this. The agent writes ROLLBACK: <minutes> to answer.txt; a shell oracle parses the first integer and compares it to the accepted value. Crucially, it distinguishes the two ways to fail, because averaging them together would hide the most important thing we found:
| verdict | meaning |
|---|---|
| PASS | Reported the value the team accepted. |
| FAIL (acted-on-rejected) | The dangerous failure. The agent reported the value the team explicitly killed — and an engineer would have shipped it. |
| FAIL (no-answer) | The honest failure. The agent recognized it could not tell which decision was in force, and declined to invent one. |
| metric | mla | ungoverned | Cliff's δ |
|---|---|---|---|
| reported the in-force value | 5/5 | 0/5 | — |
| acted on the REJECTED value | 0 | 0 | — |
| failed to answer at all | 0 | 5 (2 hit the cap) | — |
| filesystem searches | 0 | 6 | −1.00 |
| context tokens | 144k | 464k | −1.00 |
| agent time | 47 s | 290 s | — |
We predicted the ungoverned arm would confidently serve the rejected decision. It never did — not once. It recognized the contradiction, refused to fabricate a value, and said so. Then it went looking for a tiebreaker that does not exist, and two trials searched until the timeout killed them.
So the honest claim is narrower than the one we set out to prove, and more useful: memory without governance does not make a careful agent wrong. It makes it stuck. It burns 3.2× the context to arrive at "I don't know" — which, for the question "what did my team decide?", is the wrong answer in the only way that matters.
How the governed arm actually did it (from the transcripts, not from theory): retrieve_knowledge returned the two documents with different trust bands. That asymmetry prompted the agent to drill in with kb_doc_detail, which returned the explicit review verdict — ACCEPTED on one, REJECTED on the other. It then answered and stopped. The band did not have to say "rejected"; it only had to differ, which was enough to trigger the check that found the truth.
cd tools/bench-mla node run.mjs --tasks trust-containment --arms ungoverned,mla --trials 5 node analyze.mjs # the fixture is generated per run, so your values will differ from ours. # what should reproduce is the SEPARATION, not the literal numbers.
Requires a local Meetless stack and Claude Code with the mla plugin. The harness verifies the fixture is correctly governed before any trial and aborts otherwise; it also marks a trial invalid (never a loss) if its backend was unhealthy or the model provider refused the run. Raw transcripts are not published — they contain the generated answer.