1## Source contract23This change follows the accepted D20 material in `docs/design.md` and the4designer's D20 header and world-card reviews in `docs/design-inbox.md`, dated52026-09-24. `openspec/changes/add-world-index-navigation/` owns the world view6model, request origins, world transition events, and navigation behavior. This7change consumes those values and does not recreate them from level data.89## INDEX header1011The desktop and mobile header uses this hierarchy, with 8px between lines:12131. An 11px tracked eyebrow in `--muted`: `INDEX | WORLD NN`.142. The world name in `--fg`, weight 800, at 28px on desktop.153. The world tagline in `--muted`, falling back to `walk the path, pick a16 proof`.1718The large standalone `INDEX` heading and colliding stacked world-number19heading are removed from this presentation. World completion is shown as20`★ n / N`, counted only for the active world. The header must fit its owning21region at the supported desktop and 390px mobile sizes without overlapping the22board or footer.2324On mobile, the world name may use the existing measured fitting helper and a25smaller scene-approved size when needed. This change does not alter authored26world names or the D20 world model.2728## World strip2930The desktop strip is drawn as `[Q] ◀ ● • • ▶ [E]`: keycaps flank the arrows,31arrows are 14px, dots are 10px, and the current dot uses the normalized32world's accent when one is present. Non-current dots use the neutral dot role.33The strip is a visible control and its hit geometry follows the drawn control.3435On mobile, keycaps are omitted. The arrows remain visible 44px tap targets,36with no change to the one-world-per-gesture behavior owned by D20.3738When the D20 seam reports a world switch, the sheet/camera transition uses the39existing 280ms world ease and the current dot slides between its old and new40positions over 110ms with the accepted back-ease. The dot and sheet use the41same transition start, while each keeps its own duration. Reduced motion shows42the settled dot and sheet immediately.4344## First-entry world card4546When the stage receives the D20 `world-card` request, INDEX renders the card47over the stage with the existing iris entry choreography. Its centered content48uses a 16px vertical rhythm in this order:49501. the normalized world glyph at 96px;512. `WORLD NN` eyebrow;523. world name at 32px;534. tagline at 15px muted, when present;545. `<N> proofs | ★ <completed> / <total> | by <author>`; and556. the action.5657If author is absent, the byline segment is omitted; the card never prints58`by Unknown author`. The desktop action is `[ENTER] enter world`. On mobile59or a coarse pointer, it is a full-width 48px `ENTER WORLD` button in the60world accent with no keycap.6162The card is centered on the ink-and-signal surface and preserves the existing63hard-edged card lip and Recursive font. The 2px stroke and mobile action use64the world's accent while retaining neutral card surfaces. Card text is fitted and65wrapped within the card; it must not clip at the supported desktop or mobile66sizes.6768ENTER (or the equivalent confirmed card action) dismisses the card and69returns to the settled INDEX sheet. Dismissing the card does not select or70enter a proof. The card is shown at most once per world per session, and a71Workshop PLAY request uses the same composition with its D20 `workshop` origin.72The mobile action's visible 48px button is its touch target. Reduced motion73presents the settled card immediately.7475Core declares a first-party world identity: `🐈`, `Where the rules first bend.`,76`you`, and author `Miau Is True`. This keeps the opening card out of the77fallback state used for older imported packs.7879The designer accepted the finished Core and Crossword cards on 2026-09-24 in80`docs/design-inbox.md`, including desktop and 390px Crossword captures. The81world-index browser fixture passed first entry, Workshop PLAY, four-world82navigation, touch confirmation, and reduced motion with no page errors. The83full Node suite passed 373/373, the production build passed, and the84sequential world solver gate solved all 30 proofs.8586## Mobile INDEX footer and narration8788Below 760px or on a coarse pointer, INDEX does not show keyboard keycap89instructions. Under the active proof banner it shows `tap the cat to play`,90and the bottom thumb row exposes the menu affordance (`☰ menu`). Workshop is91reached through that menu. Desktop retains the scene's drawn keycap and verb92pairs.9394The canvas accessible label includes the active world number and name, its95completed and total proof count, and the Q/E world-switch action on keyboard96layouts. While the card is open, narration names the world, tagline, author,97and the ENTER action. Pointer/touch targets and narration must refer to the98same visible controls.99100## Non-goals101102- Changing the D20 world model, ordering, progress keys, or navigation.103- Changing rule evaluation, actor movement, grid coordinates, or simulation104 snapshots.105- Adding a new world identity validator or changing pack share data.106- Changing the board's map geometry or proof solving behavior.