Skip to content

July 17, 2026

Deterministic relationship language

Relationship copy now comes from the documented fact plus a source-neutral semantic profile instead of a property-only sentence. Ranked selections are distinguished from awards, series ordinals such as P1545 become readable ranks, and country relationships use language, organization, place, or neutral association wording as appropriate. Forward and inverse navigation retain the same canonical fact, so returning through a relationship cannot reverse its meaning.

This is a data rule rather than a route-specific rewrite or node blacklist. Wikidata normalization generates the canonical sentences, while the graph compiler is the common trust boundary for every source. Authored fixtures, imported normalized JSON, and future source adapters must all provide normalized entity text, recognized source-neutral semantics for ambiguous recognition targets, and a complete explanation. They cannot compile misleading award or place forms, invisible formatting, duplicated terminal punctuation, or inverse copies that disagree on wording, qualifiers, or playability. Regression tests exercise the generic compiler boundary separately from the Wikidata normalizer.

The active wikidata-2026-07-16-ten-categories-v8 atlas was revalidated from the recorded source batches without network access. Every batch was checked against its stored SHA-256 digest, and the existing Commons selections, attribution, and Wikipedia links remain unchanged. A candidate rebuild reproduced the same entities, edges, rounds, compiled graph, and graph build ID, so the already registered immutable bundle remains active instead of publishing a timestamp-only manifest under the same identity. Its verified graph build ID is 15ce21a4a7c4229dc9069372a2c5ab0fdbd57ab2c90e0139e952337f969e00fe.

The production audit also removed incidental language classification, doubled punctuation after labels such as ORCID, Inc. and Help!, and missing articles for forms such as the People's Republic of China and the Russian Empire. Unknown but structurally valid recognition targets now use neutral recorded-recognition wording instead of claiming that an entity “received” a list, organization, work, or identifier.

The final all-source audit also made physical-place, language, and organization verbs depend on positive structured evidence. Incidental description phrases no longer turn the Bombe into a place or the Bauhaus World Heritage sites into an organization; those country facts now use neutral association copy. The compiler requires both fact endpoints in every explanation, rejects every Unicode formatting control, and requires P17/P166 prose to match the deterministic formatter for the supplied semantic evidence.

Round curation now removes forced-opening starts before deterministic hashing and publication, rather than hiding already-published routes only at API selection time. The locked 100-candidate and 40-published distribution is preserved by selecting the next eligible pairs. Validation records the choice-first invariant for every candidate under deterministic-round-publication-v2; the API retains the same filter as defense in depth.

Centered result artwork

Every entity in the immutable result trail uses the same 5:4 frame. The documentary image is fully visible and centered with contain; a soft full-frame version of the same source fills the remaining space. This keeps portrait, square, and panoramic sources readable across desktop and mobile without turning the route cards into mismatched aspect ratios.

Varied, viewport-centered landing

The landing route sheet now samples ten reviewed four-move connections spanning all ten atlas categories, replacing a small set clustered around Hokusai and the United Kingdom. The landing layout allocates the viewport below the full header between its centered hero and footer, keeping both shell edges visible when the content fits while retaining normal page scrolling on shorter or narrower screens.

The former waypoint list is now a compact atlas field map with grid references, paper folds, contours, and a dashed expedition line. Its geometry is generated locally from the stable route number, so a featured route always receives the same composition while different routes retain their own map. These are explicitly decorative atlas coordinates rather than latitude and longitude; the landing page does not claim that knowledge connections are geographic and makes no runtime data or model request.

The round introduction also repeats the atlas category above the start and goal cards. The category therefore stays visible through the endpoint reveal instead of appearing only during the opening animation phase.

Decision-to-destination spacing

The gameplay map now groups ordinary decision stages more tightly with deterministic 26rem column steps. A distant goal marker sits beyond a separate 52rem terminal gap, giving the destination more visual importance without making the explored route feel sparse. Once the goal is directly reachable, it remains in the ordinary choice column because it is then part of the active decision. The shared board geometry also expands the navigable world, so camera clamping and Fit Map include the wider destination spacing automatically.

