feat(robot): shrink endgame think time when both sides pass
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 15s
CI / ui (pull_request) Has been skipped
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m17s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 15s
CI / ui (pull_request) Has been skipped
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m17s
In a dead-drawn endgame — the two most recent journal moves are both passes, so the board and the robot's rack are frozen and the robot is bound to pass again — the robot still waited out its long late-game think time (up to 90 min) before passing, needlessly dragging out a decided game. Shorten that delay to a [0.8, 1.5]x band around the human's last-move think time (the gap between the last two journal entries), clamped to [30s, 8min] and taken as a min with the normal schedule, so the robot never moves slower. A slow human collapses to the 8-min cap; a fast human is tracked, with the floor keeping the robot from passing suspiciously instantly. The anchor reads the move journal only (no schema change), stays deterministic from the seed, and still defers to the sleep window. RobotTurns now carries EndgamePass + OppLastMove, filled by one batched journal query on the scan; the honest-AI single-game trigger keeps the normal path (it moves at once). NextMoveAt (admin ETA) is left as the normal-schedule upper bound.
This commit is contained in:
+11
-1
@@ -449,11 +449,21 @@ disguised robot stays indistinguishable from a person.
|
||||
band; it proactively nudges the idle human on a **lengthening, randomized schedule** — the
|
||||
first ~60-90 min into the turn, each later reminder spaced further out toward 1-6 h — so a long
|
||||
wait gets a handful of increasingly-spaced nudges rather than an hourly stream.
|
||||
- **Dead-endgame timing**: once the **two most recent moves are both passes**, the board and the
|
||||
robot's rack are frozen and it is bound to pass again, so the robot drops the long late-game
|
||||
think time and answers on a **shortened schedule scaled to the human's own last (pass) think
|
||||
time** — a uniform sample in **[0.8, 1.5]×** of it, clamped to **[30 s, 8 min]** and taken as a
|
||||
**min** with the normal delay, so it never slows down. A slow human collapses to the 8-min cap (a
|
||||
decided game is not dragged out); a fast human is tracked, with the floor keeping the robot from
|
||||
passing suspiciously instantly. The anchor (the gap between the last two journal entries) reads the
|
||||
move journal only — no schema change — stays deterministic from the seed, and still defers to the
|
||||
sleep window.
|
||||
- **Observability**: robot accounts accrue ordinary statistics (§9) — the
|
||||
authoritative balance metric (target ≈ 40% robot wins) — and a
|
||||
`robot_games_finished_total` OTel counter plus a per-finish log give a live view.
|
||||
The **admin game card** surfaces each robot seat's per-game play-to-win intent (from
|
||||
the seed) and, on the robot's turn, its deterministic **next-move ETA**.
|
||||
the seed) and, on the robot's turn, its deterministic **next-move ETA** (the normal-schedule
|
||||
upper bound — a dead-endgame pass may land sooner).
|
||||
|
||||
## 8. Lobby & social
|
||||
|
||||
|
||||
Reference in New Issue
Block a user