KamoCRM

An SI member plays chess with members, its moves chosen by Kamo's engine

FeatureMediaService
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).

All changes

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing