Technical Report No. 09

Does contamination move Claude Opus 5’s score?

2026-07-25 · 26 tasks · 26 runs · $20.94 spend · contamination study
Abstract.

No detectable contamination effect: the arm Opus 5 could have memorised scores 11/13; the arm it cannot have seen scores 12/13: one genuine wrong answer each. The visible one-task gap is repo-scale composition, not memory. At 11 to 12 of 13 the model is near ceiling, so this rules out a large effect, not a small one, and getting to the null took four harness fixes that had been masquerading as signal.

Scorecard: Claude Opus 5 scores 11/13 on tasks whose fixes it could have seen in training and 12/13 on tasks published after its cutoff
Card. The two arms differ in exactly one property: whether the upstream fix predates the model’s May 2026 training cutoff.

One genuine miss per arm; the rest of the gap is infrastructure and repo size.

One genuine miss per arm; the rest of the gap is infrastructure and repo size
ArmScorepass@1Genuine missesHit wall-clockCostTokens/taskTime/task$/solved
Clean (post-cutoff)12/1392.3%10$4.5838 K4.7 min$0.38
Contaminated (pre-cutoff)11/1384.6%11$16.36121 K9.4 min$1.49

Claude Opus 5, medium effort, one attempt per task. Genuine misses completed and produced a wrong patch; hit wall-clock = still working productively when the budget expired, a different failure mode, not a statement about capability.

1.

No detectable contamination effect. Genuine capability misses are 1 versus 1. The headline gap is a single task (7.7 pp), inside the noise floor at n=13. Memorisation of the upstream fix did not measurably help.

2.

The visible gap is repo-scale composition, not memorisation. The contaminated arm carries 11/13 large-or-xlarge repositories against the clean arm’s 8/13, which is why the same 13-task shape cost 3.6× more and ran 2× longer per task, and why the one wall-clock loss landed there. Cross-suite comparisons must report scale mix alongside score.

3.

Evidence against a large effect, not proof of none. At 11 to 12 of 13 the model is near ceiling, and a ceiling leaves memorisation little room to show itself. A sharper test needs harder tasks or a weaker model, not more tasks at this difficulty.

4.

Most of the apparent signal was harness bugs. Before fixing them, the same comparison read 7/13 vs 12/13, a large gap pointing the wrong way for contamination, produced by stalled HTTP requests scored as failures. Each of four fixes moved the arms closer together; the sequence ran 7/13 → 10/13 → 11/13 against an unchanging 12/13.

Four scoring bugs found and fixed on the way to the null result.

Four scoring bugs found and fixed on the way to the null result
DefectEffect on scores
Run budget passed as the per-request socket timeout, disabling retriesOne stalled request consumed a whole task and scored it 0; six of 13 first-run tasks died this way
Request ceiling set from a pooled latency distribution300 s sat below a response that legitimately completed in 333 s; now 600 s
Infrastructure errors dropped the task instead of retryingA tidy pass@1 over a silently smaller denominator, a different task each run
large and xlarge repos shared an 1800 s budgetNeither tier could spend its step allowance; now 2700 s / 3600 s

These changed scoring behaviour. Results published before them, including Reports 04 and 08, were produced under the old semantics and are not directly comparable to this report.

Both arms graded by deterministic hidden tests in a network-isolated Docker sandbox; every task pre-validated gold = 1.0, unpatched = 0.0. The arms are committed suite manifests (pre-2026-05 in tasks/v3, new_in_v4 in tasks/v4), and every task records its upstream merge date, so the clean/contaminated split can be recomputed against any future model’s cutoff: v4 is clean for a May 2026 cutoff specifically, not indefinitely. Caveats: n=13 per arm (one task is 7.7 pp), single attempts, one model; wall-clock inflated ~2× by amd64 emulation on an arm64 host (scores unaffected).

← All benchmarks