clone

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

Record shared schema boundary and mechanic seam

Dami committed ffac560
commit
ffac560c01710c33893036b274873ae0d393dc0d
parent
4a8d37159c5bebf31bb14b949907329dd7624bcd
author
Dami <dami.etoile@gmail.com>
1 file changed, +25 -0
Mdocs/architecture-review.md25+++++++++++++++++++++++++
M docs/architecture-review.md +25 -0
@@ -152,3 +152,28 @@ casing, cue emptiness, and sound names. A single pure normalizer should feed
152152 direct games, trusted modules, and data-only shares, with caller-specific153153 error adapters and parity fixtures. That work precedes new gates and FRAIL154154 runtime behavior so their authored fields do not multiply validator drift.155+156+### Shared schema boundary and next mechanic seam157+158+2026-09-24. `2950532` puts standalone engine levels, CommonJS packs, and159+data-only shared packs through `src/level-schema.js`. It canonicalizes object160+kinds, tokens, and automaton steps while retaining pack-only identity/size161+limits as a profile. Direct, module, and shared errors carry the same structural162+issue code/path in caller-specific envelopes. `4a8d371` rejects conflicting163+object fields and falsey explicit kinds so normalization cannot silently drop164+authored data. Catalog and Gift preview metadata cross a separate165+`playableLevelFromView()` adapter before game creation. The full 388-test Node166+suite, production build, D20 world-index browser flow, and Gift/Workshop/share167+browser flow pass without page errors; the sequential world solver is the168+remaining release gate.169+170+The next bounded implementation is the accepted declarative mechanic171+foundation. Its registry must distinguish derived projections from truly172+stateful scalar data. Gate `pressed`, `open`, and `jammed` derive from current173+occupancy and nouns; FRAIL crumble derives from authoritative object movement,174+existence, noun, and static `leaves` metadata. Neither may add a hidden solver175+bit. A stateful future mechanic must register every dynamic scalar in the176+codec and survive accepted/rejected turns, Undo, reset, restore, and public/fast177+parity. The level schema currently rejects `mechanics`, `channel`, and `leaves`178+until that lifecycle is in place. The worlds team is preparing D1–D3 gate and179+Tidewater FRAIL data-only fixtures for the differential gate.