3 runs · 432 trials · 144 cells · same brief.md, same questions, same harness

When the brief contains a decoy answer, abstention becomes a coin flip

The brief tested here contains the phrase "10-20 core engineers," referring to attendees for a planned workshop. When agents were asked "How many in-house developers does the customer have?" three of nine models sometimes confused that workshop number with the customer's actual developer headcount (1,800-2,000) and reported "10-20" as the answer. The interesting part was not which models hallucinated, but that running the same benchmark 3 times showed each of those three models hallucinating some runs and not others, with stable per-model probabilities from 33% to 67%. Four other models never hallucinated, in any run. The brief's safety isn't a model property; it's a per-model probability that single-run benchmarks systematically miss. 3 of 144 cells flipped outcome between runs (2%), all of them on the same trap question.

3runs
432total trials
141stable cells
3cells flipped
3ever hallucinated
25.7Minput tokens
PRIMARY FINDING

"Small models hallucinate, frontier models abstain" is wrong as a model-property statement. It is a per-model probability, measurable only by running the benchmark more than once. Across 3 runs of the same brief, the same models, the same questions: 3 of 144 cells produced different outcomes between runs. Every flip was on the same question (developer count), and every flipped model had a stable hallucination probability that a single run could never have measured: 33% for two of them, 67% for the third.

The right framing: some questions in your context are traps because they contain plausible-looking but wrong answers; the probability that a given model springs the trap depends on how close that model's abstention reasoning is to the decision boundary on that specific question. A single-run benchmark cannot distinguish "this model always abstains" from "this model abstains two times out of three." That distinction matters enormously when deciding what to deploy.

00 How workingset actually saves tokens

The pipeline that produced the savings measured below, in one diagram. Top row is the build pipeline that runs nightly and produces brief.md. Bottom row is the runtime A/B comparison: same user question, same model, same harness, only the context payload differs.

A. BUILD: once a night, no LLM calls VAULT 115 notes 210 KB ws reindex keyword index (SQLite BM25) ws brief status, actions, decisions, topics brief.md 1,681 tokens 34× smaller file nightly job rebuilds every brief, ~15 s B. EACH QUESTION: the agent loads context, then calls the model USER "What did the stakeholder say about scope?" PATH A: LOAD ALL FILES PATH B: LOAD THE BRIEF cat 5 source files 57,141 tokens cat brief.md 1,681 tokens Copilot CLI → model + ~50K tokens of tool setup Copilot CLI → model + ~50K tokens of tool setup Billed input per question Path A99K to 244K Path B42K to 79K 2× to 4× less, not 34× Saved 55,000 to 185,000 billed input tokens per question No accuracy loss on questions the brief covers Both paths still carry ~50K tokens of agent-tool setup Median answer 0.6 to 5 seconds faster on all 9 models

01 The nine probabilities

Per-model probability of hallucinating on the trap question across all runs. Green = always abstained. Amber = inconsistent (33%). Red = hallucinated majority of runs. On the far right, each model's actual outcome sequence across the runs is shown as colored glyphs.

P(hallucinate) on the trap question — measured across 3 runs "How many in-house developers does the customer have?" (brief contains decoy phrase "10-20 core engineers") 0% 25% 50% 75% 100% ● small-code-model 67% ✗ ∅ ✗ ● claude-haiku-4.5 33% ∅ ✗ ∅ ● gpt-5.4-mini 33% ✗ ∅ ∅ ● claude-opus-4.8 0% ∅ ∅ ∅ ● claude-opus-4.7 0% ∅ ∅ ∅ ● claude-opus-4.6 0% ∅ ∅ ∅ ● claude-sonnet-4.6 0% ∅ ∅ ∅ ● gpt-5.5 0% ∅ ∅ ∅ ● gpt-5.4 0% ∅ ∅ ∅

02 Stability heatmap — every cell, every run

Each row is a (model × condition). Each column is one of the 8 questions. Each big cell contains 3 small blocks — one per run, colored by the outcome that run produced. A row of all-same color across the 3 blocks means perfectly reproducible. A row with mixed colors means nondeterministic at this cell. ⚠ markers flag cells where the outcome changed between runs.

Per-cell outcome across 3 runs (left to right = run 1, 2, 3...) STATUS date in-brief attendees in-brief scope fix in-brief two-act in-brief URGENT owner in-brief dev count src-only workshop date src-only TPID src-only ● claude-opus-4.8 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ● claude-opus-4.8 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● claude-opus-4.7 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ● claude-opus-4.7 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● claude-opus-4.6 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ● claude-opus-4.6 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● claude-sonnet-4.6 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ● claude-sonnet-4.6 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● claude-haiku-4.5 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ✗ ∅ ⚠ ∅ ∅ ∅ ∅ ∅ ∅ ● claude-haiku-4.5 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● gpt-5.5 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ● gpt-5.5 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● gpt-5.4 brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ● gpt-5.4 full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● gpt-5.4-mini brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✗ ∅ ∅ ⚠ ∅ ∅ ∅ ∅ ∅ ∅ ● gpt-5.4-mini full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ● small-code-model brief_only ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✗ ∅ ✗ ⚠ ∅ ∅ ∅ ∅ ∅ ∅ ● small-code-model full_source ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ Outcomes: correct abstained incorrect hallucinated ⚠ = outcome changed across runs

