native polish: guest-locale banner, seamless guest sign-in (+local-game fix), 'Opponent's turn' label, deploy-authoritative dictionary #273
Reference in New Issue
Block a user
Delete Branch "feature/native-polish-and-dict-deploy"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four fixes from the Android on-device test round (owner-approved directions).
A — banner locale (
fix(account))A fresh guest was provisioned with only its time zone;
PreferredLanguagefell to theencolumn default, so a Russian user's brand-new native guest saw English language-dependent server content (the ad banner, bot messages) until the client's later language reconcile. The client already sends its locale in the guest login (GuestLoginRequest.locale) but the gateway dropped it — now read it, thread it throughGuestAuth→ProvisionGuest, and seed the language (validated). No wire change.B — seamless guest sign-in + the merged-away local game (
feat(link))A guest linking an identity that already has a durable account was shown an irreversible 'merge two accounts?' prompt — nonsense from the user's side (they are just signing into their account). The confirm step now merges inline for a guest initiator and returns the switched session (a durable initiator still confirms — consolidating two real accounts is consequential). The active-game guard still refuses, surfaced as a clear
error.merge_active_game_conflictmessage.Also fixes bug 3: the guest's device-local games (vs_ai / hotseat) were seated under the retired account id, so after the switch the lobby/game-header could not identify "me" and showed every seat as an opponent (the game still played — turn logic is seat-index based).
applyLinkResultnow re-points local game seats to the surviving account.C — 'Opponent's turn' label (
feat(game))The under-board turn strip now reads the generic 'Opponent's turn' for online PvP and vs_ai instead of the opponent's name / robot mark (hotseat still names the seat to move; the seat row still names players).
D — deploy-authoritative dictionary (
feat(dict))Root-caused the native dict-preload splash: the dictionary lives on a persistent volume seeded from the image once and never re-seeded, so a redeploy that bumped
DICT_VERSIONleft the new DAWGs unreachable (the mount shadows the image copy) and new games stuck on the last console-installed version (prod = v1.3.0, bundle = v1.3.1) — the native app then fetched the server's older pinned dict over the network. On boot the backend now delivers the build version onto the volume add-only (from an unshadowedBACKEND_DICT_SEED_DIR) and activates it — old games keep theirs; a console version newer than the build is not downgraded. So a bump+redeploy goes live for new games with no admin step.After merge + promote + prod deploy: prod moves to v1.3.1 (matching the bundle) → new games no longer splash; the current v1.3.0 game keeps its pinned version (a one-time fetch, by design).
Verified locally: Go unit + integration (incl. the auto-merge, the active-game conflict, the deploy-delivers path, the guest language), UI svelte-check + vitest, e2e 252/252 (chromium+webkit), UI build.