{
  "format": "shadowrun-japan-progress-rules-v1",
  "version": 1,
  "profile": "japan-original-1.3.0",
  "romSha256": "586551eadaff2693c0f21d9c47a697841989ae312d422fa4bf30823473a40fae",
  "source": "Read-only interpretation of the supplied Japanese cartridge, its native scripts and persistent work RAM.",
  "endingStepId": "ending",
  "rules": [
    {
      "id": "read-slab",
      "rule": {
        "all": [
          {
            "address": 12305,
            "size": 1,
            "mask": 64,
            "equals": 64
          },
          {
            "address": 12360,
            "size": 1,
            "mask": 4,
            "equals": 4
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Entity924/slab p3010; native307 first Examine OR40 into slab flags and reveals paper546.",
        "Entity546/Paper p3047; native88 ordinary Examine OR04 into own flags at006B. Secret-coordinate branch can bypass04 and is intentionally not counted as normal paper reading."
      ]
    },
    {
      "id": "morgue-tools",
      "rule": {
        "all": [
          {
            "address": 12352,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 12367,
            "size": 2,
            "equals": 5418
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Entity1309/Scalpel owner3040 is Jake after native830 Take75.",
        "Entity917 original refrigerator patch owner304F becomes152A only in native60 Take branch after live patch910 stack is assigned to Jake."
      ],
      "limitations": "Saving the patch is advice. Completion records both original morgue pickups, not a later unrelated patch."
    },
    {
      "id": "meet-decker",
      "rule": {
        "all": [
          {
            "address": 12262,
            "size": 2,
            "equals": 5418
          },
          {
            "type": "keyword",
            "id": 16,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Actor5565 native708 opens conversation127 and calls CD only after the conversation ends.",
        "Conversation127 greeting automatically learns Hitmen23; ordinary Talk learns Firearm16. There is no Firearm-topic response in this group."
      ],
      "proposedText": "Talk with the approaching punk; learn Hitmen and Firearm.",
      "limitations": "Hitmen23 is later deleted by original760; the actor-specific completed encounter plus retained Firearm16 proves this encounter and lesson."
    },
    {
      "id": "free-dog",
      "rule": {
        "all": [
          {
            "address": 12245,
            "size": 1,
            "mask": 1,
            "equals": 1
          },
          {
            "address": 12272,
            "size": 2,
            "equals": 2212
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Actor5390 native322 sets01 after the fenced-dog release/drop sequence.",
        "DogCollar5432 native465 Take75 assigns owner2FF0=08A4. Dog505 tests the collar but never consumes it."
      ]
    },
    {
      "id": "get-pistol",
      "rule": {
        "all": [
          {
            "address": 12527,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 15847,
            "size": 2,
            "equals": 6468
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Tutorial Beretta6468 native448 Take75 sets persistent owner30EF=Jake and flag08.",
        "Shared weapon17 invokes native26; CPU808BDA records equipped Jake weapon ID in3DE7."
      ],
      "limitations": "Exact starter-gun equipment is observed and saved with the current snapshot; a later gun does not prove the Beretta was equipped."
    },
    {
      "id": "get-jacket",
      "rule": {
        "all": [
          {
            "address": 12532,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 15844,
            "size": 2,
            "equals": 2835
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "LeatherJacket2835 native855 Take75 assigns owner30F4=Jake after the source drop is available.",
        "Armor helper661/803 invokes native38; CPU808B4B stores Jake equipped armor ID3DE4."
      ],
      "limitations": "Ownership alone does not prove equipment. A later armor cannot reconstruct this historical equipment event."
    },
    {
      "id": "meet-dog",
      "rule": {
        "address": 13307,
        "size": 2,
        "equals": 5418
      },
      "mode": "state",
      "evidence": [
        "Alley dog5369 native506 opens conversation39 at002E; after it returns, the actor leaves and nativeCD sets owner33FB=152A at0049.",
        "Neither conversation39 nor native506 teaches keywordDog13."
      ],
      "proposedText": "Approach the glowing eyes and speak to the dog."
    },
    {
      "id": "get-room-key",
      "rule": {
        "allObserved": [
          {
            "address": 12800,
            "size": 1,
            "mask": 1,
            "equals": 1
          },
          {
            "address": 12812,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "vm",
            "scriptCpu": 10286757,
            "pcs": [
              49
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Injured-man987 native782 first full Examine overwrites own flags3200 with01 and reveals DoorKey5236.",
        "DoorKey5236 owner320C=Jake after native662 Take75.",
        "Memo2205 native617 D0 text108 at002F yields with bytecode PC0031; this script is unique to Memo. No persistent examined bit is written.",
        "Actual original f001 state advanced with no input: active native617 PC0031/resumeF465 persists12 frames (~200ms). See early-examine-duration-proof.json."
      ],
      "limitations": "The exact Memo reading is an observed source-VM event. Bare older native saves cannot recover this unrecorded past reading."
    },
    {
      "id": "unlock-home",
      "rule": {
        "allObserved": [
          {
            "type": "vm",
            "scriptCpu": 10286479,
            "pcs": [
              55
            ]
          },
          {
            "address": 12675,
            "size": 1,
            "mask": 129,
            "notEquals": 0
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Unique DoorKey662 D0 text144 at0035 yields atPC0037, proving Examine.",
        "DoorKey662 Use on119/49 OR80 into apartment door119 flags3183. Door683 clears request80 during opening, then sets unlocked01. Both request80 and final01 prove successful key use.",
        "Actual original f001 state advanced with no input: active native662 PC0037/resumeF465 persists8 frames (~133ms). Use50ms observation;150ms can miss this event."
      ],
      "limitations": "The game does not persist the DoorKey Examine history; the source VM event is snapshot-bound."
    },
    {
      "id": "home-items",
      "rule": {
        "all": [
          {
            "address": 12787,
            "size": 2,
            "oneOf": [
              2212,
              5418
            ]
          },
          {
            "any": [
              {
                "address": 15826,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15828,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15830,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15832,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15834,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15836,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15838,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15840,
                "size": 2,
                "equals": 79
              },
              {
                "address": 15842,
                "size": 2,
                "equals": 79
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Shades959 owner31F3 is Jake after Take and152A only after Use404 (nativeCD).",
        "RippedNote1589 native584 Examine adds phone79 via native73 after its note text; Take alone does not add the number. Native73 appends u16 IDs in phone list3DD2."
      ]
    },
    {
      "id": "home-rest",
      "rule": {
        "allObserved": [
          {
            "address": 12787,
            "size": 2,
            "equals": 5418
          },
          {
            "address": 15735,
            "size": 2,
            "equals": 170
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Shades404 Use toggles3DCD then removes own entity to152A; owner31F3 proves actual Use, not pickup.",
        "Apartment bed6475 native460 pushes return170 into shared762. Native762 writes property6 (3D77)=170 then queues original rest/menu entry347."
      ],
      "proposedText": "Wear Shades and use your apartment bed. Rest, save and spend Karma there when needed.",
      "limitations": "The functional checkpoint is Shade use and access to the apartment bed. Saving and spending optional Karma are advice, not falsely inferred actions."
    },
    {
      "id": "learn-tickets",
      "rule": {
        "type": "keyword",
        "id": 61,
        "visible": false
      },
      "mode": "observed",
      "evidence": [
        "Cage-bouncer conversation16 greeting learns Tickets61; tired-patron conversation12 can also teach the same practical lead.",
        "Original transport760 deletes Tickets61 after moving Jake to Caryards."
      ],
      "proposedText": "Learn Tickets; the Cage bouncer introduces this lead.",
      "limitations": "Known lead proves the objective. Its historical source is not recorded; old native saves after deletion cannot reconstruct it without snapshot metadata."
    },
    {
      "id": "iced-tea",
      "rule": {
        "address": 12507,
        "size": 2,
        "oneOf": [
          2212,
          6223
        ]
      },
      "mode": "state",
      "evidence": [
        "Tea3017 native89 Take75 assigns Jake owner30DB; Give accepts tired patron184F and invokes transfer7C.",
        "The only accepted transfer target184F is retained as evidence after the drink is handed over."
      ],
      "proposedText": "Get the Iced Tea from the bartender.",
      "limitations": "Talking before the pickup is incidental guidance; possession or its source-accepted transfer proves obtaining the tea."
    },
    {
      "id": "learn-datajack",
      "rule": {
        "all": [
          {
            "type": "keyword",
            "id": 42,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 11,
            "visible": false
          },
          {
            "any": [
              {
                "type": "keyword",
                "id": 10,
                "visible": false
              },
              {
                "address": 15215,
                "size": 1,
                "mask": 1,
                "equals": 1
              }
            ]
          },
          {
            "type": "keyword",
            "id": 21,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 56,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Bartender group14 Talk learns Shadowrunners42; topic42 learns Decker11; topic11 learns Datajack10.",
        "Healer group69 Talk learns Heal21; topic21 learns StreetDoc56.",
        "Doctor158 sets own flags3B6F bit01 on the paid Examination route, then deletesDatajack10. Examination15 is taught by group25 topicDatajack10; this diagnostic flag therefore preserves the earlier lesson."
      ],
      "proposedText": "Learn Shadowrunners, Decker and Datajack from the bartender; learn Heal and Street Doc nearby."
    },
    {
      "id": "learn-grinder",
      "rule": {
        "all": [
          {
            "address": 12507,
            "size": 2,
            "equals": 6223
          },
          {
            "any": [
              {
                "type": "keyword",
                "id": 19,
                "visible": false
              },
              {
                "address": 12330,
                "size": 1,
                "mask": 8,
                "equals": 8
              }
            ]
          },
          {
            "any": [
              {
                "type": "keyword",
                "id": 29,
                "visible": false
              },
              {
                "address": 12680,
                "size": 1,
                "mask": 2,
                "equals": 2
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Tea89 transfers the actual tea to accepted patron184F.",
        "Patron group12 Tickets61 learns Grinder19; topicGrinder19 learns LoneStar29.",
        "Mortician helper494 only triggers from topicGrinder19 and sets Larry302A bit08. Badge699 Use sets3188 bit02; businessman LoneStar conversation is its original purchase route. These preserve the deleted leads after760."
      ],
      "proposedText": "Give him Iced Tea; discuss Tickets, then Grinder to learn Lone Star."
    },
    {
      "id": "buy-badge",
      "rule": {
        "address": 12680,
        "size": 1,
        "mask": 2,
        "equals": 2
      },
      "mode": "state",
      "evidence": [
        "Badge2807 native699 Use explicitly OR02 into own flags3188, then CD. Pickup/purchase alone never sets02."
      ]
    },
    {
      "id": "unlock-files",
      "rule": {
        "all": [
          {
            "address": 12315,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 12325,
            "size": 1,
            "mask": 128,
            "equals": 128
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Larry2016 native635 checks helper494 Grinder-request08, visits the cabinets and OR80 into ticket cabinet4816 and credstick cabinet4823.",
        "Source cabinet helper76 uses those flags for the original unlock; merely owning Shades/Badge or knowing Grinder is insufficient."
      ],
      "limitations": "The persistent unlock of both original file cabinets proves the functional task; current clothing can subsequently change."
    },
    {
      "id": "take-files",
      "rule": {
        "all": [
          {
            "address": 12372,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 12357,
            "size": 2,
            "oneOf": [
              2212,
              4032
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Credstick5761 native686 Take75 assigns owner3054=Jake and does not consume the card on accepted phone Use.",
        "Tickets560 native913 Take75 assigns Jake; the only accepted Give target0FC0=4032 is the Cage bouncer, so owner3045=0FC0 preserves a legitimate later use."
      ]
    },
    {
      "id": "collect-office-items",
      "rule": {
        "address": 12777,
        "size": 2,
        "equals": 2212
      },
      "mode": "state",
      "evidence": [
        "Jake office Cyberdeck5635 owner31E9=08A4 is assigned on native574 Take. Other NPC cyberdeck entity IDs are deliberately excluded."
      ]
    },
    {
      "id": "help-shaman",
      "rule": {
        "address": 12535,
        "size": 1,
        "mask": 3,
        "equals": 3
      },
      "mode": "state",
      "evidence": [
        "LiveSlapPatch791 use on injured shaman3003 sets request80; native401 accepts it, then OR01 into own flags30F7 (healed).",
        "Conversation92 MagicFetish response calls475: native7B grantsFetish2443 toJake and OR02 into shaman3003. Flags03 therefore prove both healing and the actual reward."
      ],
      "limitations": "Fetish later transfers to Vladimir, so its present ownership alone would lose a completed shaman rescue."
    },
    {
      "id": "take-ghoul-bone",
      "rule": {
        "all": [
          {
            "address": 12747,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 12457,
            "size": 2,
            "equals": 2212
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Paperweight1897 native665 Take75 gives owner31CB=Jake. GhoulBone4403 native514 Take75 gives owner30A9=Jake.",
        "Dog505 checks both owners for Powerball and never consumes these components."
      ]
    },
    {
      "id": "follow-calls",
      "rule": {
        "all": [
          {
            "any": [
              {
                "address": 15826,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15828,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15830,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15832,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15834,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15836,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15838,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15840,
                "size": 2,
                "equals": 80
              },
              {
                "address": 15842,
                "size": 2,
                "equals": 80
              }
            ]
          },
          {
            "address": 12475,
            "size": 1,
            "mask": 128,
            "equals": 128
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Sassie group74 topicCalls5 invokes347, which adds Glutman phone80 via73 and deletesCalls5.",
        "Glutman phone group90 topicGlutman18 calls908, which OR80 into original Glutman entity952 flags30BB. This is stronger than merely owning a Credstick or knowing a name."
      ],
      "limitations": "Calls5 is deliberately not required after completion because the original source deletes it."
    },
    {
      "id": "meet-glutman",
      "rule": {
        "all": [
          {
            "address": 12357,
            "size": 2,
            "equals": 4032
          },
          {
            "address": 12477,
            "size": 2,
            "equals": 5418
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Tickets913 accepted Give target is bouncer4032/0FC0; source410 sees that ownership and opens the entrance.",
        "Glutman952 native929 invokes conversation75; only after it exits does native5C queue Caryards321 and CD set Glutman owner30BD=152A."
      ]
    },
    {
      "id": "caryard-leads",
      "rule": {
        "allObserved": [
          {
            "type": "keyword",
            "id": 6,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 26,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 60,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 14,
            "visible": false
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Caryards groups94/98 and other local conversation records teach Caryards6, King26, TheMatrix60 and Drake14.",
        "Original345 later deletes Caryards6 andKing26; original308 also deletesKing26 following the arena King route."
      ],
      "proposedText": "Learn Caryards, King, The Matrix and Drake before leaving.",
      "limitations": "This is a multi-conversation knowledge checkpoint. Old native saves after source deletion cannot reconstruct every optional past lesson without bound history."
    },
    {
      "id": "caryard-train",
      "rule": {
        "address": 15733,
        "size": 2,
        "oneOf": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10
        ]
      },
      "mode": "state",
      "evidence": [
        "Arena reward668 increments global property4 via native14 after a successful regular match. Property4 is word3D75 (native5D/14 base3D71).",
        "Arena owner485 reads this index to choose regular opponents0..9. It starts0."
      ],
      "proposedText": "Win an arena match; rest and improve Body or Firearm as needed.",
      "limitations": "Optional training checkpoint records an actual arena victory; optional rest/stat purchases are advice."
    },
    {
      "id": "leave-caryards",
      "rule": {
        "any": [
          {
            "address": 12815,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 12817,
            "size": 2,
            "equals": 5418
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "King574 noncombat native507 waits for paymenthelper195 flag80 and retains80 after moving aside.",
        "Combat King567 native56 on victory sets noncombatKing574 owner3211=152A. This is the source-specific defeated-King marker; generic removed actors are not assumed killed."
      ]
    },
    {
      "id": "upgrade-equipment",
      "rule": {
        "all": [
          {
            "address": 15846,
            "size": 1,
            "oneOf": [
              2,
              3,
              4,
              5,
              6
            ]
          },
          {
            "address": 15847,
            "size": 2,
            "oneOf": [
              308,
              315,
              322,
              336,
              343,
              406,
              413,
              420,
              602,
              609,
              616,
              623,
              3038,
              3045,
              4844,
              4851,
              6993
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Native38 records equipped armor rating at3DE6: Leather661=1; Mesh425/907=2, Vest165=3, Concealed413=4, Partial701=5, Full447=6.",
        "Native26 records equipped weapon entity3DE7. Listed IDs map to source item scripts669/170/424/31/365/649/792, stronger weapon damage6/4/8/8/10/4/20 than Beretta3."
      ],
      "proposedText": "Equip armor stronger than Leather Jacket and a weapon stronger than Beretta.",
      "limitations": "Optional gear preparation records actual equipped upgrades, not a hypothetical purchase or money decrease."
    },
    {
      "id": "talisman-contact",
      "rule": {
        "all": [
          {
            "type": "keyword",
            "id": 58,
            "visible": false
          },
          {
            "any": [
              {
                "address": 15826,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15828,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15830,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15832,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15834,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15836,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15838,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15840,
                "size": 2,
                "equals": 81
              },
              {
                "address": 15842,
                "size": 2,
                "equals": 81
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Talismans seller group130 greeting learnsTalismans58. Topic58 invokes286 (00 51 58 73), which adds shop phone81 to3DD2 phone list."
      ]
    },
    {
      "id": "buy-stake",
      "rule": {
        "address": 12937,
        "size": 2,
        "equals": 2212
      },
      "mode": "state",
      "evidence": [
        "Stake805 persistent owner3289=Jake is assigned by the original merchant purchase route. Item-use87 accepts Vladimir392/0188 and only alters the vampire flags; it never consumes or transfers the Stake."
      ],
      "proposedText": "Obtain the Wooden Stake; this shop also sells both bottle items."
    },
    {
      "id": "diagnose-datajack",
      "rule": {
        "all": [
          {
            "address": 15215,
            "size": 1,
            "mask": 1,
            "equals": 1
          },
          {
            "any": [
              {
                "type": "keyword",
                "id": 7,
                "visible": false
              },
              {
                "address": 15751,
                "size": 2,
                "equals": 1
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "DoctorEd791 native158 sees Examinationhelper487 request80, clears80 and sets completed/diagnostic01 in3B6F.",
        "After the procedure native158 teachesCortexBomb7 at0178. Maplethorpe later removes7 and writes property16=1 (word3D87), preserving the completed earlier diagnosis."
      ],
      "proposedText": "Reserve 2000 nuyen for the next operation; have Dr Ed examine your Datajack and identify the Cortex Bomb.",
      "limitations": "Money reservation is advice. Completion requires the diagnosis result or its source-proven repaired continuation, not just learning Examination."
    },
    {
      "id": "get-iron-key",
      "rule": {
        "address": 13297,
        "size": 2,
        "equals": 2212
      },
      "mode": "state",
      "evidence": [
        "IronKey2996 native242 Take75 sets owner33F1=Jake after its Daley source drop. Use on RustStiletto door5264/1490 only sets door80 and never consumes the key."
      ]
    },
    {
      "id": "remove-bomb",
      "rule": {
        "all": [
          {
            "address": 15751,
            "size": 2,
            "equals": 1
          },
          {
            "address": 13585,
            "size": 1,
            "mask": 192,
            "equals": 192
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Maplethorpe784 native196 sets property16=1 at00E2..00E6 after its operating sequence. Native5D/14 base3D71 makes this word3D87.",
        "The same actor ORC0 into own flags3511 at0117 after the post-operation dialogue. Initial paid/pending flags01/02 are deliberately insufficient."
      ],
      "proposedText": "Have Maplethorpe remove the Cortex Bomb and repair your datajack.",
      "limitations": "Later surgery temporarily replaces this actor flag while operating; the rule becomes true again at the completed C0 state."
    },
    {
      "id": "head-computer-lead",
      "rule": {
        "all": [
          {
            "address": 15751,
            "size": 2,
            "equals": 1
          },
          {
            "address": 13585,
            "size": 1,
            "mask": 192,
            "equals": 192
          },
          {
            "type": "keyword",
            "id": 32,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Maplethorpe196 primary operation calls group32 before setting completionC0; its mandatory greeting learnsHeadComputer20 and helper129 deletesCortexBomb7.",
        "Group32 ordinary Talk learnsMatrixSystems32. That keyword may be hidden later by source345, so known including hidden is accepted; HeadComputer20 is later deleted917."
      ],
      "proposedText": "After the repair, learn Head Computer and Matrix Systems from Maplethorpe.",
      "limitations": "The persistent completed operation proves its automatic HeadComputer greeting even after that keyword is deleted. Merely holding a lead before surgery does not pass."
    },
    {
      "id": "wastelands-leads",
      "rule": {
        "all": [
          {
            "any": [
              {
                "type": "keyword",
                "id": 24,
                "visible": false
              },
              {
                "address": 13880,
                "size": 1,
                "mask": 128,
                "equals": 128
              }
            ]
          },
          {
            "type": "keyword",
            "id": 38,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Native conversation61 record ROM0x6829D learns Ice24; conversation62 can also teach it after delivery.",
        "Conversation115 Jetboy: Matrix Systems32 record ROM0x68204 learns Raitsov38; the record contains the Matrix Systems question and Raitsov lead."
      ],
      "proposedText": "Learn Ice at Wastelands; ask Jetboy about Matrix Systems to learn Raitsov.",
      "limitations": "Checks the resulting leads. Paid ice80 is a later proof of previously using the Ice topic. Raitsov is deleted by572 after asking Pushkin, and no persistent callback flag proves that earlier lead: bare late saves cannot recover it without observation metadata.",
      "step": 34,
      "title": "Visit the Wastelands"
    },
    {
      "id": "stiletto-door",
      "rule": {
        "all": [
          {
            "address": 13660,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 14295,
            "size": 1,
            "mask": 128,
            "equals": 128
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x1490, table ROM 0x6CB33, state 0x355B (flags +1, owner +3): Rust Stilettos street entrance, flags355C.",
        "Japanese script 242, header CPU 0xA0B265, ROM 0x103265, bytecode 0069..007A: Iron Key accepts only entity1490 and sets its80 open bit.",
        "Japanese script 39, header CPU 0xA0FE5D, ROM 0x107E5D, bytecode 0054..007F: Gang Leader reaches its defeat branch, runs conversation54, then reveals Password075B with flag80."
      ],
      "proposedTitle": "Break through the gang hideout",
      "proposedText": "Use Iron Key on the entrance; fight through to defeat the gang leader inside.",
      "limitations": "Requires both the specific key-opened entrance and the leader defeat reward flag. Does not assert that every optional gang enemy was killed.",
      "step": 35,
      "title": "Enter the gang hideout"
    },
    {
      "id": "get-crowbar",
      "rule": {
        "address": 14287,
        "size": 2,
        "equals": 2212
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x167A, table ROM 0x6CD1D, state 0x37CC (flags +1, owner +3): Crowbar owner37CF.",
        "Japanese script 893, header CPU 0xA0B0FF, ROM 0x1030FF, bytecode 0031..0043: Only the pickup menu branch calls native75 to set its owner to Jake."
      ],
      "limitations": "Requires the collected Crowbar, which source893 retains after use. Merely standing in the gang room does not satisfy it.",
      "step": 36,
      "title": "Collect the ship tool"
    },
    {
      "id": "get-drake-password",
      "rule": {
        "all": [
          {
            "address": 14295,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 14297,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "vm",
            "scriptCpu": 10532584,
            "pcs": [
              56
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese entity 0x75B, table ROM 0x6BDFE, state 0x37D6 (flags +1, owner +3): The Stilettos leader Password, owner37D9 and reveal flag37D7.",
        "Japanese script 39, header CPU 0xA0FE5D, ROM 0x107E5D, bytecode 0078..007F: Reveals this Password only on the leader defeat branch.",
        "Japanese script 914, header CPU 0xA0B6E6, ROM 0x1036E6, bytecode 0020..0038: Examine option80 prints original text1E4 using nativeD0; the blocked/returned frame PC0038 identifies the actual message. Pickup option10 is a different branch.",
        "Japanese entity table binds script914 only to075B; no script bytecode contains a CALL914 site. The source script is item-specific, not a common Examine helper."
      ],
      "limitations": "Observed-only: an older save containing the Password does not prove it was examined. Requires the owner, boss reward reveal and message event together.",
      "step": 37,
      "title": "Keep the leader's password"
    },
    {
      "id": "enter-jagged-nails",
      "rule": {
        "allObserved": [
          {
            "all": [
              {
                "address": 13465,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 14295,
                "size": 1,
                "mask": 128,
                "equals": 128
              }
            ]
          },
          {
            "address": 12194,
            "size": 2,
            "equals": 199
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese entity 0x1657, table ROM 0x6CCFA, state 0x3498 (flags +1, owner +3): Jagged Nails bouncer, temporary paid bit3499&80.",
        "Japanese script 340, header CPU 0x83FFE3, ROM 0x1FFE3, bytecode 0000..000B: Calls common payment200 with 50 nuyen and bouncer1657.",
        "Japanese script 200, header CPU 0x83FF28, ROM 0x1FF28, bytecode 000F..001E: Only successful payment sets target flags80.",
        "Japanese script 639, header CPU 0xA0D04E, ROM 0x10504E, bytecode 0037..004C: Waits in conversation34 for payment, then clears80 before allowing passage.",
        "Japanese room entry199 is the Jagged Nails map with Kitsune0B3D; room-table ROM0x69E7D, data pointer0x3774."
      ],
      "limitations": "Two observed events are necessary: paid bouncer after the leader reward, and actual room199 entry. A warp to the club cannot substitute for payment. The paid flag is deliberately not treated as permanent.",
      "step": 38,
      "title": "Enter Jagged Nails"
    },
    {
      "id": "kitsune-leaves",
      "rule": {
        "all": [
          {
            "address": 13852,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "keyword",
            "id": 13,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0xB0C, table ROM 0x6C1AF, state 0x3619 (flags +1, owner +3): Enchanted Leaves, owner361C.",
        "Kitsune conversation116 Dog13 record ROM0x680D3 and conversation117 Dog13 record ROM0x6823B both call script899.",
        "Japanese script 899, header CPU 0x9BC47E, ROM 0xDC47E, bytecode 0013..002A: If not already held, gives Leaves0B0C to Jake by native7B, then prints its explanation."
      ],
      "limitations": "The Leaves have a direct Kitsune/Dog callback owner grant. This is stronger than merely observing the club or Dog keyword.",
      "step": 39,
      "title": "Approach the singer"
    },
    {
      "id": "hire-kitsune",
      "rule": {
        "all": [
          {
            "any": [
              {
                "all": [
                  {
                    "address": 12198,
                    "size": 2,
                    "oneOf": [
                      2,
                      4,
                      6
                    ]
                  },
                  {
                    "address": 12210,
                    "size": 2,
                    "equals": 2884
                  }
                ]
              },
              {
                "all": [
                  {
                    "address": 12198,
                    "size": 2,
                    "oneOf": [
                      4,
                      6
                    ]
                  },
                  {
                    "address": 12212,
                    "size": 2,
                    "equals": 2884
                  }
                ]
              },
              {
                "all": [
                  {
                    "address": 12198,
                    "size": 2,
                    "equals": 6
                  },
                  {
                    "address": 12214,
                    "size": 2,
                    "equals": 2884
                  }
                ]
              }
            ]
          },
          {
            "address": 13920,
            "size": 1,
            "mask": 1,
            "equals": 0
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese entity 0xB44, table ROM 0x6C1E7, state 0x35C9 (flags +1, owner +3): Kitsune follower entity; flags80 alone is NOT hiring proof.",
        "Native CPU80A2F2..80A2FE appends party membership at2FB0+lastOffset after incrementing2FA6 by2. Native80A3BB..80A400 removes members and shifts the parallel arrays.",
        "Party member entity words begin2FB0 (Jake), then2FB2/2FB4/2FB6; each candidate is gated by the active last-offset2FA6, so stale words beyond the current party are ignored.",
        "Japanese script 269, header CPU 0xA0BA89, ROM 0x103A89, bytecode 01A3..01AA: Rat Shaman defeat sets Dog1523 flag01, so requiring it clear observes the requested before-Rat order."
      ],
      "limitations": "Historical observed proof only: Kitsune must actually be a current party member before Rat defeat. Loading an older post-Rat save cannot establish this ordering. Does not infer hiring from the talkable Kitsune actor80 flag.",
      "step": 40,
      "title": "Choose a companion"
    },
    {
      "id": "boatman-leads",
      "rule": {
        "all": [
          {
            "any": [
              {
                "type": "keyword",
                "id": 12,
                "visible": false
              },
              {
                "address": 13880,
                "size": 1,
                "mask": 2,
                "equals": 2
              },
              {
                "address": 13225,
                "size": 1,
                "mask": 128,
                "equals": 128
              }
            ]
          },
          {
            "type": "keyword",
            "id": 33,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Boatman conversation49 greeting ROM0x6890A learns Docks12; Bremerton question ROM0x6891A learns Mermaids33.",
        "Japanese script 647, header CPU 0x9BC3E2, ROM 0xDC3E2, bytecode 0000..000F: Docks delivery requires selecting the known Docks12 question, records delivery02, then deletes Docks12; this later effect recovers the prior Docks lead.",
        "Paid boat passage80 is another later Docks-clearance proof. Mermaids33 is not deleted by the audited native85 callsites."
      ],
      "step": 41,
      "title": "Meet the boatman"
    },
    {
      "id": "matrix-systems-data",
      "rule": {
        "all": [
          {
            "address": 13797,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "vm",
            "scriptCpu": 10602029,
            "pcs": [
              30
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese entity 0x153F, table ROM 0x6CBE2, state 0x35E2 (flags +1, owner +3): DF_MT-AI download, owner35E5.",
        "Japanese script 608, header CPU 0xA1C707, ROM 0x10C707, bytecode 0013..0023: Matrix Systems computer handles its per-login1D83 bit80 and downloads entity153F through helper209.",
        "Japanese script 217, header CPU 0xA1C62B, ROM 0x10C62B, bytecode 0002..001E: Read/Examine option80 prints file text22A using nativeD0. Frame body CPUA1C62D at PC001E is the actual read event.",
        "Japanese entity table binds script217 only to153F; no script bytecode contains a CALL217 site, so the VM proof cannot be another inventory item using a shared helper."
      ],
      "proposedText": "Hack Matrix Systems to download DF_MT-AI; read that file in the inventory.",
      "limitations": "Downloaded ownership alone is insufficient. The transient Matrix result byte1D83 is not used as a persistent global completion flag.",
      "step": 42,
      "title": "Investigate the courier job"
    },
    {
      "id": "dog-heal",
      "rule": {
        "all": [
          {
            "address": 13920,
            "size": 1,
            "mask": 192,
            "equals": 192
          },
          {
            "address": 15806,
            "size": 1,
            "notEquals": 0
          },
          {
            "any": [
              {
                "type": "keyword",
                "id": 39,
                "visible": false
              },
              {
                "address": 13450,
                "size": 1,
                "mask": 1,
                "equals": 1
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x1523, table ROM 0x6CBC6, state 0x365F (flags +1, owner +3): Dog reward flags3660.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0246..0270: Checks Fetish098B, Collar1538 and Leaves0B0C are Jake-owned before setting Dog80.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 02D7..0318: Initial reward stores Heal3DBE=1, initializes Magic3DB2 if needed, then sets Dog40.",
        "Conversation40 Talk record ROM0x6904A learns Rat39 and calls838; the source tells Jake to defeat Rat Shaman.",
        "Japanese script 838, header CPU 0x9BC458, ROM 0xDC458, bytecode 0000..0007: This same Talk callback sets sewer gate18FE flag01, recovering the issued Rat task after the Rat keyword is deleted on defeat."
      ],
      "limitations": "Requires the accepted three offerings, Heal reward and actual Rat lead. The item ownership gate is not replaced by a shrine visit.",
      "step": 43,
      "title": "Visit Dog's shrine"
    },
    {
      "id": "prepare-magic",
      "rule": {
        "all": [
          {
            "type": "vm",
            "scriptCpu": 8647168,
            "pcs": [
              34
            ]
          },
          {
            "address": 15806,
            "size": 1,
            "mask": 254,
            "notEquals": 0
          },
          {
            "address": 15794,
            "size": 1,
            "mask": 254,
            "notEquals": 0
          },
          {
            "address": 13920,
            "size": 1,
            "mask": 64,
            "equals": 64
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese script 762, header CPU 0x83F1D1, ROM 0x1F1D1, bytecode 001C..0029: Using a bed stores its return checkpoint and queues the common resting scene347.",
        "Resting room347 contains entity1D6C running script469.",
        "Japanese script 469, header CPU 0x83F1FE, ROM 0x1F1FE, bytecode 0018..0022: Runs native23 party recovery, native41 rest/improvement menu, then waits20 frames at PC0022 after the menu returns.",
        "Native41 CPU80CEFB..80CF65 creates the resting choice menu and calls80CE62/80EE0B for its choices; native23 CPU80D0F7..80D107 restores party resources.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 02F3..0313: Heal3DBE and initial Magic3DB2 start at1; maskFE nonzero requires both to have increased above1."
      ],
      "proposedTitle": "Strengthen Heal and Magic",
      "proposedText": "Rest at a bed and raise Heal and Magic above their starting level.",
      "limitations": "Must observe the post-rest menu wait with both improved values. Owning Heal alone or visiting a bed is not enough. A prior save with already improved values needs a new observed rest to prove this instruction.",
      "step": 44,
      "title": "Develop your magic"
    },
    {
      "id": "defeat-rat",
      "rule": {
        "all": [
          {
            "address": 13920,
            "size": 1,
            "mask": 1,
            "equals": 1
          },
          {
            "type": "keyword",
            "id": 25,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese script 269, header CPU 0xA0BA89, ROM 0x103A89, bytecode 01A3..01AA: Rat Shaman battle completion sets Dog1523 flag01.",
        "Conversation48 greeting ROM0x68ECC learns Jester Spirit25 and explicitly follows the defeated Rat Shaman."
      ],
      "step": 45,
      "title": "Defeat Rat Shaman"
    },
    {
      "id": "dog-powerball",
      "rule": {
        "all": [
          {
            "address": 13920,
            "size": 1,
            "mask": 17,
            "equals": 17
          },
          {
            "address": 15805,
            "size": 1,
            "notEquals": 0
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0273..027A: Additional rewards require Dog01, the Rat trial completion.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 02B2..02BF: Powerball reward helper is called with GhoulBone1133, Paperweight0769 and reward bit10.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0174..018A,01BE..01C1: Checks the pair Jake-owned, writes Powerball3DBD=1 and sets Dog10; text1CF identifies POWERBALL."
      ],
      "step": 46,
      "title": "Return to Dog"
    },
    {
      "id": "learn-dark-blade",
      "rule": {
        "all": [
          {
            "type": "keyword",
            "id": 9,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 62,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Kitsune conversations116/117/118 Jester Spirit25 records teach Dark Blade9; Dark Blade9 records teach Vampires62.",
        "Vampires62 also has other club teachers. The resulting information is a story objective; speaker identity cannot be inferred from keyword62 alone."
      ],
      "proposedText": "Learn the Dark Blade and Vampires leads. Kitsune can teach them when asked about Jester Spirit and Dark Blade.",
      "limitations": "With this proposed wording the rule proves the full information objective and accepts an alternate Vampires teacher. Do not claim that the current rule proves both questions were asked specifically of Kitsune.",
      "step": 47,
      "title": "Question Kitsune again"
    },
    {
      "id": "get-strobes",
      "rule": {
        "all": [
          {
            "address": 13847,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "keyword",
            "id": 62,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x2A7, table ROM 0x6B94A, state 0x3614 (flags +1, owner +3): Strobe owner3617.",
        "Conversation37 Vampires62 record ROM0x68283 teaches Strobes57; conversation52 Strobes57 record ROM0x68838 calls164.",
        "Japanese script 164, header CPU 0x83FEF5, ROM 0x1FEF5, bytecode 0000..001D: Successful conversation choice grants Strobe02A7 to Jake and deletes keyword57. Therefore requiring that deleted topic with the item would be wrong.",
        "Script164 is the normal source ownership grant: its callback requires the Strobes57 question, whose only teacher is conversation37 Vampires62. This specific later award proves both manager-topic actions; keyword62 remains as an additional information guard."
      ],
      "limitations": "Does not require the deleted Strobes57 keyword. The actual source reward path, not mere item location, supplies the prior-dialogue proof.",
      "step": 48,
      "title": "Collect vampire protection"
    },
    {
      "id": "dark-blade-number",
      "rule": {
        "all": [
          {
            "any": [
              {
                "address": 15826,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15828,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15830,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15832,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15834,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15836,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15838,
                "size": 2,
                "equals": 83
              },
              {
                "address": 15840,
                "size": 2,
                "equals": 83
              }
            ]
          },
          {
            "type": "keyword",
            "id": 9,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Talisman seller conversation130 Dark Blade9 record ROM0x681E4 and phone conversation136 record ROM0x68325 both call832.",
        "Japanese script 832, header CPU 0x9BC4AB, ROM 0xDC4AB, bytecode 0000..0004: Adds phone contact53 by native73.",
        "Native73 CPU80E079..80E094 appends unique u16 contacts at3DD2. The source has eight contact IDs4F..56, giving eight possible populated slots3DD2..3DE0 and zero terminator3DE2."
      ],
      "proposedText": "Get Dark Blade’s telephone contact by asking the talisman seller about Dark Blade, in person or by phone.",
      "limitations": "Same source callback can be reached in person or by telephone. This proves the telephone contact, not the historical call method.",
      "step": 49,
      "title": "Get the cult's number"
    },
    {
      "id": "dark-blade-call",
      "rule": {
        "address": 13605,
        "size": 1,
        "mask": 1,
        "equals": 1
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x18F7, table ROM 0x6CF9A, state 0x3524 (flags +1, owner +3): Dark Blade courtyard gate, flags3525; initial80 is not the invitation bit.",
        "Phone conversation135 Magic Fetish30 record ROM0x68B49 calls149.",
        "Japanese script 149, header CPU 0x9BC470, ROM 0xDC470, bytecode 0000..0007: Sets exactly gate18F7 flag01 after the Magic Fetish telephone question."
      ],
      "step": 50,
      "title": "Arrange admission"
    },
    {
      "id": "vladimir-offer",
      "rule": {
        "all": [
          {
            "address": 12562,
            "size": 2,
            "equals": 329
          },
          {
            "type": "keyword",
            "id": 35,
            "visible": false
          },
          {
            "type": "keyword",
            "id": 4,
            "visible": false
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x98B, table ROM 0x6C02E, state 0x310F (flags +1, owner +3): Fetish owner3112 must be Vladimir0149, not merely held by Jake.",
        "Japanese script 837, header CPU 0x9EF665, ROM 0xF7665, bytecode 0089..0094,009C..009F: Vladimir switches to conversation58 only after Fetish098B is owned by entity0149.",
        "Conversation58 Jester Spirit25 record ROM0x68E21 learns Nirwanda35 and Bremerton4 together."
      ],
      "step": 51,
      "title": "Hear Vladimir's claim"
    },
    {
      "id": "bronze-key",
      "rule": {
        "all": [
          {
            "address": 14372,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 14405,
            "size": 1,
            "mask": 1,
            "equals": 1
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x18E2, table ROM 0x6CF85, state 0x3821 (flags +1, owner +3): Bronze Key owner3824.",
        "Japanese entity 0x18F0, table ROM 0x6CF93, state 0x3844 (flags +1, owner +3): Kitchen crypt Bronze Gate flags3845.",
        "Japanese script 552, header CPU 0xA0B2F2, ROM 0x1032F2, bytecode 0045..0057,0071..0082: Pickup gives the key to Jake; Use accepts only gate18F0 and sets its01 unlock bit."
      ],
      "step": 52,
      "title": "Find the crypt key"
    },
    {
      "id": "vladimir-stun",
      "rule": {
        "any": [
          {
            "all": [
              {
                "address": 13425,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 13427,
                "size": 2,
                "equals": 5418
              }
            ]
          },
          {
            "type": "keyword",
            "id": 28,
            "visible": false
          },
          {
            "all": [
              {
                "address": 14465,
                "size": 1,
                "mask": 65,
                "equals": 65
              },
              {
                "address": 12937,
                "size": 2,
                "equals": 2212
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese entity 0x188, table ROM 0x6B82B, state 0x3880 (flags +1, owner +3): Vampire flags3881;40 records successful strobing,01 first staking.",
        "Japanese script 481, header CPU 0xA0B1E6, ROM 0x1031E6, bytecode 0067..0079: Strobe Use in the Vampire room317 sets Vampire80.",
        "Japanese script 904, header CPU 0x9EF912, ROM 0xF7912, bytecode 010F..0140: Requires strobe80, sets40, clears low stake bits, waits for first stake01 before conversation59.",
        "Japanese script 87, header CPU 0x9CF39B, ROM 0xE739B, bytecode 004D..0092: Stake Use accepts only Vampire0188; with strobe80 it sets01, then02, then04 on successive uses.",
        "Learned Laughlyn28 is a stronger later gate: its only normal record is conversation60 after the second staking phase.",
        "Japanese script 556, header CPU 0x9CE442, ROM 0xE6442, bytecode 0000..0007: Canonical Jester conversation65 Laughlyn28 sets boss0B75 flag80. That later recorded correct-name action proves the source60 knowledge even after28 is deleted.",
        "Transitive source proof:904 cannot open conversation60 without both Stake waits after successful strobe80, and87 cannot set a Stake bit without strobe80. The later correct-name flag PLUS canonical boss owner152A proves real completion; flag80 alone is insufficient because the practice conversation can call the same hardcoded556."
      ],
      "limitations": "Observed phase or later canonical source gates are accepted. The Jester fallback relies on the fully checked source904→conversation60→conversation65/556 dependency, not on a generic boss room visit.",
      "step": 53,
      "title": "Confront the vampire"
    },
    {
      "id": "true-name",
      "rule": {
        "any": [
          {
            "all": [
              {
                "type": "keyword",
                "id": 28,
                "visible": false
              },
              {
                "type": "keyword",
                "id": 4,
                "visible": false
              }
            ]
          },
          {
            "all": [
              {
                "address": 13425,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 13427,
                "size": 2,
                "equals": 5418
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese script 904, header CPU 0x9EF912, ROM 0xF7912, bytecode 0145..0155: Waits for second staking bit02 before conversation60.",
        "Conversation60 Jester Spirit25 record ROM0x68DEB learns Laughlyn28 and Bremerton4; its text rejects the Nirwanda lie.",
        "Japanese script 556, header CPU 0x9CE442, ROM 0xE6442, bytecode 0000..0007: Jester conversation65 selecting Laughlyn28 sets0B75 flag80, but practice also calls556. Real415 must additionally remove its own0B75 owner to152A; both conditions recover the true-name chain after415/566 delete name/location keywords."
      ],
      "step": 54,
      "title": "Force the truth"
    },
    {
      "id": "buy-bottles",
      "rule": {
        "all": [
          {
            "address": 12927,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 12922,
            "size": 2,
            "equals": 2212
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x1936, table ROM 0x6CFD9, state 0x327C (flags +1, owner +3): Black Bottle owner327F.",
        "Japanese entity 0x64A, table ROM 0x6BCED, state 0x3277 (flags +1, owner +3): Potion Bottles owner327A.",
        "Both original inventory items must actually be Jake-owned. A shop visit or one bottle is insufficient."
      ],
      "step": 55,
      "title": "Collect both bottle items"
    },
    {
      "id": "fountain-water",
      "rule": {
        "address": 12920,
        "size": 1,
        "mask": 1,
        "equals": 1
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x64A, table ROM 0x6BCED, state 0x3277 (flags +1, owner +3): Potion Bottles flags3278.",
        "Japanese script 660, header CPU 0xA0B4DB, ROM 0x1034DB, bytecode 009F..00D6: Only Water Fountain012D target reaches the branch that sets Potion Bottles01; text107 identifies blue bottle water."
      ],
      "step": 56,
      "title": "Fill the first potion"
    },
    {
      "id": "octopus-ink",
      "rule": {
        "all": [
          {
            "address": 12925,
            "size": 1,
            "mask": 1,
            "equals": 1
          },
          {
            "address": 13515,
            "size": 1,
            "mask": 1,
            "equals": 1
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x1936, table ROM 0x6CFD9, state 0x327C (flags +1, owner +3): Black Bottle ink flag327D&01.",
        "Japanese entity 0x658, table ROM 0x6BCFB, state 0x34CA (flags +1, owner +3): Pool of Ink flags34CB.",
        "Japanese script 882, header CPU 0xA0F4A7, ROM 0x1074A7, bytecode 00A9..00C9: After the Octopus defeat/removal branch, reveals Pool of Ink0658 by setting01.",
        "Japanese script 230, header CPU 0xA0B693, ROM 0x103693, bytecode 000A..0018: Pool remains absent until its01 defeat-reveal bit is set.",
        "Japanese script 844, header CPU 0xA0B5FF, ROM 0x1035FF, bytecode 006C..0086: Black Bottle Use accepts only Pool0658, marks the pool used80, and sets its own01 ink-filled bit."
      ],
      "step": 57,
      "title": "Collect octopus ink"
    },
    {
      "id": "ice-delivery",
      "rule": {
        "address": 13880,
        "size": 1,
        "mask": 130,
        "equals": 130
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x1BE4, table ROM 0x6D287, state 0x3637 (flags +1, owner +3): Ice delivery NPC flags3638.",
        "Conversation46 Ice24 calls747: this charges100 through200 and sets80 only on payment.",
        "Conversation47 Docks12 calls647.",
        "Japanese script 647, header CPU 0x9BC3E2, ROM 0xDC3E2, bytecode 0000..000F: Sets the delivery NPC02, then hides Ice24 and Docks12. Both paid80 and delivery02 are required."
      ],
      "step": 58,
      "title": "Deliver ice"
    },
    {
      "id": "mermaid-scales",
      "rule": {
        "all": [
          {
            "address": 13267,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 13880,
            "size": 1,
            "mask": 2,
            "equals": 2
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x888, table ROM 0x6BF2B, state 0x33D0 (flags +1, owner +3): Mermaid Scales owner33D3.",
        "Japanese script 674, header CPU 0xA0B76B, ROM 0x10376B, bytecode 0008..001C,0051..006A: Scales pickup uses native75, but appearance checks purchase80, so ownership alone would not prove Docks delivery.",
        "Japanese script 647, header CPU 0x9BC3E2, ROM 0xDC3E2, bytecode 0000..0007: The separate delivery02 requirement proves the requested cleared-launch dependency."
      ],
      "step": 59,
      "title": "Search the cleared launch"
    },
    {
      "id": "dog-freeze",
      "rule": {
        "all": [
          {
            "address": 13920,
            "size": 1,
            "mask": 5,
            "equals": 5
          },
          {
            "address": 15810,
            "size": 1,
            "notEquals": 0
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0292..029F: Reward helper receives BlackBottle1936, MermaidScales0888 and mask04.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0137..015E: Requires both Jake-owned and Black Bottle ink01, sets Freeze3DC2=1; helper then sets Dog04.",
        "Dog01 is additionally required as the completed Rat trial gate; text1D2 confirms FREEZE."
      ],
      "step": 60,
      "title": "Learn a defensive spell"
    },
    {
      "id": "sail-bremerton",
      "rule": {
        "all": [
          {
            "address": 13225,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 13237,
            "size": 2,
            "oneOf": [
              2212,
              5418
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x192F, table ROM 0x6CFD2, state 0x33A8 (flags +1, owner +3): Boatman paid flag33A9&80.",
        "Japanese entity 0x1394, table ROM 0x6CA37, state 0x33B2 (flags +1, owner +3): Explosives owner33B5.",
        "Boatman conversation50 Bremerton4 record ROM0x68E3C calls363.",
        "Japanese script 363, header CPU 0x9BC431, ROM 0xDC431, bytecode 0000..000C: Pays1000 through common200 targeted at boatman192F; successful payment sets80.",
        "Japanese script 277, header CPU 0x9EFF47, ROM 0xF7F47, bytecode 0050..0065: Explosives pickup gives Jake ownership and checks automatic assembly932.",
        "Japanese script 932, header CPU 0x9EFE6F, ROM 0xF7E6F, bytecode 0014..002C: Canonical removed152A owner for Explosives is its consumption into the Time Bomb, so it is accepted as a later collected-item proof."
      ],
      "limitations": "Requires paid passage plus collected/assembled Explosives. Script295 removes the boatman after boarding but does not clear the80 payment flag, so later saves retain the proof.",
      "step": 61,
      "title": "Arrange passage"
    },
    {
      "id": "ship-entry",
      "rule": {
        "address": 13035,
        "size": 1,
        "mask": 1,
        "equals": 1
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x149E, table ROM 0x6CB41, state 0x32EA (flags +1, owner +3): Blocked deck door, flags32EB.",
        "Japanese script 893, header CPU 0xA0B0FF, ROM 0x1030FF, bytecode 005D..006F: Crowbar Use accepts deck Door149E and sets its01 pried-open bit.",
        "Japanese script 197, header CPU 0xA0C315, ROM 0x104315, bytecode 000E..001C: The deck door gate is controlled by this01 bit; room visits do not satisfy the rule."
      ],
      "proposedTitle": "Pry open the ship",
      "proposedText": "Use Crowbar on the blocked deck door to open the way inside.",
      "limitations": "Detects the full prying action. Does not claim the subsequent walking transition has already occurred.",
      "step": 62,
      "title": "Enter the ship"
    },
    {
      "id": "ship-detonator",
      "rule": {
        "all": [
          {
            "address": 15357,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 15345,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 15352,
            "size": 2,
            "equals": 5418
          },
          {
            "address": 13237,
            "size": 2,
            "equals": 5418
          },
          {
            "address": 13867,
            "size": 2,
            "oneOf": [
              2212,
              5418
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x620, table ROM 0x6BCC3, state 0x3BFA (flags +1, owner +3): Safe Key owner3BFD.",
        "Japanese entity 0x62E, table ROM 0x6BCD1, state 0x3BF0 (flags +1, owner +3): First safe flags3BF1.",
        "Japanese script 312, header CPU 0xA0B3F1, ROM 0x1033F1, bytecode 0069..007D: Using Safe Key on safe062E sets its80 opened bit.",
        "Japanese script 754, header CPU 0x9EFE9E, ROM 0xF7E9E, bytecode 0036..004B: Detonator pickup invokes assembly932.",
        "Japanese script 932, header CPU 0x9EFE6F, ROM 0xF7E6F, bytecode 0000..002C: Requires both Detonator15AF and Explosives1394 owned by Jake, changes both to removed152A, and creates Jake-owned TimeBomb0229.",
        "Japanese script 543, header CPU 0xA0AFDB, ROM 0x102FDB, bytecode 007E..0087: A later used Time Bomb is canonically removed152A, so both owned and used forms are accepted only with both assembled-part consumption proofs."
      ],
      "limitations": "Requires key, opened first safe, both consumed parts and assembled/used Time Bomb. It cannot complete from the Time Bomb alone.",
      "step": 63,
      "title": "Build the Time Bomb"
    },
    {
      "id": "toxic-water",
      "rule": {
        "all": [
          {
            "address": 12920,
            "size": 1,
            "mask": 2,
            "equals": 2
          },
          {
            "address": 12960,
            "size": 1,
            "mask": 1,
            "equals": 1
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x64A, table ROM 0x6BCED, state 0x3277 (flags +1, owner +3): Potion Bottles toxic-filled flag3278&02.",
        "Japanese entity 0x21B, table ROM 0x6B8BE, state 0x329F (flags +1, owner +3): Toxic Water pool state329F, flags32A0.",
        "Japanese script 439, header CPU 0xA0C6ED, ROM 0x1046ED, bytecode 0059..006C: Gray Poison Ooze death/removal sets ToxicWater021B flag01.",
        "Japanese script 356, header CPU 0xA0B481, ROM 0x103481, bytecode 000F..0019: Toxic Water is absent until its01 defeat-reveal bit is set.",
        "Japanese script 660, header CPU 0xA0B4DB, ROM 0x1034DB, bytecode 00DC..0113: Only target021B can set Potion Bottles02; text109 identifies the purple toxic-water bottle."
      ],
      "step": 64,
      "title": "Fill the second potion"
    },
    {
      "id": "airlock-puzzle",
      "rule": {
        "address": 15440,
        "size": 1,
        "mask": 64,
        "equals": 64
      },
      "mode": "state",
      "evidence": [
        "Japanese entity 0x627, table ROM 0x6BCCA, state 0x3C4F (flags +1, owner +3): Second safe pressure-memory flag3C50&40.",
        "Japanese script 81, header CPU 0xA0C744, ROM 0x104744, bytecode 0029..0047: Upper water switch refuses operation while lower airlock switch0276 is open01.",
        "Japanese script 81, header CPU 0xA0C744, ROM 0x104744, bytecode 0096..0102: Filling branch prints20E (Water Chamber filled - Maximum Pressure), completes its waits, then sets Safe0627 flag40."
      ],
      "limitations": "This is the persisted completed-pressure effect, not just a switch position or room visit. Later draining does not erase the achieved pressure flag.",
      "step": 65,
      "title": "Flood the guarded compartment"
    },
    {
      "id": "green-bottle",
      "rule": {
        "all": [
          {
            "address": 15425,
            "size": 1,
            "mask": 1,
            "equals": 0
          },
          {
            "address": 15400,
            "size": 1,
            "mask": 1,
            "equals": 0
          },
          {
            "address": 15440,
            "size": 1,
            "mask": 128,
            "equals": 128
          },
          {
            "address": 15447,
            "size": 2,
            "equals": 2212
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Japanese entity 0x276, table ROM 0x6B919, state 0x3C40 (flags +1, owner +3): Lower airlock switch flags3C41; reset closed is01 clear.",
        "Japanese entity 0x27D, table ROM 0x6B920, state 0x3C27 (flags +1, owner +3): Upper water switch flags3C28; reset drained is01 clear.",
        "Japanese entity 0x627, table ROM 0x6BCCA, state 0x3C4F (flags +1, owner +3): Second safe exploded/open flag3C50&80.",
        "Japanese entity 0x1053, table ROM 0x6C6F6, state 0x3C54 (flags +1, owner +3): Green Bottle owner3C57.",
        "Japanese script 543, header CPU 0xA0AFDB, ROM 0x102FDB, bytecode 003C..0087: Time Bomb accepts only safe0627, counts its timer, then sets80 and removes the used bomb.",
        "Japanese script 780, header CPU 0xA0C861, ROM 0x104861, bytecode 0053..0076: Closing lower airlock switch clears its01 bit.",
        "Japanese script 81, header CPU 0xA0C744, ROM 0x104744, bytecode 0050..0093: Resetting upper switch flushes the water and clears its01 bit.",
        "Japanese script 924, header CPU 0xA0B070, ROM 0x103070, bytecode 0038..004A: Green Bottle pickup gives ownerJake."
      ],
      "proposedText": "Reset both switches; use the Time Bomb on the safe and collect Green Bottle once it opens. Stand back while the timer runs.",
      "limitations": "Proves both resets, safe explosion and bottle pickup together. Standing back is safety advice; the game does not preserve Jake’s explosion-time distance as a quest flag.",
      "step": 66,
      "title": "Open the second safe"
    },
    {
      "id": "dog-ship-spells",
      "rule": {
        "all": [
          {
            "address": 13920,
            "size": 1,
            "mask": 35,
            "equals": 35
          },
          {
            "address": 15809,
            "size": 1,
            "notEquals": 0
          },
          {
            "address": 15807,
            "size": 1,
            "notEquals": 0
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0282..0292: Summon reward helper receives DogCollar1538 and DogTag151C, reward bit02.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 0121..0137: Sets Summon Spirit3DC1=1 only when both are Jake-owned; helper then sets Dog02.",
        "Japanese script 505, header CPU 0xA0F818, ROM 0x107818, bytecode 02C2..02D1,018A..01AD: Invisibility helper requires PotionBottles064A Jake-owned and flags03 (both waters), then sets3DBF=1 and Dog20.",
        "Dog01 Rat trial plus both distinct reward bits02/20 and both spell bytes are required."
      ],
      "step": 67,
      "title": "Make a spell detour"
    },
    {
      "id": "aft-ooze",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 12975,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 12965,
                "size": 1,
                "mask": 128,
                "equals": 128
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Green Bottle script924 accepts only target0380/0387 and ORs80 into target flags. Those records are32AE/32A4; both dissolve events are required. Room116/117 spawns identify the campaign pair."
      ]
    },
    {
      "id": "aft-switches",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 12980,
                "size": 1,
                "mask": 1,
                "equals": 1
              },
              {
                "address": 12985,
                "size": 1,
                "mask": 1,
                "equals": 1
              },
              {
                "address": 12990,
                "size": 1,
                "mask": 1,
                "equals": 0
              },
              {
                "address": 12982,
                "size": 2,
                "equals": 65535
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Aft door14C1 script9 passes controlling switch02A0 to door helper378. Switch58 delegates toggle358, OR1 means on.",
        "Mine script559 triggers when switch0284 is on and0292 is off (or proximity). All three switches are actual room116/117 spawns."
      ],
      "proposedText": "Activate the aft door switch and farthest mine switch; leave the middle switch off."
    },
    {
      "id": "jester-dimension",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 12194,
                "size": 2,
                "oneOf": [
                  75
                ]
              },
              {
                "address": 7387,
                "size": 2,
                "equals": 65535
              },
              {
                "address": 448,
                "size": 1,
                "equals": 15
              },
              {
                "address": 460,
                "size": 2,
                "equals": 0
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Room75 mapdata2E08 contains real Jester0B75 and insignia0B83; source transition geometry connects the preceding bubble room. This proves reaching this navigation destination, not defeating a boss."
      ],
      "proposedText": "Reach Jester's room beyond the portal, Naga and bubbles."
    },
    {
      "id": "jester-taunt",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "any": [
              {
                "all": [
                  {
                    "address": 13425,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  },
                  {
                    "address": 13427,
                    "size": 2,
                    "equals": 5418
                  }
                ]
              },
              {
                "all": [
                  {
                    "type": "vm",
                    "scriptCpu": 10281377,
                    "pcs": [
                      84
                    ]
                  },
                  {
                    "address": 15745,
                    "size": 2,
                    "equals": 2051
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Script415 second hit prints taunt text273, registers hostile conversation65, then writes nativeData10=0803 and returns to wait at0054.",
        "Later canonical defeat flag is retrospective proof: conversation65 Laughlyn invokes556, unavailable until that taunt registration."
      ],
      "proposedText": "Damage Jester until he taunts you and becomes ready for the true-name conversation."
    },
    {
      "id": "jester-name",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 13425,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 13427,
                "size": 2,
                "equals": 5418
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese conversation65, keyword28 Laughlyn, invokes script556. Its0000..0005 ORs80 into campaign boss0B75 flags3471. Real boss owner3473 must also be152A after its actual completion sequence; callback556 alone hardcodes0B75 even when invoked elsewhere, so its flag80 alone is not accepted."
      ]
    },
    {
      "id": "learn-volcano",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "keyword",
            "id": 63,
            "visible": true
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese conversation64 entry at ROM068169 (keyword14 Drake) learns63 Volcano; an exhaustive scan of conversation0..127 finds this as the only conversation teaching63."
      ]
    },
    {
      "id": "take-jester",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "any": [
              {
                "address": 13442,
                "size": 2,
                "equals": 2212
              },
              {
                "all": [
                  {
                    "address": 13440,
                    "size": 1,
                    "mask": 1,
                    "equals": 1
                  },
                  {
                    "address": 13442,
                    "size": 2,
                    "equals": 5418
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Script415 after Volcano is known sets insignia0B83 ownerJake at01B7..01BD. Script504 successful use only in campaign Drake map0x83AE (room290 alias) sets its flags01 and removes it; this supplies canonical later consumed proof."
      ]
    },
    {
      "id": "drake-preparation",
      "rule": null,
      "mode": "manual",
      "evidence": [],
      "limitations": "No exact record for this open-ended preparation choice."
    },
    {
      "id": "drake-lobby",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "any": [
              {
                "all": [
                  {
                    "address": 14850,
                    "size": 1,
                    "mask": 32,
                    "equals": 32
                  },
                  {
                    "address": 14852,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "all": [
                  {
                    "type": "vm",
                    "scriptCpu": 10602530,
                    "pcs": [
                      18
                    ],
                    "waitMask": 1,
                    "waitEquals": 1
                  },
                  {
                    "address": 7556,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Lobby computer16C7 script577 tests actual Drake Password075B ownerJake before Matrix access. Post-login result1D84 bit80 calls252.",
        "Persistent campaign UP-door13D3 flags3A02 bit20 means original elevator-open routine702 completed; VM577 post-return0012 plus result80 covers successful program before using the elevator."
      ]
    },
    {
      "id": "drake-middle",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "allObserved": [
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14870,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 14872,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10602627,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14910,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 14912,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10602890,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14950,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 14952,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10603128,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Three independent original program completions: floor2 computer16C0/581, floor3 computer16DC/591, floor4 computer16F8/600. Their campaign upward-door flags3A16/3A3E/3A66 bit20 recover old-save progress. They must all be observed independently."
      ],
      "proposedText": "On floors2–4, reach the terminals and activate each elevator program."
    },
    {
      "id": "drake-upper",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "allObserved": [
              {
                "all": [
                  {
                    "address": 15025,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  },
                  {
                    "address": 15027,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14990,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 14992,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10603199,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 15035,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 15037,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10603431,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Script601 datastore-result1D83 bit01 writes level6 node0D4A flags80 (WRAM3AB1); program1D84 bit80 calls elevator252.",
        "Floor6 script609 tests that same node80 permission before granting access. Up-door flags3A8E/3ABB bit20 recover floor5/floor6 usage."
      ]
    },
    {
      "id": "drake-roof",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 15097,
                "size": 2,
                "equals": 5418
              },
              {
                "address": 15087,
                "size": 2,
                "equals": 5418
              },
              {
                "address": 15090,
                "size": 1,
                "mask": 1,
                "equals": 1
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Roof sentries03CD/03D4 use death path570→nativeCD (owner152A).",
        "Pilot0CB0 conversation51 Volcano keyword63 invokes482; its flag01 is consumed by pilot37 to launch the volcano flight."
      ]
    },
    {
      "id": "volcano-entry",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 12194,
                "size": 2,
                "oneOf": [
                  100,
                  101,
                  203,
                  204,
                  218
                ]
              },
              {
                "address": 7387,
                "size": 2,
                "equals": 65535
              },
              {
                "address": 448,
                "size": 1,
                "equals": 15
              },
              {
                "address": 460,
                "size": 2,
                "equals": 0
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Sublevel0 entrance area script266 sets descent destination218 in nativeData2E and enters the generic lift. Room218 map22B8 is the original first-sublevel arrival hub; settled room aliases prove this navigation destination only."
      ]
    },
    {
      "id": "volcano-b1",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 15743,
            "size": 1,
            "mask": 1,
            "equals": 1
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Computer176F script875 after successful program1D84&80 invokes720(mask1). Script720 nativeA3 ORs mask into nativeData0E; native80CC96 writes word3D71+0E =3D7F."
      ]
    },
    {
      "id": "volcano-b2",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 15743,
            "size": 1,
            "mask": 2,
            "equals": 2
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Computer16AB script876 after successful program1D84&80 invokes720(mask2), persistently unlocking the third sublevel in3D7F. Turret combat is tactical advice, not a prerequisite for this flag."
      ],
      "proposedText": "Activate sublevel2's next elevator program; target scientist operators if sentries obstruct you."
    },
    {
      "id": "volcano-b3",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "address": 15743,
            "size": 1,
            "mask": 4,
            "equals": 4
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Computer17A7 script877 after successful program1D84&80 invokes720(mask4), persistently unlocking sublevel4 in3D7F. This is the actual progression result."
      ]
    },
    {
      "id": "naga-scales",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 15507,
                "size": 2,
                "equals": 2212
              },
              {
                "address": 15502,
                "size": 2,
                "equals": 5418
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Serpent Scales03C6 p3C90 use script384. On pickup, it removes the actual gold Naga07AF (owner3C8E=152A) then gives the scales to Jake (owner3C93=08A4)."
      ]
    },
    {
      "id": "dog-armor",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 13920,
                "size": 1,
                "mask": 9,
                "equals": 9
              },
              {
                "address": 15808,
                "size": 1,
                "oneOf": [
                  1,
                  2,
                  3,
                  4,
                  5,
                  6
                ]
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Dog505 requires Rat-completed flag01 and both SerpentScales03C6/MermaidScales0888 owned byJake. Its reward sets Dog flag08 and Armor level3DC0=1. Higher valid levels preserve the fact."
      ],
      "proposedText": "Offer both scale types to Dog and learn Armor."
    },
    {
      "id": "volcano-catwalks",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 12194,
                "size": 2,
                "oneOf": [
                  289,
                  290
                ]
              },
              {
                "address": 7387,
                "size": 2,
                "equals": 65535
              },
              {
                "address": 448,
                "size": 1,
                "equals": 15
              },
              {
                "address": 460,
                "size": 2,
                "equals": 0
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Campaign Drake chamber uses room289/290 map83AE and real boss146D. Reaching this destination proves the navigation objective only; debug Drake room176 is excluded."
      ]
    },
    {
      "id": "defeat-drake",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 14082,
                "size": 2,
                "equals": 5418
              },
              {
                "address": 13440,
                "size": 1,
                "mask": 1,
                "equals": 1
              },
              {
                "address": 13442,
                "size": 2,
                "equals": 5418
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Campaign Drake146D p36FF uses script416. Its defeated branch03B4 onward removes the battler, runs death sequence and sets owner152A via nativeCD at041F..0420.",
        "Insignia0B83 flags01 and removed owner prove the requested successful Jester use against the real Drake map. Campaign boss owner is3702; debug counterpart145F/3D30 does not satisfy this."
      ]
    },
    {
      "id": "pushkin-password",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "type": "keyword",
            "id": 2,
            "visible": true
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Japanese conversation67 Drake entry ROM06870C learns keyword02 Aneki. Exhaustive conversation0..127 scan found this as its only teaching record. This is the requested Pushkin topic result."
      ]
    },
    {
      "id": "pushkin-exit",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 15510,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 13862,
                "size": 2,
                "equals": 2212
              },
              {
                "type": "vm",
                "scriptCpu": 10420183,
                "pcs": [
                  30
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Conversation67 HeadComputer20 invokes917, which sets Pushkin04B4 flags80. Actor909 then gives AnekiPassword0754 and returns Jake to the roof.",
        "AnekiPassword script115 displays its actual code text483 on Examine. ResumePC001E is after that text native, providing the actual read event; mere password ownership is not accepted."
      ]
    },
    {
      "id": "final-shopping",
      "rule": null,
      "mode": "manual",
      "evidence": [],
      "limitations": "No exact record for this open-ended preparation choice."
    },
    {
      "id": "final-rest",
      "rule": null,
      "mode": "manual",
      "evidence": [],
      "limitations": "No exact record for this open-ended preparation choice."
    },
    {
      "id": "aneki-entry",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 12194,
                "size": 2,
                "oneOf": [
                  461,
                  462,
                  463,
                  471
                ]
              },
              {
                "address": 7387,
                "size": 2,
                "equals": 65535
              },
              {
                "address": 448,
                "size": 1,
                "equals": 15
              },
              {
                "address": 460,
                "size": 2,
                "equals": 0
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Aneki lobby map5E10 corresponds to room461/462/463/471. Stable room arrival proves entry only; it does not prove guard kills or any higher-floor progress."
      ],
      "proposedText": "Reach Aneki from Daley's market and enter the lobby."
    },
    {
      "id": "aneki-lobby",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "any": [
              {
                "all": [
                  {
                    "address": 15170,
                    "size": 1,
                    "mask": 32,
                    "equals": 32
                  },
                  {
                    "address": 15172,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "all": [
                  {
                    "type": "vm",
                    "scriptCpu": 10603529,
                    "pcs": [
                      18
                    ],
                    "waitMask": 1,
                    "waitEquals": 1
                  },
                  {
                    "address": 7556,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Computer1706 script582 gates Matrix permission on AnekiPassword0754 ownerJake. Its successful program calls252 for building1714. Up-door1420 flags3B42 bit20 recover the original lobby elevator unlock/use."
      ]
    },
    {
      "id": "aneki-floor2-data",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 14555,
                "size": 1,
                "mask": 128,
                "equals": 128
              },
              {
                "address": 14557,
                "size": 2,
                "equals": 65535
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Computer17AE script593 result1D83 bit80 writes node0F88 flags80 by native66 at0046..004B. Persistent node byte38DB is also checked by script594 before permitting third-floor access."
      ],
      "proposedText": "Download the second-floor data that deactivates the level3 node."
    },
    {
      "id": "aneki-floor2-lift",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "allObserved": [
              {
                "all": [
                  {
                    "address": 14555,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  },
                  {
                    "address": 14557,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14490,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 14492,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10603627,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "The other second-floor terminal1776 script590 successful program unlocks its elevator. Node0F88 bit80 plus this program/UP-door13C5 flag389A bit20 proves both second-floor progression objectives."
      ]
    },
    {
      "id": "aneki-floor3",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "all": [
                  {
                    "address": 14555,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  },
                  {
                    "address": 14557,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14560,
                        "size": 1,
                        "mask": 32,
                        "equals": 32
                      },
                      {
                        "address": 14562,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "all": [
                      {
                        "type": "vm",
                        "scriptCpu": 10603835,
                        "pcs": [
                          18
                        ],
                        "waitMask": 1,
                        "waitEquals": 1
                      },
                      {
                        "address": 7556,
                        "size": 1,
                        "mask": 128,
                        "equals": 128
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Script594 checks node0F88 bit80 and its returned program bit1D84&80 before calling252. Up-door140B flags38E0 bit20 persist after using that originally unlocked elevator."
      ]
    },
    {
      "id": "aneki-floor4",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "any": [
              {
                "all": [
                  {
                    "address": 14575,
                    "size": 1,
                    "mask": 32,
                    "equals": 32
                  },
                  {
                    "address": 14577,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "all": [
                  {
                    "type": "vm",
                    "scriptCpu": 10604076,
                    "pcs": [
                      18
                    ],
                    "waitMask": 1,
                    "waitEquals": 1
                  },
                  {
                    "address": 7556,
                    "size": 1,
                    "mask": 128,
                    "equals": 128
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Script603 successful program1D84&80 calls252. Up-door1427 flags38EF bit20 provide the matching original persistent elevator fact."
      ]
    },
    {
      "id": "aneki-otto",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "all": [
                  {
                    "address": 14697,
                    "size": 2,
                    "equals": 5418
                  },
                  {
                    "address": 14702,
                    "size": 2,
                    "equals": 5418
                  },
                  {
                    "address": 14707,
                    "size": 2,
                    "equals": 5418
                  },
                  {
                    "address": 14712,
                    "size": 2,
                    "equals": 5418
                  },
                  {
                    "address": 14717,
                    "size": 2,
                    "equals": 5418
                  }
                ]
              },
              {
                "any": [
                  {
                    "all": [
                      {
                        "address": 14720,
                        "size": 1,
                        "mask": 64,
                        "equals": 64
                      },
                      {
                        "address": 14722,
                        "size": 2,
                        "equals": 65535
                      }
                    ]
                  },
                  {
                    "type": "vm",
                    "scriptCpu": 10408805,
                    "pcs": [
                      834
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Canonical AI-room160/374 spawns mages0A33/09ED, Otto01B2 and samurai05B0/05E8. Their combat death paths863 set owner152A.",
        "AI computer261 active callerPC0342 is suspended in Matrix helper746 after using the computer; alternatively canonical AI-completion40 proves it was approached. Both guard deaths and actual computer approach/use are required."
      ]
    },
    {
      "id": "destroy-ai",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "address": 14720,
                "size": 1,
                "mask": 64,
                "equals": 64
              },
              {
                "address": 14722,
                "size": 2,
                "equals": 65535
              }
            ]
          }
        ]
      },
      "mode": "state",
      "evidence": [
        "Physical AI Computer1B6D record397F script261 handles the Matrix result1D84&80, prints download text606, and ORs40 into its persistent flags at030F..0312 before queuing ending-room160.",
        "Native Matrix81BF55..66 copies working program-result1758 to1D84 only after exit; graph entry clears working results at81BEB0. This rule uses the original game's canonical final-system completion, not a room visit or an isolated first-CPU hit. Owner3982==FFFF excludes uninitialized55 memory."
      ]
    },
    {
      "id": "ending",
      "rule": {
        "all": [
          {
            "address": 12208,
            "size": 2,
            "equals": 2212
          },
          {
            "all": [
              {
                "all": [
                  {
                    "address": 14720,
                    "size": 1,
                    "mask": 64,
                    "equals": 64
                  },
                  {
                    "address": 14722,
                    "size": 2,
                    "equals": 65535
                  }
                ]
              },
              {
                "address": 15773,
                "size": 2,
                "equals": 13
              },
              {
                "type": "vm",
                "scriptCpu": 10411143,
                "pcs": [
                  36
                ],
                "waitMask": 1,
                "waitEquals": 1
              }
            ]
          }
        ]
      },
      "mode": "observed",
      "evidence": [
        "Ending dispatcher38 reads nativeData2C (word3D9D). Its phase12 runs cast-roll151;151 exits through343, incrementing phase to13.",
        "Phase13 executes466: after its final display pose7, it yields atPC0024 for9999frames. Observing this actual final presentation phase, with canonical AI40, proves the ending sequence has reached its final screen. AI defeat alone is insufficient."
      ]
    }
  ],
  "limits": [
    "A rule checks only a source-proven state or event. Reaching a room alone does not prove an entire quest.",
    "Some brief events can be missed; manually check a completed task if its original record is no longer present.",
    "Old snapshots without browser progress metadata can recover persistent game facts, but not every past conversation or equipment action.",
    "Three optional preparation/choice steps remain manual."
  ]
}
