Rollout veto
runtime-pausedevidence: ledger-recordedpublic informationKeep the depth-4 search's move unless replaying every column forward for twenty-five moves says, across all seven imagined futures, that another one is better.
Play the depth-4 search's move — unless replaying every legal column forward for twenty-five moves says, consistently across all seven imagined futures, that a different column is better.
This is the family's most direct idea and its most eventful record: one extraordinary game, a runtime rejection, three attempts to make it affordable, and finally a properly powered retest that rejected the mechanism.
The intuition
The reference search is tactically strong and structurally short-sighted. It cannot see the second row rise, so it cannot see that a column it likes will be unplayable two cycles from now. A twenty-five-move replay can. But a long replay is also noisy: play the same position forward under different luck and you get very different outcomes, so a long look used carelessly will happily override a good move on the strength of one lucky imagined future.
The veto design answers both at once: the long look never chooses, it can only object, and it may only object when the objection holds up statistically.
How it works, step by step
- Run unmodified fair depth-4 search. Keep its column as the default. If anything below fails, this is what gets played.
- Route or skip. The expensive part runs only when the board is dangerous — defined as a maximum column height of at least four. On safe boards the policy is plain depth 4, bit for bit.
- At a routed position, give every legal column the same seven imagined futures. Each future is generated from a hash of the public board, so the comparison between columns is paired and no column gets luckier tapes than another.
- In each future, force the candidate column, then play twenty-five more moves with a fresh, complete depth-2 search at every step. That continuation is typed so that it structurally cannot receive the tape, the scenario identity, the score, the level or the move number: it sees a board, a disc, a rise phase and whether the game is over.
- Score each line by the points it actually earns, minus a large penalty if it dies, plus one leaf evaluation if it is still alive at move 25.
- Four conditions, all required, before an alternative may displace depth 4: it must survive in at least as many of the seven futures; it must not clear fewer numbered discs on average; its paired advantage must be positive at a fixed one-sided confidence bound; and it must not be too far below depth 4's own valuation of the position. Among alternatives that pass, the one with the largest confidence bound wins. Otherwise depth 4 plays.
What happened, in plain English
One astonishing game. The single registered pilot lasted 250 moves and scored 404,047 where plain depth 4 lasted 105 moves and scored 159,616. It made only twelve overrides in the whole game. Its projected cost was also more than five times its own preregistered runtime ceiling, so the run was paused before the second game rather than being allowed to become a strength claim on a sample of one. The record was explicit at the time: "only one pair, not statistical evidence".
Making it cheaper did not make it fast. Two follow-ups applied only changes that provably cannot alter a single decision — skip alternatives that depth 4 already values too poorly, evaluate the baseline once, reuse identical continuations, drop a cache. Every value, action and selected move stayed bit-identical to the original, and the wall-clock savings were immaterial.
A wider look at quality did not rescue it either. Adding three more games left the mean higher, but mostly because the original long game was still in it; only one of the three new games was a joint win on both score and lifetime, and the frozen quality gate failed.
And the cheaper teachers could not imitate it. Six approximations — shallower continuations, fewer futures, shorter horizons, mixed schemes — were replayed against the original's own decisions. The best of them reproduced 2 of the 12 beneficial overrides against a preregistered requirement of 8. The high overall agreement in that table is an illusion created by the 167 positions where the teacher did nothing; agreement on doing nothing is easy.
Then it was retested properly, and it does not reproduce. The whole mechanism was ported to corrected 17,000-point scoring, verified byte-identical against the frozen source, and run on 32 paired games. Fair depth 4 averaged 339,290 points and 98.66 moves; the veto averaged 292,780 and 86.34. It lost 19 of 32 games and won 9. Most tellingly, the two flow rates that would have had to rise for the idea to work both fell: the accepted overrides produced a policy that clears and reveals less per move than the search it was supposed to improve.
The technical record
Original pilot (runtime-paused — ledger-recorded). Seed 0x3ded0000, one
game: stock depth 4 159,616 points / 105 moves, 1.97143 clears and 1.09524
reveals per move; the veto 404,047 / 250, with 2.276 clears and 1.316 reveals per
move. 12 switches out of 179 routed decisions (4.8% of 250 moves); 15
alternatives passed every gate. Runtime: 852.255 seconds for the pair against a
2,700-second ceiling, projected to 15,340.599 seconds for the full protocol; the
runner paused before 0x3ded0001.
Exact compression (runtime-paused — ledger-recorded). Replay asserted the original 404,047 points, 250 moves, 179 routes and 12 switches before writing. The depth-4 value prefilter skipped 120 of 1,242 action roots (9.66%); exact continuation reuse removed a further 26,303 transitions; depth-2 calls fell from 192,983 to 152,884. Whole-game wall time moved 641.689 to 639.321 seconds — the rollout phase from 333.585 to 295.902 — which is not the order of magnitude the gate required.
Quality extension (rejected — ledger-recorded). Four games: candidate mean
174,659.5 points / 113.75 moves against 107,007.75 / 72.5. Clears per move rose
1.84483 to 2.05055, reveals 0.98966 to 1.12967, and all four leave-one-out
subsets were positive — but only one of the three new pairs was a joint
score-and-move win, and lower-half score retention was 88.38% against a 90%
requirement. Individual games: 0x3ded0001 109,264/70 became 153,925/100;
0x3ded0002 was identical at 59,004/45 with zero switches; 0x3ded0003
100,147/70 became 81,662/60.
Teacher compression (rejected — ledger-recorded). Replay-only over the 179 exported routed states. Best configuration (depth 2 at rise phases 1 or 5, otherwise depth 1) reproduced 166 of 179 exact actions and 2 of 12 switches, against an eligibility floor of 8 of 12; the five other configurations recovered none.
Corrected-scoring retest, finding-03
(run validity valid, scientific outcome fail, evidence tier development,
reproduced in this checkout; separate namespace and seed lease, frozen source
untouched):
| Arm | mean score | mean moves | clears/move | reveals/move |
|---|---|---|---|---|
| fair depth 4 | 339,290 | 98.66 | 2.0200 | 1.1308 |
| rollout veto | 292,780 | 86.34 | 1.9515 | 1.0749 |
Paired mean delta −46,510.5 points and −12.31 moves; one-sided 95% bootstrap lower bound −91,924.6; wins–ties–losses 9–4–19; sign test p = 0.0436 on the 28 non-tied games; 0 censored games, 0 illegal moves. Of 12,314 alternatives scored, 103 passed all four conditions and 68 overrides were taken — an average of −21,887 points per override taken. Three games drew zero overrides and were exactly identical to the comparator, which doubles as a fallback check. The value-band correction that an earlier audit had asked for (7,000 to 17,000) was run as a full second arm and changed the number of overrides taken by one, from 67 to 68; 29 of 32 games were identical between the two bands.
Records: experiment index "D4 and long-outcome
research"; ledger sections "Fair-D4 25-move exact-D2
rollout veto", "Exact 25-move rollout-veto compression", "D2 rollout
teacher-compression replay" and "Original D4 + D2/s7/h25 quality extension".
Sources: d4-d2-rollout-veto.cpp, d4-d2-rollout-veto-exact-compressed.cpp,
d4-d2-rollout-veto-cache-free.cpp, d4-d2-rollout-veto-quality-extension.cpp,
d2-rollout-teacher-compression.cpp.
What this taught us, and what is still open
- The estimator was measuring the wrong game. A column selected because it looks good under 25 moves of depth-2 play is executed in a game that will be played by depth 4. That mismatch — not merely noise — is the most concrete finding here, and it is why the accepted overrides made realized flow worse even though "must not clear fewer discs" was one of the four conditions.
- A one-game pilot cannot be informative in either direction for a policy whose per-override effect has a standard deviation of roughly 160,000 points.
- What is ruled out, exactly: horizon 25, seven futures, danger height 4, a depth-2 continuation, all legal columns as challengers, at both value bands, on 32 fresh paired games. What is not: the family. The retest names the cheapest next test — not a longer horizon and not a wider band, but more imagined futures, since the return test appears under-sampled by roughly two to seven times at seven.
- The good engineering here survives the negative result: paired imagined futures shared across columns, a continuation whose type cannot carry privileged data, an exact fallback, and a compression pass proven decision-identical.
Source files
README.mdxd2-rollout-teacher-compression.cppd4-d2-rollout-veto-cache-free.cppd4-d2-rollout-veto-exact-compressed.cppd4-d2-rollout-veto-quality-extension.cppd4-d2-rollout-veto.cpp