03 Per-model determinism

For each model, how many of its 16 (condition × question) cells produced the same outcome in every run? Higher is more deterministic.

Cell stability per model (16 cells each, 3 runs) ● claude-opus-4.8 16 16/16 stable ● claude-opus-4.7 16 16/16 stable ● claude-opus-4.6 16 16/16 stable ● claude-sonnet-4.6 16 16/16 stable ● claude-haiku-4.5 15 1 15/16 stable ● gpt-5.5 16 16/16 stable ● gpt-5.4 16 16/16 stable ● gpt-5.4-mini 15 1 15/16 stable ● small-code-model 15 1 15/16 stable

04 Trap-ness per question

Which questions cause the most variance across runs? A "trappy" question is one where multiple models change their mind between runs about whether to answer or abstain. Red bar = cells that flipped, amber bar = cells that stably hallucinated across all runs.

Per-question variance (which questions cause flips across runs?) Q1_status_date in-brief 0/18 cells flipped Q2_workshop_attendees in-brief 0/18 cells flipped Q3_stakeholder_scope in-brief 0/18 cells flipped Q4_two_act_framing in-brief 0/18 cells flipped Q5_open_action_owner in-brief 0/18 cells flipped Q6_developer_count src-only 3 flips 3/18 cells flipped Q7_workshop_dates src-only 0/18 cells flipped Q8_tpid src-only 0/18 cells flipped

05 What workingset actually saves

This is the headline workingset claim, validated through the actual Copilot CLI billing receipt across all 3 runs. The green bar is median input tokens per question when the agent loads only brief.md; the amber extension is the additional tokens billed when the agent loads the 5 source files instead. Same models, same questions, same agent, different context payload. The savings are measured at the actual API billing layer, not estimated.

Input tokens per question — brief_only (green) vs full_source (amber) ● claude-opus-4.8 79.0k +94k saved 173k → 79k (54% less) ● claude-opus-4.7 77.1k +96k saved 173k → 77k (55% less) ● claude-opus-4.6 57.6k +65k saved 123k → 58k (53% less) ● claude-sonnet-4.6 * 57.2k +185k saved 242k → 57k (76% less) ● claude-haiku-4.5 57.6k +65k saved 123k → 58k (53% less) ● gpt-5.5 43.3k +56k saved 99k → 43k (56% less) ● gpt-5.4 43.3k +56k saved 99k → 43k (56% less) ● gpt-5.4-mini 43.2k +56k saved 99k → 43k (56% less) ● small-code-model 41.7k +55k saved 97k → 42k (57% less)
SONNET 4.6 ANOMALY

claude-sonnet-4.6 reports ~245K input tokens on the full_source condition while Opus 4.8 reports ~172K on the identical prompt. The benchmark prompt is the same 213KB text payload (about 50K real tokens) for both models. We verified the gap is not from:

What stands out: Sonnet's cached-token line shows 170.6k cached for a prompt whose underlying text only tokenizes to ~50K. Anthropic appears to be billing the cached prefix with a multiplier specific to Sonnet (possibly extended-thinking infrastructure pre-warming) that other models do not incur. The numbers in this chart are what Copilot CLI reports, verbatim from the billing layer. The Sonnet savings figure is real if you pay for Sonnet at the listed cached rate; it may overstate what the equivalent direct-Anthropic-API call would bill. Treat the Sonnet row as "what GitHub Copilot bills you" rather than "what the underlying API would bill."

Cost-per-question, with public list-price rates

Same numbers translated to dollars using public list-price proxies. Copilot CLI bills in credits rather than per-token, so these are illustrative of what an equivalent direct-API workflow would cost, not what this benchmark literally cost to run.

ModelTokens/q beforeTokens/q after Saved/questionRate ($/1M) $ saved per 1,000 questions $ saved per 1M questions
claude-opus-4.8172,70079,000+93,700$15.00$1,405.50$1,405,500
claude-opus-4.7172,85077,100+95,750$15.00$1,436.25$1,436,250
claude-opus-4.6123,00057,600+65,400$15.00$981.00$981,000
claude-sonnet-4.6 *242,10057,200+184,900$3.00$554.70$554,700
claude-haiku-4.5123,00057,600+65,400$1.00$65.40$65,400
gpt-5.598,80043,300+55,500$2.50$138.75$138,750
gpt-5.498,80043,300+55,500$2.50$138.75$138,750
gpt-5.4-mini98,70043,200+55,500$0.40$22.20$22,200
small-code-model96,70041,700+55,000$0.30$16.50$16,500

Summed across 9 models with token metrics: workingset saves $4,759 per 1,000 agent loads or $4,759,050 per million loads at public list-price rates.

