Drop7 Research
← Concepts

Why one great game proves nothing

Drop7 scores are heavy-tailed, so a single million-point game can sit happily inside a policy whose average is three hundred thousand — and telling two policies apart takes paired games and a confidence bound, not a highlight reel.

The goal of this project is a policy whose mean score over many games is above one million points. That word does a lot of work. Somewhere in this repository is a record of a single depth-4 game that scored 1,246,684 points, and the research status page files it under "Anecdote; not an average or qualification". This page is about why that filing is correct, and what it takes instead.

Sixty-four games, one dot each

Here is every game of a retained cohort: the repository's reference policy, fair depth-4 expectimax, over 64 complete games.

64 games of fair-d4, one dot eachruns/RUN-A51D-d4/d4-standard64.json · development cohort, 0 games censored at the 2,000-move capdocs/exploratory/finding-01-score-is-survival.md0250k500k750k1000k0xa51d001f: 104,731 points in 35 moves0xa51d000d: 120,373 points in 40 moves0xa51d0001: 121,091 points in 40 moves0xa51d0015: 121,356 points in 40 moves0xa51d0005: 121,368 points in 40 moves0xa51d0028: 121,921 points in 40 moves0xa51d002c: 123,333 points in 40 moves0xa51d0036: 124,118 points in 40 moves0xa51d0033: 137,924 points in 45 moves0xa51d003c: 139,736 points in 45 moves0xa51d0026: 141,116 points in 45 moves0xa51d0000: 156,143 points in 50 moves0xa51d0008: 156,884 points in 50 moves0xa51d002e: 173,820 points in 55 moves0xa51d000b: 178,001 points in 55 moves0xa51d0037: 178,281 points in 55 moves0xa51d000e: 192,174 points in 58 moves0xa51d0009: 193,423 points in 60 moves0xa51d000c: 193,826 points in 60 moves0xa51d002b: 198,833 points in 60 moves0xa51d0012: 209,704 points in 65 moves0xa51d003a: 210,643 points in 65 moves0xa51d0030: 230,963 points in 70 moves0xa51d0020: 235,133 points in 70 moves0xa51d0021: 237,013 points in 70 moves0xa51d0038: 246,599 points in 75 moves0xa51d0016: 246,987 points in 75 moves0xa51d0002: 248,710 points in 75 moves0xa51d0034: 261,981 points in 80 moves0xa51d002d: 264,422 points in 79 moves0xa51d0024: 264,486 points in 80 moves0xa51d000f: 265,110 points in 78 moves0xa51d0022: 267,454 points in 80 moves0xa51d0017: 279,248 points in 80 moves0xa51d001d: 288,506 points in 85 moves0xa51d0010: 319,139 points in 95 moves0xa51d0035: 324,991 points in 95 moves0xa51d0013: 325,825 points in 94 moves0xa51d001b: 336,552 points in 100 moves0xa51d003e: 340,481 points in 100 moves0xa51d0023: 346,763 points in 100 moves0xa51d003d: 350,443 points in 100 moves0xa51d003b: 360,374 points in 105 moves0xa51d0039: 370,812 points in 110 moves0xa51d0019: 381,545 points in 110 moves0xa51d0006: 383,860 points in 110 moves0xa51d0025: 398,958 points in 115 moves0xa51d0007: 401,216 points in 115 moves0xa51d001c: 403,984 points in 113 moves0xa51d0004: 414,600 points in 120 moves0xa51d0018: 442,203 points in 121 moves0xa51d001e: 445,556 points in 130 moves0xa51d001a: 467,788 points in 130 moves0xa51d0032: 468,479 points in 135 moves0xa51d000a: 469,046 points in 130 moves0xa51d003f: 487,165 points in 140 moves0xa51d0029: 495,813 points in 137 moves0xa51d002a: 545,241 points in 155 moves0xa51d002f: 617,048 points in 175 moves0xa51d0011: 665,787 points in 185 moves0xa51d0014: 687,477 points in 195 moves0xa51d0031: 706,223 points in 200 moves0xa51d0003: 877,456 points in 245 moves0xa51d0027: 1,017,234 points in 280 movesmedian 266,282mean 321,991.72the one-million targetHalf the games finished below 266,282. The single best game reached 1,017,234 — and the average is 321,991.72.Lowest game 104,731 · lower quartile 188,700.75 · standard deviation 187,501.83
table view — the recorded cohort summary
quantityscoremoves
mean321,991.71994.0625
median266,28280
lower quartile188,700.7557.25
minimum104,73135
maximum1,017,234280
standard deviation187,501.832
Each dot is one complete game. The data are the per-game rows recorded in runs/RUN-A51D-d4/d4-standard64.json and reported in docs/exploratory/finding-01-score-is-survival.md — an exploratory, development-tier cohort on seed lease SEEDLEASE-A51D, reproduced in this checkout on 2026-08-20, with no censored games. Hover a dot for its seed.

