Why
Crate Works needs pressure plates and gates as a real Sokoban stressor for the engine. The mechanic must make a crate on a plate readable, support words and multiple YOU objects as pressers, and preserve rule-driven transformations of the gate and plate nouns. It also needs to survive the same boundaries as every future mechanic: contacts, Undo, restore, sharing, and solver replay.
What Changes
- Add channel metadata to authored objects and validate it against the host channel palette.
- Treat current-noun
PLATEandGATEentities as channel-linked circuit members while retaining the authored channel on their stable entity IDs. - Make plate pressure occupancy-based and recompute gate openness at the end of each turn after contacts.
- Make a closed gate an unconditional movement blocker using the prior settled
state; never add a synthetic
GATE IS STOPrule. - Define jammed gates, transformed-away gates, channel isolation, and settled
gateChanged/plateChangedevents. - Preserve channel metadata through reset, Undo, restore, CommonJS export, pack installation, data-only sharing, and solver parity.
The change does not implement switches with edge-triggered toggles, crushing,
custom gate predicates, or visual styling beyond the neutral shape marker
contract. It assumes the declarative mechanic state foundation in
9e91d42; this change adds gate behavior on that foundation.
Capabilities
New Capabilities
channel-linked-gates: occupancy plates, channel linking, unconditional closed-gate blocking, memoryless jam behavior, and mechanic events.
Modified Capabilities
None.
Impact
The engine movement/contact phases, object and mod schemas, normalized pack and sharing paths, settled events, solver fixtures, and board presentation data will change. Existing levels without channel metadata remain unchanged. Gate and plate visuals are consumed by the design-owned renderer after the engine contract is accepted.