Zain Ali

← All work

whetstone

When a system improves itself, can you tell a real gain from gaming its own verifier?

Open source · 3 arms, 12 seeds, every proposal logged

39.6%

of the self-edits accepted under a visible test only gamed that test. Under a held-out test, 0%. With no test at all, 6.9%.

The question

When a model is scored by a judge it can see, “it got better” and “it learned to please the judge” look the same. Telling them apart needs a domain where correctness is decided by execution.

What I built

A self-improvement loop for program synthesis. Every self-edit is a bounded change to one weight table, every proposal is logged with its visible and its held-out score, and one of three gates decides what is accepted: the visible examples, held-out examples, or nothing.

What I found

With one visible example, 41.2% of “solves” fit by coincidence. Under the visible gate, 39.6% of accepted edits raised the visible score without raising the held-out one; under the held-out gate, none did. The ledger catches the gaming.

What it does not show

Whether the loop improves at all is unresolved: the headroom is +0.029 against a per-arm standard deviation of 0.048, which needs 43 seeds for 80% power, and 12 were run.

0%
accepted edits that were gaming under the held-out gate
41.2%
solves that fit by coincidence with one visible example
43 (ran 12)
seeds needed to resolve the solve rate at 80% power

The result

hack rate by acceptance gate · accepted self-edits that only looked like improvement
hack rate by acceptance gate · accepted self-edits that only looked like improvement
visible gate0.396
no gate0.069
held-out gate0.000

How it works

  1. task generator (skewed) → search policy (weight tables) → bounded proposal → held-out gate → ledger (both deltas) → accept / reject
  2. bounded proposal → visible gate → ledger (both deltas)
  3. bounded proposal → no gate → ledger (both deltas)
  4. Policy.oracle

Every number, table and caveat: the full technical write-up