The shape is the point. Most games cluster low. A long thin tail runs off to the right. And there, at the far end, sits a game worth 1,017,234 points — a genuine million-point game, played by a policy whose average over the same 64 games was 321,991.72 and whose median was 266,282.

That single game is not a fluke to be explained away, and it is not evidence of a million-point policy either. It is what a heavy tail looks like.

Mean, median, and why they disagree

The median is the middle game: half scored more, half scored less. The mean is the total divided by the number of games. When a distribution is symmetric they are close. When a few games are enormous, the mean is dragged towards them and the median is not.

In this cohort the mean is 321,991.72 and the median 266,282: the average game is not the typical game. The standard deviation — a rough measure of how spread out the games are — is about 187,502, which finding 01 notes is 58% of the mean itself. It draws the honest conclusion: with 64 games at that spread, the mean is known to roughly ±46,000 at one standard error.

Both numbers are useful and they answer different questions. The median answers what happens in a typical game. The mean answers what happens on average over a long session — and the mean is what the qualification standard is written against, because the target is a mean. That choice makes the standard harder to meet reliably, not easier: a mean over a heavy-tailed variable is a jumpy quantity.

What a small cohort can and cannot say

Every recorded figure for the reference policy, on one axis, with the target:

Every recorded figure, on the same axis as the target1,000,000 — the qualification meanfair D4, mean of 8 gamesledger-recorded; small confirmation cohort(status.md)400,675.25fair D4, mean of 64 gamesledger-recorded; broader reference cohort(status.md)308,295.578fair D4, mean of 64 fresh-seed gamesdevelopment tier; finding 01, reproduced2026-08-20321,991.72median of those 64 fresh-seed gamesrecorded in the same run266,282best single game in that cohortone game, 280 moves, seed 0xa51d00331,017,234one D4 gametask-record only — an anecdote, not an average1,246,684
Grey bars are single games and are not comparable with the means above them. The 8-game and 64-game ledger figures are different cohorts of the same policy; the gap between 400,675.25 and 308,295.578 is what a small sample does to a heavy-tailed mean, not a change in the policy.

Look at the first two rows. The same reference policy measured 400,675.25 over eight games and 308,295.578 over 64. Nothing about the policy changed. Eight games is simply not enough to pin down the mean of a distribution with a tail this long — which is exactly why the repository's benchmark contract calls a 1–8 game run a PILOT, whose entire permitted purpose is to "find bugs and project runtime/memory" with no strength claim (benchmark contract).

Now look at the last two rows. A single million-point game is above the target line. It says nothing whatsoever about the mean, because you can always find the best game in a sample, and the best game of a heavy-tailed sample is always impressive.

Comparing two policies: pair the games

If score is this noisy, how does anyone tell whether a change helped? The answer is not "run more games and compare averages" — or not only that. It is to make the two policies play the same games.

A cohort is a fixed, ordered list of seeds. Both the candidate and the reference play seed 1, then seed 2, and so on, and the comparison is done seed by seed: the candidate scored more on this game, less on that one. This is a paired comparison, and it removes the largest source of noise, which is that some games are simply luckier than others. The methodology document requires exactly that — "per-game paired results against the reference" — and asks for wins, ties and losses, not just a difference of means (methodology, benchmarks).

You have already seen a small paired comparison on this site: the two look-alike boards on what makes a board good? were replayed under the same sixteen scripted disc tapes, and the result was reported as six wins, nine ties and one loss rather than as two averages.

The same rule is why the repository refuses to promote an aggregate win when a preregistered subgroup fails: a policy that gains overall but regresses on a whole class of positions has not been shown to be better.

Bootstrap lower bounds, without the statistics

Suppose a candidate averages 1,050,000 over 256 games. Is its true long-run mean above one million, or did it get a lucky tail?

