clone

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

Record noun-mapped FRAIL architecture and fixtures

Dami committed 8401593
commit
840159391c0e69b0ba41b963aa1ab9313e895a24
parent
850285a30d9860373868a94977d9400474413af4
author
Dami <dami.etoile@gmail.com>
1 file changed, +9 -8
Mdocs/architecture-review.md17+++++++++--------
M docs/architecture-review.md +9 -8
@@ -104,7 +104,7 @@ The concurrent designer controls `docs/design.md` and `docs/design.html`; the wo
104104 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.105105 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.106106 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.107-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.107+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 is represented by a noun change; a level-scoped map selects the next noun from the object's current noun. 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.110110
@@ -115,7 +115,7 @@ The three active OpenSpec changes (`add-declarative-mechanic-state-contract`, `a
115115 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.116116 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.117117 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.118+4. Implement FRAIL departures and the level-scoped noun map through the same lifecycle. Its future is carried by entity noun, existence, position, and the static map. Check handovers, word/automaton departures, SINK contacts, Undo, share, and solver replay against Tidewater fixtures.119119 120120 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.121121
@@ -172,9 +172,10 @@ The next bounded implementation is the accepted declarative mechanic
172172 foundation. Its registry must distinguish derived projections from truly173173 stateful scalar data. Gate `pressed`, `open`, and `jammed` derive from current174174 occupancy and nouns; FRAIL crumble derives from authoritative object movement,175-existence, noun, and static `leaves` metadata. Neither may add a hidden solver176-bit. A stateful future mechanic must register every dynamic scalar in the177-codec and survive accepted/rejected turns, Undo, reset, restore, and public/fast178-parity. The level schema currently rejects `mechanics`, `channel`, and `leaves`179-until that lifecycle is in place. The worlds team is preparing D1–D3 gate and180-Tidewater FRAIL data-only fixtures for the differential gate.175+existence, noun, and a static level-scoped current-noun map. Neither may add a176+hidden solver bit. A stateful future mechanic must register every dynamic177+scalar in the codec and survive accepted/rejected turns, Undo, reset, restore,178+and public/fast parity. The level schema rejects undeclared `mechanics` and179+object-level `leaves`; it will admit host-supported declarations and gate180+`channel` metadata through the mechanic registry. The worlds team's six181+data-only gate and FRAIL fixtures are committed for differential replay.