Current and destination cards now connect directly to their map tokens. The current card's right edge covers the left half of the red token, while the distant-goal card's left edge covers the right half of the ochre token. Both cards are vertically centered on that shared route anchor, so outgoing and incoming lines no longer appear detached beneath the endpoint cards. The whole current card is also an inspection target, giving touch users a reliable full-card hit area.

The redundant explanatory sentence beneath the results-page Cartographer's note was removed, leaving the generated route recap as the note's only body copy.

Compact map utility rail

Desktop and tablet route count and map help now sit at the top right of a shorter map header. The ordinary instruction sentence remains available to assistive technology without consuming layout space. A narrow rail on the right holds zoom, Fit map, and Current at the top, then distributes Compass, Lens, and Map fragment in a compact stack below one short divider. Hint score costs remain visible, while explanatory copy uses inward-opening hover and keyboard-focus tooltips. Icon-only map navigation, borderless hint actions, and the absence of a rail outline keep the utility column visually quiet. The node canvas is free of persistent visible controls, and latest-hint feedback floats beside the rail without changing the map dimensions or intercepting node input. Phone layouts retain the compact canvas toolbar and bottom hint dock.

The README frontispiece and Solo-map screenshots were recaptured from the rebuilt Compose surface. The Solo image records a fresh United Nations to Cold War round and retains the matching Commons credits in the screenshot provenance ledger.

Density-aware vertical lanes

Ordinary map nodes now use gently adaptive vertical spacing. Sparse one- and two-route frontiers keep 11rem between lane anchors; every additional route trims 0.5rem until the spacing reaches a 9rem floor at six routes. Dense decision columns therefore sit slightly nearer together without changing horizontal progression, the wider destination gap, or deterministic placement. The board height and Fit Map bounds continue to derive from the same layout geometry.

Phone route constellation

Phone-width gameplay now projects the same deterministic graph into a top-to-bottom atlas while packing each live frontier into a compact two-column constellation. The current entity remains the only full card; history and the distant goal use compact labels, and reachable choices become small route bubbles. The first selection highlights a bubble, opens one detail tray with the full fact, artwork, and explicit Move, Check, or Finish action, and exposes a small action indicator beside the selected bubble. That preview is ephemeral UI state and sends no command. Selecting the same bubble again confirms through the same existing command as the tray action; selecting another bubble only switches the preview.

Moving forward pans the newest current stage toward the upper portion of the phone canvas and keeps the compact frontier in view. Desktop and tablet retain the established left-to-right layout and direct full-card actions. Node identity, links, commands, and scoring are unchanged, while crossing the phone breakpoint clears any stale preview, selects the appropriate presentation, and refits the viewport against its geometry.

Short-phone canvas recovery

Phones at or below both 32rem wide and 42rem tall now use a 3rem inner-route header and a single-row active HUD so the route constellation receives more canvas height. Live, Time, Moves, Par, and Score remain visible; full status and mode text remains available to assistive technology. Back and header controls preserve 44px touch targets while the compact surrounding chrome returns its recovered space to the playable graph. The ordinary-decision map header now follows the same density rule: only Your move remains visible, while Where do you go next? continues to name the region for assistive technology. Compass and branch-recovery questions stay expanded. On the rebuilt Compose surface at 320×568, the map header measures 49px and the node canvas grows from 314px to 347px with no document overflow.

Inline route Back confirmation

The immediately previous active-route node now doubles as a lightweight Back control on desktop, tablet, and phone layouts. One activation arms the node with a red Back indicator without spending a move; activating it again sends the existing Back command. Older breadcrumbs and abandoned branches remain inspection-only, while the HUD button and keyboard shortcut are unchanged. Phone stage fitting now keeps the previous node visible with the current entity and reachable frontier, and pointer activation no longer triggers the keyboard-only focus reveal that could move a node between press and release.

Unified desktop map frame

Desktop and tablet maps now continue the rounded header outline around the complete canvas and utility rail instead of ending the right border below the header and rounding only the canvas. The canvas no longer draws a competing inner frame at these widths, leaving one continuous perimeter around the full game surface. Phone layouts retain their edge-to-edge treatment.