The bootstrap answers that by resampling. Take the 256 recorded game scores. Draw 256 of them at random, with replacement — some games appear twice, some not at all — and compute the mean of that imaginary cohort. Do it thousands of times. You now have a spread of plausible means, built entirely out of the games you actually played. The 5th percentile of that spread is a one-sided 95% lower bound: a value the true mean is unlikely to be below.

Two things make this the right tool here. It assumes nothing about the shape of the distribution, which matters when the shape is a long tail. And it resamples whole games, respecting the rule that a complete game is the independent unit of measurement — move-level or position-level statistics can diagnose a model, but they cannot supply a confidence interval for a policy.

The qualification ladder is built from these bounds:

StageGamesWhat it must show
Development gate256observed mean above 1,050,000 and a one-sided 95% whole-game bootstrap lower bound above 1,000,000
Protected validation256mean above 1,000,000, with both bootstrap and Student-t one-sided lower bounds above it, no illegal moves, no runner failures
Final confirmation256the unchanged, frozen candidate repeats those conditions on a one-shot cohort

From the archived validation protocol as summarised in docs/methodology.md. The frozen record states that no candidate has qualified and that neither the protected nor the final seeds have been opened.

Note the gap between the first two rows: the development gate demands 1,050,000, not 1,000,000. That margin exists because a mean measured on data you were allowed to look at is optimistic, and a heavy tail makes it more optimistic still.

How to read a number on this site

  • Ask how many games. Eight games is a pilot. Sixty-four is a development cohort, useful for deciding what to try next and explicitly "never fresh confirmation". Two hundred and fifty-six on unseen seeds is a gate.
  • Ask whether it is a mean or a game. A single score is an anecdote no matter how large.
  • Ask whether it was paired. An unpaired comparison of two policies on different seeds is mostly measuring luck.
  • Ask what the label says. This repository marks every figure task-record only, ledger-recorded, repository-verified or reproduced, and those words are not decoration. The 1,246,684-point game is task-record only: it survives as a note in a conversation record, with no run artifact behind it.
The technical record

The dot plot. Per-game rows from runs/RUN-A51D-d4/d4-standard64.json, snapshotted into web/content/learn/data/d4-cohort-scores.json by web/scripts/extract-d4-cohort.ts, which copies recorded fields and computes nothing. Policy fair-d4, 64 games, seeds 0xa51d00000xa51d003f, seed lease SEEDLEASE-A51D, 2,000-move cap, 0 censored games. Recorded summary: mean 321,991.71875, median 266,282, lower quartile 188,700.75, minimum 104,731, maximum 1,017,234, standard deviation 187,501.831766; mean moves 94.0625. Reported in docs/exploratory/finding-01-score-is-survival.md as an exploratory, development-tier result reproduced in this checkout on 2026-08-20. runs/ is not committed, so on a checkout without it the figure degrades to a message rather than inventing data.

The ledger figures — 400,675.25 over 8 games and 308,295.578 over 64 games, against depth-3's 235,071.25 over the same 8 — are the ledger-recorded entries in docs/research/status.md, labelled there as a small confirmation cohort and a broader reference cohort respectively. They are different cohorts from the finding-01 run above and must not be pooled.

The 1,246,684-point game appears in the status snapshot as task-record only, with the explicit note "Anecdote; not an average or qualification". No run artifact for it exists in this checkout.

Statistical rules. The independent unit is a complete game; report mean, median, lower quartile and minimum score, mean and lower-quartile lifetime, censor count and cap, clears and reveals per move, chain depth, per-game paired results, and whole-game confidence bounds for a qualification claim (methodology, benchmarks). A game stopped at the 2,000-move cap is censored, keeps the score already earned, and is a lower bound that must never be extrapolated. For qualification the exact bootstrap and Student-t rules of the frozen protocol apply; for earlier tiers the estimate, resampling method and seed, interval direction and number of whole-game samples must all be published.

What this taught us, and what is still open

  • Drop7 scores are heavy-tailed: in a retained 64-game cohort the standard deviation was 58% of the mean, and the best game scored 1,017,234 against a mean of 321,991.72.
  • A million-point game and a 300,000-point average are perfectly consistent, and this repository has both.
  • Small cohorts move a lot: the same policy measured 400,675.25 over 8 games and 308,295.578 over 64.
  • Pairing games and reporting wins, ties and losses removes far more noise than simply running more unpaired games.
  • The open question is not whether some game can reach a million — one already has — but whether any policy can put the average there. Nothing in this repository is close; the reference policy would need roughly three times its current mean lifetime, as score is survival works out.