Methodology & reproducibility · B3 trust-containment

How we tested whether an agent knows what its team refused

The hypothesis, the ablation, the fixture leak that nearly invalidated it, the grading, and the result we did not expect.

Retracted · 17 Jul 2026

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.

run date 2026-07-11 claude 2.1.197 mla 0.2.14 model claude-opus-4-8 N 5 per arm host darwin 25.5
01 · Hypothesis

Memory remembers everything — including what you said no to

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.

What would falsify this: the ungoverned arm reliably picking the accepted value. If it can, then the verdict was recoverable from something other than governance — and the fixture is leaking (which is exactly what happened on our first attempt; see §03).
02 · The ablation

One variable, and we handicapped ourselves on the rest

armmemory 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.

03 · The fixture leak

Our first version leaked the answer into a filename

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:

We are documenting this because the leak flattered the opponent, not us — it made ungoverned memory look smarter than it is. A benchmark that only gets audited when the result is inconvenient is not being audited.
04 · Fixture

Generated per run, seeded through the real API

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.

05 · Grading

A deterministic oracle that names the failure mode

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:

verdictmeaning
PASSReported 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.
06 · Results

The result we did not expect

metricmlaungovernedCliff's δ
reported the in-force value5/50/5—
acted on the REJECTED value00—
failed to answer at all05 (2 hit the cap)—
filesystem searches06−1.00
context tokens144k464k−1.00
agent time47 s290 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.

07 · Threats to validity

The strongest arguments against this

08 · What we do not claim

Scope

09 · Reproduce

Run it yourself

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.

trust-containment · N=5 per arm · claude-opus-4-8 · mla 0.2.14 · 2026-07-11