Rail-contained hint feedback

The latest hint no longer floats over map nodes. Desktop and tablet place the feedback as a compact status block beneath the vertical hint tools, while phone layouts keep it inside the bottom hint dock. The message remains live and readable without occupying or intercepting the playable canvas.

Verification

The final release gate covers formatting, linting, Python and TypeScript type checks, unit and data-quality tests, strict documentation, production builds, and desktop/mobile browser flows. The active immutable manifest and canonical Compose surface are also verified before release.

Production domain readiness

The deployment verifier now accepts the graph schema v3 used by the pipeline and API instead of rejecting the current reviewed bundle as legacy-incompatible. A focused regression test covers the accepted version and rejects older or unknown schemas. Production Caddy configuration also supports one explicit non-canonical HTTPS address, permanently redirecting it to the configured canonical site without duplicating application origins or cookie scope.

Production now includes a pinned, self-hosted Umami service and isolated PostgreSQL volume behind stats.webwoven.org. The browser adapter honors Do Not Track, excludes query strings and hashes, and sends only page views plus five fixed aggregate gameplay events. A runtime allowlist prevents identifiers or unexpected free-form properties from leaving the client. Umami telemetry, external calls, public sharing, heatmaps, and replay remain disabled.

The public /privacy page documents the exact collection boundary. Deployment rotates the default dashboard password and creates the fixed website record before exposing Caddy. A daily 90-day retention task and a separate private analytics-database backup extend the existing operational controls without making analytics a gameplay dependency.

Production bootstrap now waits for the analytics health check before rotating credentials or creating the website, removing the startup race observed during the first VPS rollout. The analytics host also returns a standards-correct multiline robots.txt that disallows crawling.

Build Week midpoint repository refresh

The public repository now reflects the deployed product instead of the original implementation forecast. The README links directly to the live game, technical docs, and privacy boundary; it also records what is already live and what remains for the second half of Build Week.

Compose acceptance at http://localhost was rebuilt and captured at 1280×720 desktop and 390×844 phone widths. The frontispiece and desktop Solo images were refreshed, and a new phone screenshot documents the two-tap route preview using the same real United Nations to Cold War session. The screenshot ledger preserves the corresponding Commons attribution.

A new midpoint system map documents both halves of the architecture: the production Caddy, Svelte, FastAPI, SQLite, PostgreSQL, Valkey, and Umami request path, and the offline Wikidata/Commons acquisition, normalization, validation, and compilation pipeline. Deployment docs now name the live canonical, redirect, and analytics hosts, while delivery docs distinguish the deployed core from the remaining accessibility, security, load, content-review, and submission work.

The refresh passes the complete local gate: 134 web unit tests, 347 Python tests, strict MkDocs, formatting, lint, type checks, and all 32 desktop/mobile Playwright flows. The rebuilt Compose architecture page was also inspected at http://localhost/docs/architecture/system-map/; the SVG, navigation, and tables render correctly with no browser warnings or errors.

Optional category routes

Solo setup and Lobby creation now share one compact category picker. Any category preserves the existing automatic pool, while one of the ten canonical topics filters both endpoints and still allows the route itself to cross the wider knowledge graph. Category and difficulty preferences are remembered independently for Solo and Multiplayer; the lobby host's choices are locked when the lobby pins its round, and joiners see the resulting category without being able to alter it. Daily assignments remain unchanged.

The room-creation contract accepts the same optional category filter that Solo sessions already supported, and both modes use the existing history-aware round selector. No room schema migration is needed because the room continues to persist only its immutable round ID.

The current pack has two Easy routes and one Normal and Hard route per topic. Expanding those category-and-difficulty combinations remains a separate content milestone.

Verification passes 139 web unit tests, 348 Python tests, strict documentation, and all 32 desktop/mobile Playwright flows. The rebuilt Compose surface at http://localhost was then checked at desktop and 390×844 phone sizes: Science & Technology Solo selected Alan Turing → computer, Film & Media lobby creation pinned The Godfather → Walt Disney, both mode-specific preferences survived navigation, and the browser reported no warnings or errors.