ui/phase-25: backend turn-cutoff guard + auto-pause + UI sync protocol
Backend now owns the turn-cutoff and pause guards the order tab relies on: the scheduler flips runtime_status between generation_in_progress and running around every engine tick, a failed tick auto-pauses the game through OnRuntimeSnapshot, and a new game.paused notification kind fans out alongside game.turn.ready. The user-games handlers reject submits with HTTP 409 turn_already_closed or game_paused depending on the runtime state. UI delegates auto-sync to a new OrderQueue: offline detection, single retry on reconnect, conflict / paused classification. OrderDraftStore surfaces conflictBanner / pausedBanner runes, clears them on local mutation or on a game.turn.ready push via resetForNewTurn. The order tab renders the matching banners and the new conflict per-row badge; i18n bundles cover en + ru. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -385,6 +385,12 @@ The current direct `Gateway -> User` self-service boundary uses that pattern:
|
||||
- business error projection:
|
||||
- gateway `result_code`
|
||||
- FlatBuffers error payload mirroring User Service `code` and `message`
|
||||
- User Service `code` values pass through verbatim as `result_code`
|
||||
via `projectUserBackendError`; known non-`ok` codes that clients
|
||||
branch on include `turn_already_closed` (Phase 25 turn cutoff,
|
||||
HTTP 409 from `Orders` / `Commands` while the runtime is in
|
||||
`generation_in_progress`) and `game_paused` (Phase 25 auto-pause,
|
||||
HTTP 409 while the game is in `paused` / `finished` / `removed`).
|
||||
|
||||
The request envelope version literal is `v1`.
|
||||
`payload_hash` is the raw 32-byte SHA-256 digest of `payload_bytes`.
|
||||
|
||||
Reference in New Issue
Block a user