Selected game
-| Move | Guess → search | Guess | Search | Change |
|---|
Opponents
nothing measured yet| Opponent | Score | Games · W-D-L | Trend | Series |
|---|
Ancestor anchors
-| Ancestor | Score | Lower 95 | Elo ahead | Record | Read by | Age | Earlier readings |
|---|
Piece values
-| Piece | Value | x pawn | of queen | Change |
|---|
Forced mates
-| Probe | Solved | Positions | Target mass | Change |
|---|
Is the progress real?
-| Instrument | Now | Trend | Evidence |
|---|
Generations
-| Cycle | Gen | Gate | Games | Positions | Pos/h | Minutes | Passes | Policy KL | Held-out KL | Held-out CE |
|---|
Against other people
-Rating
-By time control
| Speed | Games | Record | Score |
|---|
How games ended
| Ending | Games |
|---|
The games themselves
-| Opponent | Rating | Colour | Result | How it ended | Clock | Opening | When |
|---|
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, and now one with a rating other people gave it. Since 24 September ChessLab has played on Lichess as chesslabdk, and after 88 rated blitz games its rating there is 1434. That is the first number in this project that nobody here computed.
The benchmarks below are 200-game matches at 64 simulations a move, played by the frozen champion of generation 45 on 25 September 2026. Maia is a network trained to imitate human players of a given rating; its authors note the nets play somewhat above their label.
| Opponent | Result | Score | Was (gen 37) |
|---|---|---|---|
| Maia 1300 | 73 wins, 61 draws, 66 losses | 0.5175 | not played |
| Maia 1500 | 51 wins, 53 draws, 96 losses | 0.3875 | 0.205 |
| Maia 1900 | 33 wins, 51 draws, 116 losses | 0.2925 | 0.1975 |
| Stockfish, weakest setting, four nodes | 86 wins, 29 draws, 85 losses | 0.5025 | — |
A score is the share of the points, a draw counting half. Against the weakest Stockfish at one node, generation 15 scored 0.1875 over 200 games (17 wins, 41 draws, 142 losses) and generation 37 scored 0.465; the same setting at four nodes is now a coin flip. Two of those rows answer a question the last version of this page could not. In September the 1500 and 1900 nets scored 0.205 and 0.1975 — seven thousandths apart, which is to say they were not two opponents but one, seen from too far below. Eight generations later they are 0.095 apart, thirteen times the old gap. A wall stops being one wall before it stops being above you.
Two measurements that share no code and no opponent now agree. Maia 1300 reads 0.5175, dead centre, which places the champion near 1310 on Maia’s scale; the Lichess rating says 1434 over 88 games. Nothing here had been corroborated from outside before.
The opponents it is measured against are chosen by where the reading sits, not by hand. A score says the most at a coin flip and nothing at nought or one, so the games go to the rungs where the number can still move, and a rung the learner has outgrown sleeps until its turn comes round again. Stockfish’s skill levels give twenty-one steps to choose from: at skill 1 we score 0.4800, at skill 3 0.3025, at skill 5 0.2725 and at skill 8 0.1975.
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. One oddity worth recording: at its weakest skill setting Stockfish is not made stronger by more thinking — we score 0.5025 against it at four nodes and 0.6075 at sixteen. Skill level 0 makes deliberate mistakes, and more nodes change which ones rather than how many.
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.