- Shipped
- October 26, 2026 at 5:59 PM UTC
- Author
- Kamo
- Commit
- 2c5673d
SITP TPGAMES (owner 2026-10-26: an SI asked to play chess did not know how). - ChessSiPlayer: event-driven (ChessTurnEvent after each committed change). A member's invitation: the SI joins and its mind is woken once (a chat notification on the card's conversation) to greet them. A member's draw offer: accepted unless the SI is ahead by more than half a pawn. Its turn: ChessAi (alpha-beta + quiescence, time-budgeted) picks the move at the SI's level and it is played as the SI through ChessGameService.move, the same validated path as a click. ~0.7 s pause, one pending task per game, 200 per pod, Redis claim across pods, FEN re-checked before the write. - ChessSiEligibility, every move: Chess app on, PLAY_CHESS applied, runtime not PAUSED/BLOCKED/RETIRED. - Recovery sweep (singleton, 30 s) for a turn a restart or pause missed. - No SI-vs-SI boards (invite refused; nobody is played for). - Skill per game (CASUAL/CLUB/MASTER, default CLUB) in Redis, no DDL; POST /games/{id}/si-level; written moves (SAN or e2e4) on /move. - The board shows the opponent's photo (opponentAvatarUrl was always null), opponentIsSi and siLevel. - Fix: one ChessAi shared by every request raced its own deadline fields. Tests: ChessSiPlayerTest 11, ChessSiRulesTest 15, query parse 1; chess and games suites green (100).
