clone

a browser grid puzzle game where you push words around to rewrite the rules of each level

main
miau-is-true / openspec / changes / archive / 2026-09-24-add-world-index-navigation / tasks.md
tasks.md 3.7K source

1. World identity and pack validation

  • [x] 1.1 Extend the normalized pack/catalog record with one world record per pack, including stable order, origin, author, level count, and per-world completion counts.
  • [x] 1.2 Validate manifest.world.glyph with Intl.Segmenter grapheme counting and the 16 UTF-16-unit cap; validate tagline length, newlines, sentence case, and U+00B7; validate accent against the closed token set, including tick. Emit nonblocking W11 notes and normalized fallback metadata for invalid optional identity fields.
  • [x] 1.3 Add focused tests for valid metadata, grapheme and UTF-16 edge cases, each invalid field, the exact middle-dot diagnostic, absent metadata, gameplay-field rejection, replacement position, imported registration order, fork append order, and removal of an imported world.
  • [x] 1.4 Add a pack-service/share view assertion that world metadata is exposed without changing pack IDs, level IDs, or share collision behavior.

2. World-owned INDEX layout

  • [x] 2.1 Remove origin/ID-based bundled grouping from src/scenes/map.js and create one chapter group and sheet range for every pack, including core.
  • [x] 2.2 Expose worlds, worldId, and world-local sheet links while keeping existing node coordinates, IDs, and fifteen-cell serpentine layout stable.
  • [x] 2.3 Add tests for a one-sheet world, a multi-sheet world, sheet boundaries, world boundaries, empty packs, and deterministic registration order.
  • [x] 2.4 Update layout callers and accessibility text to use the active world identity rather than deriving world names from the active level.

3. World navigation and progress

  • [x] 3.1 Add Q/E, gamepad LB/RB, and one-per-gesture two-finger swipe actions to the INDEX navigator with no-op feedback at the outer boundaries.
  • [x] 3.2 Make path traversal cross adjacent world boundaries only at the terminal/initial node in the corresponding travel direction, without wraparound or accidental jumps between nearby cells.
  • [x] 3.3 Preserve a cursor per world, choose that cursor or the first available node on entry, and keep proof unlocking and completion counts scoped to the active pack ID.
  • [x] 3.4 Add focused navigator/progress tests for Q/E, edge traversal, boundary no-ops, locked openers, solved counts, undo/restart isolation, and removal of the active imported world.

4. Presentation handoff seam

  • [x] 4.1 Expose the pure world header/strip view model and stable transition events without changing canvas grid geometry or simulation state.
  • [x] 4.2 Emit a first-entry world-card request and a Workshop PLAY card origin; deduplicate repeated requests within a session and preserve the active node.
  • [x] 4.3 Add accessible text coverage for world number/name, per-world completion, adjacent-world actions, and card ENTER/return state.
  • [x] 4.4 Leave final card/header geometry, font fitting, iris animation, and copy to a separate designer-reviewed presentation change; post the seam evidence to docs/design-inbox.md before implementing that follow-up.

5. Verification and handoff

  • [x] 5.1 Run the focused catalog, map, navigator, and progress tests.
  • [x] 5.2 Run the complete Node suite, bundled-world solver gate, production build, and desktop/mobile browser checks for INDEX, world switching, locked nodes, Workshop PLAY, and share import.
  • [x] 5.3 Confirm the map implementation no longer relies on the old paragraph that grouped built-ins on sheet 1; update the live game-presentation and level-packs specs only when implementation is complete.
  • [x] 5.4 Post navigation and metadata screenshots/logs to both team inboxes, obtain designer review for the presentation seam, and record the final world order and pack validation result before archiving this change.