diff --git a/authored/flow.json b/authored/flow.json index 59a0e27f..55c9230c 100644 --- a/authored/flow.json +++ b/authored/flow.json @@ -15,7 +15,7 @@ "boot": [ { "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." + "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." }, { "screen": "developer_logos", @@ -34,11 +34,11 @@ "screen": "press_start", "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.", - "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=238. `clock: \"shared\"` is that, spelled out rather than implied by the absence of a delay field.", - "arithmetic_why": "Why one clock reproduces the measurement, checked against this export rather than taken on trust: build 4's visible build-in ends at t=118, where `pteff01`, `pteff02` and `ptlogoall_eff` finish together; `ptbtn00` reaches alpha 255 at t=238; the difference is 120 units = 2.000 s at 60 units/s. The oracle measured 2.138 s and 2.132 s. The gap is presentation rate: 120 units in 2.135 s is 56.2 units/s, i.e. the emulator presenting at 28.1 fps against a nominal 30, and the corpus had independently measured the idle title at 28.5 fps before these runs.", + "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=238. `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.", + "arithmetic_why": "Why one clock reproduces the measurement, checked against this export rather than taken on trust: build 4's visible build-in ends at t=118, where `pteff01`, `pteff02` and `ptlogoall_eff` finish together; `ptbtn00` reaches alpha 255 at t=238; the difference is 120 units = 2.000 s at 60 units/s. The oracle measured 2.138 s and 2.132 s. The gap is presentation rate: 120 units in 2.135 s is 56.2 units/s, i.e. the emulator presenting at 28.1 fps against a nominal 30, and the corpus had independently measured the idle title at 28.5 fps before these runs. 📌 SOURCE, added 2026-09-01: 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.", "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. `ptlogo1` has rest.t=251 and stops MOVING at t=42, then creeps 5 px and 31 alpha steps over the next 209 units. Reading rest.t 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.", - "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.", - "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." + "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.", + "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." }, "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." } @@ -183,7 +183,9 @@ "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", - "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." ], "initial_focus_why": [ "MEASURED 2026-08-30 (later) -- `NEW GAME` on a fresh boot, 2/2 fresh boots,", @@ -290,7 +292,7 @@ "", "✅ 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", - "(handler, id, name pointer) 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**.", "", "🔴 \"THREE INDEPENDENT ROUTES\" CORRECTED TO TWO -- 2026-08-31, by the Decoder,", @@ -325,6 +327,31 @@ "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.", "", + "🔴 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", + "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", + "alignment record 0 had a handler of 0x10000000, which is not a code address.", + "ids and names are unaffected and DLG_SELECT_DIFFICULTY is still 2000, so", + "nothing here moves except the sentence.", + "", + "📌 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", + "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.", + "", + "❔ 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", + "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", + "what a wrong address gives, and the dialog table itself reads non-zero through", + "the same arithmetic.", + "", + "⚠️ 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", + "established. Recorded as a route rather than an answer, which is how they sent", + "it.", + "", "❔ 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", "build, and no pointer joins them. The tie is UNIQUENESS PLUS THE ORACLE", @@ -361,7 +388,7 @@ "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_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.", + "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.", "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_kind": "measured", diff --git a/authored/screen_names.json b/authored/screen_names.json index 89df17c8..95d7f4e7 100644 --- a/authored/screen_names.json +++ b/authored/screen_names.json @@ -1,94 +1,94 @@ { - "format": "sylpheed.screen_names/1", - "_": [ - "Which GP_TITLE pak entry is which screen. AUTHORED: the disc does not name its", - "builds, so every name here is a decision. The identifications come from", - "HANDOFF Q2 (ui-title-build-map.md), which measured them against framebuffer", - "captures of the running game; the exporter stamps the name into the screen", - "file with name_source: \"authored\" so a reader can tell a recovered name from", - "an invented one.", - "", - "KEYED BY PAK ENTRY INDEX, not by the enumeration ordinal. It used to be the", - "ordinal; widening the enumeration to reach the splash renumbers ordinals, and", - "a name that moves when the enumeration rule changes is not a name. The entry", - "was always described here as the stronger locator -- now it is the only", - "stable one.", - "", - "Delete an entry here the day the RE agent decodes a name field." - ], - "archives": { - "dat/GP_TITLE.pak": { - "2": { - "name": "press_start", - "why": "HANDOFF Q2: builds 2/3 are the PRESS (A) BUTTON plate -- a build of its own, composited over the title and faded in a beat later. English of the EN/JP pair. Measured against a live capture." - }, - "3": { - "name": "press_start_jp", - "why": "HANDOFF Q2: the Japanese twin of build 2. Out of scope for this milestone; named so it is not mistaken for a screen we need." - }, - "4": { - "name": "title", - "why": "HANDOFF Q2: build 4 is the English title art. Measured against a live capture." - }, - "5": { - "name": "main_menu", - "why": "HANDOFF Q2: builds 5/8 are the five-button main menu; 5 is English. Measured against a live capture. (An earlier reading called 8 a submenu and was withdrawn -- 8 is the Japanese main menu.)" - }, - "6": { - "name": "extras", - "why": "HANDOFF Q2: builds 6/9 are the EXTRAS submenu, the only submenu inside this archive. Measured against a fresh EXTRAS capture." - }, - "7": { - "name": "title_jp", - "why": "HANDOFF Q2: the Japanese twin of build 4." - }, - "8": { - "name": "main_menu_jp", - "why": "HANDOFF Q2: the Japanese twin of build 5." - }, - "9": { - "name": "extras_jp", - "why": "HANDOFF Q2: the Japanese twin of build 6." - }, - "10": { - "name": "publisher_logo", - "why": "The SQUARE ENIX PUBLISHER wordmark -- the FIRST thing the boot sequence shows, before the developer logos. Measured by the RE agent 2026-08-29, render grid at docs/re/captures/title-builds/splash-both-halves-rendered.png. Entries 10/13 are region twins distinguished by the trademark glyph; 10 carries the (TM)." - }, - "13": { - "name": "publisher_logo_r", - "why": "The region twin of entry 10, carrying (R) where 10 carries (TM). Named so it is not mistaken for a second screen the boot path needs." - }, - "11": { - "name": "developer_logos", - "why": "The GAME ARTS / SETA / studio anima logos -- the developer splash, shown after the publisher wordmark. HANDOFF Q2 and the RE agent's 2026-08-29 render grid; draws 7/7 elements." - }, - "14": { - "name": "developer_logos_r", - "why": "The region twin of entry 11, as 13 is to 10." - } - } - }, - "unnamed": { - "dat/GP_TITLE.pak": "Entries 0/1 and 12/15 are plates never seen running -- not in the boot path, not on any title-side screen, not in the attract loop (HANDOFF Q2). They export under their entry index rather than a name we would be inventing." - }, - "also_export": { - "dat/GP_TITLE.pak": { - "10": { - "name": "publisher_logo", - "why": "LOCATED BY ENTRY INDEX, not by a rule. These four bundles declare their sprites directly and have no .rat layout child, so `is_build` cannot see them -- and the RE agent established that NO content rule can: design size fails (every extra composable bundle sampled is 1280x720, the same as every screen) and element count fails (fragments run 2..15 elements in GP_OPTIONS/GP_SAVE_LOAD while these are 3 and 7 -- the ranges overlap). Safe here and not in general: in GP_TITLE the widened set adds exactly these four and all four are real screens, zero fragments." - }, - "11": { - "name": "developer_logos", - "why": "As entry 10: located by index because no content rule distinguishes a splash from a fragment. 7 elements, all drawn." - }, - "13": { - "name": "publisher_logo_r", - "why": "As entry 10, region twin." - }, - "14": { - "name": "developer_logos_r", - "why": "As entry 11, region twin." - } - } + "format": "sylpheed.screen_names/1", + "_": [ + "Which GP_TITLE pak entry is which screen. AUTHORED: the disc does not name its", + "builds, so every name here is a decision. The identifications come from", + "HANDOFF Q2 (ui-title-build-map.md), which measured them against framebuffer", + "captures of the running game; the exporter stamps the name into the screen", + "file with name_source: \"authored\" so a reader can tell a recovered name from", + "an invented one.", + "", + "KEYED BY PAK ENTRY INDEX, not by the enumeration ordinal. It used to be the", + "ordinal; widening the enumeration to reach the splash renumbers ordinals, and", + "a name that moves when the enumeration rule changes is not a name. The entry", + "was always described here as the stronger locator -- now it is the only", + "stable one.", + "", + "Delete an entry here the day the RE agent decodes a name field." + ], + "archives": { + "dat/GP_TITLE.pak": { + "2": { + "name": "press_start", + "why": "HANDOFF Q2: builds 2/3 are the PRESS (A) BUTTON plate -- a build of its own, composited over the title and faded in a beat later. English of the EN/JP pair. Measured against a live capture. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "3": { + "name": "press_start_jp", + "why": "HANDOFF Q2: the Japanese twin of build 2. Out of scope for this milestone; named so it is not mistaken for a screen we need. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "4": { + "name": "title", + "why": "HANDOFF Q2: build 4 is the English title art. Measured against a live capture. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "5": { + "name": "main_menu", + "why": "HANDOFF Q2: builds 5/8 are the five-button main menu; 5 is English. Measured against a live capture. (An earlier reading called 8 a submenu and was withdrawn -- 8 is the Japanese main menu.) 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "6": { + "name": "extras", + "why": "HANDOFF Q2: builds 6/9 are the EXTRAS submenu, the only submenu inside this archive. Measured against a fresh EXTRAS capture. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "7": { + "name": "title_jp", + "why": "HANDOFF Q2: the Japanese twin of build 4. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "8": { + "name": "main_menu_jp", + "why": "HANDOFF Q2: the Japanese twin of build 5. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "9": { + "name": "extras_jp", + "why": "HANDOFF Q2: the Japanese twin of build 6. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "10": { + "name": "publisher_logo", + "why": "The SQUARE ENIX PUBLISHER wordmark -- the FIRST thing the boot sequence shows, before the developer logos. Measured by the RE agent 2026-08-29, render grid at docs/re/captures/title-builds/splash-both-halves-rendered.png. Entries 10/13 are region twins distinguished by the trademark glyph; 10 carries the (TM). 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "13": { + "name": "publisher_logo_r", + "why": "The region twin of entry 10, carrying (R) where 10 carries (TM). Named so it is not mistaken for a second screen the boot path needs. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "11": { + "name": "developer_logos", + "why": "The GAME ARTS / SETA / studio anima logos -- the developer splash, shown after the publisher wordmark. HANDOFF Q2 and the RE agent's 2026-08-29 render grid; draws 7/7 elements. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "14": { + "name": "developer_logos_r", + "why": "The region twin of entry 11, as 13 is to 10. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + } } + }, + "unnamed": { + "dat/GP_TITLE.pak": "Entries 0/1 and 12/15 are plates never seen running -- not in the boot path, not on any title-side screen, not in the attract loop (HANDOFF Q2). They export under their entry index rather than a name we would be inventing." + }, + "also_export": { + "dat/GP_TITLE.pak": { + "10": { + "name": "publisher_logo", + "why": "LOCATED BY ENTRY INDEX, not by a rule. These four bundles declare their sprites directly and have no .rat layout child, so `is_build` cannot see them -- and the RE agent established that NO content rule can: design size fails (every extra composable bundle sampled is 1280x720, the same as every screen) and element count fails (fragments run 2..15 elements in GP_OPTIONS/GP_SAVE_LOAD while these are 3 and 7 -- the ranges overlap). Safe here and not in general: in GP_TITLE the widened set adds exactly these four and all four are real screens, zero fragments. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "11": { + "name": "developer_logos", + "why": "As entry 10: located by index because no content rule distinguishes a splash from a fragment. 7 elements, all drawn. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "13": { + "name": "publisher_logo_r", + "why": "As entry 10, region twin. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + }, + "14": { + "name": "developer_logos_r", + "why": "As entry 11, region twin. 📌 SOURCE, added 2026-09-01 in the uncited-why backfill: the four bundles are identified in docs/re/ui-title-build-map.md, and the ordinal-versus-entry distinction this entry depends on is docs/re/structures/build-ordinal-vs-entry.md. ⚠️ The sibling references below (\"as entry 10, region twin\") are a citation form too -- they point at another entry in this file rather than at a document, and forcing a path onto them would be mislabelling to satisfy a counter." + } + } + } } diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index d4d9cfac..389016fe 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -305 sections. Search this before re-deriving anything. +307 sections. Search this before re-deriving anything. * [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28) * [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28) @@ -316,6 +316,8 @@ dies, which is what this file is for. * [Triaging the 52: thirteen were provenance claims, and two failed on sight](#triaging-the-52-thirteen-were-provenance-claims-and-two-failed-on-sight) * [My own triage under-counted, and three uncited measurements surfaced behind it](#my-own-triage-under-counted-and-three-uncited-measurements-surfaced-behind-it) * [🔴 My mechanism does not reproduce in my own corpus — measured, and it is refuted](#my-mechanism-does-not-reproduce-in-my-own-corpus--measured-and-it-is-refuted) +* [The backfill: 17 was 12, and 12 is now 0](#the-backfill-17-was-12-and-12-is-now-0) +* [🔴 Their record layout was wrong and I had copied it — fourth relayed aside](#their-record-layout-was-wrong-and-i-had-copied-it--fourth-relayed-aside) ## P0 — the exporter, 2026-08-28 @@ -15102,3 +15104,64 @@ value of mine, and the receiving end cannot distinguish a summarised measurement from a recalled one.** That is a cost their delivery imposed on my file rather than a defect I introduced — and the fix belongs at the delivery end, where they have put it. + +## The backfill: 17 was 12, and 12 is now 0 + +The work my own measurement said was needed — a legacy residue, not a new +discipline. Doing it corrected the number twice. + +🔴 **First, "17 uncited" was inflated by my own extractor.** Five of the sixteen +named a **capture filename** (`live-extras.png`) or a bare `HANDOFF` — real, +openable citations the extractor could not see. **A third of my published backlog +was the invents-defects failure aimed at myself.** Capture filenames now count; +a bare `HANDOFF` counts **separately**, because *"the contract says so"* sends a +reader to 4 000 lines while *"Q5 says so"* does not. + +✅ **Then the genuine twelve, all backfilled to zero.** The plate-overlay group +now cites `plate-pulse-measured.md`, `plate-pulse-phase-lock.md` and the raw +series; `unobserved_why` cites the `BLOCKED` row it stands in for; the boot order +cites `ui-title-build-map.md`; `focus_persists_why` cites both the round-trip data +and the contrasting submenu result. + +⚠️ **`screen_names.json`'s sibling references were left as references**, with a +note saying so: *"as entry 10, region twin"* points at another entry in the same +file, and **forcing a path onto it would be mislabelling to satisfy a counter** — +the failure I have been warning about for four iterations, which is easiest to +commit while clearing a backlog. + +## 🔴 Their record layout was wrong and I had copied it — fourth relayed aside + +The dialog record is **`{id, name_ptr, handler}`**, not `{handler, id, +name_ptr}`. Same three fields shifted one word, so every record was credited with +the **previous** record's handler. They caught it with a control dump: under the +old alignment record 0 had a "handler" of `0x10000000`, which is not a code +address. + +**I had copied the wrong order into `flow.json`.** ids and names are unaffected +and `DLG_SELECT_DIFFICULTY` is still 2000, so nothing here moves except the +sentence. + +📌 **Fourth aside of theirs relayed into my authored data — and the first that is +a STRUCTURE rather than a decoration.** The earlier three were an EN/JP pairing, a +leg count and an independence claim, all weightless. **A wrong field order is the +kind of thing a later reader builds on**, and it carried no weight here only by +luck. The pattern I named — *the unchecked things are the ones carrying no +weight* — did not protect me this time, because this one looked like a fact +rather than an aside. + +### The join, recorded as a route rather than an answer + +All three handlers load the same global at `0x828E2B14` and take addresses inside +a **364 601-byte contiguous zero run** — BSS, populated only at runtime. +Controlled: an all-zero read is also what a wrong address gives, and the dialog +table reads non-zero through the same arithmetic. + +⚠️ **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 +established** — their framing, kept. + +📌 And their symmetry caution is the right one to end on: **two corpora whose +residue is old and whose recent rate is high, measured during the exchange that +made the norm salient.** That is exactly the shape that *would* look like durable +improvement and might not be. Worth re-measuring later — *"which is not a thing I +would bet on"*. diff --git a/tools/port/audit-kinds b/tools/port/audit-kinds index 9140dfe5..d3f5e460 100755 --- a/tools/port/audit-kinds +++ b/tools/port/audit-kinds @@ -99,6 +99,18 @@ def citations(t): out.append(("mission", m[1])) for r in re.findall(r"MODDING rule (\d+)", t): out.append(("modding", r)) + # 🔴 A CAPTURE FILENAME IS A CITATION and this could not see one. Five of the + # sixteen `why` fields I reported as uncited name `live-extras.png` or an + # equivalent -- openable, in `docs/re/captures/`, and exactly the evidence a + # reader wants. My published "17 uncited" was inflated by a third by my own + # extractor, which is the invents-defects failure aimed at my own backlog. + for cap in re.findall(r"\b([\w-]+\.(?:png|txt|wav|tsv))\b", t): + out.append(("capture", cap)) + # ⚠️ A bare `HANDOFF` names the document and not the section. Counted, and + # counted SEPARATELY, because "the contract says so" is a weaker pointer than + # "Q5 says so" -- it sends a reader to 4 000 lines. + if re.search(r"\bHANDOFF\b", t) and not re.search(r"HANDOFF Q\d+", t): + out.append(("handoff-vague", "HANDOFF")) return out @@ -250,7 +262,11 @@ def main(): cites = citations(why) bad = [] for typ, c in cites: - if typ == "handoff": + if typ == "capture": + if c not in paths and not os.path.exists(c) \ + and not any(p.endswith("/" + c) for p in paths): + bad.append(c) + elif typ == "handoff": if not re.search(rf"\|\s*{c}\s*\|", handoff()): bad.append(f"HANDOFF {c} (no such row)") elif typ == "path" and c not in paths and not os.path.exists(c):