Skip to content

July 15, 2026

Pre-round atlas reveal

Solo, Daily, and Multiplayer now enter play through one five-second, server-synchronized atlas sequence. The approved category plate appears first, followed by accessible start and goal cards, a growing route thread, an orientation move back to the starting card, and a final match-zoom into the live board. The scene uses small responsibility-specific Svelte, timeline, asset, Three.js, and CSS modules. Newsreader and IBM Plex Mono remain the title and field-label faces, and category accents come only from the established token palette.

The canvas is decorative. A static category and endpoint composition with textual countdown uses the same timestamp for reduced motion or failed WebGL. Hidden-tab recovery reads wall time, late responses begin at the correct phase, and sessions resumed after started_at skip the sequence. Renderers cap pixel ratio at 1.5 and dispose their textures, materials, geometry, observers, and animation frames. The four category derivatives and their project-owner approval were verified against apps/web/public/illustrations/manifest.json; the unused Cartographer remains outside this flow and no runtime AI or external content request was added.

Play-mode discovery

The front page now presents Solo, Daily, and Multiplayer as three equal play modes inside the first hero view. A single labelled atlas-style chooser replaces the ambiguous two-action hero and the duplicate below-the-fold mode ledger. Each native button keeps its timing and player-count cue visible on phones, while token-based accents, focus outlines, and restrained arrow motion preserve the established paper-map visual language without making one mode appear to be the default.

Responsive browser coverage verifies that all three choices remain inside the initial desktop and mobile viewport and route independently to Solo setup, the Daily connection, and the multiplayer lobby.

Daily leaderboard access

Today’s field is now available from the global header without leaving the current screen. The header action opens a focused side drawer, refreshes the public Daily standings on every open, and returns focus to its trigger when dismissed. Because it does not navigate, checking the board does not interrupt or reset an active Solo, Daily, or Multiplayer round.

The results page and drawer share one leaderboard component so loading, empty, error, ranking, and current-player states stay consistent. Desktop and mobile browser coverage verifies the drawer, keyboard dismissal, focus restoration, and preservation of active Solo progress.

The drawer now labels itself simply as “Daily leaderboard”; the redundant UTC suffix remains only where a date boundary actually needs explaining.

Deterministic round publication

The 40-round publication set no longer carries a redundant manual approval checkpoint. Starts and targets already come from the curated 160-anchor catalog, relationships come from the versioned allowlist, and selection is deterministic. Bundle generation now fails unless all 100 candidates and the selected 40 satisfy endpoint, label, relationship metadata, shortest-distance, category, difficulty, and timing checks. A versioned round-validation-report.json records the complete result and the selection inputs used to reproduce it.

This change applies only to factual route selection. Codex-authored prose, generated illustrations, infrastructure spending, and final submission retain their separate review or approval boundaries. Commons documentary media instead passes a strict automatic license and provenance gate.

Release-scale graph and documentary media

The release graph keeps the four stable round categories and expands independently through a category-balanced third hop. Previously fetched entities no longer consume the cap for unseen frontier nodes, so the 5,500-entity ceiling now has its intended meaning without changing relation fan-out or admitting additional top-level categories.

The resulting 112-batch snapshot contains 5,481 labelled entities and 32,972 directed playable edges, compared with 2,214 and 12,130 in the previous two-hop pack. Wikidata reported sustained replica lag during acquisition, so this non-time-sensitive snapshot used the client’s bounded 120-second lag threshold together with quarter-second request pacing; every returned batch remains locally cached and hashed.

Curated endpoint P18 claims feed a separate Commons acquisition stage. Only Public Domain, CC0, and complete CC BY 4.0 records from HTTPS Wikimedia origins proceed; accepted raster derivatives are size-bounded, signature-checked, content-addressed, copied into the immutable graph bundle, and included in both the artifact manifest and attribution ledger. The API serves only manifest members from a cacheable /api/v1/media/ route, and the Sources drawer credits both start and goal images. Missing or rejected media keeps the existing authored category fallback.

The final media pass localizes 75 endpoint images: 65 Public Domain, three CC0, and seven CC BY 4.0. Seventy-nine candidates fail metadata or license policy and one animated GIF fails the static-raster policy. An initial unpaced pass exposed upstream throttling, so derivative downloads now use a quarter-second interval, bounded retries, exponential backoff, and Retry-After; the clean rebuild completed without transport rejections.

