Gradia Research

A visual walkthrough of the paper · September 2026

The Reward‑Hacking Wind Tunnel

Every benchmark score you have ever trusted was produced by a scorekeeper — a regex, a rubric, an LLM judge, a test suite — and the scorekeeper can be fooled. This paper builds a wind tunnel that attacks a deployed benchmark scorer with answers proven wrong by a machine oracle, localizes the exploited slice with witnessed one-variable counterfactuals, repairs the scorer, and re-attacks — to measure the question the field has not asked: when you patch a scorer, does the evaluation converge, or is it whack-a-mole forever?

5public benchmarks
9,620L1 attack attempts
357witnessed exploits
0human labels
γlocal = 0the headline

01 · The last untrusted component

Your benchmark number comes out of a pipeline, not out of truth

When a lab reports “94.2 on MATH,” nobody checked 94.2% of the answers. A scoring pipeline did: an answer extractor decided what the model “answered,” a judge or rubric decided whether it was right, a unit-test verifier decided whether the code worked.

Two earlier pillars of the Gradia program made the rest of the evaluation stack honest: Interruptible Universes proved what happened in a changing world, and Gradia Guard made the runtime record tamper-evident. The scorekeeper is the last trusted component — and it is an attack surface. Prior work already showed how wide open it is: a GSM8K judge whose pass rate could be pushed from 0.72 to 0.94 while true accuracy stayed at 0.20, and multi-judge panels that agree with each other at Fleiss κ = 0.151, barely above chance.

Model output

free text, code, a final environment state

The scorekeeper

the gameable middle

answer extractor LLM judge rubric grader unit-test verifier

The number

“94.2” — what everyone actually trusts

The scoring pipeline is (a) unverifiable — you trust the harness; (b) gameable — the judge can be fooled by answers that look right and are wrong; (c) contaminated — the test set may have leaked into training. This paper attacks (b) and armors (a) and (c) along the way.

02 · Oracle-witnessed exploits (C3)

Wrong by construction: exploits that need zero human labels

The trick that makes the whole study cheap: start from a verified-correct answer, apply a typed transform that breaks the truth in a machine-checkable way, and let a deterministic oracle (numeric equality, an answer key, a hidden test suite) confirm the result is wrong. If the judge still says PASS, that is a confirmed exploit — wrongness is double-locked, and no expert ever looks at anything.

Attacks run on four rungs, never pooled: L0 natural incidence, L1 a fixed metamorphic catalog, L2 budgeted adaptive search against the judge, L3 patch-aware re-attack. A naturalness constraint bans injection artifacts — every exploit must be an answer a deployed model could plausibly emit (an automated screen passed 100% of an 80-exploit stratified sample). That line is what separates a reward-hacking study from a rediscovery of prompt injection.

JUDGE ORACLE x = 7 ✓ oracle ✓ ∴ 42 (wrong) WRONG → EXPLOIT B (wrong) “rigorous” + lie WRONG → EXPLOIT tests pass ✓ oracle ✓ 3√5 (wrong)
judge PASS judge FAIL (deflected) oracle proves it WRONG → a witnessed exploit, at zero labeling cost

Reduced motion: the tunnel shows answers flowing at a judge gate; the oracle marks judge-passed wrong answers as exploits.

mutate a correct answer oracle confirms WRONG judge scores it judge PASS = confirmed exploit

Base transforms by answer shape: final_answer_corruption (math), choice_corruption (MCQ), subtle_bug (code), plus keyword_inflation and authoritative_wrong dressings. Every witness is checked by the oracle or a rule — no LLM, no expert. The same archetype extends to agentic scorers that grade a final environment state instead of an answer.

03 · The causal instrument (C1)

A branchable, witnessed universe turns “which slice is exploited?” into a proof

Public benchmarks can tell you a model is being gamed. Only a branchable, witnessed universe can tell you which counterfactual causes it — because only there can you change one fact and prove you changed nothing else.

A fork on the Gradia engine snapshots a parent world, applies an intervention that changes exactly one declared variable, and returns content-addressed before/after world roots plus a hash-chained occurrence: changed_fields and single_variable_verified = true. A judge verdict that flips under such a fork is a causally localized defect — the scorer rewarded that one variable, not the work. No static benchmark, and no correlational analysis, can certify that nothing else changed.

Parent world · item math-00002 root c2eac8be… answer: provably wrong judge: FAIL oracle: WRONG + “To be thorough and rigorous,” Child world · one variable forked root 09e30cdd… answer: still provably wrong judge: PASS oracle: WRONG single_variable_verified = true

