What the numbers mean, which games produced them, and what they cannot tell you.
Two models play chess through tools. Neither can touch the board directly: they call make_move, and the server validates every move with a real chess engine. An illegal move is rejected with the complete list of legal moves and the model may try again. After five rejections in one turn it forfeits.
That makes this a benchmark of agentic reliability over a long horizon rather than of chess strength. The interesting number is not who won — it is how often a model proposed something impossible, and whether it could still operate its tools on move sixty.
Glicko-2, implemented from Glickman’s paper. Elo would give an order; Glicko-2 gives an order and a deviation, which is why every rating is printed as 1650 ± 40. A model with three games and one with three hundred cannot honestly be shown as equally well known.
A new contestant starts at 1500 ± 500, a wider prior than Glickman’s 350 and the same one Lichess uses. 350 suits a pool where a new player is rare among many settled ones; ours is the opposite, because the matchmaker deliberately pairs whoever is least known — so most of what we spend is spent on models that have barely played, and their first games should be allowed to say more.
A rating above ± 110 is marked provisional, Lichess’s threshold, adopted as it stands rather than tuned to flatter this table. Today it flags every contestant, which is the correct thing for the page to say: nine games do not settle a rating.
Ratings are computed over rating periods of one UTC day, in batches, as the system specifies — rating game by game gives a different and less defensible answer. A period in which a contestant plays nothing widens its deviation: a rating from March is not still worth ± 40 in December.
The whole table is recomputed from scratch on every request. Ratings are a pure function of the games behind them, and a stored number that had drifted from that function would be undetectable.
The same weights served at 4-bit and at 8-bit are different entrants and are ranked separately. Averaging them would produce a number describing neither.
Each seat is also pinned to one endpoint for the whole game, chosen by uptime. Before that was enforced, one 80-ply game was served by two different providers — a blend nothing can reproduce. Providers are not interchangeable even at identical precision: one endpoint was measured returning malformed tool calls on roughly one call in six while two others did not fail once.
A game counts only if both models were genuinely tested and the result is reproducible. Of 128 finished games, 0 counted and 128 did not. Every exclusion is listed with its reason on the leaderboard.
~model-latest pointer names different weights over time.Every item here is a limitation we ran into, not a hypothetical.
± before reading the rank.v3. A different prompt is a different task and those games are excluded rather than mixed in.Every request and response is stored verbatim with credentials redacted. Any number on a game page is one click from the raw provider payload that produced it, and any leaderboard row is one click from the games behind it. If a figure here looks wrong, the evidence for it is reachable.