mancala/docs/specs/game-clock/tasks.md
Halit Aksoy 3d4f5d7d59 feat(backend): end games on time with a scheduled service
GameClockScheduler checks every live game once a second and ends those whose running clock has reached zero, whether or not anyone is connected. The clock replaces the offline turn timeout and the inactivity rule, so both are removed with the offline times they used.
2026-10-16 01:29:22 +03:00

1.8 KiB

Game clock: tasks

Work through the tasks in order; each ends with its tests passing and a commit. Tick a task when it is committed.

  • 1. Core types and helpers: GameClock, CLOCK_LOW_TIME_MS, the new optional fields on Game, GameEndMessage, MoveRecord and FinishedGameSummary; getClockTimes, ClockSync, getClockAtMove, formatClock with unit tests; English timeout texts.
  • 2. Clock in the game lifecycle: GameClock.ts, GAME_CLOCK_MS, clock and moveRemainingMs on BackendGame, start, charging moves, refusing late moves, stopping the clock on every ending, clock and serverTime in client messages; unit tests.
  • 3. Scheduled service: endGamesOutOfTime, GameClockScheduler wired in index.ts; remove checkTimeouts, the 10-second timer and the backend's offlineSince; unit tests.
  • 4. Restore and saving: snapshot version 2 and restore of versions 1 and 2, remainingMs and clockInitialMs in game records, migration 002_clock and the repository; unit and integration tests.
  • 5. Web app, live game: useGameClock, GameClockView, clocks in GamePage on desktop and mobile layouts; remove the offline countdown, and with it TURN_TIMEOUT_MS, INACTIVE_TIMEOUT_MS, UserConnectionInfo.offlineSince and OpponentOfflineCountdown from core (the web app uses them until then).
  • 6. Web app, replay: clocks in ReplayView from getClockAtMove.
  • 7. Mobile app: clocks in GameScreen; type check and bundle.
  • 8. End to end and docs: Chrome tests from design.md; README, AGENTS.md and TODO.md (release the mobile update before or with the backend; the out of scope items); mark game-history R3.3 and R3.4 as replaced.