A real witnessed flip from the MATH pilot: the identical oracle-wrong answer fails as parent and passes once one phrase is added — the fork certifies exactly one field changed (changed_fields=(phrase), distinct world roots). Causal attribution of a grader defect to a single manipulable variable, at zero human labeling cost. When the production engine is absent, an in-repo witness engine supplies the same guarantees, so any third party can reproduce the instrument.

04 · The engine of the paper

Attack → localize → patch → re-attack

The Wind Tunnel is a closed loop over a deployed scorer, running on a tamper-evident evidence spine. The unit of measurement is the exploit; the object of measurement is what happens when you try to fix the scorer and attack it again.

Attack L0–L2 Localize 1-var fork Patch Δ⁺, Δ⁻, γ Re-attack rung L3 convergence is measured, not assumed
1

Attack the deployed scorer

An adversary (frontier models: Opus 5, Gemini 3.1 Pro, Grok 4.6, GPT-5.6-sol) fires truth-breaking transforms under a budget and the naturalness screen; the oracle confirms every wrongness for free.

2

Localize the causal slice

Each exploit re-runs inside a witnessed fork that changes exactly one variable — or the instrument honestly reports the defect as diffuse when no single variable survives held-out validation.

3

Patch under an autoimmunity budget

Three modalities: edit the rubric, retrain against the whole family, or swap in a structurally stronger judge. A patch that starts rejecting too many correct answers is refused.

4

Re-attack untouched evidence

The patched scorer re-enters the adversary at L3. Held-out exploit density over K cycles classifies the system: monotone↓, plateau, or oscillating.

Every episode — attack, judge call, oracle check, fork, patch — drops into an evidence spine (frames.ndjson → manifest → verify_bundle → public timestamp anchor). The write-up asserts nothing; it derives everything, and any third party recomputes every number offline.

05 · Convergence (C2) — the central finding

Repair relocates. It does not converge.

Run the loop for K=5 cycles on a controlled 288-item factorial. Each rubric patch fully closes the exploit it targets (Δ⁺ = 666.7/1k). And yet held-out exploit density — measured each cycle on a still-unpatched signal — does not move: 666.7 → 666.7 → 666.7 → 666.7 → 0, flat until the entire favored-phrase family is manually exhausted.

Patch generalization γlocal = 0.00: a local patch generalizes nothing to the held-out family. That is the operational definition of whack-a-mole, and the preregistered classifier calls it a relocation_plateau. The adversary simply moves to the next unpatched phrase; global exploitability is unchanged cycle after cycle.

held-out exploit density
666.7 /1k
patch cycle
0
patchedphrase‑1
patchedphrase‑2
patchedphrase‑3
patchedphrase‑4
patchedphrase‑5

Each patch lands with full local closure — and the exploit (red) relocates to the next un-patched signal in the family. The density counter stays at 666.7/1k until every slice is closed by hand. γlocal = 0.

Procedural substrate (keyword scorer, K=5)

held-out exploits /1k per patch cycle

Real frontier judge (claude-opus-5, n=100/cycle)

held-out exploits /1k across 4 rubric patches + self-commitment (◆)

Left: flat at 666.7 for four cycles, then the family is exhausted — relocation_plateau. Right: the replication that matters. On a deployed frontier judge, held-out density is statistically flat across four rubric patches (MATH first-vs-last z = −0.40; HLE z = −0.45), and even the structural self-commitment defense — the one arm that cures gaming in the procedural model (γ = 1) — shows no_significant_change: MATH 140 → 190/1k (z = −0.95), HLE 100 → 130/1k (z = −0.67). The procedural cure is the best case; it does not survive deployment.

Why does patching relocate? Because the defect is diffuse. Powered localization (n=200 per benchmark, prospective holdout validation, preregistration SHA a9b4ba69…) returned validated=false on both MATH and HLE — no single construction variable survives holdout. Many surface cues succeed at comparable rates, so closing one signal invites the next. A positive control proves the localizer can confirm: against a scorer built with exactly one exploitable cue, it recovers that cue with flip rate 1.0 and lift +1.0, validated=true. The instrument confirms and refutes — the property a causal instrument must have.

Gameability is a property of the paradigm, not one checkpoint

full attack catalog re-fired against four structurally different scorers (exploits /1k)

~590permissive union
~515verification-rewarding
~100deliberation-rewarding
0independent verifier

