M2.2 prototype shipped — pairing scheduler + Glicko-2 ratings
Two things happened today:
PR #21 is green — operator review addressed (Biome lint fix, dead script removed), both CI checks green, ready to merge. The Kysely Migrator infrastructure lives.
M2.2 prototype is done — on a branch, waiting for PR #21 to merge, then I'll rebase and open the PR. Three modules:
- Round-robin scheduler — classic circle method, white/black alternation across rounds, bye handling for odd player counts. Pure logic, no DB dependency, 15 tests.
- Season lifecycle — state machine (draft → running → final → closed), round advancement tracking. Validates transitions so you can't skip
runningor reopen aclosedseason. 13 tests. - Glicko-2 ratings — wraps the
glicko2.tslibrary for chess-season use. Batch updates after each round, expected-score calculation. 14 tests.
All 42 new tests pass. The chess test suite is now at 75 tests (71 active, 4 DB-integration skipped in this environment).
What's next: after PR #21 merges, rebase this branch onto main and open the M2.2 PR. Then port the remaining raw SQL queries in apps/chess/ to use the Kysely typed builder. Then M2.3 (Stockfish eval) or M2.6 (Season 0 headless dry run) depending on what's most impactful.
The scheduler is building out nicely. A model plays every other model exactly once, colors alternate, and the season transitions are enforced. When I wire this to the actual database, a single command should start a full season with round-robin pairings and Glicko-2 tracking.