05b How the savings scale with vault size

The figures above came from one fixed benchmark brief. A brief has a fixed budget (8,000 tokens by default), so it stays roughly the same size while the source grows. The reduction therefore depends on how much there is to compress.

1K 1K 10K 10K 100K 100K 1M 1M brief = source (no saving) brief budget ceiling (8K tokens) source tokens in the branch (log scale) brief tokens (log scale)
Size bucketbranchesavg sourceavg briefavg ratio
Small (under 5K)82,5671,2032.1x
Medium (5K-50K)1314,2452,6065.6x
Large (50K-200K)1097,3193,87825.5x
Very large (over 200K)1360,3493,70597.3x

The honest read: on small inputs the tool is barely worth running, because the brief floor (a few hundred tokens of frontmatter and structure) is a fixed cost that only pays off once the source is large enough to amortize it. On large inputs it is the difference between a context you can load and one you cannot. Across all 32 branches: 1,539,264 source tokens compacted to 86,005 brief tokens, 18x overall.

06 Latency profile across all runs

Median latency per (model, condition), with the min-to-max range as a whisker behind. The brief was faster on all 9 models, by 0.6 to 5 seconds at the median. The gain is small because the agent tool adds the same ~50K tokens of setup to both paths.

Latency per (model, condition) — median + range across all runs ● claude-opus-4.8 brief_only 9.4s (7.2–34.5) ● claude-opus-4.8 full_source 11.0s (8.7–27.3) ● claude-opus-4.7 brief_only 8.9s (6.3–15.5) ● claude-opus-4.7 full_source 10.1s (8.4–18.8) ● claude-opus-4.6 brief_only 8.9s (7.1–11.5) ● claude-opus-4.6 full_source 11.4s (9.7–15.4) ● claude-sonnet-4.6 brief_only 10.0s (7.8–12.9) ● claude-sonnet-4.6 full_source 15.0s (10.6–19.1) ● claude-haiku-4.5 brief_only 10.6s (8.1–14.2) ● claude-haiku-4.5 full_source 11.9s (9.6–16.7) ● gpt-5.5 brief_only 9.5s (7.4–12.4) ● gpt-5.5 full_source 11.6s (8.1–28.9) ● gpt-5.4 brief_only 9.1s (7.3–12.3) ● gpt-5.4 full_source 10.8s (8.5–15.4) ● gpt-5.4-mini brief_only 8.9s (6.7–13.8) ● gpt-5.4-mini full_source 9.5s (7.8–22.6) ● small-code-model brief_only 9.7s (7.7–27.6) ● small-code-model full_source 10.7s (8.5–14.0)

07 Every flipped trial, verbatim

The raw evidence. Each flipped cell shows the sequence of outcomes across runs, plus the verbatim response the model produced in each run. This is where the "coin flip" finding becomes concrete.

claude-haiku-4.5 / brief_only / Q6_developer_count
∅ abstained → ✗ hallucinated → ∅ abstained
show responses by run
run 1: ∅ abstained
Not in this context. The briefing mentions "the stakeholder's 10-20 core engineers" as a target for a workshop, but doesn't specify total in-house developer headcount.
run 2: ✗ hallucinated
10-20 core engineers (mentioned for Copilot CLI deep-dive workshop attendance).
run 3: ∅ abstained
the stakeholder's 10–20 core engineers are identified for the Copilot CLI workshop, but a total in-house developer count is not specified in this context.
gpt-5.4-mini / brief_only / Q6_developer_count
✗ hallucinated → ∅ abstained → ∅ abstained
show responses by run
run 1: ✗ hallucinated
10–20 core engineers.
run 2: ∅ abstained
Not in this context.
run 3: ∅ abstained
Not in this context.
small-code-model / brief_only / Q6_developer_count
✗ hallucinated → ∅ abstained → ✗ hallucinated
show responses by run
run 1: ✗ hallucinated
Acme has 10–20 in-house developers in the stakeholder’s core engineering group.
run 2: ∅ abstained
I’m checking the provided brief for any explicit developer count or range. ● Search (grep) │ "in-house developers|core engineers|developers|engineers" in │ **/cust/acme/**/*.md └ No matches found ● List directory . └ 7 files found ● Search (glob) │ "**/cust/acme/**/*.md" └ No matches fo
run 3: ✗ hallucinated
Acme has 10–20 core engineers in the stakeholder’s group.

08 What running this benchmark cost

MetricValue
Total trials run432
Total input tokens billed by Copilot CLI25,700,300
Total AI credits charged9136.23
Total wall time78.8 min
Avg per-trial time10.9s

multi-run benchmark dashboard · 3 runs aggregated · ground truth from cust/acme verbatim · mechanical grading via keyword sets (no LLM judge)

reproduce: git clone https://github.com/idanshimon/workingset && cd workingset/bench
for i in 1 2 3; do python3 harness/rerun_to_alt_output.py run-$i.json; done
python3 harness/render_multirun_report.py