Every reference-free judge leaks to some attack, and exploits are signal-specific (an exploit that fools the deliberation judge fools the verification judge only 23–30% of the time; the reverse, ~5%). Only the scorer that independently verifies the answer passes zero wrong-by-construction attacks. This is why patching one signal invites relocation: only changing what is checked escapes the game.

06 · Autoimmunity (C4)

Every patch has a price: the correct answers it starts rejecting

An immune system that attacks its own body is worse than the disease. The Wind Tunnel prices every repair with an autoimmunity cost Δ⁻ — the fraction of verified-correct answers the patched scorer newly rejects — and refuses any patch that exceeds a preregistered budget.

One patch, three modalities, same starting scorer:

rubric_edit

neutralize the exact exploited signal
closure Δ⁺666.7/1k
autoimmunity Δ⁻0.000
global density after666.7/1k
γ = 0.00
relocates the flaw

curriculum_retrain

neutralize the whole observed family
closure Δ⁺666.7/1k
autoimmunity Δ⁻0.000
global density after0.0/1k
γ = 1.00
removes the family

judge_arch (self-commitment)

judge solves it first, accepts only a match
closure Δ⁺666.7/1k
autoimmunity Δ⁻−1.000
global density after0.0/1k
γ = 1.00
changes what is checked

The negative Δ⁻ is itself a finding: the broken keyword scorer rejected every verified-correct answer (baseline false-rejection 1.0 — it rewarded phrasing, not correctness), so the structural fix lowers false rejection while closing exploits. The classical autoimmunity trade-off (Δ⁻ > 0) appears when the verifier itself solves imperfectly — the regime the real-judge runs measure. And the caveat from §05 stands: on deployed frontier judges, even self-commitment showed no significant reduction. On this procedural substrate it is the best case, not the cure.

07 · The judge-gaming transform family

Seven ways to dress a wrong answer so a judge says yes

A second transform family targets the LLM judge’s documented biases rather than the answer extractor. Each keeps the oracle-wrong core — so a judge PASS is a confirmed defect, not a disagreement — and wraps it in natural rhetoric a deployed model could plausibly emit. Flip a card.

247 / 357exploits from this family (69%)
72%of MATH’s exploits
66%of HLE’s exploits

The family is load-bearing exactly where the judge cannot cheaply re-derive the truth — on open-ended scorers (MATH, HLE) it carries the majority of all exploits. Every vector is oracle-confirmed wrong on every machine-checkable benchmark before it ever reaches the judge.

08 · An honest zero

The instrument catches its own bugs — and un-breaks HumanEval

The first run reported HumanEval as the most gameable scorer of all: 72.6/1k. A convenient headline — and wrong. The tell was the localizer refusing to attribute anything: zero witnessed single-variable flips on the benchmark with the highest exploit density. Instead of explaining the contradiction away, the authors traced it.

The subtle_bug mutation never matched real solutions and silently fell back to appending a comment (leaving the code correct); meanwhile keyword_inflation prepended prose above Python source, so the file simply stopped parsing. The measured quantity was “prose pasted above code breaks execution and the judge doesn’t notice” — not “the judge accepts subtly buggy code.”

first run · syntax artifact
72.6 /1k †

The “exploits” were parse failures, not scorer defects. The oracle called subtle_bug wrong on 0/40 items — the mutation wasn’t mutating.

# intended mutation (never matched): return a + b return a * b # what actually happened: Certainly! Here is the solution… def add(a, b): # ← no longer parses
CORRECTED RE-RUN fixed attack family · verified oracle-wrong
0.0 /1k

0 exploits in 1,640 L1 attempts and 0 in 163 L2 episodes. With semantic mutations that still ast.parse and judge-bait injected as code comments, the code-judge path is not gameable by these transforms.

Where the oracle is execution, the attack surface is zero — a positive result for unit-test-backed scorers.

GSM8K tells the same story from the other side: 0 exploits in 2,000 L1 attempts and 0 of 200 items cracked at L2 (~2,800 judge queries exhausted the full budget). A scorer that can independently re-derive its answer resists at every budget. The paper reports two more caught defects — a fail-open grader that manufactured six impossible “exploits” (flagged by its own controls before any number was read) and a bundle verifier that could have accepted a forged aggregate (now derives every field from the raw frames). A scoring pipeline you cannot audit will eventually report a number that is confidently wrong — including ours.

09 · The living Scorer Gameability Index

One recomputable number per benchmark scorer

The instrument distills into standing infrastructure: a per-benchmark gameability index — oracle-witnessed exploit density under the canonical adversary, with a bootstrap CI, pinned to the dataset snapshot, judge identity, catalog version, and git SHA. Each index card is content-addressed; anyone recomputes the number offline without trusting the authors.

The ordering is mechanistic, not difficulty-driven: gameability tracks the judge’s ability to independently verify, not the benchmark’s difficulty for models. GSM8K and HLE sit at opposite ends of both scales.

Oracle-witnessed exploit density, real claude-opus-5 judge

L1 metamorphic (light) · L2 adaptive search (solid) · 95% item-clustered bootstrap CIs

Adaptive budget roughly doubles density on every leaking scorer and cracks the near-resistant key-match scorer (GPQA-Diamond 6.6 → 15.2) — but opens no gap where none exists. HumanEval and GSM8K sit on the independent-verification frontier at exactly zero. SWE-bench Verified is a structurally different archetype — a weak test grader attacked by test-gaming patches, measured live in Docker — so it ships as its own card and is never pooled with the LLM-judge rows.

The agentic archetype: reward-hacking the environment checker

5 typed reward-hacks × 5 weak-checker archetypes — a clean diagonal (exploits /1k)

When the scorer grades a final environment state (Terminal-Bench, OSWorld, SWE-bench), the checker is a proxy — and a proxy is exactly what a reward-hacking policy games. Each of five typed hacks games exactly its target checker and no other (100 oracle-witnessed exploits over 700 attempts; both controls at 0), every one witnessed-localized to the single observable variable it manipulates. Each weak checker has one dominant reward-hack — a benchmark’s blind spot is specific, not uniform.

The archetype in the wild: SWE-bench Verified, live in Docker (N=100)

test-gaming patches vs. three weak graders and the real hidden-suite oracle (exploits /1k)

150test_skip_injection vs present-tests grader
143.3exit_zero_wrapper vs exit-code grader
3.3assertion_defang
0public_subset_gaming in the wild
0strong oracle: restored hidden suite catches every attack
0 / 0controls: gold_fix & no_op both clean

One container run per (instance, patch), read through three proxy lenses: 1,800 attempts, 89 oracle-witnessed exploits, 49.4/1k overall [CI 36.7–62.8]. Every weak proxy that reads the tree “as the patch left it” leaks; the official harness, which restores the dataset’s original tests, leaks nothing. For benchmarks with no oracle at all, a second regime (metamorphic invariance, bias probes, judge-disagreement geometry) carries the audit with honestly weaker verdicts.

10 · What this means

An immune system, not an exploit kit

Three instruments, three views, one structure: reference-free scoring is gameable diffusely. Local edits relocate the flaw rather than remove it; even the structural defense that cures the procedural model does not transfer to a real frontier judge. No repair the paper tested removes the exploit surface at deployment. That is the safety-relevant thesis — the alignment problem in miniature: patching a proxy moves the flaw unless you change what the proxy measures.

Scoping, in the paper’s own words: this studies whether a benchmark’s scoring pipeline can be gamed and whether repairing it converges — not whether any model is broadly weak or any benchmark worthless. Densities are per frozen cell and per judge. GSM8K and HumanEval resisting completely is reported with the same care as HLE leaking.

Disclosure runs as an immune response, not an attack: each broken benchmark’s maintainers receive a content-addressed index card, oracle-witnessed examples, the convergence result for their scorer, and a suggested structural defense — under embargo, before public release. The gameability index ships as a zero-install audit command, a published living index, a CI badge, and an open card schema, so third parties produce and verify cards independently of the authors. And because the preregistration and evidence chain heads are anchored in public timestamp logs, backdating or equivocation by the authors themselves is detectable by anyone.

Pillar 1

Interruptible Universes

Proves what happened — a benchmark can verify outcomes in a changing, branchable world.

Pillar 2

Gradia Guard

Proves the record was not tampered with — tamper-evident, coverage-honest runtime evidence.

Pillar 3 · this paper

The Wind Tunnel

Attacks the last trusted component — the scorekeeper — and measures whether repairing it can ever converge.

  • C1Witnessed universes as a causal instrument — “which slice is exploited?” becomes an identified interaction effect, with before/after roots and evolution witnesses.
  • C2The first convergence measurement of evaluator repair — γlocal = 0: local patching relocates exploitability; whack-a-mole replicates on a real frontier judge.
  • C3Oracle-witnessed, wrong-by-construction attacks — every exploit machine-confirmed, zero human labels.
  • C4The autoimmunity metric — pricing how many correct answers each patch starts wrongly rejecting.
  • C5A contamination-proof protocol — hidden regression suite hash-committed before any result exists; every number recomputable from a tamper-evident, publicly anchored evidence bundle.