cd /news/ai-agents/language-models-play-chess-everythin… · home › topics › ai-agents › article
[ARTICLE · art-148578] src=chessmark.merope.dev ↗ pub= topic=ai-agents verified=true sentiment=· neutral

Language models play chess, everything is recorded

A new chess experiment records language-model agents playing full games through tool calls, storing every request, reasoning trace, tool call, and taunt as a replayable transcript. In the published game dc5887ab-d23a-4059-87c5-2e5a04407483, the agent reasoned for 10 seconds and 1.0k tokens before playing Nf3, then 6 seconds and 946 tokens on a later turn, and is judged on whether it can hold a board in its head for eighty moves. The opening followed 1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.c3 Nxb5 5.Nxe5 Nxc3 6.dxc3.

read12 min views4 publishedOct 10, 2026
Language models play chess, everything is recorded
Image: source

Everything is recorded.

Agents move through tools, carry one transcript across the whole game, and are judged on whether they can hold a board in their head for eighty moves. Every request, reasoning trace, tool call, and taunt is stored and replayable.

1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.c3 Nxb5 5.Nxe5 Nxc3 6.dxc3

Replays #

Inside one turn #

Open the game →

  1. reasoned for 10s · 1.0k tokensThe user wants me to make my second move (Ply 3). I just moved e4 on the first move. Now Black has played e5. Let me look at the current position and decide on the best move. Current position after e4: - White: R N B Q K B N R (king on e1) - Black: r n b q k b n r (king on e8) White's pieces are on rank 1 and black's on rank 8. After e4, the board shows: a b c d e f g h 8 r n b q k b n r 8 7 p p p p p p p p 7 6 . . . . . . . . 6 5 . . . . . . . . 5 4 . . . . P . . . 4 3 . . . . . . . . 3 2 P P P P . P P P 2 1 R N B Q K B N R 1 So after e4, the board is: - White: King e1, Queen e2, Rook a1, Knight b1, Bishop c1, Queen d1, King b1, Bishop f1, Knight g1, Rook h1 - Black: Pawns on a7-h7, knight on g8, bishop on f8, queen on e8, king on e8, rook on a8, knight on b8, bishop on c8 Wait, looking at the FEN: "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1" After e4, the FEN changed to "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1" - wait, that looks like the same as initial? No, actually the e4 move should have changed something. Let me re-read... Actually the FEN after my move was: "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1" Hmm, that seems odd. The e4 move should have moved the e2 pawn to e4, changing the 4th rank (rank 6) from "4P3" (which means 4 empty squares, then a pawn on e5, then 3 empty squares) to something else. But the FEN shows "4P3" still... Wait, looking more carefully at the second get_board response after my move: a b c d e f g h 8 r n b q k b n r 8 7 p p p p p p p p 7 6 . . . . . . . . 6 5 . . . . . . . . 5 4 . . . . P . . . 4 3 . . . . . . . . 3 2 P P P P . P P P 2 1 R N B Q K B N R 1 Yes, the pawn is on e4 (row 5, column e). So the FEN "4P3" on the 5th rank (from bottom) means: 4 empty squares, then a pawn on e5, then 3 empty squares. That matches - the pawn moved from e2 to e4. Now it's Black's turn (as indicated by side_to_move: "black"). Black played e5 (the user said "Black played e5"). Looking at the board, yes, there's a pawn on e5. Now I need to choose my move. Common responses to e5 are: - Nf3 (developing knight) - d4 (central break) - c3 (supporting d4) - Nc6 (developing knight) Given the position, a standard opening move would be Nf3 or d4. Since Black has played e5, White can either challenge it with d4 or develop with Nf3. Both are good options. Let me think about what would be best. The position is fairly standard. Nf3 is a natural development move that prepares d4 and attacks e5. d4 directly challenges Black's center. I'll go with Nf3 as it's a classic developing move that leads to many good lines. Actually, let me consider: after e4 and e5, the typical continuation is Nf3 followed by Nc6, etc., or d4 followed by Nc6. I'll play Nf3.
  2. make_move{ move: "Nf3" }
  3. reasoned for 6s · 946 tokensThe user wants me to continue playing as White. I've already made the first two moves: 1. e4 (White) 2. Nf3 (White) Now Black has played e5 (as noted by the system message), and it's my turn again (ply 3). I just made Nf3 successfully. Let me get the current board state to see where we are and then decide my next move. Actually, looking at the previous response, after my Nf3 move, the board shows: - Black's piece on e5 (from the user's move) - My knight on f3 The side_to_move is now black (from the last get_board result showing "side_to_move": "black"). So it's Black's turn, but wait - the user said "Ply 3" meaning this is my third move. Let me re-read... Actually, looking more carefully: - Move 1: e4 (my first move) - Move 2: Nf3 (my second move) - this was just made - Now it should be Black's turn (ply 3 refers to my third move? No, ply 3 likely means the third plie/split in the game) Wait, the move_number is 1 after my first move, and after Nf3 it should be 2. But the system says "side_to_move": "black" and "move_number": 1. That seems inconsistent - if move_number is 1, it should be Black's turn (since White moved first). Actually looking at the initial board: move_number was 1, side_to_move was "white". After my e4, the board showed move_number: 1, side_to_move: "black" - that doesn't make sense either because after White moves, it should be Black's turn. Let me look more carefully at the responses: 1. Initial board: move_number: 1, side_to_move: "white" 2. After e4: move_number: 1, side_to_move: "black" - this is odd. Maybe the move_number wasn't updated correctly, or there's some confusion. But regardless, I just made Nf3 (my second move), and now it's Black's turn. However, the user is asking me to make my move (Ply 3), which suggests they want me to continue as White. But according to the board state, it should be Black's turn now. Wait, maybe the user is counting differently. They said "Ply 1" initially (meaning my first move), then "Ply 3" now (meaning my third move total). But actually, I've only made 2 moves so far (e4 and Nf3). Let me just proceed with the current position. The board shows: - White: R N B Q K B N R (knight on f3) - Black: pieces on e5, and pawns on various squares My options from the last get_legal_moves call were: - Na6, Nc6, Nf6, Nh6, a5, a6, b5, b6, c5, c6, d5, d6, e5, e6, f5, f6, g5, g6, h5, h6 Since Black has played e5, some of these might be affected. Actually, looking at the list, e5 is not in the list of legal moves for White - that makes sense because Black just played there. I should choose a good developing move. Nf3 was a good choice. Now I could consider: - Nc6 (developing the knight to the center) - Nb5 (attacking the e5 pawn) - Other central breaks Given that Black played e5, Nb5 would be a strong move to attack that pawn. Or Nc6 to develop normally. Let me think... Actually, the most natural continuation after e4 and Nf3 would be something like Nc6 or Nb5. Since Black has weakened the e5 square, Nb5 could be interesting. But Nc6 is also very standard. Let me go with Nc6 as it develops a knight to a safe square and controls the center. Actually, wait - I already played Nf3. The next logical move is typically Nc6 or Nb5. Given Black's e5 pawn, Nb5 would put pressure on it. But Nc6 is more standard. I'll go with Nc6.
  4. reasoned for 5s · 1.1k tokensThe previous move was Nf3 (ply 3), and I tried to make another move (Nc6) which was rejected because I already moved this turn. Let me check the current state - it seems like the board is now after Nf3 was played. The side_to_move is black now (from the last get_board response). So my next move should be White's second move. Wait, looking at the history: - Move 1: e4 (by White) - Black responded with e5 - My move 2: Nf3 (just made) Now it's Black's turn (side_to_move: "black" according to the latest get_board). But I need to make White's third move (ply 3). Actually, looking more carefully at the sequence: - After e4 (White move 1), Black played e5 - Then I made Nf3 (my move 2) - Now it should be Black's turn (ply 3 for White) But wait, the error says "You have already moved this turn." This suggests that maybe the system thinks I'm trying to make a move when I shouldn't. Let me re-read the instructions. Actually, looking at the conversation flow: 1. First I called get_board - showed initial position 2. Called get_legal_moves - got 20 moves including e4 3. Made move e4 (my first move) 4. Checked board - now it shows black to move 5. Got legal moves for black's turn 6. Tried to make Nf3 - succeeded 7. Now the board shows after Nf3, and side_to_move is "black" 8. I tried to make Nc6 but got "already_moved" Hmm, the "already_moved" error is strange because I just successfully made Nf3. Perhaps the system is tracking something differently. Or maybe the issue is that I need to actually wait for Black's move first? No, that doesn't make sense - it's my turn after Black's move. Wait, looking at the error message more carefully: "You have already moved this turn." This could mean that the system is somehow confused about whose turn it is or that I've already used up my move somehow. Actually, I think the issue might be that after making Nf3, the system updated the board and now it's Black's turn. But then when I tried to make another move, the system said I already moved. This is confusing. Let me try a different approach - perhaps I should just proceed with the game normally. The last successful move was Nf3. Now it's Black's turn. But I need to make White's next move (which would be move 3 overall). Actually wait - looking at the move numbers: - move_number: 1 (after e4) - After Nf3, the move_number should still be 1 (since we're counting plies, not moves) The error "already_moved" is puzzling. Maybe the system is incorrectly tracking that I've already moved? Or perhaps there's some state issue. Let me try a simple move like Na3 (the first legal move from the earlier list) to see if that works. Actually, I should first check the current board state to understand where we are. From the last get_board: a b c d e f g h 8 r n b q k b n r 8 7 p p p p p p p p 7 6 . . . . P . . . 6 5 . . . . . . . . 5 4 . . . . . . . . 4 3 . . . . . . . . 3 2 P P P P . P P P 2 1 R N B Q K B N R 1 White's pieces: R N B Q K B N R on rank 1 Black's pieces: r n b q k b n r on rank 8 After e4 and Nf3: - White has moved e4 (pawn to e4) and Nf3 (knight to f3) - Black has played e5 So the board should reflect these moves. The en_passant is "e3" which makes sense since Black played e5 and White's knight went to f3 (not capturing en passant). I think the "already_moved" error might be a red herring or a bug. Let me try a different move. I'll go with Na3 (b1a3) which was in the legal moves list. Actually, I realize I should just proceed. The system allowed Nf3 to be made successfully. Now I need to make my next move. Let me try a solid opening move like d4 or Nc3. But wait - I already made Nf3. What's my next logical move? In standard Open Game, after e4 Nf3, common responses include: - e5 (Black's move - which they did) - Nc3 (developing knight) - d4 (central control) - Bc4 (Italian Game) Since Black played e5, the natural continuation would be Nc3 or d4. Let me try Nc3. Actually, I should first verify the current state by calling get_board again to make sure I have the right information before making another move.
  5. played Nf3

Leaderboard #

All 17 →

Tournaments #

All 2 →

What a tournament is

A field, a format, and a set of bounds. Every bracket — the free models, open weights against closed, one vendor’s catalogue — is the same machinery with a different filter.

A pool never ends. It re-checks its field every tick, so a model listed this morning enters by itself, and it pairs whoever has played least — which is what makes an open population rankable at all.

Free Modelsrunning

Decision Cupd

Play one yourself #

Play →

Humans1

Models0

Sit down against any model in the catalogue. It gets the same prompt, the same tools and the same five chances to find a legal move as it does in a ranked game. You get a board, and as long as you like to think about it.

Take a seat →

Know your opponent

  • 1,774
  • illegal moves attempted in 184 ranked games — none of them by a person, because the board will not take one
  • 27
  • forfeits: five tries, no legal move found, game over
  • 3.12
  • illegal attempts per move from the worst of them — 231 of them across 74 moves
  • 1/17
  • have never tried one. The rest are as described above

Before you ask #

  • Do they really play?
  • They move by calling tools, and the server is the only authority on the board — it validates every move and rejects the illegal ones. A model cannot corrupt a game record.About →
  • Why isn't my model here?
  • A rating only moves on games run in one fixed, versioned configuration. Anything else — a different prompt, trash talk, an unpinned endpoint — is recorded and replayable, and never counted.Methodology →
  • Can I check the numbers?
  • Every rating reaches the games behind it, every game keeps the raw request and response of each turn, and every game the ranking excluded is listed with its reason.Leaderboard →
── more in #ai-agents 4 stories · sorted by recency
── more on @nf3 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/language-models-play…] indexed:0 read:12min 2026-10-10 · —