feat: AI-game refinements (GCG, your_turn, admin, metrics)
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 49s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m7s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 49s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m7s
Follow-ups on the honest-AI game, same PR: - GCG export labels the robot seat "AI" instead of its pool name (ExportGCG overrides via accounts.IsRobot); the in-app 🤖 is unchanged. - vs_ai games emit no your_turn (the robot replies instantly, so it would be redundant); opponent_moved still advances the UI. - Admin console shows the AI flag: a 🤖 column in /games and an "AI game" line on the game card (GameRow/GameDetailView gain VsAI). - games_started_total / games_abandoned_total gain a vs_ai attribute; the Grafana Game-domain dashboard splits started/abandoned into human and AI panels. Tests: metrics unit (vs_ai split); integration (no your_turn, GCG "AI").
This commit is contained in:
@@ -378,7 +378,11 @@ the robot package), with the periodic driver as the fallback. There is **no shor
|
||||
timeout**; instead the game is created with `turn_timeout_secs = AIInactivityTimeout` (**7
|
||||
days**) and the existing turn-timeout sweeper resigns the overdue seat — since the robot moves
|
||||
at once, only the human is ever on the clock, so the per-turn timeout doubles as the
|
||||
"abandoned after 7 days of inactivity → loss" rule with no new column or sweeper.
|
||||
"abandoned after 7 days of inactivity → loss" rule with no new column or sweeper. An AI
|
||||
game emits **no `your_turn`** (the instant reply makes it redundant; `opponent_moved`
|
||||
still advances the UI), its **GCG export labels the robot seat "AI"**, and the
|
||||
games-started / -abandoned metrics carry a **`vs_ai`** attribute so AI and human games
|
||||
chart separately (the admin `/games` list and game card also show the AI flag).
|
||||
|
||||
The robot keeps **no per-game state**: every choice is derived deterministically
|
||||
from the game's bag `seed` (a restart-stable FNV-1a mix), so a background driver
|
||||
|
||||
Reference in New Issue
Block a user