release: promote development → master (v1.23.0) #276

Merged
developer merged 6 commits from development into master 2026-07-15 00:32:54 +00:00
Owner

Promote the second native-polish batch (#275) to production. Tag v1.23.0 after merge, then prod-deploy.

Ships (#275)

  • fix(game) two-robots-after-merge (game header recognises the local guest id).
  • feat(newgame) guest offline-host skips the take-a-seat prompt.
  • feat(account) fresh guest gets a distinct Guest###### display name.
  • fix(boot) native offline-first launch: silent heal (no spurious back-online toast) + fast airplane fallback (~3 s instead of ~25 s).
  • chore(android) minSdk 24 → 29 (affects the NEXT store APK build, not the running services).

Schema

None — no migrations, so the prod deploy needs no maintenance window (rolling, health-gated, auto-rollback).

Verified on #275: full CI green; contour deployed. Local: Go unit+integration, UI svelte-check+vitest, e2e 252/252, native e2e 4/4.

Promote the second native-polish batch (#275) to production. Tag v1.23.0 after merge, then prod-deploy. ## Ships (#275) - fix(game) two-robots-after-merge (game header recognises the local guest id). - feat(newgame) guest offline-host skips the take-a-seat prompt. - feat(account) fresh guest gets a distinct Guest###### display name. - fix(boot) native offline-first launch: silent heal (no spurious back-online toast) + fast airplane fallback (~3 s instead of ~25 s). - chore(android) minSdk 24 → 29 (affects the NEXT store APK build, not the running services). ## Schema None — no migrations, so the prod deploy needs no maintenance window (rolling, health-gated, auto-rollback). Verified on #275: full CI green; contour deployed. Local: Go unit+integration, UI svelte-check+vitest, e2e 252/252, native e2e 4/4.
developer added 6 commits 2026-07-15 00:26:48 +00:00
The game header identified the viewer's seat only by app.session.userId, but a device-local
game (vs_ai / hotseat) created offline is seated under the local guest id (the lobby already
matches both). After a merge switched the active account to a durable id, the human seat matched
neither, so a vs_ai game showed BOTH seats as robots (the turn still worked — it is seat-index
based). seatName now matches app.session.userId OR localGuestId, like the lobby. Completes the
v1.22.0 repointLocalGameSeats fix, which only covered games seated under the retired session id.
A guest host has no meaningful display name to seat, so the offline 'with friends' flow's
"do you take a seat?" prompt only produced a nameless seat. For a guest the prompt is skipped:
after the master PIN, the two empty player seats show directly. A durable host is still asked.
Every guest showed a bare "Guest" to opponents (e.g. in a random match). Mint the display name
as "Guest" + a random six-digit suffix at provisioning, so guests are distinguishable. Not an
identifier and not unique — a label only, so collisions are harmless.
Two native offline-first boot glitches (seen on Android 10):
- bootOffline forced offlineNoNetwork, so its first successful reconcile healed to online with a
  spurious "back online" toast on a first launch that actually had connectivity. The boot-assumed
  offline is now PROVISIONAL: the first probe confirms it — a success heals silently (nothing to
  come back from), a failure turns it into a real offline whose later recovery does toast.
- A native launch with a cached guest session (no email) skipped the offline short-circuit and hung
  ~25 s on adoptSession's retrying profile fetch in airplane mode. The native channel is offline-first,
  so it now takes the same reachability-gated fallback (~3 s bound) as an installed email PWA.
chore(android): raise minSdk to 29 (Android 10)
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 22s
CI / ui (pull_request) Successful in 1m15s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m56s
fe29c6fe58
The bundled WebView build is only compatible from Android 10 (API 29); on Android 9 it lands on
the in-app unsupported-engine screen. Declaring minSdk 29 lets RuStore/Google Play block older
devices at install rather than shipping a known-incompatible build.
Merge pull request 'native polish 2: two-robots fix, guest offline-host UX, Guest###### name, silent+fast native boot, minSdk 29' (#275) from feature/native-polish-2 into development
CI / changes (push) Successful in 2s
CI / unit (push) Successful in 11s
CI / integration (push) Successful in 22s
CI / ui (push) Successful in 1m15s
CI / conformance (push) Successful in 10s
CI / changes (pull_request) Successful in 2s
CI / gate (push) Successful in 0s
CI / deploy (push) Successful in 1m57s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 21s
CI / ui (pull_request) Successful in 1m14s
CI / conformance (pull_request) Successful in 11s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Has been skipped
d48797e297
owner approved these changes 2026-07-15 00:26:57 +00:00
developer merged commit d94d56b461 into master 2026-07-15 00:32:54 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/scrabble-game#276