Skip to content

July 19, 2026

Phone game-chrome and map clarity

Hands-on phone review exposed a mismatch between the amount of interface chrome and the space needed for the route atlas. At the 32rem vertical-map breakpoint, the active HUD now keeps only Time, Moves, the complete wrapping Target, and an available Back action. Score, the separate round identity, the map prompt row, and the floating zoom/navigation toolbar no longer compete with the first node. The horizontal hint dock is one 44px row of icons and numeric penalties; its complete names, costs, availability, and state remain in accessible labels.

The initial phone camera uses the same upper-stage anchor as subsequent moves, placing You are here close beneath the HUD without hiding the complete frontier. A hidden toolbar can no longer contribute a stale safe-area offset when the selected-route detail tray is revealed. After a move, the existing full-frontier fitting still keeps Back, current, and every new choice reachable.

Phone choice pins are reduced from 44px to 40px while their surrounding controls remain at least 44px. Decorative WebGL and SVG tokens receive the matching 90% phone-only scale; desktop geometry is unchanged. The distant target card no longer inherits the artwork column when the compact artwork is absent, so long targets wrap completely and remain horizontally centered. Row-based choice labels continue to use the tallest measured label in each row and vertically center shorter neighbors.

Reachable-target heartbeat

The reachable target was too easy to mistake for an ordinary route. Its phone pin and desktop goal card now share a continuous 1.05-second two-beat size heartbeat. Phone peaks are intentionally stronger because the marker is small; the larger desktop card uses the same rhythm with restrained scale. Both the system preference and Webwoven's in-app reduced-motion setting stop the animation while preserving the static Ochre goal treatment.

Focused browser coverage locks the unclipped phone HUD, hidden mobile toolbar and prompt row, compact hint controls, 40px visible pin with a larger touch target, centered multi-line goal, initial camera anchor, complete post-move frontier, and shared mobile/desktop heartbeat name. The changes were reviewed interactively from a physical phone over the LAN Vite hot-reload surface before release.

Desktop opening-stage containment

A production follow-up exposed that the opening desktop fit included the start and active choices but omitted a distant goal. Closing the endpoint introduction then applied ordinary stage-follow panning and could move that goal partly or completely outside the clipped map viewport. The initial desktop bounds now include the distant goal, and the transition from introduction to active play refits the opening stage instead of treating it as a completed move. A 1341×868 browser regression measures both complete endpoint cards inside the real map viewport after the introduction closes.

Mobile dead-end Back containment

Visual acceptance of the all-terminal recovery exposed that its intentionally stationary Back camera could replace a compact history marker with the taller current card partly above the clipped phone viewport. Vertical dead-end recovery now preserves the current zoom and continuity while nudging the recovered current card and active choices just far enough inside the map. Desktop keeps the existing stationary collapse. The exhausted-branch browser flow measures the complete recovered current card against the real mobile map viewport and retains the unchanged-camera assertion on desktop. Canonical Compose replayed bird → Ornithurae → Back at 390×844 and left the complete returned bird card 17px below the map's clipped top edge while both choices and the goal remained visible.

All-terminal frontier recovery

Production lobby 90PSJ6 exposed a route state where Ornithurae offered Ornithuromorpha and evolution of birds, although both destinations had no route-safe edge except the blocked return to Ornithurae. The existing safeguard only examined a frontier with exactly one destination, so two equivalent terminal choices bypassed it. Frontier projection now follows the forced continuation through one shared route-aware search and treats the current node as exhausted when no path can reach the target without revisiting the active route. A dead-end decoy remains playable when at least one real alternative exists, and that safe first move is guaranteed to survive the six-choice display cap. Compass and frontier projection now share the same reachability owner. The fix is derived from the pinned graph and active route; no entity blacklist or graph-data edit is involved. A full current-bundle sweep followed the retained safe move through all 100 published rounds and reached every target across 301 frontier projections. On the local SQLite adapter, projection took 4.05ms on average, 18.62ms at the 95th percentile, and 34.24ms at maximum.

Canonical Compose acceptance rebuilt the API against graph build bcef5c35ef4725305ba3e71124f0925383fdebd26e0c70d33c9af9f0253b62d1 and replayed the exact round-b99863c778102356 state through the real HTTP session contract. Following bird to Ornithurae produced zero visible targets while retaining bird in the navigation stack, so the client presents the existing Back recovery instead of either false continuation.

Release validation

The complete quality gate passes 163 web tests, 363 Python tests, both Remotion composition checks, formatting, lint, Svelte and Python type checks, file-size and color-policy checks, and the strict documentation build. All 44 Playwright flows pass across desktop and mobile, including both reduced-motion paths for the reachable-goal heartbeat. Layout-focused browser coverage was split into its own responsibility-owned spec so the modified test files remain below 600 lines.

Canonical Compose acceptance rebuilt Caddy at http://localhost against the active real Wikidata bundle. A fresh 390×844 galaxy → Sun round placed the current card 61px below the map viewport edge, kept the 40px choice pins inside their larger controls, wrapped the Target in full, hid Score, the map header, and the floating toolbar, and produced no horizontal document overflow. At 1341×868 the same compiled bundle returned to the horizontal card layout with Score, map header, and utility rail visible. The emitted production CSS contains the shared reachable-goal-heartbeat animation, and the local UI and readiness endpoints both return HTTP 200.