A chess program that was told the rules and nothing else
What ChessLab is, how it learns, where it stands on 24 September 2026, and what it has worked out on its own. Every number here comes from the project's own log or from the data behind the dashboard.
The rule it is built on
ChessLab is a small chess program that teaches itself to play. It started from random numbers, and it was given the rules of chess and nothing else: no human games, no opening book, no table of piece values, no chess engine's opinion of a position. Anything it knows about chess beyond the rules, it found by playing itself. The project's guide states the boundary in one line:
The rules are engineered. The intelligence is learned.
Outside engines are allowed as opponents, never as teachers. Stockfish plays moves against ChessLab and nothing of what Stockfish thinks about a position is ever used to train it. One exception is worth stating: in the first cycles of this run, the search's evaluations were blended with a hand-written material count as a launch ramp. That weight decayed by a fifth every cycle, was effectively zero by cycle 27, and was never a training target.
How it learns
A neural network of about a third of a million parameters looks at a position and makes two guesses: which moves look promising, and who is winning. A search uses those guesses to look ahead, 200 simulations a move, and comes back with an answer that is a little better than the guess alone. That better answer becomes the training target: the network is trained to guess next time what the search found this time.
One cycle is 2,048 games of self-play, then training, then a test. The trained candidate plays the current champion, and it becomes the champion only if it wins convincingly: a sequential test of up to 400 games that must find the candidate closer to 58% of the points than to an even split. A candidate that cannot show that is not promoted; it keeps training and tries again. That loop is the whole project. The run started on 19 September 2026 on one Apple-silicon Mac, and a cycle takes about three quarters of an hour.
Everything is measured against something the learner cannot author: fixed opponents that never learn, frozen positions where a mate is forced, and its own earlier generations, archived so they can be replayed.
Where it stands
Honestly: a beginner. The benchmarks below are 200-game matches at 64 simulations a move, played by the champion of generation 37 on 23 September 2026. Maia is a network trained to imitate human players of a given rating, so the 1100 row is the nearest thing to a human scale this project has. Its authors note the nets play somewhat above their label.
| Opponent | Result | Score |
|---|---|---|
| Stockfish at its weakest setting (skill 0, one node) | 78 wins, 30 draws, 92 losses | 0.465 |
| Maia 1100 | 66 wins, 47 draws, 87 losses | 0.4475 |
| Maia 1500 | 15 wins, 52 draws, 133 losses | 0.205 |
| Maia 1900 | 16 wins, 47 draws, 137 losses | 0.1975 |
A score is the share of the points, a draw counting half. Against the same weakest Stockfish, generation 15 scored 0.1875 over 200 games (17 wins, 41 draws, 142 losses); generation 37 scores a coin flip. Maia 1500 and Maia 1900 are indistinguishable from where we stand: 0.205 and 0.1975, against a standard error of about 0.03. Whatever beats us there, more of it changes nothing yet.
The project is nowhere near a strong engine. Stockfish given 5,000 nodes a move has won every one of the 40 games it has played against ChessLab. And a caveat on the Maia rows: Maia at one node is a policy with no search at all, and we answer it with 64 simulations of search and land beside it.
Two numbers for the same opponent
The dashboard shows two kinds of reading against the outside engines, and they must not be confused. The ladder is played every training cycle at the self-play budget, 200 simulations a move, in short matches of a few dozen games. A benchmark is a one-off match at 64 simulations a move, 200 games, taken by hand. So the same Stockfish setting can read above 0.9 on the ladder while the benchmark in the table above reads 0.465: more search, fewer games, and a later champion. The Opponents table labels which is which. Neither is a rating.
What it worked out by itself
Nobody told the network that a queen outranks a pawn. A probe asks its value head directly: add one piece for the side to move in eight frozen positions from the run's own games, and read how much the network's expectation of winning moves. The queen has been the most valuable piece in every reading since the probe started at generation 22. The pawn has been the cheapest in most readings, but not all: it read a hair below zero at generation 24, above both the rook and the knight at generation 33, and above the bishop at generations 35 and 36. Rook, bishop and knight still trade places from one generation to the next. At generation 43 the order is queen, rook, bishop, knight, pawn.
The scale is the network's own, not pawns, and the sizes drift as the value head sharpens, so the ordering is the finding and the magnitudes are not. It is a tidier story to say it discovered the textbook. It did not; it discovered the queen, and it is still arguing about the rest.
One finding worth telling
On 22 September the search budget went from 48 simulations a move to 200, roughly four times the thinking per move. The deeper search produced better training targets per cycle and about four times fewer cycles an hour, and the two cancelled. Measured the same way, the champion against a frozen ancestor over 400 games at 64 simulations, the run gained 12.0 ± 3.3 Elo an hour before the change and 12.1 ± 0.9 after. It is a good result precisely because the answer was "no change"; it says the cost of a target and the value of a target rose together. One confound, stated plainly: the sparring opponents changed in the same window, so the gain after the change cannot be split between the two. These are internal Elo, our own generations playing each other, not a rating against anything outside.
Two more that contradicted the plan: a network sixteen times bigger learned nothing more on the same data, and about half of self-play time was going to Python's garbage collector, which the search never needed.
Read more
The project dossier, with the commit log and the findings as they land, is at thecloudybrain.com/p/chesslab. The rest of what I build is at thecloudybrain.com.
Made by Dennis Milton. The dashboard is at chesslab.dk.