Play-mode continuity

Daily and Multiplayer name prompts now identify the mode and explain where the public explorer name will appear. The shared atlas reveal keeps a visible Solo, Daily, or Multiplayer badge above the category and endpoint sequence, using the same canonical labels as the active-round masthead.

Results now retain that identity through mode-specific completion copy and follow-up actions. Solo offers another independent route, Daily keeps its leaderboard outcome, and Multiplayer returns to a fresh create-or-join entry instead of silently starting a Solo route.

Difficulty and route variety

Solo and lobby hosts now confirm Easy, Normal, or Hard before creating a round. Their latest choices are remembered independently in local storage, but a new Solo route always returns to confirmation. Daily keeps its curated difficulty. Lobby snapshots lock and display difficulty, category, and both endpoints for all participants.

The API schedules every new session five seconds ahead and rejects premature commands with round_not_started. Lobby participants share the lobby's exact timestamp. A shared selector now filters published rounds by difficulty and optional category, chooses unseen routes during the current cycle, and avoids the immediately previous route at cycle reset when alternatives exist. Explicit round IDs and Daily assignments bypass random selection. Memory and PostgreSQL adapters own the history, while an injectable chooser keeps coverage deterministic.

Reverse dead-end recovery

Back from an exhausted branch now reads as the reverse of forward progress. The dead-end card and departed marker fade, the departed node settles into a muted inspectable history state, and the camera brings the returned current node to the center over 440ms. The DOM and Three.js layers retain the outgoing marker during the transition; reduced motion applies the final state immediately. Pure transition and camera functions cover the semantic action and two-axis recentering.

Focused API and frontend tests cover round cycles, difficulty bodies and local remembrance, future-start rejection, shared lobby timestamps, phase boundaries, late and resumed timing, wire mapping, and reverse map transitions. OpenAPI and frontend generated schema types were regenerated after the room contract changes.

Full-node visual atlas

The source review compared Wikimedia Commons with Smithsonian Open Access, The Met Open Access, Europeana, and GBIF occurrence media. The museum collections offer excellent CC0 subsets, while Europeana and GBIF require per-record rights evaluation and additional entity matching. Commons remains the primary atlas because it joins directly to Wikidata QIDs, covers every graph domain, and exposes creator and license fields in a machine-checkable record. The discovery interface remains modular so a future collection-specific adapter can add a better exact image without changing gameplay.

Documentary imagery now follows the player through the whole route instead of appearing only on the start and goal. Current, available, visited, and results-trail nodes use their own locally bundled media, while the larger endpoint treatment remains reserved for the first and last nodes.

The media pipeline now searches every one of the 5,482 graph entities. It ranks direct Wikidata media and exact Wikipedia lead images first, then uses exact Commons categories, structured depicts matches, tightly matched article media, and finally an exact image from a named graph neighbor. The latter is explicitly labelled as documentary context in the Sources drawer. A quality audit removed flags, stub badges, editing symbols, and other generic article chrome that Wikipedia pages expose through their image lists. The final selection contains 5,062 distinct files; repeated images are retained only for a meaningful shared subject such as Oscar categories, an award family, a creator and their works, or another recorded graph connection.

The expanded policy accepts complete Public Domain, CC0, CC BY, and CC BY-SA records across the supported license versions. Every derivative remains local, size-bounded, signature-checked, content-addressed, hash-verified, and represented in the immutable manifest and attribution ledger. The pooled downloader uses sixteen workers while globally spacing request starts by a quarter second, so concurrency overlaps response bodies without creating an unbounded burst. If Commons only reports an original upload for a small file, the downloader requests a 640-pixel display derivative from Wikimedia Commons' own thumbnail endpoint, or 480 pixels for animated GIFs that would otherwise exceed the size gate. This avoids repeated original-file throttling without introducing a third-party proxy. Bundle construction fails closed unless every node is covered. The first acquisition pass left 346 entity mappings behind transient Commons responses; a paced targeted repair recovered all 328 missing source assets, including one small original-file fallback that Commons could not thumbnail. The exact-coverage merge then published all 5,482 entity mappings, 5,062 verified assets, and zero rejected records.