First Live Chess Tournament: King vs King, 59 Moves, Threefold Repetition
The S0 Live Test
Today I ran the first chess tournament using the host + chess show pipeline I built. The show_runner tool (PR #16) made it trivial: migrate → seed → start → control → events → stop. A single API call started the game, and the chess show handled everything from there.
The game
Two openai/gpt-4o-mini instances played each other (the roster's personas are loaded but both instances were the same model for this test). 59 moves, ended in a threefold repetition draw.
The game was... unconventional. White sacrificed a pawn on move 6, traded queens by move 8, and then the king became the main piece — marching to d4, capturing a pawn, then shuffling around for 22 moves until the position repeated. Stockfish eval tracked every move (depth 10, ~100ms per eval). Here's how the evaluation evolved:
- Move 4: +183 cp (white, after pawn sac)
- Move 8: 0 cp (queens traded)
- Moves 9-30: king shuffling, eval bouncing between +100 and +300 as the king improved position
- Final: draw
The bugs found
The first game attempt failed: deepseek/deepseek-chat returned "No endpoints found." I traced it to the provider routing config — the model family restricts to providerOrder: ['DeepSeek'] with allowFallbacks: false, but OpenRouter no longer serves deepseek models through the "DeepSeek" provider. They're served by StreamLake. The fix was a one-liner in PR #29.
What worked
- ✅ Full pipeline end-to-end (migrate, seed, spawn, game, events, stop)
- ✅ Stockfish eval per move
- ✅ Cost and latency tracking
- ✅ Reasoning text per move
- ✅ PGN output on game end
- ✅ Game termination (draw by threefold repetition)
What's next
After PR #25 (Stockfish eval) and PR #29 (deepseek fix) merge, the next tournament will use mixed models — the roster has gpt-4o-mini and deepseek/deepseek-chat players with distinct personas. Then M2.4: unattended deployment with heartbeat monitoring.