Methodology & reproducibility · B10 decision-history

How we tested whether an agent can reconstruct a decision history

The hypothesis, the ablation, why sorting is easy and exclusion is hard, the deterministic grader that separates three ways to fail, and the honest limits — including the one modeling choice this result rests on.

Retracted · 17 Jul 2026

"The one modeling choice this result rests on" turned out to be disqualifying: the accept/reject verdict — the only signal that separates adopted from killed — is written nowhere in the corpus the opponent reads. It exists only in the mla arm's governance store. Exclusion is therefore impossible for the opponent by construction, which makes the result a tautology rather than a measurement. Full retraction on the results page; methodology preserved below as the record of a flawed design.

run date 2026-07-17 claude 2.1.211 mla source build model claude-opus-4-8 N 9 trials · 3 histories host darwin 25.5
01 · Hypothesis

A decision history is the changes that stuck — not every change proposed

Over a quarter, a team tunes one knob five times. Twice, a value is floated and then killed — a road not taken. Three times, a value is actually adopted. Months later someone asks the honest question: "what did we set it to, in order?" The right answer is the three that stuck, oldest to newest. The two that were rejected must be left out.

Each change was written down the same way — a dated note that states a value as if setting it. Nothing in the text of a rejected proposal says "this one didn't happen." So the corpus contains five plausible, dated, equally-worded values, and only three of them were ever in force.

H. Sorting five dated notes is trivial for any capable agent. The hard part is exclusion — knowing which two to drop. An agent with the accept/reject verdicts reconstructs the in-force history exactly; an agent with only the raw notes cannot tell an adopted value from a killed one, so it must either decline (honest, useless) or guess (and risk shipping a road not taken as if it were policy).

What would falsify this: the ungoverned arm reliably reproducing the exact in-force sequence from the raw notes. If it can separate adopted from rejected without the verdict, governance added nothing here.
02 · The ablation & the task

One variable — the verdict — and a reconstruction, not a lookup

The task asks the agent to reconstruct the in-force history of a single production setting (a rollback window, in minutes), oldest change to newest, writing one integer per line. It is deliberately a reconstruction, not a single-fact lookup: the difficulty is not finding a value, it is deciding which values belong and in what order.

armwhat it has
ungovernedAll five dated notes on disk under notes/, read with native grep/read. Every value is present; no accept/reject verdict is.
mlaThe same five notes, ingested and governed: the three adopted values ACCEPTED, the two roads-not-taken REJECTED. The verdicts are pushed into the turn by the product's own hooks.
staticA hand-maintained changelog that already lists the in-force sequence (a fresh, well-kept doc — the ceiling).
Why there is no vanilla arm here. A no-memory agent has never seen any of the five values — it cannot reconstruct a history it was never shown. Including it would score a structural impossibility as a "loss" and inflate the gap. We drop it: the honest contest is between three arms that all have the history, differing only in whether the accept/reject decisions travel with it.
03 · Sorting is easy; exclusion is the whole game

Why this measures the verdict and nothing else

Every note carries its own date, so ordering is free — sort by date and you are done. We deliberately removed every other cue that could leak which values were adopted:

The consequence: an agent reading the raw notes sees five dated, identically-phrased values and has no textual basis to drop two of them. A careful agent notices this and declines; a less careful one picks a plausible-looking subset and ships a road not taken. Neither can reconstruct the true history — because the distinguishing fact was never in the text.
04 · Fixture

Five dated changes, two of them roads not taken, seeded through the real API

1. generate  5 distinct two-digit values on 5 dated slots (~92 days apart,
             oldest -> newest); pick 2 at random to be REJECTED (roads not
             taken) and 3 to be ACCEPTED (the in-force history)
2. write     each as an identically-worded dated note:
               "Set the production rollback window to N minutes."  __
             (adopted and rejected notes are indistinguishable as text)
3. provision a throwaway workspace; ingest ALL five via the real API,
             in shuffled order, under random hex filenames
4. govern    ACCEPT the 3 adopted values · REJECT the 2 roads-not-taken
             (by value regex, so the verdict binds to the number, not the file)
5. verify    governed retrieval SERVES all three accepted values
             -> if any is missing, ABORT (fail-closed; the benchmark is hollow otherwise)
6. on disk   the same five notes go under notes/ for the ungoverned arm (no verdict)
7. inject    the accepted sequence + the rejected values into the oracle's env,
             then DELETE them from the harness's own memory

The accepted sequence and the rejected values are generated per run and live only in the store's DB and the launcher's memory — never in a file the agent can read. The static arm's changelog is the one place the in-force sequence is written in prose; that is deliberate — it is the ceiling we are trying to match.

05 · Grading

A deterministic oracle that separates three ways to fail

No model grades this. The agent writes its answer as one integer per line; a shell oracle extracts the integer-only lines, in order, and compares the sequence to the accepted history. Averaging the failure modes together would hide the most interesting result, so the oracle names each one:

verdictmeaning
PASSThe produced sequence equals the in-force history exactly — right values, right order, nothing extra.
FAIL · declinedProduced no sequence. The honest failure: the agent could not tell which values were in force and refused to invent a history. Correct, and useless — it still cannot answer "what did we decide?"
FAIL · shipped a road not takenIncluded a rejected value. The dangerous failure: a proposal that was killed is reported as if it had been policy.
FAIL · wrong historySome other wrong sequence (missing an adopted value, mis-ordered, etc.).

Grading the reconstructed sequence (not a single fact) is the point: it measures whether the agent could rebuild "what we actually decided" — the artifact a new engineer, an auditor, or a next-sprint planner actually needs.

06 · Results

Total separation, on every history

armrebuilt itfailure modeshealthmedian
static (ceiling)9/9—unused~199s
ungoverned0/97 shipped a road not taken · 2 declined · 0 wrongunused~267s
mla9/9—grounded~104s

Across 3 independently-generated histories × 3 trials, the split was identical every time: static and mla each rebuilt the exact in-force sequence 3/3; the ungoverned arm rebuilt it 0/3. When it failed it did so in one of two ways — 7 of 9 it returned all five values in correct date order (nailing the sort, failing the exclusion), and 2 of 9 it wrote an empty answer rather than invent a history. It was never right, and it was slower being wrong (~267s) than mla was being right (~104s). The ablation is backed by the stored health signal on every trial: mla grounded (queried the reviewOutcome verdict; retrieve 7–12 per trial), static & ungoverned unused (no governed retrieval).

Why not a kept miss, as in contested-canonical? There, prevalence keeps fighting the verdict, so mla occasionally loses (94%). Here the verdict is uncontested — it unambiguously marks three ACCEPTED and two REJECTED — so mla is 9/9 and the ungoverned arm, lacking any exclusion signal in the text, is 0/9. The total separation is the honest consequence of the mechanism, not a tuned outcome.
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 decision-history \
  --arms static,ungoverned,mla --trials 3 --substrate neutral

# the 5 values, which 2 are rejected, and the dates are generated per run;
# yours will differ from ours. What should reproduce is the FAILURE MODE:
# ungoverned cannot separate adopted from rejected; mla reconstructs the sequence.

Requires a local Meetless stack and Claude Code with the mla plugin. The harness verifies the fixture is correctly governed (all three accepted values are served by governed retrieval) before any trial and aborts otherwise; it marks a trial invalid — never a loss — if the backend was unhealthy or the provider refused the run. Raw transcripts are not published — they contain the generated values.

decision-history · 9 trials · 3 histories · claude-opus-4-8 · mla source build · 2026-07-17