clone

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

Plan mechanics delivery through shared lifecycle and codec

Dami committed d81b474
commit
d81b474e76f896a7d2f63c5ef6ba000010dff9f7
parent
5c49232565d1183a48881a71d5d01e5fcd778be1
author
Dami <dami.etoile@gmail.com>
1 file changed, +14 -3
Mdocs/architecture-review.md17++++++++++++++---
M docs/architecture-review.md +14 -3
@@ -101,9 +101,20 @@ The concurrent designer controls `docs/design.md` and `docs/design.html`; the wo
101101 102102 2026-09-23. The initial refactor is complete. The active work now has separate OpenSpec tracks, so engine semantics, content, and presentation can be accepted independently:103103 104-1. **D22 motion:** finish Gift and Workshop scene transitions, verify mobile touch targets against rendered geometry, obtain designer acceptance for Win, then run the public scene/share flow before updating the stable preview. `src/stage/events.js` now owns DOM input wiring outside `stage.js`; the Pause hit map follows its visible tile rectangles, including inert 14px gaps.105-2. **W3 solver and W2 world handoff:** the compact, fast solver includes object nouns and automata phases in its versioned state key and reuses authoritative turn phases. A sequential `check:worlds` gate covers core, Crate Works, Tidewater, and Clockwork while Crossword is revised for W6. The first core proof 02 failed its author contract under PUSH-over-STOP; its corrected lesson is `Stuck at the end`, where removing `ROCK IS PUSH` clears the jam. Finish W3 only after the complete gate passes on that correction.106-3. **W6 content convergence:** rule precedence and stacked parsing are implemented and tested. The worlds team owns the Crossword rework and Tidewater `shell-game` search-space reduction; their solver checks remain open. A `LIMIT` result on a forbidden-rule search is not evidence that a rule is required.104+1. **D22 motion:** the designer accepted Pause, Win, keycap press, clipped odometer, ledger stamp, and pushed-word skid. Title, INDEX, Gift, and Workshop now have scene entry/exit motion. The public release remains gated on the full browser scene/share flow and the designer's two captured P1 regressions: default-player chrome and the DEFEAT ledger color. `src/stage/events.js` owns DOM input wiring outside `stage.js`; input stays blocked during menu exit while a later external import can retarget its destination.105+2. **W3 solver and W2 world handoff:** the compact, fast solver includes object nouns and automata phases in its versioned state key and reuses authoritative turn phases. W3 is archived after a 23/23 sequential gate. Core proof 02 now teaches removing `ROCK IS PUSH` to clear a jam, verified by exact solver and browser replay. The worlds team subsequently reworked Tidewater `shell-game`; its 11-step solution and 623,612-state forbidden-rule check pass, and the complete 23-proof gate is being repeated on that revision.106+3. **W6 content convergence:** rule precedence and stacked parsing are implemented and tested. The worlds team owns the Crossword rework. An authoring `mustForm` claim requires an UNSOLVED forbidden-rule search; a `LIMIT` alone is inconclusive.107107 4. **Mechanic stressors:** review the worlds team's channel-linked gate/plate and step-off FRAIL drafts as data contracts first. For each mechanic, require authored validation, phase order, complete snapshot/restore, compact state-key treatment, replay/Undo, settled events, and browser presentation before shipping a default proof. The designer chose a memoryless gate: after contacts, its open state derives from current plate occupancy or another thing occupying its cell, so the solver can derive it from object state rather than storing a hidden jam bit. A FRAIL leftover can be represented by a noun change; authored `leaves` follows a stable entity ID. Confirm these formulas with differential scenarios and record final choices in focused OpenSpec changes before implementation.108108 109109 The next structural cleanup should stay bounded: unify rendered hit-region geometry beyond Pause and Win, split the remaining `juice.consume()` event reducer by effect family, and consolidate overlapping mod/engine validation. Each slice needs a behavioral fixture tied to an observed risk; file length alone is not a success metric.110+111+### Next mechanic delivery sequence112+113+The three active OpenSpec changes (`add-declarative-mechanic-state-contract`, `add-channel-linked-gates`, and `add-frail-leftover-tiles`) form one ordered delivery path after the public motion release:114+115+1. Add a validated, versioned mechanic declaration and lifecycle adapter outside `engine.js`. Preserve it through CommonJS import/export, data-only links, catalog cloning, Undo, reset, restore, and complexity rollback. Reject unsupported declarations before installation.116+2. Register mechanic state with the compact solver codec before adding a concrete mechanic. Two boards with identical entities but different mechanic scalars must get different keys, while no-mechanic levels keep their current routes.117+3. Implement channel plates/gates through shared movement blocker and after-contact projection hooks. Keep openness derived from the current board rather than a hidden bit; compare public and fast transitions, then replay the Crate Works gate scenarios.118+4. Implement FRAIL departures and stable-ID `leaves` through the same lifecycle. Its future is carried by entity noun, existence, position, and authored metadata. Check handovers, word/automaton departures, SINK contacts, Undo, share, and solver replay against Tidewater fixtures.119+120+Gate and FRAIL presentation and default-world bundling follow differential engine fixtures and designer review. This order keeps mechanic-specific branches out of the turn coordinator and preserves the single authoritative transition path.