- commit
- d81b474e76f896a7d2f63c5ef6ba000010dff9f7
- parent
- 5c49232565d1183a48881a71d5d01e5fcd778be1
- author
- Dami <dami.etoile@gmail.com>
| M | docs/ | 17 | ++++++++++++++--- |
@@ -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.