clone

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

Add derived gate regression fixtures

Dami committed 01ae95a
commit
01ae95ab41a2dabe8634d980f677ea4df04b5409
parent
d0b547609564020e0cfe3945894d035edd4f55a5
author
Dami <dami.etoile@gmail.com>
2 files changed, +1644 -9
Mdocs/worlds/crate-works.md53+-
Adocs/worlds/fixtures/gates.json1600++++++++++++++++++++++++++++++
M docs/worlds/crate-works.md +44 -9
@@ -261,12 +261,14 @@ board([
261261 ], { id: 'hand-off' });262262 ```263263 264-After `CRATE AND MIAU IS YOU`, the crate walks right onto the plate while the265-cat walks its room. On the turn the crate lands, the gate is still closed266-during movement and opens at end of turn. The cat passes on the *next* `R`,267-and the crate stays on the plate because the wall at the end of its lane268-absorbs the move. If the crate isn't `PUSH` (it isn't here), only269-"anything presses" makes this work.264+After `CRATE AND MIAU IS YOU`, the crate walks right onto the plate (turn265+12) while the cat walks its room. The crate then stays on the plate because266+the wall at the end of its lane absorbs the move, and the cat crosses. The267+crate isn't `PUSH`, so only "anything presses" makes this work. The shortest268+route never bumps the closed gate. The fixture's `same-turn-block` probe269+(`LLUDRURRRRURRRRR`) covers that case. On turn 13 the crate lands on the plate270+while the cat, next to the gate, is refused. The gate opens at the end of the271+turn, and the cat crosses on turn 14.270272 271273 ### Draft D3: Jam (a gate never closes on an occupant)272274
@@ -282,9 +284,14 @@ board([
282284 ], { id: 'jam' });283285 ```284286 285-Push the crate over the plate and through the gate. The crate and then the286-cat keep the gate occupied as the plate empties, so it stays open. This also287-shows the authoring hazard: an adjacent plate makes the gate trivial.287+There is no `CRATE IS PUSH`, so the crate is inert and the cat walks through288+it. (An earlier version of this paragraph said the crate is pushed, which was289+wrong. The route is the same.) The cat presses the plate itself (turn 4), and290+the gate opens at the end of that turn. It steps into the gate (turn 5): the291+plate is now empty but the cell is occupied, so the gate is open and jammed292+rather than closing on the cat. When the cat steps out (turn 6), the gate293+closes behind it. This also shows the authoring hazard: a plate next to its294+own gate lets a lone YOU skip the circuit.288295 289296 ### Undo, reset, sharing, and solver requirements290297
@@ -313,5 +320,33 @@ shows the authoring hazard: an adjacent plate makes the gate trivial.
313320 identical. (The prototype's per-gate key character is superseded. It was314321 only needed while gates carried a hidden bit.) The D1 to D3 drafts remain315322 useful as regression fixtures for the engine's derived semantics.323+- **Regression fixtures.** D1 to D3 are exported as data at324+ [`fixtures/gates.json`](fixtures/gates.json), with routes and observations325+ re-derived under the derived semantics. None of the three shortest routes326+ changed from the stored-bit prototype: D1 `LURRURDDURRRRRR` (15), D2327+ `LUDLURRRRRURRRR` (15), D3 `RRRRRRR` (7). Format of each entry:328+ - `level`: `{ id, width, height, mechanics, objects }`. Every object has an329+ explicit, readable, stable id: `d1-gate-a`, `d1-plate-a`, or330+ `d1-<noun>-<x>-<y>` and `d1-word-<text>-<x>-<y>` for everything else, where331+ x and y are the starting cell. PLATE and GATE objects carry332+ `channel: 'amber'`.333+ - `mechanics`: the minimal declaration334+ `[{ id: 'gates', type: 'channel-gates', version: 1, channels: ['amber'] }]`.335+ `type` names the host mechanic, and `channels` lists the channel palette336+ entries the level uses, so a loader can reject a channel with no337+ declaration. The mechanic is derived, so it declares no state.338+ - `expectedRoute`: the shortest winning route under the derived semantics.339+ `routeChangedFromStoredBitPrototype` is `false` for all three.340+ - `observations`: the gate and plate projections after turn 0, after every341+ turn where any `open`, `jammed`, or `pressed` value changes, and after the342+ winning turn. Entries are `{ afterTurn, move, gates: [{ id, open, jammed }],343+ plates: [{ id, pressed }], won }`. An entry also gets344+ `refusedByClosedGate: [ids]` when a YOU was refused by a closed gate on a345+ turn that was otherwise accepted.346+ - `probes` (D2 only): extra non-shortest routes that exercise a rule. Each347+ probe has the same observation format.348+ - The engine currently rejects `channel` and `mechanics`, so these fixtures349+ are for the upcoming implementation. They were generated with350+ `/tmp/cw/gen-gates.mjs` on the derived prototype `/tmp/cw/sim-gate.mjs`.316351 - **Events.** `settled()` should report `gates: [{ id, from, to, cause:317352 'pressed' | 'released' | 'jammed' }]` so juice and audio can react.
A docs/worlds/fixtures/gates.json +1600 -0
@@ -0,0 +1,1600 @@
1+[2+ {3+ "id": "door-stop",4+ "title": "Door stop",5+ "level": {6+ "id": "door-stop",7+ "width": 12,8+ "height": 9,9+ "mechanics": [10+ {11+ "id": "gates",12+ "type": "channel-gates",13+ "version": 1,14+ "channels": [15+ "amber"16+ ],17+ "state": "derived"18+ }19+ ],20+ "objects": [21+ {22+ "id": "d1-word-miau-0-0",23+ "kind": "word",24+ "text": "MIAU",25+ "x": 0,26+ "y": 027+ },28+ {29+ "id": "d1-word-is-1-0",30+ "kind": "word",31+ "text": "IS",32+ "x": 1,33+ "y": 034+ },35+ {36+ "id": "d1-word-you-2-0",37+ "kind": "word",38+ "text": "YOU",39+ "x": 2,40+ "y": 041+ },42+ {43+ "id": "d1-word-wall-4-0",44+ "kind": "word",45+ "text": "WALL",46+ "x": 4,47+ "y": 048+ },49+ {50+ "id": "d1-word-is-5-0",51+ "kind": "word",52+ "text": "IS",53+ "x": 5,54+ "y": 055+ },56+ {57+ "id": "d1-word-stop-6-0",58+ "kind": "word",59+ "text": "STOP",60+ "x": 6,61+ "y": 062+ },63+ {64+ "id": "d1-word-crate-8-0",65+ "kind": "word",66+ "text": "CRATE",67+ "x": 8,68+ "y": 069+ },70+ {71+ "id": "d1-word-is-9-0",72+ "kind": "word",73+ "text": "IS",74+ "x": 9,75+ "y": 076+ },77+ {78+ "id": "d1-word-push-10-0",79+ "kind": "word",80+ "text": "PUSH",81+ "x": 10,82+ "y": 083+ },84+ {85+ "id": "d1-word-gap-0-2",86+ "kind": "word",87+ "text": "GAP",88+ "x": 0,89+ "y": 290+ },91+ {92+ "id": "d1-word-is-1-2",93+ "kind": "word",94+ "text": "IS",95+ "x": 1,96+ "y": 297+ },98+ {99+ "id": "d1-word-sink-2-2",100+ "kind": "word",101+ "text": "SINK",102+ "x": 2,103+ "y": 2104+ },105+ {106+ "id": "d1-wall-0-3",107+ "kind": "object",108+ "noun": "WALL",109+ "x": 0,110+ "y": 3111+ },112+ {113+ "id": "d1-wall-1-3",114+ "kind": "object",115+ "noun": "WALL",116+ "x": 1,117+ "y": 3118+ },119+ {120+ "id": "d1-wall-2-3",121+ "kind": "object",122+ "noun": "WALL",123+ "x": 2,124+ "y": 3125+ },126+ {127+ "id": "d1-wall-3-3",128+ "kind": "object",129+ "noun": "WALL",130+ "x": 3,131+ "y": 3132+ },133+ {134+ "id": "d1-wall-4-3",135+ "kind": "object",136+ "noun": "WALL",137+ "x": 4,138+ "y": 3139+ },140+ {141+ "id": "d1-wall-5-3",142+ "kind": "object",143+ "noun": "WALL",144+ "x": 5,145+ "y": 3146+ },147+ {148+ "id": "d1-wall-6-3",149+ "kind": "object",150+ "noun": "WALL",151+ "x": 6,152+ "y": 3153+ },154+ {155+ "id": "d1-wall-7-3",156+ "kind": "object",157+ "noun": "WALL",158+ "x": 7,159+ "y": 3160+ },161+ {162+ "id": "d1-wall-8-3",163+ "kind": "object",164+ "noun": "WALL",165+ "x": 8,166+ "y": 3167+ },168+ {169+ "id": "d1-wall-9-3",170+ "kind": "object",171+ "noun": "WALL",172+ "x": 9,173+ "y": 3174+ },175+ {176+ "id": "d1-wall-10-3",177+ "kind": "object",178+ "noun": "WALL",179+ "x": 10,180+ "y": 3181+ },182+ {183+ "id": "d1-wall-11-3",184+ "kind": "object",185+ "noun": "WALL",186+ "x": 11,187+ "y": 3188+ },189+ {190+ "id": "d1-wall-0-4",191+ "kind": "object",192+ "noun": "WALL",193+ "x": 0,194+ "y": 4195+ },196+ {197+ "id": "d1-wall-6-4",198+ "kind": "object",199+ "noun": "WALL",200+ "x": 6,201+ "y": 4202+ },203+ {204+ "id": "d1-word-truck-7-4",205+ "kind": "word",206+ "text": "TRUCK",207+ "x": 7,208+ "y": 4209+ },210+ {211+ "id": "d1-word-is-8-4",212+ "kind": "word",213+ "text": "IS",214+ "x": 8,215+ "y": 4216+ },217+ {218+ "id": "d1-word-win-9-4",219+ "kind": "word",220+ "text": "WIN",221+ "x": 9,222+ "y": 4223+ },224+ {225+ "id": "d1-wall-10-4",226+ "kind": "object",227+ "noun": "WALL",228+ "x": 10,229+ "y": 4230+ },231+ {232+ "id": "d1-wall-11-4",233+ "kind": "object",234+ "noun": "WALL",235+ "x": 11,236+ "y": 4237+ },238+ {239+ "id": "d1-wall-0-5",240+ "kind": "object",241+ "noun": "WALL",242+ "x": 0,243+ "y": 5244+ },245+ {246+ "id": "d1-crate-2-5",247+ "kind": "object",248+ "noun": "CRATE",249+ "x": 2,250+ "y": 5251+ },252+ {253+ "id": "d1-crate-4-5",254+ "kind": "object",255+ "noun": "CRATE",256+ "x": 4,257+ "y": 5258+ },259+ {260+ "id": "d1-gate-a",261+ "kind": "object",262+ "noun": "GATE",263+ "x": 6,264+ "y": 5,265+ "channel": "amber"266+ },267+ {268+ "id": "d1-gap-8-5",269+ "kind": "object",270+ "noun": "GAP",271+ "x": 8,272+ "y": 5273+ },274+ {275+ "id": "d1-truck-10-5",276+ "kind": "object",277+ "noun": "TRUCK",278+ "x": 10,279+ "y": 5280+ },281+ {282+ "id": "d1-wall-11-5",283+ "kind": "object",284+ "noun": "WALL",285+ "x": 11,286+ "y": 5287+ },288+ {289+ "id": "d1-wall-0-6",290+ "kind": "object",291+ "noun": "WALL",292+ "x": 0,293+ "y": 6294+ },295+ {296+ "id": "d1-miau-2-6",297+ "kind": "object",298+ "noun": "MIAU",299+ "x": 2,300+ "y": 6301+ },302+ {303+ "id": "d1-wall-6-6",304+ "kind": "object",305+ "noun": "WALL",306+ "x": 6,307+ "y": 6308+ },309+ {310+ "id": "d1-wall-7-6",311+ "kind": "object",312+ "noun": "WALL",313+ "x": 7,314+ "y": 6315+ },316+ {317+ "id": "d1-wall-8-6",318+ "kind": "object",319+ "noun": "WALL",320+ "x": 8,321+ "y": 6322+ },323+ {324+ "id": "d1-wall-9-6",325+ "kind": "object",326+ "noun": "WALL",327+ "x": 9,328+ "y": 6329+ },330+ {331+ "id": "d1-wall-10-6",332+ "kind": "object",333+ "noun": "WALL",334+ "x": 10,335+ "y": 6336+ },337+ {338+ "id": "d1-wall-11-6",339+ "kind": "object",340+ "noun": "WALL",341+ "x": 11,342+ "y": 6343+ },344+ {345+ "id": "d1-wall-0-7",346+ "kind": "object",347+ "noun": "WALL",348+ "x": 0,349+ "y": 7350+ },351+ {352+ "id": "d1-plate-a",353+ "kind": "object",354+ "noun": "PLATE",355+ "x": 4,356+ "y": 7,357+ "channel": "amber"358+ },359+ {360+ "id": "d1-wall-6-7",361+ "kind": "object",362+ "noun": "WALL",363+ "x": 6,364+ "y": 7365+ },366+ {367+ "id": "d1-wall-7-7",368+ "kind": "object",369+ "noun": "WALL",370+ "x": 7,371+ "y": 7372+ },373+ {374+ "id": "d1-wall-8-7",375+ "kind": "object",376+ "noun": "WALL",377+ "x": 8,378+ "y": 7379+ },380+ {381+ "id": "d1-wall-9-7",382+ "kind": "object",383+ "noun": "WALL",384+ "x": 9,385+ "y": 7386+ },387+ {388+ "id": "d1-wall-10-7",389+ "kind": "object",390+ "noun": "WALL",391+ "x": 10,392+ "y": 7393+ },394+ {395+ "id": "d1-wall-11-7",396+ "kind": "object",397+ "noun": "WALL",398+ "x": 11,399+ "y": 7400+ },401+ {402+ "id": "d1-wall-0-8",403+ "kind": "object",404+ "noun": "WALL",405+ "x": 0,406+ "y": 8407+ },408+ {409+ "id": "d1-wall-1-8",410+ "kind": "object",411+ "noun": "WALL",412+ "x": 1,413+ "y": 8414+ },415+ {416+ "id": "d1-wall-2-8",417+ "kind": "object",418+ "noun": "WALL",419+ "x": 2,420+ "y": 8421+ },422+ {423+ "id": "d1-wall-3-8",424+ "kind": "object",425+ "noun": "WALL",426+ "x": 3,427+ "y": 8428+ },429+ {430+ "id": "d1-wall-4-8",431+ "kind": "object",432+ "noun": "WALL",433+ "x": 4,434+ "y": 8435+ },436+ {437+ "id": "d1-wall-5-8",438+ "kind": "object",439+ "noun": "WALL",440+ "x": 5,441+ "y": 8442+ },443+ {444+ "id": "d1-wall-6-8",445+ "kind": "object",446+ "noun": "WALL",447+ "x": 6,448+ "y": 8449+ },450+ {451+ "id": "d1-wall-7-8",452+ "kind": "object",453+ "noun": "WALL",454+ "x": 7,455+ "y": 8456+ },457+ {458+ "id": "d1-wall-8-8",459+ "kind": "object",460+ "noun": "WALL",461+ "x": 8,462+ "y": 8463+ },464+ {465+ "id": "d1-wall-9-8",466+ "kind": "object",467+ "noun": "WALL",468+ "x": 9,469+ "y": 8470+ },471+ {472+ "id": "d1-wall-10-8",473+ "kind": "object",474+ "noun": "WALL",475+ "x": 10,476+ "y": 8477+ },478+ {479+ "id": "d1-wall-11-8",480+ "kind": "object",481+ "noun": "WALL",482+ "x": 11,483+ "y": 8484+ }485+ ]486+ },487+ "expectedRoute": "LURRURDDURRRRRR",488+ "routeChangedFromStoredBitPrototype": false,489+ "observations": [490+ {491+ "afterTurn": 0,492+ "gates": [493+ {494+ "id": "d1-gate-a",495+ "open": false,496+ "jammed": false497+ }498+ ],499+ "plates": [500+ {501+ "id": "d1-plate-a",502+ "pressed": false503+ }504+ ],505+ "won": false506+ },507+ {508+ "afterTurn": 8,509+ "move": "D",510+ "gates": [511+ {512+ "id": "d1-gate-a",513+ "open": true,514+ "jammed": false515+ }516+ ],517+ "plates": [518+ {519+ "id": "d1-plate-a",520+ "pressed": true521+ }522+ ],523+ "won": false524+ },525+ {526+ "afterTurn": 15,527+ "move": "R",528+ "gates": [529+ {530+ "id": "d1-gate-a",531+ "open": true,532+ "jammed": false533+ }534+ ],535+ "plates": [536+ {537+ "id": "d1-plate-a",538+ "pressed": true539+ }540+ ],541+ "won": true542+ }543+ ],544+ "notes": "Occupancy, anything presses. The lower crate is pushed down onto d1-plate-a on turn 8; d1-gate-a opens at the end of that turn. The upper crate is then pushed into the open gate (turn 10: occupied while pressed, so open and not jammed), the cat follows it into the gate (turn 11), and the crate sinks into the gap on turn 12. Plate stays pressed to the win. No word moves, so tools/solve.mjs would report BYPASS; as shipped content it would need a rule edit."545+ },546+ {547+ "id": "hand-off",548+ "title": "Hand-off",549+ "level": {550+ "id": "hand-off",551+ "width": 11,552+ "height": 9,553+ "mechanics": [554+ {555+ "id": "gates",556+ "type": "channel-gates",557+ "version": 1,558+ "channels": [559+ "amber"560+ ],561+ "state": "derived"562+ }563+ ],564+ "objects": [565+ {566+ "id": "d2-word-wall-0-0",567+ "kind": "word",568+ "text": "WALL",569+ "x": 0,570+ "y": 0571+ },572+ {573+ "id": "d2-word-is-1-0",574+ "kind": "word",575+ "text": "IS",576+ "x": 1,577+ "y": 0578+ },579+ {580+ "id": "d2-word-stop-2-0",581+ "kind": "word",582+ "text": "STOP",583+ "x": 2,584+ "y": 0585+ },586+ {587+ "id": "d2-word-truck-4-0",588+ "kind": "word",589+ "text": "TRUCK",590+ "x": 4,591+ "y": 0592+ },593+ {594+ "id": "d2-word-is-5-0",595+ "kind": "word",596+ "text": "IS",597+ "x": 5,598+ "y": 0599+ },600+ {601+ "id": "d2-word-win-6-0",602+ "kind": "word",603+ "text": "WIN",604+ "x": 6,605+ "y": 0606+ },607+ {608+ "id": "d2-wall-0-1",609+ "kind": "object",610+ "noun": "WALL",611+ "x": 0,612+ "y": 1613+ },614+ {615+ "id": "d2-wall-1-1",616+ "kind": "object",617+ "noun": "WALL",618+ "x": 1,619+ "y": 1620+ },621+ {622+ "id": "d2-wall-2-1",623+ "kind": "object",624+ "noun": "WALL",625+ "x": 2,626+ "y": 1627+ },628+ {629+ "id": "d2-wall-3-1",630+ "kind": "object",631+ "noun": "WALL",632+ "x": 3,633+ "y": 1634+ },635+ {636+ "id": "d2-wall-4-1",637+ "kind": "object",638+ "noun": "WALL",639+ "x": 4,640+ "y": 1641+ },642+ {643+ "id": "d2-wall-5-1",644+ "kind": "object",645+ "noun": "WALL",646+ "x": 5,647+ "y": 1648+ },649+ {650+ "id": "d2-wall-6-1",651+ "kind": "object",652+ "noun": "WALL",653+ "x": 6,654+ "y": 1655+ },656+ {657+ "id": "d2-wall-7-1",658+ "kind": "object",659+ "noun": "WALL",660+ "x": 7,661+ "y": 1662+ },663+ {664+ "id": "d2-wall-8-1",665+ "kind": "object",666+ "noun": "WALL",667+ "x": 8,668+ "y": 1669+ },670+ {671+ "id": "d2-wall-9-1",672+ "kind": "object",673+ "noun": "WALL",674+ "x": 9,675+ "y": 1676+ },677+ {678+ "id": "d2-wall-10-1",679+ "kind": "object",680+ "noun": "WALL",681+ "x": 10,682+ "y": 1683+ },684+ {685+ "id": "d2-wall-0-2",686+ "kind": "object",687+ "noun": "WALL",688+ "x": 0,689+ "y": 2690+ },691+ {692+ "id": "d2-wall-8-2",693+ "kind": "object",694+ "noun": "WALL",695+ "x": 8,696+ "y": 2697+ },698+ {699+ "id": "d2-wall-9-2",700+ "kind": "object",701+ "noun": "WALL",702+ "x": 9,703+ "y": 2704+ },705+ {706+ "id": "d2-wall-10-2",707+ "kind": "object",708+ "noun": "WALL",709+ "x": 10,710+ "y": 2711+ },712+ {713+ "id": "d2-wall-0-3",714+ "kind": "object",715+ "noun": "WALL",716+ "x": 0,717+ "y": 3718+ },719+ {720+ "id": "d2-word-miau-3-3",721+ "kind": "word",722+ "text": "MIAU",723+ "x": 3,724+ "y": 3725+ },726+ {727+ "id": "d2-word-is-4-3",728+ "kind": "word",729+ "text": "IS",730+ "x": 4,731+ "y": 3732+ },733+ {734+ "id": "d2-word-you-5-3",735+ "kind": "word",736+ "text": "YOU",737+ "x": 5,738+ "y": 3739+ },740+ {741+ "id": "d2-gate-a",742+ "kind": "object",743+ "noun": "GATE",744+ "x": 8,745+ "y": 3,746+ "channel": "amber"747+ },748+ {749+ "id": "d2-truck-10-3",750+ "kind": "object",751+ "noun": "TRUCK",752+ "x": 10,753+ "y": 3754+ },755+ {756+ "id": "d2-wall-0-4",757+ "kind": "object",758+ "noun": "WALL",759+ "x": 0,760+ "y": 4761+ },762+ {763+ "id": "d2-word-crate-1-4",764+ "kind": "word",765+ "text": "CRATE",766+ "x": 1,767+ "y": 4768+ },769+ {770+ "id": "d2-word-and-2-4",771+ "kind": "word",772+ "text": "AND",773+ "x": 2,774+ "y": 4775+ },776+ {777+ "id": "d2-wall-8-4",778+ "kind": "object",779+ "noun": "WALL",780+ "x": 8,781+ "y": 4782+ },783+ {784+ "id": "d2-wall-9-4",785+ "kind": "object",786+ "noun": "WALL",787+ "x": 9,788+ "y": 4789+ },790+ {791+ "id": "d2-wall-10-4",792+ "kind": "object",793+ "noun": "WALL",794+ "x": 10,795+ "y": 4796+ },797+ {798+ "id": "d2-wall-0-5",799+ "kind": "object",800+ "noun": "WALL",801+ "x": 0,802+ "y": 5803+ },804+ {805+ "id": "d2-miau-3-5",806+ "kind": "object",807+ "noun": "MIAU",808+ "x": 3,809+ "y": 5810+ },811+ {812+ "id": "d2-wall-8-5",813+ "kind": "object",814+ "noun": "WALL",815+ "x": 8,816+ "y": 5817+ },818+ {819+ "id": "d2-wall-9-5",820+ "kind": "object",821+ "noun": "WALL",822+ "x": 9,823+ "y": 5824+ },825+ {826+ "id": "d2-wall-10-5",827+ "kind": "object",828+ "noun": "WALL",829+ "x": 10,830+ "y": 5831+ },832+ {833+ "id": "d2-wall-0-6",834+ "kind": "object",835+ "noun": "WALL",836+ "x": 0,837+ "y": 6838+ },839+ {840+ "id": "d2-wall-1-6",841+ "kind": "object",842+ "noun": "WALL",843+ "x": 1,844+ "y": 6845+ },846+ {847+ "id": "d2-wall-2-6",848+ "kind": "object",849+ "noun": "WALL",850+ "x": 2,851+ "y": 6852+ },853+ {854+ "id": "d2-wall-3-6",855+ "kind": "object",856+ "noun": "WALL",857+ "x": 3,858+ "y": 6859+ },860+ {861+ "id": "d2-wall-4-6",862+ "kind": "object",863+ "noun": "WALL",864+ "x": 4,865+ "y": 6866+ },867+ {868+ "id": "d2-wall-5-6",869+ "kind": "object",870+ "noun": "WALL",871+ "x": 5,872+ "y": 6873+ },874+ {875+ "id": "d2-wall-6-6",876+ "kind": "object",877+ "noun": "WALL",878+ "x": 6,879+ "y": 6880+ },881+ {882+ "id": "d2-wall-7-6",883+ "kind": "object",884+ "noun": "WALL",885+ "x": 7,886+ "y": 6887+ },888+ {889+ "id": "d2-wall-8-6",890+ "kind": "object",891+ "noun": "WALL",892+ "x": 8,893+ "y": 6894+ },895+ {896+ "id": "d2-wall-9-6",897+ "kind": "object",898+ "noun": "WALL",899+ "x": 9,900+ "y": 6901+ },902+ {903+ "id": "d2-wall-10-6",904+ "kind": "object",905+ "noun": "WALL",906+ "x": 10,907+ "y": 6908+ },909+ {910+ "id": "d2-wall-0-7",911+ "kind": "object",912+ "noun": "WALL",913+ "x": 0,914+ "y": 7915+ },916+ {917+ "id": "d2-crate-1-7",918+ "kind": "object",919+ "noun": "CRATE",920+ "x": 1,921+ "y": 7922+ },923+ {924+ "id": "d2-plate-a",925+ "kind": "object",926+ "noun": "PLATE",927+ "x": 7,928+ "y": 7,929+ "channel": "amber"930+ },931+ {932+ "id": "d2-wall-8-7",933+ "kind": "object",934+ "noun": "WALL",935+ "x": 8,936+ "y": 7937+ },938+ {939+ "id": "d2-wall-9-7",940+ "kind": "object",941+ "noun": "WALL",942+ "x": 9,943+ "y": 7944+ },945+ {946+ "id": "d2-wall-10-7",947+ "kind": "object",948+ "noun": "WALL",949+ "x": 10,950+ "y": 7951+ },952+ {953+ "id": "d2-wall-0-8",954+ "kind": "object",955+ "noun": "WALL",956+ "x": 0,957+ "y": 8958+ },959+ {960+ "id": "d2-wall-1-8",961+ "kind": "object",962+ "noun": "WALL",963+ "x": 1,964+ "y": 8965+ },966+ {967+ "id": "d2-wall-2-8",968+ "kind": "object",969+ "noun": "WALL",970+ "x": 2,971+ "y": 8972+ },973+ {974+ "id": "d2-wall-3-8",975+ "kind": "object",976+ "noun": "WALL",977+ "x": 3,978+ "y": 8979+ },980+ {981+ "id": "d2-wall-4-8",982+ "kind": "object",983+ "noun": "WALL",984+ "x": 4,985+ "y": 8986+ },987+ {988+ "id": "d2-wall-5-8",989+ "kind": "object",990+ "noun": "WALL",991+ "x": 5,992+ "y": 8993+ },994+ {995+ "id": "d2-wall-6-8",996+ "kind": "object",997+ "noun": "WALL",998+ "x": 6,999+ "y": 81000+ },1001+ {1002+ "id": "d2-wall-7-8",1003+ "kind": "object",1004+ "noun": "WALL",1005+ "x": 7,1006+ "y": 81007+ },1008+ {1009+ "id": "d2-wall-8-8",1010+ "kind": "object",1011+ "noun": "WALL",1012+ "x": 8,1013+ "y": 81014+ },1015+ {1016+ "id": "d2-wall-9-8",1017+ "kind": "object",1018+ "noun": "WALL",1019+ "x": 9,1020+ "y": 81021+ },1022+ {1023+ "id": "d2-wall-10-8",1024+ "kind": "object",1025+ "noun": "WALL",1026+ "x": 10,1027+ "y": 81028+ }1029+ ]1030+ },1031+ "expectedRoute": "LUDLURRRRRURRRR",1032+ "routeChangedFromStoredBitPrototype": false,1033+ "observations": [1034+ {1035+ "afterTurn": 0,1036+ "gates": [1037+ {1038+ "id": "d2-gate-a",1039+ "open": false,1040+ "jammed": false1041+ }1042+ ],1043+ "plates": [1044+ {1045+ "id": "d2-plate-a",1046+ "pressed": false1047+ }1048+ ],1049+ "won": false1050+ },1051+ {1052+ "afterTurn": 12,1053+ "move": "R",1054+ "gates": [1055+ {1056+ "id": "d2-gate-a",1057+ "open": true,1058+ "jammed": false1059+ }1060+ ],1061+ "plates": [1062+ {1063+ "id": "d2-plate-a",1064+ "pressed": true1065+ }1066+ ],1067+ "won": false1068+ },1069+ {1070+ "afterTurn": 15,1071+ "move": "R",1072+ "gates": [1073+ {1074+ "id": "d2-gate-a",1075+ "open": true,1076+ "jammed": false1077+ }1078+ ],1079+ "plates": [1080+ {1081+ "id": "d2-plate-a",1082+ "pressed": true1083+ }1084+ ],1085+ "won": true1086+ }1087+ ],1088+ "probes": [1089+ {1090+ "id": "same-turn-block",1091+ "purpose": "end-of-turn gate timing",1092+ "expectedRoute": "LLUDRURRRRURRRRR",1093+ "steps": 16,1094+ "assertions": [1095+ {1096+ "afterTurn": 13,1097+ "move": "R",1098+ "type": "refusedByClosedGate",1099+ "entityId": "d2-miau-3-5",1100+ "gateId": "d2-gate-a",1101+ "gateOpenAfterTurn": true1102+ },1103+ {1104+ "afterTurn": 14,1105+ "move": "R",1106+ "type": "enteredGate",1107+ "gateId": "d2-gate-a",1108+ "gateOpenAfterTurn": true,1109+ "jammed": false1110+ }1111+ ],1112+ "observations": [1113+ {1114+ "afterTurn": 0,1115+ "gates": [1116+ {1117+ "id": "d2-gate-a",1118+ "open": false,1119+ "jammed": false1120+ }1121+ ],1122+ "plates": [1123+ {1124+ "id": "d2-plate-a",1125+ "pressed": false1126+ }1127+ ],1128+ "won": false1129+ },1130+ {1131+ "afterTurn": 13,1132+ "move": "R",1133+ "gates": [1134+ {1135+ "id": "d2-gate-a",1136+ "open": true,1137+ "jammed": false1138+ }1139+ ],1140+ "plates": [1141+ {1142+ "id": "d2-plate-a",1143+ "pressed": true1144+ }1145+ ],1146+ "refusedByClosedGate": [1147+ "d2-miau-3-5"1148+ ],1149+ "won": false1150+ },1151+ {1152+ "afterTurn": 16,1153+ "move": "R",1154+ "gates": [1155+ {1156+ "id": "d2-gate-a",1157+ "open": true,1158+ "jammed": false1159+ }1160+ ],1161+ "plates": [1162+ {1163+ "id": "d2-plate-a",1164+ "pressed": true1165+ }1166+ ],1167+ "won": true1168+ }1169+ ]1170+ }1171+ ],1172+ "notes": "Anything presses: after CRATE AND MIAU IS YOU (turn 5) the crate walks its lane; it is YOU but not PUSH and still presses d2-plate-a (turn 12). The wall behind the plate holds the crate in place while the cat crosses the gate (turn 13) and reaches the truck. The shortest route never tries the gate while it is closed, so the probe covers end-of-turn timing: after LLUDRURRRRUR the cat stands next to the closed gate while the crate is one cell from the plate; on the next R the crate lands on the plate but the cat is refused by the gate (turn 13, refusedByClosedGate), and it crosses on the following R. Unsolvable if only PUSH things press."1173+ },1174+ {1175+ "id": "jam",1176+ "title": "Jam",1177+ "level": {1178+ "id": "jam",1179+ "width": 11,1180+ "height": 6,1181+ "mechanics": [1182+ {1183+ "id": "gates",1184+ "type": "channel-gates",1185+ "version": 1,1186+ "channels": [1187+ "amber"1188+ ],1189+ "state": "derived"1190+ }1191+ ],1192+ "objects": [1193+ {1194+ "id": "d3-word-miau-0-0",1195+ "kind": "word",1196+ "text": "MIAU",1197+ "x": 0,1198+ "y": 01199+ },1200+ {1201+ "id": "d3-word-is-1-0",1202+ "kind": "word",1203+ "text": "IS",1204+ "x": 1,1205+ "y": 01206+ },1207+ {1208+ "id": "d3-word-you-2-0",1209+ "kind": "word",1210+ "text": "YOU",1211+ "x": 2,1212+ "y": 01213+ },1214+ {1215+ "id": "d3-word-wall-4-0",1216+ "kind": "word",1217+ "text": "WALL",1218+ "x": 4,1219+ "y": 01220+ },1221+ {1222+ "id": "d3-word-is-5-0",1223+ "kind": "word",1224+ "text": "IS",1225+ "x": 5,1226+ "y": 01227+ },1228+ {1229+ "id": "d3-word-stop-6-0",1230+ "kind": "word",1231+ "text": "STOP",1232+ "x": 6,1233+ "y": 01234+ },1235+ {1236+ "id": "d3-word-truck-8-0",1237+ "kind": "word",1238+ "text": "TRUCK",1239+ "x": 8,1240+ "y": 01241+ },1242+ {1243+ "id": "d3-word-is-9-0",1244+ "kind": "word",1245+ "text": "IS",1246+ "x": 9,1247+ "y": 01248+ },1249+ {1250+ "id": "d3-word-win-10-0",1251+ "kind": "word",1252+ "text": "WIN",1253+ "x": 10,1254+ "y": 01255+ },1256+ {1257+ "id": "d3-wall-0-1",1258+ "kind": "object",1259+ "noun": "WALL",1260+ "x": 0,1261+ "y": 11262+ },1263+ {1264+ "id": "d3-wall-1-1",1265+ "kind": "object",1266+ "noun": "WALL",1267+ "x": 1,1268+ "y": 11269+ },1270+ {1271+ "id": "d3-wall-2-1",1272+ "kind": "object",1273+ "noun": "WALL",1274+ "x": 2,1275+ "y": 11276+ },1277+ {1278+ "id": "d3-wall-3-1",1279+ "kind": "object",1280+ "noun": "WALL",1281+ "x": 3,1282+ "y": 11283+ },1284+ {1285+ "id": "d3-wall-4-1",1286+ "kind": "object",1287+ "noun": "WALL",1288+ "x": 4,1289+ "y": 11290+ },1291+ {1292+ "id": "d3-wall-5-1",1293+ "kind": "object",1294+ "noun": "WALL",1295+ "x": 5,1296+ "y": 11297+ },1298+ {1299+ "id": "d3-wall-6-1",1300+ "kind": "object",1301+ "noun": "WALL",1302+ "x": 6,1303+ "y": 11304+ },1305+ {1306+ "id": "d3-wall-7-1",1307+ "kind": "object",1308+ "noun": "WALL",1309+ "x": 7,1310+ "y": 11311+ },1312+ {1313+ "id": "d3-wall-8-1",1314+ "kind": "object",1315+ "noun": "WALL",1316+ "x": 8,1317+ "y": 11318+ },1319+ {1320+ "id": "d3-wall-9-1",1321+ "kind": "object",1322+ "noun": "WALL",1323+ "x": 9,1324+ "y": 11325+ },1326+ {1327+ "id": "d3-wall-10-1",1328+ "kind": "object",1329+ "noun": "WALL",1330+ "x": 10,1331+ "y": 11332+ },1333+ {1334+ "id": "d3-wall-0-2",1335+ "kind": "object",1336+ "noun": "WALL",1337+ "x": 0,1338+ "y": 21339+ },1340+ {1341+ "id": "d3-wall-7-2",1342+ "kind": "object",1343+ "noun": "WALL",1344+ "x": 7,1345+ "y": 21346+ },1347+ {1348+ "id": "d3-wall-10-2",1349+ "kind": "object",1350+ "noun": "WALL",1351+ "x": 10,1352+ "y": 21353+ },1354+ {1355+ "id": "d3-wall-0-3",1356+ "kind": "object",1357+ "noun": "WALL",1358+ "x": 0,1359+ "y": 31360+ },1361+ {1362+ "id": "d3-miau-2-3",1363+ "kind": "object",1364+ "noun": "MIAU",1365+ "x": 2,1366+ "y": 31367+ },1368+ {1369+ "id": "d3-crate-4-3",1370+ "kind": "object",1371+ "noun": "CRATE",1372+ "x": 4,1373+ "y": 31374+ },1375+ {1376+ "id": "d3-plate-a",1377+ "kind": "object",1378+ "noun": "PLATE",1379+ "x": 6,1380+ "y": 3,1381+ "channel": "amber"1382+ },1383+ {1384+ "id": "d3-gate-a",1385+ "kind": "object",1386+ "noun": "GATE",1387+ "x": 7,1388+ "y": 3,1389+ "channel": "amber"1390+ },1391+ {1392+ "id": "d3-truck-9-3",1393+ "kind": "object",1394+ "noun": "TRUCK",1395+ "x": 9,1396+ "y": 31397+ },1398+ {1399+ "id": "d3-wall-10-3",1400+ "kind": "object",1401+ "noun": "WALL",1402+ "x": 10,1403+ "y": 31404+ },1405+ {1406+ "id": "d3-wall-0-4",1407+ "kind": "object",1408+ "noun": "WALL",1409+ "x": 0,1410+ "y": 41411+ },1412+ {1413+ "id": "d3-wall-7-4",1414+ "kind": "object",1415+ "noun": "WALL",1416+ "x": 7,1417+ "y": 41418+ },1419+ {1420+ "id": "d3-wall-10-4",1421+ "kind": "object",1422+ "noun": "WALL",1423+ "x": 10,1424+ "y": 41425+ },1426+ {1427+ "id": "d3-wall-0-5",1428+ "kind": "object",1429+ "noun": "WALL",1430+ "x": 0,1431+ "y": 51432+ },1433+ {1434+ "id": "d3-wall-1-5",1435+ "kind": "object",1436+ "noun": "WALL",1437+ "x": 1,1438+ "y": 51439+ },1440+ {1441+ "id": "d3-wall-2-5",1442+ "kind": "object",1443+ "noun": "WALL",1444+ "x": 2,1445+ "y": 51446+ },1447+ {1448+ "id": "d3-wall-3-5",1449+ "kind": "object",1450+ "noun": "WALL",1451+ "x": 3,1452+ "y": 51453+ },1454+ {1455+ "id": "d3-wall-4-5",1456+ "kind": "object",1457+ "noun": "WALL",1458+ "x": 4,1459+ "y": 51460+ },1461+ {1462+ "id": "d3-wall-5-5",1463+ "kind": "object",1464+ "noun": "WALL",1465+ "x": 5,1466+ "y": 51467+ },1468+ {1469+ "id": "d3-wall-6-5",1470+ "kind": "object",1471+ "noun": "WALL",1472+ "x": 6,1473+ "y": 51474+ },1475+ {1476+ "id": "d3-wall-7-5",1477+ "kind": "object",1478+ "noun": "WALL",1479+ "x": 7,1480+ "y": 51481+ },1482+ {1483+ "id": "d3-wall-8-5",1484+ "kind": "object",1485+ "noun": "WALL",1486+ "x": 8,1487+ "y": 51488+ },1489+ {1490+ "id": "d3-wall-9-5",1491+ "kind": "object",1492+ "noun": "WALL",1493+ "x": 9,1494+ "y": 51495+ },1496+ {1497+ "id": "d3-wall-10-5",1498+ "kind": "object",1499+ "noun": "WALL",1500+ "x": 10,1501+ "y": 51502+ }1503+ ]1504+ },1505+ "expectedRoute": "RRRRRRR",1506+ "routeChangedFromStoredBitPrototype": false,1507+ "observations": [1508+ {1509+ "afterTurn": 0,1510+ "gates": [1511+ {1512+ "id": "d3-gate-a",1513+ "open": false,1514+ "jammed": false1515+ }1516+ ],1517+ "plates": [1518+ {1519+ "id": "d3-plate-a",1520+ "pressed": false1521+ }1522+ ],1523+ "won": false1524+ },1525+ {1526+ "afterTurn": 4,1527+ "move": "R",1528+ "gates": [1529+ {1530+ "id": "d3-gate-a",1531+ "open": true,1532+ "jammed": false1533+ }1534+ ],1535+ "plates": [1536+ {1537+ "id": "d3-plate-a",1538+ "pressed": true1539+ }1540+ ],1541+ "won": false1542+ },1543+ {1544+ "afterTurn": 5,1545+ "move": "R",1546+ "gates": [1547+ {1548+ "id": "d3-gate-a",1549+ "open": true,1550+ "jammed": true1551+ }1552+ ],1553+ "plates": [1554+ {1555+ "id": "d3-plate-a",1556+ "pressed": false1557+ }1558+ ],1559+ "won": false1560+ },1561+ {1562+ "afterTurn": 6,1563+ "move": "R",1564+ "gates": [1565+ {1566+ "id": "d3-gate-a",1567+ "open": false,1568+ "jammed": false1569+ }1570+ ],1571+ "plates": [1572+ {1573+ "id": "d3-plate-a",1574+ "pressed": false1575+ }1576+ ],1577+ "won": false1578+ },1579+ {1580+ "afterTurn": 7,1581+ "move": "R",1582+ "gates": [1583+ {1584+ "id": "d3-gate-a",1585+ "open": false,1586+ "jammed": false1587+ }1588+ ],1589+ "plates": [1590+ {1591+ "id": "d3-plate-a",1592+ "pressed": false1593+ }1594+ ],1595+ "won": true1596+ }1597+ ],1598+ "notes": "Derived jam. There is no CRATE IS PUSH, so the crate is inert and the cat walks through it (turn 2). The cat presses d3-plate-a itself (turn 4, gate opens at end of turn), steps into the gate (turn 5: plate empty, gate occupied, so open and jammed rather than crushing the cat), steps out (turn 6: gate empty and unpressed, closes behind it) and reaches the truck. Also shows the authoring hazard: a plate adjacent to its own gate lets a lone YOU skip the circuit."1599+ }1600+]