port: OPTIONS is reachable from the main menu
main_menu ptbtn04 had goto:null and blocked:'GP_OPTIONS not in this export'. GP_OPTIONS is in the export now, entry 19 is its root, and the walk works: main_menu -> down x3 -> (A) -> the OPTIONS root renders, (B) backs out. A dead button became a real screen. 🔴 Navigation INSIDE it does not work, and that is a decode question. The exporter's detector is kind==0x3002 && !focused; the OPTIONS rows are 0x3003, so role is unknown and buttons[] is empty. Not widened here -- what 0x3003 means is the Decoder's. The circumstantial case is strong and circumstantial is exactly the standard that has cost this project three retractions. A rule of 'has a focus record therefore is a menu item' fits both screens and is still an inference about semantics from structure; not taken. Also recorded: a screen NAME only reaches the port through a full re-export, which re-transcodes both movies -- renaming one screen costs the whole tree. 🔴 And a dangerous mistake: pkill -f 'check-all' matched the CONTAINER ENTRYPOINT, whose command line contains the loop prompt, which mentions check-all. pgrep then reported the job still running after it had stopped, and pkill -9 on that pattern could have killed the session. Match on comm or list with ps and check first -- a pattern that appears in your own instructions does not identify a process.
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
"boot": [
|
"boot": [
|
||||||
{
|
{
|
||||||
"screen": "publisher_logo",
|
"screen": "publisher_logo",
|
||||||
"why": "The SQUARE ENIX wordmark is the first thing the boot shows -- RE agent, 2026-08-29. Entry 10 of the pair; 13 is its region twin and the port shows one, not both. 📌 SOURCE, added 2026-09-01: the boot's screen order and dwells are derived from GP_TITLE's own entries -- see docs/port/FORMAT.md for the export shape and docs/re/ui-title-build-map.md for which entry is which screen. The order here is not authored; it is what the archive declares."
|
"why": "The SQUARE ENIX wordmark is the first thing the boot shows -- RE agent, 2026-08-29. Entry 10 of the pair; 13 is its region twin and the port shows one, not both. \ud83d\udccc SOURCE, added 2026-09-01: the boot's screen order and dwells are derived from GP_TITLE's own entries -- see docs/port/FORMAT.md for the export shape and docs/re/ui-title-build-map.md for which entry is which screen. The order here is not authored; it is what the archive declares."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"screen": "developer_logos",
|
"screen": "developer_logos",
|
||||||
@@ -34,11 +34,11 @@
|
|||||||
"screen": "press_start",
|
"screen": "press_start",
|
||||||
"clock": "shared",
|
"clock": "shared",
|
||||||
"why": "MEASURED, 2026-08-29, docs/re/title-plate-delay-measured.md on branch auto/no-disc-and-menu-captures at 5b0a6e6 (NOT on main when this was written). The boot title shows build 4 ALONE and the `PRESS (A) BUTTON` plate -- build 2 -- arrives later. This is the ONE case in the port where two builds are drawn at once.",
|
"why": "MEASURED, 2026-08-29, docs/re/title-plate-delay-measured.md on branch auto/no-disc-and-menu-captures at 5b0a6e6 (NOT on main when this was written). The boot title shows build 4 ALONE and the `PRESS (A) BUTTON` plate -- build 2 -- arrives later. This is the ONE case in the port where two builds are drawn at once.",
|
||||||
"no_constant_why": "THERE IS NO AUTHORED DELAY HERE, AND THERE WAS ONE FOR ONE ITERATION. The first version of this block carried `after_settle_seconds: 2.13`, taken from the RE agent's instruction. The port refuted that instruction with arithmetic off the disc -- build 2 has a group of its own, and starting it at settle put the plate 3.97 s late -- and the corrected answer needs no constant at all: BOTH BUILDS RUN ON ONE CLOCK, STARTED TOGETHER, and the plate arrives at its own declared t=236 (CORRECTED 2026-09-01 from t=238, which is the last opaque frame rather than the arrival). `clock: \"shared\"` is that, spelled out rather than implied by the absence of a delay field. 📌 SOURCES, added 2026-09-01 in the uncited-why backfill: the plate's arrival is docs/re/title-plate-delay-measured.md and its pulse is docs/re/structures/plate-pulse-measured.md. 🔴 AND `clock: \"shared\"` IS AUTHORED FROM OUR OWN ARITHMETIC, NOT MEASURED. Nobody has watched whether build 2's group starts with build 4's; it is the reading that reconciles the oracle's 2.13 s IF the settle anchor is t=118. See docs/port/plate-arrival-halves.md and BLOCKED.md H3.",
|
"no_constant_why": "THERE IS NO AUTHORED DELAY HERE, AND THERE WAS ONE FOR ONE ITERATION. The first version of this block carried `after_settle_seconds: 2.13`, taken from the RE agent's instruction. The port refuted that instruction with arithmetic off the disc -- build 2 has a group of its own, and starting it at settle put the plate 3.97 s late -- and the corrected answer needs no constant at all: BOTH BUILDS RUN ON ONE CLOCK, STARTED TOGETHER, and the plate arrives at its own declared t=236 (CORRECTED 2026-09-01 from t=238, which is the last opaque frame rather than the arrival). `clock: \"shared\"` is that, spelled out rather than implied by the absence of a delay field. \ud83d\udccc SOURCES, added 2026-09-01 in the uncited-why backfill: the plate's arrival is docs/re/title-plate-delay-measured.md and its pulse is docs/re/structures/plate-pulse-measured.md. \ud83d\udd34 AND `clock: \"shared\"` IS AUTHORED FROM OUR OWN ARITHMETIC, NOT MEASURED. Nobody has watched whether build 2's group starts with build 4's; it is the reading that reconciles the oracle's 2.13 s IF the settle anchor is t=118. See docs/port/plate-arrival-halves.md and BLOCKED.md H3.",
|
||||||
"arithmetic_why": "Why one clock reproduces the measurement, checked against this export rather than taken on trust: build 4's effect quads `pteff01`, `pteff02` and `ptlogoall_eff` end their ramps together at t=118; `ptbtn00` reaches alpha 255 at t=236; the difference is 118 units = 1.967 s at 60 units/s. The oracle measured 2.138 s and 2.132 s. The gap is presentation rate: the emulator presents at 28.1 fps against a nominal 30, and the corpus had independently measured the idle title at 28.5 fps before these runs. 🔴 CORRECTED 2026-09-01: this said `ptbtn00` reaches 255 at t=238 and that the difference is 120 units = 2.000 s. It reaches 255 at t=236 and HOLDS to 238, so 238 is the last opaque frame, not the arrival; 236 - 118 = 118. The port printed the contradiction in one sentence on every boot. The correction moves the reconciliation by 0.033 s and overturns nothing -- see docs/port/plate-arrival-halves.md. 🔴 AND THE ANCHOR IS NOW OPEN. The oracle defines \"title settled\" operationally, as its glyph counter first reading the no-plate value 154. This export offers TWO anchors 42 units apart: t=118 (the effect quads) and t=160 (`ptcopyright` at full alpha -- the LAST element to finish building in, and the only one made of glyphs). This line picked 118, while `ScreenView.settle_time()` returns 160 and the boot prints `settles at t=160`, so one binary holds both. Asked in BLOCKED.md H3; not guessed here. 📌 SOURCE: the pulse period and its phase behaviour are in docs/re/structures/plate-pulse-measured.md and docs/re/structures/plate-pulse-phase-lock.md, with the raw series in docs/re/data/plate-pulse-timeseries.txt. ✅ AUDITED 2026-09-01: the corpus's 28.5 fps is a genuinely independent leg -- a different quantity (idle-title presentation rate), measured BEFORE these runs, so it could have come out disagreeing. It agrees to 1.4 %.",
|
"arithmetic_why": "Why one clock reproduces the measurement, checked against this export rather than taken on trust: build 4's effect quads `pteff01`, `pteff02` and `ptlogoall_eff` end their ramps together at t=118; `ptbtn00` reaches alpha 255 at t=236; the difference is 118 units = 1.967 s at 60 units/s. The oracle measured 2.138 s and 2.132 s. The gap is presentation rate: the emulator presents at 28.1 fps against a nominal 30, and the corpus had independently measured the idle title at 28.5 fps before these runs. \ud83d\udd34 CORRECTED 2026-09-01: this said `ptbtn00` reaches 255 at t=238 and that the difference is 120 units = 2.000 s. It reaches 255 at t=236 and HOLDS to 238, so 238 is the last opaque frame, not the arrival; 236 - 118 = 118. The port printed the contradiction in one sentence on every boot. The correction moves the reconciliation by 0.033 s and overturns nothing -- see docs/port/plate-arrival-halves.md. \ud83d\udd34 AND THE ANCHOR IS NOW OPEN. The oracle defines \"title settled\" operationally, as its glyph counter first reading the no-plate value 154. This export offers TWO anchors 42 units apart: t=118 (the effect quads) and t=160 (`ptcopyright` at full alpha -- the LAST element to finish building in, and the only one made of glyphs). This line picked 118, while `ScreenView.settle_time()` returns 160 and the boot prints `settles at t=160`, so one binary holds both. Asked in BLOCKED.md H3; not guessed here. \ud83d\udccc SOURCE: the pulse period and its phase behaviour are in docs/re/structures/plate-pulse-measured.md and docs/re/structures/plate-pulse-phase-lock.md, with the raw series in docs/re/data/plate-pulse-timeseries.txt. \u2705 AUDITED 2026-09-01: the corpus's 28.5 fps is a genuinely independent leg -- a different quantity (idle-title presentation rate), measured BEFORE these runs, so it could have come out disagreeing. It agrees to 1.4 %.",
|
||||||
"the_premise_that_failed_why": "The port's own, and it is worth keeping because it will bite again: `rest.t` IS NOT WHEN A SCREEN SETTLES. It is the last hold keyframe before the exit. Reading it as the settle put build 4's arrival at 4.35 s instead of 1.97 s, and every reconciliation computed from it came out wrong by exactly that error. `ScreenView.settle_time()` still uses rest.t -- see docs/port/BLOCKED.md. 🔴 THE EXAMPLE THIS CITED IS GONE, THOUGH THE CONCLUSION IS NOT. It read \"`ptlogo1` has rest.t=251 and stops MOVING at t=42\". In the CURRENT export `ptlogo1.rest.t` is 42 -- equal to when it stops moving. The record-layout fix repaired precisely that element, and the entry was never re-derived under it (REFUTED.md now carries this at 🟡 ⟨our-reader⟩). rest.t is still wrong for transients -- `ptlogo_back2eff1` is a two-frame flash whose rest.t=54 is the flash PEAK -- and for `pteff00`, whose rest.t=16 sits at the end of the fade-FROM-black while a fade-TO-black runs 261..269. Re-derived 2026-09-01: docs/port/plate-arrival-halves.md. 🔴 AND IT IS NOT THIS DEFECT'S CAUSE. The plate's ARRIVAL is a declared keyframe (transparent to t=214, opaque at t=236), not a rest pose; rest.t=236 only chooses where `holding` parks it, and 236 is that ramp's own peak. Confirmed on a filmed boot with rest.t untouched: the onset is bracketed within one frame of 214.",
|
"the_premise_that_failed_why": "The port's own, and it is worth keeping because it will bite again: `rest.t` IS NOT WHEN A SCREEN SETTLES. It is the last hold keyframe before the exit. Reading it as the settle put build 4's arrival at 4.35 s instead of 1.97 s, and every reconciliation computed from it came out wrong by exactly that error. `ScreenView.settle_time()` still uses rest.t -- see docs/port/BLOCKED.md. \ud83d\udd34 THE EXAMPLE THIS CITED IS GONE, THOUGH THE CONCLUSION IS NOT. It read \"`ptlogo1` has rest.t=251 and stops MOVING at t=42\". In the CURRENT export `ptlogo1.rest.t` is 42 -- equal to when it stops moving. The record-layout fix repaired precisely that element, and the entry was never re-derived under it (REFUTED.md now carries this at \ud83d\udfe1 \u27e8our-reader\u27e9). rest.t is still wrong for transients -- `ptlogo_back2eff1` is a two-frame flash whose rest.t=54 is the flash PEAK -- and for `pteff00`, whose rest.t=16 sits at the end of the fade-FROM-black while a fade-TO-black runs 261..269. Re-derived 2026-09-01: docs/port/plate-arrival-halves.md. \ud83d\udd34 AND IT IS NOT THIS DEFECT'S CAUSE. The plate's ARRIVAL is a declared keyframe (transparent to t=214, opaque at t=236), not a rest pose; rest.t=236 only chooses where `holding` parks it, and 236 is that ramp's own peak. Confirmed on a filmed boot with rest.t untouched: the onset is bracketed within one frame of 214.",
|
||||||
"scope_why": "Attached to the BOOT STEP, not to the `title` screen, and that is deliberate. What was measured is the boot title. Whether the title shows the plate when it is REACHED AGAIN -- by (B) from the main menu, or after the attract movie -- is not measured, and putting the overlay on the screen would quietly claim it is. 📌 SOURCE, added 2026-09-01: the plate belongs to the boot's overlay step rather than to the title screen because its arrival is measured against the boot clock -- docs/re/title-plate-delay-measured.md. 🔴 STALE CLAUSE, CORRECTED 2026-09-01: this said \"Whether the title shows the plate when it is REACHED AGAIN -- by (B) from the main menu, or after the attract movie -- is not measured\". It IS measured now, and has been since 2026-08-30: after (B) from the menu the plate is re-drawn, pressed at 351.2 s with its pulse back at 358.5 s (the Decoder, nav-autorepeat-and-settled-b data). The port re-arms the overlay on arrival at the title by any path, and that is correct. What stayed true is the structural half -- the declaration lives on the boot STEP and is looked up from there, so a screen that gains an overlay gets it on both paths at once. ⚠️ What is STILL not measured is whether the returned plate FADES or appears at once; the 7.3 s between press and pulse is consistent with a transition plus the declared 214->236 fade, but that is consistency, not a measurement of the ramp on this path.",
|
"scope_why": "Attached to the BOOT STEP, not to the `title` screen, and that is deliberate. What was measured is the boot title. Whether the title shows the plate when it is REACHED AGAIN -- by (B) from the main menu, or after the attract movie -- is not measured, and putting the overlay on the screen would quietly claim it is. \ud83d\udccc SOURCE, added 2026-09-01: the plate belongs to the boot's overlay step rather than to the title screen because its arrival is measured against the boot clock -- docs/re/title-plate-delay-measured.md. \ud83d\udd34 STALE CLAUSE, CORRECTED 2026-09-01: this said \"Whether the title shows the plate when it is REACHED AGAIN -- by (B) from the main menu, or after the attract movie -- is not measured\". It IS measured now, and has been since 2026-08-30: after (B) from the menu the plate is re-drawn, pressed at 351.2 s with its pulse back at 358.5 s (the Decoder, nav-autorepeat-and-settled-b data). The port re-arms the overlay on arrival at the title by any path, and that is correct. What stayed true is the structural half -- the declaration lives on the boot STEP and is looked up from there, so a screen that gains an overlay gets it on both paths at once. \u26a0\ufe0f What is STILL not measured is whether the returned plate FADES or appears at once; the 7.3 s between press and pulse is consistent with a transition plus the declared 214->236 fade, but that is consistency, not a measurement of the ramp on this path.",
|
||||||
"no_pulse_why": "The port draws the plate arriving and then holding. It does not pulse it. The RE agent identifies the pulse as the plate's FOCUS RECORD `ptbtn00f` -- a glow ramping 0x00 to 0x50 and back, t=6..105 -- not as a loop of `ptbtn00`'s own group, which was the port's earlier reading and was wrong. Looping that record is a candidate the port has NOT taken: its group is 105 timed units plus an AUTHORED 24-unit exit ramp, and hitting the measured 2.24 s mean requires composing that authored constant with a loop assumption, which is tuning rather than measuring. Filed in BLOCKED.md. 📌 SOURCE, added 2026-09-01: docs/re/structures/plate-pulse-measured.md, and the phase-lock caveat that bounds what a gated capture can show is docs/re/structures/plate-pulse-phase-lock.md."
|
"no_pulse_why": "The port draws the plate arriving and then holding. It does not pulse it. The RE agent identifies the pulse as the plate's FOCUS RECORD `ptbtn00f` -- a glow ramping 0x00 to 0x50 and back, t=6..105 -- not as a loop of `ptbtn00`'s own group, which was the port's earlier reading and was wrong. Looping that record is a candidate the port has NOT taken: its group is 105 timed units plus an AUTHORED 24-unit exit ramp, and hitting the measured 2.24 s mean requires composing that authored constant with a loop assumption, which is tuning rather than measuring. Filed in BLOCKED.md. \ud83d\udccc SOURCE, added 2026-09-01: docs/re/structures/plate-pulse-measured.md, and the phase-lock caveat that bounds what a gated capture can show is docs/re/structures/plate-pulse-phase-lock.md."
|
||||||
},
|
},
|
||||||
"why": "HANDOFF Q2/Q6: the boot reaches the title after the intro movie. This is the LAST step, and a last step is where the sequence stops rather than fading out -- a boot that ends by fading to black looks like a boot that crashed. P5 gave the title somewhere to go, but that is a HANDOVER and not another boot step: `--boot` still stops here, and `--boot --play` hands the same held title to the menu flow, where (A) opens TITLE_MENU. Kept as a stop rather than folded into `screens` because what the boot does is authored from a measured sequence, and what (A) does is a separate measurement."
|
"why": "HANDOFF Q2/Q6: the boot reaches the title after the intro movie. This is the LAST step, and a last step is where the sequence stops rather than fading out -- a boot that ends by fading to black looks like a boot that crashed. P5 gave the title somewhere to go, but that is a HANDOVER and not another boot step: `--boot` still stops here, and `--boot --play` hands the same held title to the menu flow, where (A) opens TITLE_MENU. Kept as a stop rather than folded into `screens` because what the boot does is authored from a measured sequence, and what (A) does is a separate measurement."
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"It first said 'a screen's dwell is its OWN keyframe group'. Then GP_TITLE",
|
"It first said 'a screen's dwell is its OWN keyframe group'. Then GP_TITLE",
|
||||||
"build 4 was measured dwelling ~1100 presented frames against a declared ~120,",
|
"build 4 was measured dwelling ~1100 presented frames against a declared ~120,",
|
||||||
"and I generalised that into 'the boot is KNOWN TOO FAST [refuted] on both splashes'.",
|
"and I generalised that into 'the boot is KNOWN TOO FAST [refuted] on both splashes'.",
|
||||||
"🔴 THAT WAS AN OVER-CORRECTION and it is withdrawn. Build 4 is the title: its",
|
"\ud83d\udd34 THAT WAS AN OVER-CORRECTION and it is withdrawn. Build 4 is the title: its",
|
||||||
"exit is caused by something outside its timeline, so it holds. A splash's exit",
|
"exit is caused by something outside its timeline, so it holds. A splash's exit",
|
||||||
"is caused by nothing, so it plays its declared timeline and leaves. The title",
|
"is caused by nothing, so it plays its declared timeline and leaves. The title",
|
||||||
"is the exception, not the rule, and one screen was never enough to overturn",
|
"is the exception, not the rule, and one screen was never enough to overturn",
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
"4.400 s and 3.650 s -- each declared value plus the 9-unit black hold, exactly.",
|
"4.400 s and 3.650 s -- each declared value plus the 9-unit black hold, exactly.",
|
||||||
"So the pacing was right all along and nothing changes in the code.",
|
"So the pacing was right all along and nothing changes in the code.",
|
||||||
"",
|
"",
|
||||||
"🔴 AND THE UNIT STAYS UNITS, NOT SECONDS. The same two dwells timed in the",
|
"\ud83d\udd34 AND THE UNIT STAYS UNITS, NOT SECONDS. The same two dwells timed in the",
|
||||||
"Decoder's own container came out 15-20 % LONGER than both the declared values",
|
"Decoder's own container came out 15-20 % LONGER than both the declared values",
|
||||||
"and the corpus -- same disc, same timeline -- and three independent readings",
|
"and the corpus -- same disc, same timeline -- and three independent readings",
|
||||||
"of that container's rate disagree with each other. A seconds figure records",
|
"of that container's rate disagree with each other. A seconds figure records",
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
"left_right_why": "HANDOFF Q5: left/right do nothing. Measured. Implemented as an explicit no-op rather than by omission, so that 'we never wired it' and 'the game ignores it' are distinguishable in the code.",
|
"left_right_why": "HANDOFF Q5: left/right do nothing. Measured. Implemented as an explicit no-op rather than by omission, so that 'we never wired it' and 'the game ignores it' are distinguishable in the code.",
|
||||||
"left_right_kind": "measured",
|
"left_right_kind": "measured",
|
||||||
"input_during_transition": "ignored",
|
"input_during_transition": "ignored",
|
||||||
"input_during_transition_why": "AUTHORED, and NOT measured -- nobody has watched what the game does with a button pressed mid-fade. Ignoring is the choice that invents the least: it cannot queue a press the game might have dropped. Ask the RE agent before relying on it. 📌 WHERE THE ASK LIVES, added 2026-09-01: docs/port/BLOCKED.md carries it, and until now this why said \"ask the RE agent\" without naming where the question is recorded -- a pointer with no destination. An `authored` kind still needs a citation, because the thing to cite is the OPEN QUESTION the choice stands in for; without it, an invented value and a placeholder for a measurement read the same.",
|
"input_during_transition_why": "AUTHORED, and NOT measured -- nobody has watched what the game does with a button pressed mid-fade. Ignoring is the choice that invents the least: it cannot queue a press the game might have dropped. Ask the RE agent before relying on it. \ud83d\udccc WHERE THE ASK LIVES, added 2026-09-01: docs/port/BLOCKED.md carries it, and until now this why said \"ask the RE agent\" without naming where the question is recorded -- a pointer with no destination. An `authored` kind still needs a citation, because the thing to cite is the OPEN QUESTION the choice stands in for; without it, an invented value and a placeholder for a measurement read the same.",
|
||||||
"input_during_transition_kind": "authored",
|
"input_during_transition_kind": "authored",
|
||||||
"auto_repeat": false,
|
"auto_repeat": false,
|
||||||
"auto_repeat_why": "MEASURED 2026-08-30, Decoder daf8f47: a 2.0 s held (down) moves the cursor EXACTLY ONCE. Their counter passes its own control first -- a single 0.12 s tap gives exactly 1 spike, the hold gives 1, move spike 0.0202-0.0220 against a 0.0003-0.0038 floor. The port's edge-triggered _input already behaved this way; what changed is that it is now a MEASUREMENT rather than an unexamined consequence of how the handler was written. HANDOFF Q5's 'up / down' row is split at the source: one-item-per-press (evidenced by the 4-press wrap count) from no-auto-repeat (which had nothing until this run).",
|
"auto_repeat_why": "MEASURED 2026-08-30, Decoder daf8f47: a 2.0 s held (down) moves the cursor EXACTLY ONCE. Their counter passes its own control first -- a single 0.12 s tap gives exactly 1 spike, the hold gives 1, move spike 0.0202-0.0220 against a 0.0003-0.0038 floor. The port's edge-triggered _input already behaved this way; what changed is that it is now a MEASUREMENT rather than an unexamined consequence of how the handler was written. HANDOFF Q5's 'up / down' row is split at the source: one-item-per-press (evidenced by the 4-press wrap count) from no-auto-repeat (which had nothing until this run).",
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
"a screen file, and this field is documentation.",
|
"a screen file, and this field is documentation.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
"\ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
@@ -157,18 +157,18 @@
|
|||||||
"and not a refinement: a player who moved to EXTRAS, pressed (B), then (A),",
|
"and not a refinement: a player who moved to EXTRAS, pressed (B), then (A),",
|
||||||
"landed back on NEW GAME.",
|
"landed back on NEW GAME.",
|
||||||
"",
|
"",
|
||||||
"🔴 SCOPED TO THIS SCREEN ON PURPOSE, and the scope is the authored part.",
|
"\ud83d\udd34 SCOPED TO THIS SCREEN ON PURPOSE, and the scope is the authored part.",
|
||||||
"The measurement is of the MAIN MENU. Making it a menu-wide rule would be",
|
"The measurement is of the MAIN MENU. Making it a menu-wide rule would be",
|
||||||
"n=1 wearing a rule's clothes -- and here it would actively contradict a",
|
"n=1 wearing a rule's clothes -- and here it would actively contradict a",
|
||||||
"measurement, because `extras` opens on MISSION SELECT as a MEASURED initial",
|
"measurement, because `extras` opens on MISSION SELECT as a MEASURED initial",
|
||||||
"focus, and a remembered cursor would override it on re-entry. `wrap` is a",
|
"focus, and a remembered cursor would override it on re-entry. `wrap` is a",
|
||||||
"menu rule because it was measured on two screens; this was measured on one.",
|
"menu rule because it was measured on two screens; this was measured on one.",
|
||||||
"",
|
"",
|
||||||
"⚠️ WHAT IS NOT KNOWN: whether the memory survives a return to the BOOT",
|
"\u26a0\ufe0f WHAT IS NOT KNOWN: whether the memory survives a return to the BOOT",
|
||||||
"(as opposed to the title), and whether any other screen has it. Ask before",
|
"(as opposed to the title), and whether any other screen has it. Ask before",
|
||||||
"widening this.",
|
"widening this.",
|
||||||
"",
|
"",
|
||||||
"🔴 CORRECTED 2026-08-30, SAME DAY, by the Decoder: the paragraph above argued",
|
"\ud83d\udd34 CORRECTED 2026-08-30, SAME DAY, by the Decoder: the paragraph above argued",
|
||||||
"the scope from `extras` having a MEASURED initial focus that a remembered",
|
"the scope from `extras` having a MEASURED initial focus that a remembered",
|
||||||
"cursor would override. That is a good reason to be CAUTIOUS and NOT a finding",
|
"cursor would override. That is a good reason to be CAUTIOUS and NOT a finding",
|
||||||
"that `extras` resets. Nothing has measured what a submenu's own cursor does on",
|
"that `extras` resets. Nothing has measured what a submenu's own cursor does on",
|
||||||
@@ -182,10 +182,10 @@
|
|||||||
"asserted non-persistence as though it had been measured -- which would have",
|
"asserted non-persistence as though it had been measured -- which would have",
|
||||||
"held the port to the wrong behaviour and passed while doing it.",
|
"held the port to the wrong behaviour and passed while doing it.",
|
||||||
"",
|
"",
|
||||||
"❔ The Decoder is measuring EXTRAS re-entry now. Do not build on the",
|
"\u2754 The Decoder is measuring EXTRAS re-entry now. Do not build on the",
|
||||||
"non-persistence half until it returns.",
|
"non-persistence half until it returns.",
|
||||||
"",
|
"",
|
||||||
"📌 SOURCE, added 2026-09-01 in the uncited-why backfill: docs/re/data/focus-persists-across-title.txt carries the round trip, and docs/re/data/extras-focus-resets.txt carries the contrasting submenu result that keeps this scoped to one screen."
|
"\ud83d\udccc SOURCE, added 2026-09-01 in the uncited-why backfill: docs/re/data/focus-persists-across-title.txt carries the round trip, and docs/re/data/extras-focus-resets.txt carries the contrasting submenu result that keeps this scoped to one screen."
|
||||||
],
|
],
|
||||||
"initial_focus_why": [
|
"initial_focus_why": [
|
||||||
"MEASURED 2026-08-30 (later) -- `NEW GAME` on a fresh boot, 2/2 fresh boots,",
|
"MEASURED 2026-08-30 (later) -- `NEW GAME` on a fresh boot, 2/2 fresh boots,",
|
||||||
@@ -193,24 +193,24 @@
|
|||||||
"today's focus delivery\"; ring row y=225.5 against a measured 79.25 px step,",
|
"today's focus delivery\"; ring row y=225.5 against a measured 79.25 px step,",
|
||||||
"data in docs/re/data/menu-focus-reader-offset.txt.",
|
"data in docs/re/data/menu-focus-reader-offset.txt.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS FIELD WAS `authored` UNTIL NOW AND THE UPGRADE IS NOT BECAUSE IT",
|
"\ud83d\udd34 THIS FIELD WAS `authored` UNTIL NOW AND THE UPGRADE IS NOT BECAUSE IT",
|
||||||
"AGREES WITH ME. The value did not change; its standing did. The confirmation",
|
"AGREES WITH ME. The value did not change; its standing did. The confirmation",
|
||||||
"is a direct reading of a fresh boot's first menu entry, independent of the",
|
"is a direct reading of a fresh boot's first menu entry, independent of the",
|
||||||
"reasoning that chose NEW GAME here -- and the Decoder had said explicitly that",
|
"reasoning that chose NEW GAME here -- and the Decoder had said explicitly that",
|
||||||
"my agreeing with their records was no evidence, which was correct at the time.",
|
"my agreeing with their records was no evidence, which was correct at the time.",
|
||||||
"",
|
"",
|
||||||
"✅ AND IT SURVIVES A REBOOT -- MEASURED 2026-08-31. Six fresh boots all",
|
"\u2705 AND IT SURVIVES A REBOOT -- MEASURED 2026-08-31. Six fresh boots all",
|
||||||
"opened on NEW GAME, and THREE of them followed a session that ended with the",
|
"opened on NEW GAME, and THREE of them followed a session that ended with the",
|
||||||
"cursor on EXTRAS or OPTIONS. That is what makes it a test of persistence",
|
"cursor on EXTRAS or OPTIONS. That is what makes it a test of persistence",
|
||||||
"rather than six repetitions of the same start.",
|
"rather than six repetitions of the same start.",
|
||||||
"",
|
"",
|
||||||
"⚠️ REACH, and it is the Decoder's own caveat rather than mine: every one of",
|
"\u26a0\ufe0f REACH, and it is the Decoder's own caveat rather than mine: every one of",
|
||||||
"those sessions ended with the emulator KILLED, not shut down cleanly. A game",
|
"those sessions ended with the emulator KILLED, not shut down cleanly. A game",
|
||||||
"that writes menu state on a clean exit never gets the chance, so this",
|
"that writes menu state on a clean exit never gets the chance, so this",
|
||||||
"measures 'does not survive a KILLED session'. If a real console remembers a",
|
"measures 'does not survive a KILLED session'. If a real console remembers a",
|
||||||
"cursor across a power cycle, that does not contradict this.",
|
"cursor across a power cycle, that does not contradict this.",
|
||||||
"",
|
"",
|
||||||
"⚠️ WHY 'FIRST ENTRY' IS LOAD-BEARING: the menu REMEMBERS ITS CURSOR (see",
|
"\u26a0\ufe0f WHY 'FIRST ENTRY' IS LOAD-BEARING: the menu REMEMBERS ITS CURSOR (see",
|
||||||
"`focus_persists`), so any reading not taken on a fresh boot's first entry is",
|
"`focus_persists`), so any reading not taken on a fresh boot's first entry is",
|
||||||
"measuring HISTORY, not what the screen opens on. That objection is what",
|
"measuring HISTORY, not what the screen opens on. That objection is what",
|
||||||
"invalidated the earlier TUTORIAL/NEW GAME disagreement, and this measurement",
|
"invalidated the earlier TUTORIAL/NEW GAME disagreement, and this measurement",
|
||||||
@@ -222,12 +222,12 @@
|
|||||||
"",
|
"",
|
||||||
" (was) AUTHORED, standing in for HANDOFF Q5, which measured that initial focus is NOT STABLE: four boots of the same harness opened on TUTORIAL, TUTORIAL, NEW GAME, NEW GAME. A port has to open on something. ptbtn01 (NEW GAME) is picked because it is one of the two states actually observed and it is the top item, so a reader can predict it. It is a CHOICE. Delete this the day the RE agent finds what selects it. CORROBORATED 2026-08-29, and still not decoded: the committed capture live-main-menu.png has NEW GAME focused. Identified by rendering all five focus states and taking the minimum difference -- 531 differing pixels against 6080-7094 for the others, an 11.5x margin -- with the method controlled on live-main-menu-options-focused.png, whose answer is in its filename and which it picks by 4.7x. That means the port's choice matches the state of one committed frame. It does NOT make focus stable: Q5's four boots gave TUTORIAL, TUTORIAL, NEW GAME, NEW GAME, and this identifies one frame rather than a rule. Delete this entry the day something says what SELECTS it. TIGHTENED 2026-08-29: Q5 now has SIX boots, and the shape is sharper than 'unstable' -- TUTORIAL x3, NEW GAME x3, and NO OTHER ITEM EVER OBSERVED. So it is not uniform over five buttons; whatever selects it has to explain a two-way split. That does not change this choice (NEW GAME remains one of exactly two observed states, and it is the state of the committed capture) but it does change what would REFUTE it: a boot opening on LOAD GAME, OPTIONS or EXTRAS would break the two-way shape, and a rule that predicts the split would delete this entry outright.",
|
" (was) AUTHORED, standing in for HANDOFF Q5, which measured that initial focus is NOT STABLE: four boots of the same harness opened on TUTORIAL, TUTORIAL, NEW GAME, NEW GAME. A port has to open on something. ptbtn01 (NEW GAME) is picked because it is one of the two states actually observed and it is the top item, so a reader can predict it. It is a CHOICE. Delete this the day the RE agent finds what selects it. CORROBORATED 2026-08-29, and still not decoded: the committed capture live-main-menu.png has NEW GAME focused. Identified by rendering all five focus states and taking the minimum difference -- 531 differing pixels against 6080-7094 for the others, an 11.5x margin -- with the method controlled on live-main-menu-options-focused.png, whose answer is in its filename and which it picks by 4.7x. That means the port's choice matches the state of one committed frame. It does NOT make focus stable: Q5's four boots gave TUTORIAL, TUTORIAL, NEW GAME, NEW GAME, and this identifies one frame rather than a rule. Delete this entry the day something says what SELECTS it. TIGHTENED 2026-08-29: Q5 now has SIX boots, and the shape is sharper than 'unstable' -- TUTORIAL x3, NEW GAME x3, and NO OTHER ITEM EVER OBSERVED. So it is not uniform over five buttons; whatever selects it has to explain a two-way split. That does not change this choice (NEW GAME remains one of exactly two observed states, and it is the state of the committed capture) but it does change what would REFUTE it: a boot opening on LOAD GAME, OPTIONS or EXTRAS would break the two-way shape, and a rule that predicts the split would delete this entry outright.",
|
||||||
" (was) ",
|
" (was) ",
|
||||||
" (was) ✅ CONSISTENT WITH THE ONE CAPTURE, measured 2026-08-30. Rendering each of the",
|
" (was) \u2705 CONSISTENT WITH THE ONE CAPTURE, measured 2026-08-30. Rendering each of the",
|
||||||
" (was) five buttons focused against `live-main-menu.png` gives 0.0705 % for ptbtn01",
|
" (was) five buttons focused against `live-main-menu.png` gives 0.0705 % for ptbtn01",
|
||||||
" (was) and 0.72-0.84 % for the other four -- a 10x discrimination. So that capture",
|
" (was) and 0.72-0.84 % for the other four -- a 10x discrimination. So that capture",
|
||||||
" (was) shows NEW GAME focused, and the authored choice matches it.",
|
" (was) shows NEW GAME focused, and the authored choice matches it.",
|
||||||
" (was) ",
|
" (was) ",
|
||||||
" (was) ⚠️ THIS DOES NOT OVERTURN Q5. Q5 measured initial focus as UNSTABLE across",
|
" (was) \u26a0\ufe0f THIS DOES NOT OVERTURN Q5. Q5 measured initial focus as UNSTABLE across",
|
||||||
" (was) four boots; one capture showing ptbtn01 is consistent with that and does not",
|
" (was) four boots; one capture showing ptbtn01 is consistent with that and does not",
|
||||||
" (was) contradict it. What the measurement establishes is narrower and still worth",
|
" (was) contradict it. What the measurement establishes is narrower and still worth",
|
||||||
" (was) having: the port's focus rendering is distinctive enough that a capture",
|
" (was) having: the port's focus rendering is distinctive enough that a capture",
|
||||||
@@ -248,7 +248,7 @@
|
|||||||
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
"a screen file, and this field is documentation.",
|
"a screen file, and this field is documentation.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
"\ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
@@ -264,7 +264,7 @@
|
|||||||
"goto_name": "DLG_SELECT_DIFFICULTY",
|
"goto_name": "DLG_SELECT_DIFFICULTY",
|
||||||
"goto_name_kind": "name match, not measured",
|
"goto_name_kind": "name match, not measured",
|
||||||
"goto_name_why": [
|
"goto_name_why": [
|
||||||
"✅ CORRECTED 2026-08-31: this read `DIFFICULTY`, and the destination is a",
|
"\u2705 CORRECTED 2026-08-31: this read `DIFFICULTY`, and the destination is a",
|
||||||
"DIALOG rather than a GamePart -- `DLG_SELECT_DIFFICULTY`, `GP_DIALOG.pak`",
|
"DIALOG rather than a GamePart -- `DLG_SELECT_DIFFICULTY`, `GP_DIALOG.pak`",
|
||||||
"entries 2/3 [see the withdrawal below]. Decoder, TWO arguments [corrected below]; the geometry one is",
|
"entries 2/3 [see the withdrawal below]. Decoder, TWO arguments [corrected below]; the geometry one is",
|
||||||
"re-derived here with this port's own reader: entries 2 and 3 are the ONLY",
|
"re-derived here with this port's own reader: entries 2 and 3 are the ONLY",
|
||||||
@@ -272,13 +272,13 @@
|
|||||||
"259/329/399/469, spacing exactly 70. See",
|
"259/329/399/469, spacing exactly 70. See",
|
||||||
"`crates/sylpheed-export/examples/dialog_rows.rs`.",
|
"`crates/sylpheed-export/examples/dialog_rows.rs`.",
|
||||||
"",
|
"",
|
||||||
"🔴 SO THE FOUR EXTERNAL DESTINATIONS ARE NOT UNIFORM: three open GameParts",
|
"\ud83d\udd34 SO THE FOUR EXTERNAL DESTINATIONS ARE NOT UNIFORM: three open GameParts",
|
||||||
"and this one opens a dialog. HANDOFF Q6's count-match -- four external, EXTRAS",
|
"and this one opens a dialog. HANDOFF Q6's count-match -- four external, EXTRAS",
|
||||||
"internal -- still holds as a COUNT, and a rule read off it would be reading",
|
"internal -- still holds as a COUNT, and a rule read off it would be reading",
|
||||||
"across two categories. The Decoder sent that count with disc support",
|
"across two categories. The Decoder sent that count with disc support",
|
||||||
"yesterday and weakened it themselves today; recorded at the weaker strength.",
|
"yesterday and weakened it themselves today; recorded at the weaker strength.",
|
||||||
"",
|
"",
|
||||||
"✅ THE REACH IS NOW BOUNDED -- 2026-08-31, and both agents scanned for it.",
|
"\u2705 THE REACH IS NOW BOUNDED -- 2026-08-31, and both agents scanned for it.",
|
||||||
"",
|
"",
|
||||||
"It read: \"another four-button dialog with the same rows would be",
|
"It read: \"another four-button dialog with the same rows would be",
|
||||||
"indistinguishable by this evidence\". The Decoder searched every build in",
|
"indistinguishable by this evidence\". The Decoder searched every build in",
|
||||||
@@ -290,12 +290,12 @@
|
|||||||
"fewer than 2 would mean the reader cannot see the incumbents and its zero",
|
"fewer than 2 would mean the reader cannot see the incumbents and its zero",
|
||||||
"would mean nothing.",
|
"would mean nothing.",
|
||||||
"",
|
"",
|
||||||
"✅ And the name is now backed by a TABLE ENTRY rather than an inference",
|
"\u2705 And the name is now backed by a TABLE ENTRY rather than an inference",
|
||||||
"from a string list: every `DLG_` name in the image sits in a 12-byte record",
|
"from a string list: every `DLG_` name in the image sits in a 12-byte record",
|
||||||
"(id, name pointer, handler [corrected]) spanning 0x820A0A2C-0x820A0D68 -- 70 names,",
|
"(id, name pointer, handler [corrected]) spanning 0x820A0A2C-0x820A0D68 -- 70 names,",
|
||||||
"70 records, none unmatched. `DLG_SELECT_DIFFICULTY` is **id 2000**.",
|
"70 records, none unmatched. `DLG_SELECT_DIFFICULTY` is **id 2000**.",
|
||||||
"",
|
"",
|
||||||
"🔴 \"THREE INDEPENDENT ROUTES\" CORRECTED TO TWO -- 2026-08-31, by the Decoder,",
|
"\ud83d\udd34 \"THREE INDEPENDENT ROUTES\" CORRECTED TO TWO -- 2026-08-31, by the Decoder,",
|
||||||
"and I had relayed the count unchecked for the second time from one delivery.",
|
"and I had relayed the count unchecked for the second time from one delivery.",
|
||||||
"",
|
"",
|
||||||
"The image leg says DIFFICULTY is a dialog and names no entry, so alone it",
|
"The image leg says DIFFICULTY is a dialog and names no entry, so alone it",
|
||||||
@@ -305,11 +305,11 @@
|
|||||||
"is what the word \"three\" was taking credit for. The conclusion is unchanged;",
|
"is what the word \"three\" was taking credit for. The conclusion is unchanged;",
|
||||||
"the evidence is two arguments, one of them compound, and was never three.",
|
"the evidence is two arguments, one of them compound, and was never three.",
|
||||||
"",
|
"",
|
||||||
"📌 The test that falls out of it, theirs: ask of an n-routes claim not whether",
|
"\ud83d\udccc The test that falls out of it, theirs: ask of an n-routes claim not whether",
|
||||||
"the routes are correct but whether ANY COULD HAVE COME OUT DIFFERENTLY GIVEN",
|
"the routes are correct but whether ANY COULD HAVE COME OUT DIFFERENTLY GIVEN",
|
||||||
"THE OTHERS. That is an exclusion argument, and it is usually absent.",
|
"THE OTHERS. That is an exclusion argument, and it is usually absent.",
|
||||||
"",
|
"",
|
||||||
"🔴 WITHDRAWN 2026-08-31 -- \"AN EN/JP PAIR\", AND I RELAYED IT.",
|
"\ud83d\udd34 WITHDRAWN 2026-08-31 -- \"AN EN/JP PAIR\", AND I RELAYED IT.",
|
||||||
"",
|
"",
|
||||||
"The Decoder stated entries 2/3 as a language pair in the same HANDOFF row that",
|
"The Decoder stated entries 2/3 as a language pair in the same HANDOFF row that",
|
||||||
"identifies DIFFICULTY, as a fact, and has withdrawn it: nothing established the",
|
"identifies DIFFICULTY, as a fact, and has withdrawn it: nothing established the",
|
||||||
@@ -323,11 +323,11 @@
|
|||||||
"equally consistent with a duplicate. So `2/3` are two builds with the same four",
|
"equally consistent with a duplicate. So `2/3` are two builds with the same four",
|
||||||
"buttons at the same rows, and calling them EN and JP is an assumption.",
|
"buttons at the same rows, and calling them EN and JP is an assumption.",
|
||||||
"",
|
"",
|
||||||
"⚠️ THE IDENTIFICATION DOES NOT REST ON IT -- unique four-button geometry with",
|
"\u26a0\ufe0f THE IDENTIFICATION DOES NOT REST ON IT -- unique four-button geometry with",
|
||||||
"zero rivals disc-wide, plus the oracle capture. The pairing was decoration on a",
|
"zero rivals disc-wide, plus the oracle capture. The pairing was decoration on a",
|
||||||
"conclusion that stands without it, which is exactly why it travelled unchecked.",
|
"conclusion that stands without it, which is exactly why it travelled unchecked.",
|
||||||
"",
|
"",
|
||||||
"✅ RESTORED 2026-08-31, ON A MEASUREMENT RATHER THAN A RELAY. The Decoder took",
|
"\u2705 RESTORED 2026-08-31, ON A MEASUREMENT RATHER THAN A RELAY. The Decoder took",
|
||||||
"the `ja` capture of DIFFICULTY that was missing and 2/3 ARE English/Japanese:",
|
"the `ja` capture of DIFFICULTY that was missing and 2/3 ARE English/Japanese:",
|
||||||
"EN vs JP differ in 1.82 % of pixels in FOUR BANDS AND NOWHERE ELSE -- the",
|
"EN vs JP differ in 1.82 % of pixels in FOUR BANDS AND NOWHERE ELSE -- the",
|
||||||
"heading (DIFFICULTY -> the JP heading), the ring by 2 px, the BACK label, and",
|
"heading (DIFFICULTY -> the JP heading), the ring by 2 px, the BACK label, and",
|
||||||
@@ -335,18 +335,18 @@
|
|||||||
"leaves the three difficulty names in Latin script, which is why the disc figure",
|
"leaves the three difficulty names in Latin script, which is why the disc figure",
|
||||||
"is only 2.77 % of bytes against 1.82 % of pixels.",
|
"is only 2.77 % of bytes against 1.82 % of pixels.",
|
||||||
"",
|
"",
|
||||||
"📌 MY OBJECTION WAS NOT WRONG AND IS NOT WITHDRAWN. It was that IDENTICAL",
|
"\ud83d\udccc MY OBJECTION WAS NOT WRONG AND IS NOT WITHDRAWN. It was that IDENTICAL",
|
||||||
"ELEMENT SETS DO NOT IMPLY A LANGUAGE PAIR -- 26 of 65 adjacent pairs differ in",
|
"ELEMENT SETS DO NOT IMPLY A LANGUAGE PAIR -- 26 of 65 adjacent pairs differ in",
|
||||||
"button count, so adjacency proves nothing. That argument still holds; what has",
|
"button count, so adjacency proves nothing. That argument still holds; what has",
|
||||||
"changed is that the conclusion now rests on a direct locale capture instead of",
|
"changed is that the conclusion now rests on a direct locale capture instead of",
|
||||||
"on that inference. A bad argument for a true claim is still a bad argument, and",
|
"on that inference. A bad argument for a true claim is still a bad argument, and",
|
||||||
"the claim was correctly out of this file until somebody went and looked.",
|
"the claim was correctly out of this file until somebody went and looked.",
|
||||||
"",
|
"",
|
||||||
"⚠️ REACH, THEIRS: one JP boot, one screen, does not generalise. GP_TITLE 4/7 is",
|
"\u26a0\ufe0f REACH, THEIRS: one JP boot, one screen, does not generalise. GP_TITLE 4/7 is",
|
||||||
"known to differ by MORE than text -- entry 7 carries nine sprites entry 4 lacks.",
|
"known to differ by MORE than text -- entry 7 carries nine sprites entry 4 lacks.",
|
||||||
"Nothing in the port keys off locale today; this is recorded, not consumed.",
|
"Nothing in the port keys off locale today; this is recorded, not consumed.",
|
||||||
"",
|
"",
|
||||||
"🔴 RECORD LAYOUT CORRECTED 2026-09-01, and I had copied the wrong one. I wrote",
|
"\ud83d\udd34 RECORD LAYOUT CORRECTED 2026-09-01, and I had copied the wrong one. I wrote",
|
||||||
"\"(handler, id, name pointer)\"; it is {id, name_ptr, handler} -- the same three",
|
"\"(handler, id, name pointer)\"; it is {id, name_ptr, handler} -- the same three",
|
||||||
"fields shifted one word, so every record was being credited with the PREVIOUS",
|
"fields shifted one word, so every record was being credited with the PREVIOUS",
|
||||||
"record's handler. The Decoder caught it with a control dump: under the old",
|
"record's handler. The Decoder caught it with a control dump: under the old",
|
||||||
@@ -354,24 +354,24 @@
|
|||||||
"ids and names are unaffected and DLG_SELECT_DIFFICULTY is still 2000, so",
|
"ids and names are unaffected and DLG_SELECT_DIFFICULTY is still 2000, so",
|
||||||
"nothing here moves except the sentence.",
|
"nothing here moves except the sentence.",
|
||||||
"",
|
"",
|
||||||
"📌 FOURTH aside of theirs relayed into this file. The first three were an EN/JP",
|
"\ud83d\udccc FOURTH aside of theirs relayed into this file. The first three were an EN/JP",
|
||||||
"pairing, a leg count and an independence claim -- all decorative. This one is a",
|
"pairing, a leg count and an independence claim -- all decorative. This one is a",
|
||||||
"STRUCTURE, which is worse: a wrong field order is the kind of thing a later",
|
"STRUCTURE, which is worse: a wrong field order is the kind of thing a later",
|
||||||
"reader builds on, and it carried no weight here only by luck.",
|
"reader builds on, and it carried no weight here only by luck.",
|
||||||
"",
|
"",
|
||||||
"❔ AND THE JOIN IS NOT REACHABLE BY THAT ROUTE -- their negative, with their",
|
"\u2754 AND THE JOIN IS NOT REACHABLE BY THAT ROUTE -- their negative, with their",
|
||||||
"reach. All three handlers load the same global at 0x828E2B14 and take addresses",
|
"reach. All three handlers load the same global at 0x828E2B14 and take addresses",
|
||||||
"at 0x828E45E0/4640/467C, every one inside a 364 601-byte contiguous zero run:",
|
"at 0x828E45E0/4640/467C, every one inside a 364 601-byte contiguous zero run:",
|
||||||
"BSS, populated only at runtime. Controlled, because an all-zero read is also",
|
"BSS, populated only at runtime. Controlled, because an all-zero read is also",
|
||||||
"what a wrong address gives, and the dialog table itself reads non-zero through",
|
"what a wrong address gives, and the dialog table itself reads non-zero through",
|
||||||
"the same arithmetic.",
|
"the same arithmetic.",
|
||||||
"",
|
"",
|
||||||
"⚠️ That closes the DIALOG HANDLERS, not the image. The archive loader and any",
|
"\u26a0\ufe0f That closes the DIALOG HANDLERS, not the image. The archive loader and any",
|
||||||
"id-keyed table elsewhere are unexamined, so \"not in the image\" is NOT",
|
"id-keyed table elsewhere are unexamined, so \"not in the image\" is NOT",
|
||||||
"established. Recorded as a route rather than an answer, which is how they sent",
|
"established. Recorded as a route rather than an answer, which is how they sent",
|
||||||
"it.",
|
"it.",
|
||||||
"",
|
"",
|
||||||
"❔ STILL UNBOUND, and it is what would make this airtight: nothing connects",
|
"\u2754 STILL UNBOUND, and it is what would make this airtight: nothing connects",
|
||||||
"id 2000 to a pak entry. The table gives name-to-id, the disc gives a unique",
|
"id 2000 to a pak entry. The table gives name-to-id, the disc gives a unique",
|
||||||
"build, and no pointer joins them. The tie is UNIQUENESS PLUS THE ORACLE",
|
"build, and no pointer joins them. The tie is UNIQUENESS PLUS THE ORACLE",
|
||||||
"CAPTURE, not a binding -- so if a rival build ever appeared, this",
|
"CAPTURE, not a binding -- so if a rival build ever appeared, this",
|
||||||
@@ -391,7 +391,7 @@
|
|||||||
" (was) invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
" (was) invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
" (was) a screen file, and this field is documentation.",
|
" (was) a screen file, and this field is documentation.",
|
||||||
" (was) ",
|
" (was) ",
|
||||||
" (was) 🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
" (was) \ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
" (was) labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
" (was) labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
" (was) claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
" (was) claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
" (was) as BORROWED rather than ok, because a label resting on a neighbour's",
|
" (was) as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
@@ -407,7 +407,7 @@
|
|||||||
"then_video": "S00A",
|
"then_video": "S00A",
|
||||||
"then_video_why": "P7. HANDOFF Q9, DECODED from the movie manifest: MS00A -> S00A.wmv is the new-game intro, 93.9 s. Its POSITION is measured as well -- the movie starts ~4.5 s after (A) on the save slot, matched off the running game at 0.96-1.000 with a strictly monotone playhead over 25 consecutive 0.5 s samples.",
|
"then_video_why": "P7. HANDOFF Q9, DECODED from the movie manifest: MS00A -> S00A.wmv is the new-game intro, 93.9 s. Its POSITION is measured as well -- the movie starts ~4.5 s after (A) on the save slot, matched off the running game at 0.96-1.000 with a strictly monotone playhead over 25 consecutive 0.5 s samples.",
|
||||||
"then_video_kind": "decoded",
|
"then_video_kind": "decoded",
|
||||||
"unobserved_why": "WHAT FILLS THE ~4.5 s between the save slot and the movie is NOT KNOWN. The oracle run that would have shown it hit the already-documented sub_823070B0 cache crash after SELECT DATA. GP_TITLE does carry a LOADING screen -- entries 0/1 and 12/15, whose elements are every one of them named pgloading_* -- and LOADING is in the game's own screen vocabulary, but nobody has watched it appear here and the port does NOT put it in the chain on that basis. 📌 WHERE THE OPEN QUESTION LIVES, added 2026-09-01: docs/port/BLOCKED.md carries the row -- 'what fills the 4.5 s before S00A'. An explicit unknown still needs a citation, or it cannot be distinguished from an unexamined one.",
|
"unobserved_why": "WHAT FILLS THE ~4.5 s between the save slot and the movie is NOT KNOWN. The oracle run that would have shown it hit the already-documented sub_823070B0 cache crash after SELECT DATA. GP_TITLE does carry a LOADING screen -- entries 0/1 and 12/15, whose elements are every one of them named pgloading_* -- and LOADING is in the game's own screen vocabulary, but nobody has watched it appear here and the port does NOT put it in the chain on that basis. \ud83d\udccc WHERE THE OPEN QUESTION LIVES, added 2026-09-01: docs/port/BLOCKED.md carries the row -- 'what fills the 4.5 s before S00A'. An explicit unknown still needs a citation, or it cannot be distinguished from an unexamined one.",
|
||||||
"skippable": true,
|
"skippable": true,
|
||||||
"skippable_why": "HANDOFF Q9, MEASURED: one (A) press skips a movie -- the title was reached at 57 s against a 193 s baseline. Same rule the boot intro already uses.",
|
"skippable_why": "HANDOFF Q9, MEASURED: one (A) press skips a movie -- the title was reached at 57 s against a 193 s baseline. Same rule the boot intro already uses.",
|
||||||
"skippable_kind": "measured",
|
"skippable_kind": "measured",
|
||||||
@@ -438,7 +438,7 @@
|
|||||||
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
"a screen file, and this field is documentation.",
|
"a screen file, and this field is documentation.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
"\ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
@@ -448,9 +448,15 @@
|
|||||||
},
|
},
|
||||||
"ptbtn04": {
|
"ptbtn04": {
|
||||||
"label": "OPTIONS",
|
"label": "OPTIONS",
|
||||||
"goto": null,
|
"goto": "options",
|
||||||
"goto_name": null,
|
"goto_name": null,
|
||||||
"blocked": "The settings menu is GP_OPTIONS, not in this export. Destination MEASURED."
|
"goto_why": "UNBLOCKED 2026-09-03. This read goto:null with blocked: 'The settings menu is GP_OPTIONS, not in this export.' GP_OPTIONS is in the export now -- authored/screen_names.json export_archives -- and entry 19 is its root, named `options` from the text it renders: GAME SETTINGS, CONTROL SETTINGS, SOUND SETTINGS, SCREEN SETTINGS, BACK. docs/port/options-screens.md. The destination itself was always MEASURED; only the screen file was missing.",
|
||||||
|
"goto_kind": "measured-destination-newly-exported",
|
||||||
|
"limits": [
|
||||||
|
"\ud83d\udd34 THE SCREEN OPENS BUT DOES NOT NAVIGATE. Its five rows are kind 0x3003 and the exporter only treats 0x3002 as a button, so export buttons[] is empty and up/down move nothing. \u24b7 backs out correctly.",
|
||||||
|
"What 0x3003 MEANS is a decode question and is with the Decoder -- not widened here on the port's authority. The circumstantial case is strong (five rows, each with a focus record, on a screen whose own text lists five options) and circumstantial is exactly the standard this project keeps getting burned by.",
|
||||||
|
"None of the sub-screens is wired. Which row leads where is read off content, not measured navigation."
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"ptbtn05": {
|
"ptbtn05": {
|
||||||
"label": "EXTRAS",
|
"label": "EXTRAS",
|
||||||
@@ -467,7 +473,7 @@
|
|||||||
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
"a screen file, and this field is documentation.",
|
"a screen file, and this field is documentation.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
"\ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
@@ -489,13 +495,13 @@
|
|||||||
"first entry, and the screen confirmed by eye as EXTRAS because an earlier",
|
"first entry, and the screen confirmed by eye as EXTRAS because an earlier",
|
||||||
"run was fooled about which screen it was on.",
|
"run was fooled about which screen it was on.",
|
||||||
"",
|
"",
|
||||||
"📌 WRITTEN EXPLICITLY, THOUGH THE PORT'S DEFAULT IS ALREADY false. The",
|
"\ud83d\udccc WRITTEN EXPLICITLY, THOUGH THE PORT'S DEFAULT IS ALREADY false. The",
|
||||||
"absent key and the measured false behave identically and mean completely",
|
"absent key and the measured false behave identically and mean completely",
|
||||||
"different things: one is 'nobody looked', the other is 'the game was",
|
"different things: one is 'nobody looked', the other is 'the game was",
|
||||||
"watched doing it'. `tools/port/audit-kinds` can see the second and not the",
|
"watched doing it'. `tools/port/audit-kinds` can see the second and not the",
|
||||||
"first, which is the whole reason for spending a key on it.",
|
"first, which is the whole reason for spending a key on it.",
|
||||||
"",
|
"",
|
||||||
"🔴 AND THIS IS NOT A VINDICATION OF HOW IT GOT HERE. For one iteration the",
|
"\ud83d\udd34 AND THIS IS NOT A VINDICATION OF HOW IT GOT HERE. For one iteration the",
|
||||||
"port ASSERTED non-persistence for EXTRAS in `contract-check` while nothing",
|
"port ASSERTED non-persistence for EXTRAS in `contract-check` while nothing",
|
||||||
"had measured it; the Decoder flagged that, and it turned out right. Being",
|
"had measured it; the Decoder flagged that, and it turned out right. Being",
|
||||||
"right by luck does not retroactively make it evidence -- declining to",
|
"right by luck does not retroactively make it evidence -- declining to",
|
||||||
@@ -503,14 +509,14 @@
|
|||||||
"here' as a positive claim was a different and wrong one that happened to",
|
"here' as a positive claim was a different and wrong one that happened to",
|
||||||
"land. The measurement is what makes it true; the assertion never did.",
|
"land. The measurement is what makes it true; the assertion never did.",
|
||||||
"",
|
"",
|
||||||
"⚠️ Do NOT generalise in either direction: main_menu persists, EXTRAS resets,",
|
"\u26a0\ufe0f Do NOT generalise in either direction: main_menu persists, EXTRAS resets,",
|
||||||
"and OPTIONS / LOAD GAME / TUTORIAL are untouched."
|
"and OPTIONS / LOAD GAME / TUTORIAL are untouched."
|
||||||
],
|
],
|
||||||
"initial_focus_why": [
|
"initial_focus_why": [
|
||||||
"MEASURED, unlike the main menu's: EXTRAS opens focused on MISSION SELECT (live-extras.png). It is authored here only because there is nowhere else to put a measurement -- it is not a choice.",
|
"MEASURED, unlike the main menu's: EXTRAS opens focused on MISSION SELECT (live-extras.png). It is authored here only because there is nowhere else to put a measurement -- it is not a choice.",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"✅ CAVEAT LIFTED 2026-08-30 -- MEASURED, not a single-entry reading any more.",
|
"\u2705 CAVEAT LIFTED 2026-08-30 -- MEASURED, not a single-entry reading any more.",
|
||||||
"HANDOFF `4ed75e6`, docs/re/data/extras-focus-resets.txt: EXTRAS opens at ring",
|
"HANDOFF `4ed75e6`, docs/re/data/extras-focus-resets.txt: EXTRAS opens at ring",
|
||||||
"y=347.5 on MISSION SELECT, moves to 427.5 after one delivery-confirmed DOWN,",
|
"y=347.5 on MISSION SELECT, moves to 427.5 after one delivery-confirmed DOWN,",
|
||||||
"and returns to 347.5 on re-entry with the frame 0.0 % different from the first",
|
"and returns to 347.5 on re-entry with the frame 0.0 % different from the first",
|
||||||
@@ -518,7 +524,7 @@
|
|||||||
"measuring history -- which is precisely what made the caveat necessary while",
|
"measuring history -- which is precisely what made the caveat necessary while",
|
||||||
"persistence here was unknown.",
|
"persistence here was unknown.",
|
||||||
"",
|
"",
|
||||||
"✅ THE AMBIGUITY IS RESOLVED -- MEASURED 2026-08-31, and it went the way",
|
"\u2705 THE AMBIGUITY IS RESOLVED -- MEASURED 2026-08-31, and it went the way",
|
||||||
"that makes `ptbtn11` right for a REASON rather than by coincidence.",
|
"that makes `ptbtn11` right for a REASON rather than by coincidence.",
|
||||||
"",
|
"",
|
||||||
"A submenu resets to ITS OWN OPENING ITEM, and that item is a per-screen",
|
"A submenu resets to ITS OWN OPENING ITEM, and that item is a per-screen",
|
||||||
@@ -533,13 +539,13 @@
|
|||||||
"`MenuFlow.initial_focus` is a REPAIR rather than a default -- which is how",
|
"`MenuFlow.initial_focus` is a REPAIR rather than a default -- which is how",
|
||||||
"it was already documented, and is now measured rather than principled.",
|
"it was already documented, and is now measured rather than principled.",
|
||||||
"",
|
"",
|
||||||
"❔ STILL OPEN, and not leaned on: whether the reset target MOVES once a",
|
"\u2754 STILL OPEN, and not leaned on: whether the reset target MOVES once a",
|
||||||
"difficulty has actually been confirmed. A game that remembered your last",
|
"difficulty has actually been confirmed. A game that remembered your last",
|
||||||
"choice would behave differently, and the probe never confirms one -- the",
|
"choice would behave differently, and the probe never confirms one -- the",
|
||||||
"same SELECT DATA crash that constrains the run prevents testing it.",
|
"same SELECT DATA crash that constrains the run prevents testing it.",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"🔴 CORRECTED 2026-08-31. This read \"it matters IF another screen is ever",
|
"\ud83d\udd34 CORRECTED 2026-08-31. This read \"it matters IF another screen is ever",
|
||||||
"authored\" whose opening item is not its first. Such a screen exists and is",
|
"authored\" whose opening item is not its first. Such a screen exists and is",
|
||||||
"recorded IN THIS FILE: DIFFICULTY, under `main_menu/buttons/ptbtn01`, is",
|
"recorded IN THIS FILE: DIFFICULTY, under `main_menu/buttons/ptbtn01`, is",
|
||||||
"EASY/NORMAL/HARD/BACK and opens on NORMAL -- the SECOND of four. Measured:",
|
"EASY/NORMAL/HARD/BACK and opens on NORMAL -- the SECOND of four. Measured:",
|
||||||
@@ -555,7 +561,7 @@
|
|||||||
"reading, and the REASON is not established.",
|
"reading, and the REASON is not established.",
|
||||||
"",
|
"",
|
||||||
"The superseded caveat is kept below.",
|
"The superseded caveat is kept below.",
|
||||||
" (was) ⚠️ WEAKENED 2026-08-30 -- the OBSERVATION stands, its reading as an INITIAL",
|
" (was) \u26a0\ufe0f WEAKENED 2026-08-30 -- the OBSERVATION stands, its reading as an INITIAL",
|
||||||
" (was) focus does not. It was taken on a single entry. Now that the main menu is known",
|
" (was) focus does not. It was taken on a single entry. Now that the main menu is known",
|
||||||
" (was) to remember its cursor across a round trip, a one-entry reading of any screen",
|
" (was) to remember its cursor across a round trip, a one-entry reading of any screen",
|
||||||
" (was) may be measuring HISTORY rather than what the screen opens on -- the same",
|
" (was) may be measuring HISTORY rather than what the screen opens on -- the same",
|
||||||
@@ -563,10 +569,10 @@
|
|||||||
" (was) ",
|
" (was) ",
|
||||||
" (was) Kept as `measured` because the frame really does show MISSION SELECT focused,",
|
" (was) Kept as `measured` because the frame really does show MISSION SELECT focused,",
|
||||||
" (was) and kept as the port's opening item because it is the only reading there is.",
|
" (was) and kept as the port's opening item because it is the only reading there is.",
|
||||||
" (was) 🔴 If EXTRAS turns out to persist, this becomes history and the kind must",
|
" (was) \ud83d\udd34 If EXTRAS turns out to persist, this becomes history and the kind must",
|
||||||
" (was) change with it.",
|
" (was) change with it.",
|
||||||
"",
|
"",
|
||||||
"🔴 CHECKED AGAINST THE BYTES 2026-08-31 by both agents -- and NOT independently.",
|
"\ud83d\udd34 CHECKED AGAINST THE BYTES 2026-08-31 by both agents -- and NOT independently.",
|
||||||
"Settled by fact, not by my inference: the Decoder's 282/362/442 came from",
|
"Settled by fact, not by my inference: the Decoder's 282/362/442 came from",
|
||||||
"`crates/sylpheed-formats/examples/extras_button_order.rs`, which calls",
|
"`crates/sylpheed-formats/examples/extras_button_order.rs`, which calls",
|
||||||
"`ui_layout::parse_build` -- THE SAME CRATE this port's export uses. The",
|
"`ui_layout::parse_build` -- THE SAME CRATE this port's export uses. The",
|
||||||
@@ -575,7 +581,7 @@
|
|||||||
"information about the reader being right; it carries information only about",
|
"information about the reader being right; it carries information only about",
|
||||||
"two callers of it agreeing, which they could not fail to do.",
|
"two callers of it agreeing, which they could not fail to do.",
|
||||||
"",
|
"",
|
||||||
"⚠️ The VALUE is unaffected -- `ptbtn11` is decided by the DIFFICULTY",
|
"\u26a0\ufe0f The VALUE is unaffected -- `ptbtn11` is decided by the DIFFICULTY",
|
||||||
"measurement and by the reset finding. What died is a word I used about the",
|
"measurement and by the reset finding. What died is a word I used about the",
|
||||||
"evidence, which is the third such word in three iterations.",
|
"evidence, which is the third such word in three iterations.",
|
||||||
"",
|
"",
|
||||||
@@ -591,7 +597,7 @@
|
|||||||
"",
|
"",
|
||||||
"So: the values agreeing is still evidence, and calling it INDEPENDENT was a",
|
"So: the values agreeing is still evidence, and calling it INDEPENDENT was a",
|
||||||
"claim about their tooling that I did not check. Recorded at the strength I",
|
"claim about their tooling that I did not check. Recorded at the strength I",
|
||||||
"can support. ⚠️ Nothing rests on it -- the row order is also decided by the",
|
"can support. \u26a0\ufe0f Nothing rests on it -- the row order is also decided by the",
|
||||||
"DIFFICULTY measurement -- which is exactly why it went unexamined.",
|
"DIFFICULTY measurement -- which is exactly why it went unexamined.",
|
||||||
"",
|
"",
|
||||||
"Decoder attempted to refute this value and it survives: `ptbtn11` is the TOP",
|
"Decoder attempted to refute this value and it survives: `ptbtn11` is the TOP",
|
||||||
@@ -600,7 +606,7 @@
|
|||||||
"export, a different reader of the same disc: extras 282/362/442, and the main",
|
"export, a different reader of the same disc: extras 282/362/442, and the main",
|
||||||
"menu as a control at 162/242/322/401/482.",
|
"menu as a control at 162/242/322/401/482.",
|
||||||
"",
|
"",
|
||||||
"🔴 WHICH ALSO MEANS EXTRAS CANNOT SEPARATE the two readings -- named item and",
|
"\ud83d\udd34 WHICH ALSO MEANS EXTRAS CANNOT SEPARATE the two readings -- named item and",
|
||||||
"top item coincide here. It was DIFFICULTY, opening on its second of four, that",
|
"top item coincide here. It was DIFFICULTY, opening on its second of four, that",
|
||||||
"settled it."
|
"settled it."
|
||||||
],
|
],
|
||||||
@@ -618,7 +624,7 @@
|
|||||||
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
"a screen file, and this field is documentation.",
|
"a screen file, and this field is documentation.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
"\ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
@@ -654,7 +660,7 @@
|
|||||||
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
"invent one. THE PORT NEVER BRANCHES ON IT: navigation uses `goto`, which is",
|
||||||
"a screen file, and this field is documentation.",
|
"a screen file, and this field is documentation.",
|
||||||
"",
|
"",
|
||||||
"🔴 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
"\ud83d\udd34 THIS `why` DID NOT EXIST UNTIL 2026-08-30. All seven `goto_name_kind`",
|
||||||
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
"labels rested on a sibling `why` that argues the DESTINATION -- a different",
|
||||||
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
"claim from where the NAME came from. `tools/port/audit-kinds` reports that",
|
||||||
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
"as BORROWED rather than ok, because a label resting on a neighbour's",
|
||||||
|
|||||||
@@ -42,3 +42,52 @@ anything beyond `main_menu → options` needs the real navigation.
|
|||||||
* **All 14 are `NEVER COMPARED`** by `verify-screen` — reported, not asserted;
|
* **All 14 are `NEVER COMPARED`** by `verify-screen` — reported, not asserted;
|
||||||
both its allowance and the reference renderer were calibrated on `GP_TITLE`.
|
both its allowance and the reference renderer were calibrated on `GP_TITLE`.
|
||||||
* The screens are static: no navigation, no focus movement, no value editing.
|
* The screens are static: no navigation, no focus movement, no value editing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ✅ OPTIONS is reachable — and navigation inside it is blocked on a kind
|
||||||
|
|
||||||
|
`main_menu` `ptbtn04` now has `goto: "options"`. Walked with the menu harness:
|
||||||
|
main_menu → ⬇⬇⬇ → Ⓐ → the OPTIONS root renders. Ⓑ backs out.
|
||||||
|
|
||||||
|
## 🔴 The rows do not move, and the reason is a decode question
|
||||||
|
|
||||||
|
The exporter's button detector is `kind == 0x3002 && !focused`. The OPTIONS rows
|
||||||
|
are **`kind_raw = 0x3003`**, so `role` comes out `unknown`, the export's
|
||||||
|
`buttons[]` is empty, and up/down move nothing.
|
||||||
|
|
||||||
|
| screen | element | kind | focus record | in `buttons[]` |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `main_menu` | `ptbtn01` | `0x3002` | yes | yes |
|
||||||
|
| `extras` | `ptbtn11` | `0x3002` | yes | yes |
|
||||||
|
| **`options`** | **`po_menu_btn1`** | **`0x3003`** | **yes** | **no** |
|
||||||
|
|
||||||
|
**What `0x3003` means is not the port's to decide**, so the rule was not widened
|
||||||
|
here. The circumstantial case is strong — five rows, each carrying a focus
|
||||||
|
record, on a screen whose own text lists five options — and *circumstantial* is
|
||||||
|
precisely the standard that has cost this project three separate retractions.
|
||||||
|
Asked of the Decoder.
|
||||||
|
|
||||||
|
⚠️ A tempting alternative rule is "an element with a focus record is a menu item",
|
||||||
|
which fits both screens. It is still an inference about semantics from structure,
|
||||||
|
and it would silently reclassify elements on every screen in the export. Not
|
||||||
|
taken.
|
||||||
|
|
||||||
|
## The workflow cost this exposed, worth knowing before repeating it
|
||||||
|
|
||||||
|
**A screen name is authored data, but it only reaches the port through a full
|
||||||
|
re-export** — which re-transcodes both movies. Renaming one screen costs the
|
||||||
|
whole tree. Not worth fixing today; worth knowing before anyone plans a naming
|
||||||
|
pass.
|
||||||
|
|
||||||
|
## 🔴 And a genuinely dangerous mistake, recorded because it nearly cost the session
|
||||||
|
|
||||||
|
Killing a background check with `pkill -f "check-all"` matched **the container's
|
||||||
|
own entrypoint**, whose command line contains the loop prompt — and that prompt
|
||||||
|
mentions `check-all`. `pgrep` duly reported the process as still running after it
|
||||||
|
had stopped, and a `pkill -9` on that pattern could have killed the session
|
||||||
|
itself.
|
||||||
|
|
||||||
|
**Match a process by its actual `comm`, or list with `ps` and check, before
|
||||||
|
sending a signal.** A pattern that appears in your own instructions is not a
|
||||||
|
pattern that identifies a process.
|
||||||
|
|||||||
Reference in New Issue
Block a user