Hand-built heuristics and shallow search
Give points to the things about a board that a human would notice — low stacks, open columns, gray discs you can reach, numbers that are nearly ready to clear — add them up, and play the column with the best total.
Give points to the things about a board that a human would notice — low stacks, open columns, gray discs you can reach, numbers that are nearly ready to clear — add them up, and play the column with the best total.
That is the whole family. It is the oldest idea in the repository, the easiest to explain, and the one that everything else is built on top of: these weighted sums are the leaf evaluators at the bottom of every deeper search and the quick continuation policies inside every rollout. When a large learned system fails here, the post-mortem almost always ends with a sentence about features.
The intuition, on real boards
Every figure below is the repository's own rules engine playing a scripted game — the boards, the points, the clears and the reveals are engine output, not drawings. Each one shows a real position and what two of its seven legal columns actually do.
"Open the board"
Twenty-eight of the forty-nine cells are occupied and twenty-three of those are covered gray discs whose numbers nobody can see. Five drops remain before the next rise adds seven more.
The 5 lands beside another 5 and completes a row-run of exactly five. Two waves follow: three numbered discs clear, three gray discs give up their numbers (one of them is then cleared as well), and one more gray is cracked. 53 points, and the covered count falls from 23 to 20.
The same disc in the leftmost column. Nothing clears, nothing is revealed, no points, and the tallest stack grows from five rows to six — with the rise still coming. A feature-scoring policy is exactly a rule for preferring the first board to this one.
Two features do that work: how tall the stacks are, and how many gray discs
are still closed. Both are things a human notices in a second, and both are
literal terms in the hand evaluator in src/core/typescript/heuristic.ts.
"Prepare useful chains"
Sometimes only one column does anything at all. Here the engine reports that six of the seven legal columns score zero, and the seventh scores 770.
Five waves from one drop: five numbered discs cleared, two gray discs opened, 770 points, and columns 1, 3 and 4 each fall by one or two rows. The arrangement that made this possible was built several moves earlier — which is why 'chain readiness' is a feature and not just a lucky outcome.
Where the idea starts to strain
The three jobs — stay alive, open the board, prepare chains — pull against each other, and a weighted sum has to settle the argument with fixed numbers. Here is a position where they disagree. It is three drops from a rise.
Column 4: three waves, 155 points, three numbered discs cleared and two gray discs opened — one of them in the bottom row. Column 4 empties completely, but the tallest stack is still five rows high.
Column 3: one wave, 14 points, two numbered discs cleared, one gray opened — and the tallest stack comes down from five rows to four before the rise. The repository's one-ply hand evaluator picks this move over the 155-point one.
Which is right? Nobody in this repository knows. The evaluator traded 141 points and one extra reveal for one row of height, because that is what its fixed weights say height is worth. Deciding such trades correctly is the entire research problem, and it is the reason the family's later members stop being pure feature sums and start looking one, two, or several moves ahead.
How a policy in this family works, step by step
- Read the public position. The visible board, the visible next disc, and the rise clock. Nothing else — not the seed, not the hidden gray numbers, not the score. (One member of the family breaks this and is flagged where it appears: see gray throughput.)
- Simulate each legal column with the real rules engine. Every disc that clears, every gray disc that cracks or reveals, every wave of the chain.
- Measure the resulting board. The hand evaluator counts open columns, a squared height load, solid and cracked gray cells, numbered cells, discs that are one addition away from clearing, latent chain potential, gray discs exposed to a future clear, and clogging patterns such as adjacent 1s and triples of 2s.
- Add it up with fixed weights. Positive for open columns, ready structure and exposed covers; negative for height, buried gray discs and clogs; a flat large penalty for a modelled game over. What such a leaf evaluator can and cannot see is its own subject.
- Optionally look further. Members of this family extend step 4 in four different directions: average over the possible next discs (sparse expectimax); play the position forward with a quick policy (rollout); commit to a whole sequence of columns before seeing the discs (open loop); or weight the bad outcomes more heavily than the good ones (risk sensitive).
- Play the winning column. Ties are broken by a fixed order, so the same visible position always produces the same move.
Everything the searching members do at chance points — averaging honestly rather than hoping — is explained on the choice-and-chance concept page.
What happened, in plain English
These policies were fast, they were easy to reason about, and several of their features survive today inside the reference search's leaf. As complete policies they were brittle. Weight-fitting runs repeatedly improved the games they were fitted on and then gave the gain back on fresh games, and no hand-built policy tested here displaced the depth-4 reference search (research status, §2 and the compact evidence map in the strategy catalog).
The single most useful thing the family produced is not a policy at all. It is
the observation that immediate score is a poor guide: in this mode
score is very nearly survival time, and
what a long game needs is a steady rate of clearing numbered discs and opening
covered ones.
Two evaluators in src/core/typescript encode the arithmetic directly — five
drops arrive per cycle, a rise adds seven covered discs, so a board that never
fills needs about 2.4 numbered clears and 1.4 covered reveals per move.
The technical record
What is in this family, and how strong the evidence is. Statuses and evidence labels are copied from the experiment index ("Heuristic and rollout search") and, where marked, the experiment history.
| Approach | Status | Evidence |
|---|---|---|
| Sparse expectimax | completed | task-record only |
| Open loop | support-only | repository-verified |
| Phase horizon | rejected | task-record only |
| Tunneling | completed | task-record only |
| Virtual ignition | rejected | task-record only |
| Risk sensitive | rejected | task-record only |
| Policy comparison | support-only | repository-verified |
| Gray throughput | rejected | task-record only |
| Rollout | rejected (planner) / completed (teacher) | task-record only |
| Cycle abstraction | rejected | task-record only |
| Edge priority | unknown | repository-verified |
| Critical risk | unknown | repository-verified |
| Evolution | rejected | ledger-recorded |
| Evolved public policy | rejected | ledger-recorded |
| Exact search | rejected (quadrature, historical D4) / completed (ensemble) | ledger-recorded / task-record only |
A scoring caveat that applies to most of the older numbers. A 2026-08-15
audit found that several early experiments had used the 7,000-point level
award from the 30-drop Classic/Sequence rules instead of the 17,000-point
award of the five-drop Hardcore mode studied here. Runs that record
levelBonus: 7000 remain valid evidence that one policy beat another on the
same games, and valid evidence about cost, but their absolute scores are not
evidence for the Hardcore million-point target
(mode-specific scoring correction). Every page in
this family says which of its numbers are affected.
The ledger-recorded results in this family, in one place:
- Engineered-feature evolution — three families of evolved one-step action scorers, all rejected. The small nonlinear network fitted 96.86% of 255 training actions but only 43.40% of 235 disjoint teacher actions, then lost its four-game screen 148,349.25 to 307,222.75 points. The phase-weight vector lost its eight-game screen 105,534.875 to 107,709.75. Both are historical 7,000-point Sequence-scored runs.
- Evolved public policy — corrected 17,000-point scoring, and the only member of this family measured under it. It improved its 128-game fitting tournament from 136,169.15 to 157,528.50 points, did not improve lower-quartile survival at all, and its best selective-search wrapper reached 272,605.13 points on eight reused fitting games. Rejected before the probe cohort was opened.
- Exact search — a three-member root-quadrature ensemble passed a four-game screen and then lost its eight-game confirmation 117,066.5 to 162,492.125 while using about three times the work per move; a fully completed extra ply with the older leaf lost its screen 124,172.25 to 149,621.25 at about 24 times the cost. Both historical 7,000-point Sequence-scored runs.
What this taught us, and what is still open
- Interpretable features earned their place as ingredients, not as policies. Height danger, reveal flow, build readiness and the timing of a rise all matter, and all of them survive inside the reference search's leaf. The strategy catalog's recommendation is to keep them as diagnostics and leaf inputs, and not to treat a higher fitting score from another weight sweep as a result without a fresh, paired gate.
- Fitting a weight vector on games is the failure mode, not the method. Every evolution run in this family found plausible directions and then lost them on games it had not been fitted to. That is the same sibling-ranking problem that later defeated much larger learned models, arriving early and cheaply.
- A whole line of this family is unfinished, not refuted. Two labs — edge priority and critical risk — are complete, gated programs with no located outcome at all. The honest label is unknown, and running them is cheap.
- Human strategy advice has never been tested properly here. The strategy catalog's sixth open direction is to turn plausible human rules — high covered discs first, watch the weakly connected edge columns, build simple three- and four-wave chains — into reflection-safe public features and test them on preserved sibling panels before letting any of them control a move. The edge-priority lab is that experiment, waiting to be run.
Approaches in this family
Be cautious only when the board is actually in trouble — play the ordinary way on a healthy board, and switch to worst-case thinking when height, crowding, or a backlog of covered discs says the game is close to ending.
Stop choosing a column and start choosing a plan — pick one of five intentions for the whole five-drop cycle, and let a model predict which intention this board should adopt.
Test the two things an experienced human player actually says about this game — attack the high covered discs, and distrust the edge columns — as measurable changes to one term in the evaluator.
Stop arguing about how much each board feature is worth and let a search find the numbers — play thousands of games with slightly different weights, keep the ones that scored best, repeat.
Give the weight search a bigger, phase-aware evaluator and let it optimise complete games directly — no imitation, no proxy label, just play and keep what survives.
Three attempts to fix a search by giving it more — more independent chance estimates, more depth, more voters — and the discovery that none of them repairs a biased judgement of the board.
Stop trying to score and start trying to keep up — clear numbered discs and open covered ones fast enough that the board never fills.
Decide a whole short sequence of columns in advance, judge it against many imagined disc streams at once, and play only its first move before planning again.
Judge a board by how it will look when the next row rises, not by how it looks now — a board one drop from a rise is in far more trouble than the same board five drops away.
The shared harness that makes two hand-built policies play the same games, so that a difference between them is about the policies and not about which one got luckier discs.
Judge a column by how bad its worst futures are, not only by how good its average future is — because one collapse ends the game and there is no next game to average it against.
Instead of judging a column by how the board looks afterwards, play the game on from there — twenty-five more moves, several imagined disc streams — and judge it by how that went.
Look several moves ahead, but instead of considering every disc the game might deal, take a small fixed handful of representative ones — and always finish the depth you promised.
Dig a channel down beside the tall side of the board so that the dangerous gray discs high up can actually be reached and opened.
Before choosing a column, imagine dropping a few imaginary discs onto the board to see which arrangements would go off like a firework — and prefer the boards that would.