check-all's four remaining red rows. What I established, and two hypotheses that died on the way -- the second is the one worth reading. ✅ build_12 / build_15 are ONE ELEMENT. All 951 differing pixels lie inside pgloading_loop5 (pgloading_ring.png, 333x276 at [1,444]) and the diff's own bbox x 69..301 y 478..710 sits entirely within it. That also answers, with no rule at all, why build_00 and build_01 AGREE: the port's own draw log says they draw 7 elements to build_12's 10, and pgloading_loop5 is one of the three they never draw. The loading screens that agree are the ones that never draw the element the disagreement is in. 🔴 REFUTED, and it looked strong. ui_layout.rs:86 states in its own words that "rotation_deg is decoded but NOT rendered", and the port does render it. A census over all sixteen exported screens gave: every screen with a non-zero rest rotation DIFFERS, every screen without agrees -- 6 of 6 both ways, including both legacy rows. Widening it to any rotating element (rest rotation OR a two-keyframe 360 spinner at any depth) breaks it: build_00 and build_01 carry two spinners each, the port draws both, and they agree with the reference. A rule that holds on 14 of 16 and fails on the two cases nobody had looked at is a rule fitted to the rows it was built from. Recorded rather than deleted, because the ui_layout.rs:86 comment is exactly what the next reader will find. 🟡 main_menu_jp / extras_jp carry the same sweep leaves -- ptloop01/pteff03 at rot 30, ptloop02/pteff03a at rot -45 -- whose phase residual is the reason already named for `title`, and their means (0.79, 0.66) sit with title's 0.44 rather than their EN twins' 3.94 and 6.74. Consistent with, not established: nobody has isolated those leaves on those screens. 🔴 And an asymmetry this exposed, now DECLARED rather than left silent. main_menu_jp contains exactly the six elements main_menu marks additive, and extras_jp all nine of extras'. The map is keyed by screen name and the Decoder's RB_BLENDCONTROL0 log was taken on the ENGLISH screens, so the port draws them additive on EN and alpha-over on JP -- asserting by omission that the JP build blends differently, which is the LESS likely possibility. Both options assert something unmeasured; only one of them was visible. The map is NOT extended (that would extrapolate a measurement onto a build nobody drove to) and the claim is instead written into authored/rendering.json's additive_elements_why, plus a low-priority ask H6 that says out loud it may not be worth a boot -- MISSION §7 puts JP out of scope and it costs two rows. check-all stays red on the same four. Nothing was excused. Not settled: why the two renderers disagree on pgloading_loop5 specifically; the JP blend question; H1 (key repeat); whether the splashes tick at the title's rate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AHUQvXGyNcKonSEWsgWcX
252 lines
14 KiB
JSON
252 lines
14 KiB
JSON
{
|
|
"format": "sylpheed.rendering/1",
|
|
"_": [
|
|
"WHICH decoded rules the runtime applies where. AUTHORED because it is a",
|
|
"choice about the REACH of somebody else's decode, not about the disc.",
|
|
"Delete an entry the day the decode covers the case outright.",
|
|
"",
|
|
"The exporter flags `leaf_carries_geometry` on 15 elements -- those whose",
|
|
"nested `.rat` leaf declares a scale or rotation the parent does not. That",
|
|
"flag is a CENSUS FACT and it is emitted for all 15. What is DECODED is",
|
|
"narrower: the Decoder fitted the game's own composed alpha (per-draw vertex",
|
|
"colours C3FFFFFF / B6FFFFFF = 195 and 182) against the ptloop leaves and got",
|
|
"one consistent time, then PREDICTED the quad centres to ~11 px. That covers",
|
|
"`ptloop01` and `ptloop02` and nothing else."
|
|
],
|
|
"draw_leaf_for": [
|
|
"ptloop01",
|
|
"ptloop02"
|
|
],
|
|
"draw_leaf_why": [
|
|
"The two the decode covers. `docs/re/structures/ui-leaf-vs-parent-alpha.md`.",
|
|
"",
|
|
"NOT DRAWN, though the exporter flags them and ships their data:",
|
|
"",
|
|
" `title_jp/ptlogo_eff2` -- OUT OF SCOPE, which is a better reason than",
|
|
" the caution this entry first gave. MISSION section 7 scopes out",
|
|
" 'localisation beyond English', and this element exists only on the",
|
|
" Japanese title. So it is not a thing the menu port has to answer, and the",
|
|
" parked Japanese-locale capture does not need reviving on its account --",
|
|
" that is the human's call and not something either agent widens quietly.",
|
|
"",
|
|
" It is ALSO undecidable here even if it were in scope. Its 125% is a POP,",
|
|
" not a steady scale: scale-0 -> 125% -> scale-0 between t=50 and t=107,",
|
|
" about 0.95 s. The leaf draws at 100%, as two superimposed copies at alpha",
|
|
" 160 and 80, each rotating 360 degrees over 960 units -- 16 s a turn. If",
|
|
" parent scale gates the leaf it is a 0.95 s flash; if the leaf runs free it",
|
|
" spins for 16 s. Nothing on the disc chooses and title_jp has no oracle",
|
|
" capture.",
|
|
" `build_12,15/pgloading_loop5` -- STILL NOT DRAWN, but the reason given here",
|
|
" was WRONG and is replaced. It read \"leaf scale (0,0). A zero scale is one of",
|
|
" the three historical failures this corpus names\" -- which describes t=0 and",
|
|
" t=30 and nothing after them.",
|
|
"",
|
|
" What the leaf actually holds, read out of the export: ONE element,",
|
|
" `pgloading_ring`, with a sprite, whose scale ramps 0 -> 250 -> 800 -> 1000",
|
|
" while its alpha rises to full at t=55 and falls to nothing by t=130. An",
|
|
" expanding, fading ring -- a loading pulse, not a degenerate record.",
|
|
"",
|
|
" 🔴 And it is VISIBLE at the instant this port poses. `build_12`'s settle",
|
|
" window is [40, 48], so the pose lands near t=44, where the ring interpolates",
|
|
" to scale 140 at alpha 143. So withholding it is not declining to draw",
|
|
" nothing; it is declining to draw something, and the old reason hid that.",
|
|
"",
|
|
" It stays withheld on the reason below, which is the one that always applied:",
|
|
" there is no way to adjudicate it here. The loading screens have no oracle",
|
|
" capture -- the RE agent records them as not reachable from the title path --",
|
|
" and `verify-screen` compares against a renderer that draws no leaves at all.",
|
|
" Drawing it would put unadjudicable content on a screen, which is the same",
|
|
" test `ptlogo_eff2` fails.",
|
|
"",
|
|
"AND THERE IS NO WAY TO ADJUDICATE EITHER HERE. `title_jp` has no oracle",
|
|
"capture, and `verify-screen` compares against `sylpheed-cli`, which does not",
|
|
"draw leaves at all -- so ANY leaf drawing increases that divergence whether",
|
|
"it is right or wrong. Its max went 155 -> 232 when they were drawn, and that",
|
|
"number is not evidence in either direction.",
|
|
"",
|
|
"What deletes this list: a decode covering those cases, or an oracle capture",
|
|
"of title_jp."
|
|
],
|
|
"draw_leaf_kind": "decoded",
|
|
"loop_leaf_on_screens": [
|
|
"title"
|
|
],
|
|
"loop_leaf_why": [
|
|
"WHICH screens replay a leaf's group instead of letting it run once and park.",
|
|
"MEASURED on the title, UNRESOLVED on the menus, so it is scoped to the title.",
|
|
"",
|
|
"The disc gives one pass: ptloop01's leaf runs t=0..600 and ptloop02's t=0..720,",
|
|
"each ending parked off-screen at x=1521 / -839. The port ran them once.",
|
|
"",
|
|
"THE ORACLE SAYS THEY LOOP ON THE TITLE. Across two title dwells the sweep quad",
|
|
"oscillates over its whole x range and resets hard to the same start value --",
|
|
"one reset inside the first dwell, two inside the second. A run-once-and-park",
|
|
"shows one traverse and then a constant x.",
|
|
"",
|
|
"🔴 THE LOOP-LENGTH FIELD CANNOT SETTLE THIS, and I had hoped it would.",
|
|
"`ptloop01` declares 600 with keyframes to exactly 600; `ptloop02` declares 720",
|
|
"to 720. SLACK ZERO -- and 'loops at 600' and 'runs once for 600 and stops'",
|
|
"write the identical header. 92.3% of records on the disc are in that state, so",
|
|
"the field discriminates loop length only where there IS slack, as the plate's",
|
|
"105-in-120 had.",
|
|
"",
|
|
"⚠️ THE MENUS ARE NOT COVERED, on purpose. Both declare the same 600/720, so",
|
|
"nothing on the disc distinguishes them -- but the oracle measurement is of the",
|
|
"title, and my own weak evidence points the other way for the menu: sweeping the",
|
|
"phase against live-main-menu.png, the port matches best with the sweeps",
|
|
"OFF-SCREEN (0.061%) and three times worse mid-screen (0.183%). If they looped",
|
|
"with a 600-unit period the sweep is on screen for roughly 73% of the cycle, so",
|
|
"a capture showing none is not nothing -- but it is one capture, and 'best",
|
|
"match' is a weak instrument for an absence. Two weak signals in opposite",
|
|
"directions is a reason to scope, not to pick.",
|
|
"",
|
|
"What settles the menu: a direct capture of it, which the Decoder has offered.",
|
|
"",
|
|
"🔴 RE-MEASURED 2026-08-31, BECAUSE THE EVIDENCE ABOVE WAS TAKEN WITH THE WRONG",
|
|
"BLEND. The phase sweep that produced '0.061 % off-screen, 0.183 % mid-screen'",
|
|
"drew the sweeps ALPHA-OVER. They are additive -- measured off the running game",
|
|
"the same day (`additive_elements`) -- so an on-screen sweep composited the wrong",
|
|
"way was being scored against the capture, and 'mid-screen is worse' could have",
|
|
"been an artefact of my own compositing rather than of the sweeps being absent.",
|
|
"",
|
|
"Re-run with additive sweeps and looping switched on for the menu, against",
|
|
"`live-main-menu.png`:",
|
|
"",
|
|
" phase 0 0.0208 % sweeps paint 0 px -- off screen",
|
|
" phase 150 0.0851 % sweeps paint 58 027 px, bbox 884x720",
|
|
" phase 300 0.0205 % sweeps paint 0 px -- off screen",
|
|
" phase 75 / 225 / 375 / 450 / 525: 0.086..0.122 %",
|
|
" run-once-and-park, which is what the port ships: 0.0208 %",
|
|
"",
|
|
"✅ THE CONCLUSION HELD AND GOT STRONGER. The ratio was 3x with the wrong blend",
|
|
"and is 4-6x with the right one, and the absolute numbers improved everywhere.",
|
|
"The capture still matches best with the sweeps NOT VISIBLE. So this entry stays",
|
|
"scoped to the title, and the correction is recorded rather than the scoping",
|
|
"changed.",
|
|
"",
|
|
"⚠️ It is still one capture and 'best match' is still a weak instrument for an",
|
|
"absence -- that caveat is not repaired by fixing the blend, only cleared of one",
|
|
"confound.",
|
|
"",
|
|
"📌 AND THE NEW DRAW LOG DOES NOT SETTLE IT EITHER, though it looks like it",
|
|
"should. `docs/re/captures/ui-draws/blend-main-menu-2026-08-31.log` shows both",
|
|
"sweep strips SUBMITTED on the main menu, in every frame group. That is not",
|
|
"evidence they animate there: a quad parked off-screen at x=1521 is still a draw",
|
|
"call. A DRAW IS NOT A VISIBLE ELEMENT, and reading that log as 'the sweeps run",
|
|
"on the menu' would have contradicted the pixels for no reason."
|
|
],
|
|
"loop_leaf_kind": "measured",
|
|
"additive_elements": {
|
|
"main_menu": [
|
|
"pteff12",
|
|
"ptframe1",
|
|
"ptframe2",
|
|
"ptloop01",
|
|
"ptloop02"
|
|
],
|
|
"extras": [
|
|
"pteff10",
|
|
"pteff20",
|
|
"ptframe3",
|
|
"ptframe4",
|
|
"pteff21",
|
|
"pteff22",
|
|
"pteff23",
|
|
"ptloop01",
|
|
"ptloop02"
|
|
],
|
|
"press_start": [
|
|
"ptbtn00f"
|
|
],
|
|
"title": []
|
|
},
|
|
"additive_elements_why": [
|
|
"TRANSCRIBED, not authored, and the distinction is the whole entry. The port",
|
|
"composited every element with straight alpha-over and four came out too dark",
|
|
"against the capture. I measured from my side that the shortfall scales with",
|
|
"the BACKGROUND, and that of alpha-over / additive / screen, additive roughly",
|
|
"halves the error (DECISIONS.md, two-background composite solve, control 0.0000).",
|
|
"That was a PROPOSAL and stayed one: nothing on the disc selects a blend mode",
|
|
"(`docs/re/structures/t32-blend-mode-not-on-disc.md`), so choosing one was not",
|
|
"mine to do.",
|
|
"",
|
|
"It is now MEASURED OFF THE RUNNING GAME. The Decoder logged RB_BLENDCONTROL0",
|
|
"per draw in Canary and drove the game to both screens:",
|
|
"`docs/re/structures/ui-blend-mode-measured.md`, table in",
|
|
"`docs/re/data/ui-blend-mode-measured.txt`. 0x01010101 is src=ONE dst=ONE,",
|
|
"additive. Elements are identified by the PIXEL SIZE of their quad against",
|
|
"sprite dimensions.",
|
|
"",
|
|
"✅ Their control, and it is what makes this a blend result rather than a shader",
|
|
"result: ONE pixel shader, 0xE59B2B3DA4AA9008, runs with BOTH states on the main",
|
|
"menu -- 12 draws additive and 18 alpha-over. The frames and `ptbase` share a",
|
|
"shader. Only the blend register differs.",
|
|
"",
|
|
"`ptloop01` and `ptloop02` are the two ROTATED SWEEP STRIPS, added 2026-08-31.",
|
|
"`docs/re/structures/ui-blend-mode-measured.md`'s summary table names them",
|
|
"additive in the same row as the frames, and their control 1 identifies them: the",
|
|
"NDC->pixel conversion reproduces 1134 and 1303 px, two heights measured by a",
|
|
"different tool in a different session (`data/title-sweep-drawn-at-rest.txt`), on",
|
|
"BOTH screens. So this is an identification with an independent check behind it,",
|
|
"not a name match -- the automatic matcher reports 'no match' for these two.",
|
|
"",
|
|
"⚠️ AND IT CHANGES NOTHING VISIBLE TODAY, which is why it is worth writing down.",
|
|
"On the menus the port runs the leaf group ONCE and parks it off-screen, so these",
|
|
"two paint no pixels at any pose the port can be put in (checked: suppressing",
|
|
"both sprites at leaf-time 100, 200 and 300 changes 0 pixels). The entry is here",
|
|
"because it is measured, not because it does anything. What it DOES do is fix the",
|
|
"instrument for the menu-looping question -- see `loop_leaf_on_screens_why`.",
|
|
"",
|
|
"⚠️ EVERY ID HERE IS A MEASURED DRAW, and the list stops where the measurement",
|
|
"does. THREE THINGS ARE NOT IN IT:",
|
|
"",
|
|
" `ptframe4` -- NOT MEASURED. It never appears in either capture's draw list,",
|
|
" and the port measures it at 10.46x the frame mean, dark, exactly like its",
|
|
" three siblings. It is the most tempting entry on this page and it is not",
|
|
" going in: 'the other three frames are additive' is a RULE, and the Decoder's",
|
|
" own warning with the table was to take it as per-element facts because which",
|
|
" field selects the mode is still unknown. A fourth frame added on the strength",
|
|
" of a pattern would be indistinguishable from a measured one in a month.",
|
|
"",
|
|
" The two unidentified additive draws per screen (889.6x1134.0 and",
|
|
" 1299.2x1303.2) -- these are the rotated sweep strips, whose height the",
|
|
" Decoder's OWN control reproduces independently. Additive, but the port draws",
|
|
" them through `draw_leaf_for` and I have not checked that path.",
|
|
"",
|
|
" The 819.2x720.0 additive draw, which matches no sprite on either screen.",
|
|
"",
|
|
"⚠️ AND NOT PREMULTIPLIED TEXTURES. The measured non-additive state is",
|
|
"0x07010701 -- src=ONE, which is the PREMULTIPLIED form of alpha-over. It would",
|
|
"be easy to read 'so the textures are premultiplied and the port's straight",
|
|
"alpha-over is wrong everywhere'. The Decoder flagged this before I could: src",
|
|
"being ONE means the fixed-function stage multiplies the SHADER's output by 1,",
|
|
"and the shader has not been read. The port's alpha-over path measures 0.92-1.31x",
|
|
"the frame mean on `ptbase`/`pteff05`, so it is not visibly wrong. Nothing here",
|
|
"changes it.",
|
|
"",
|
|
"🔴 2026-09-01 — THE JP SCREENS ARE NOT IN THIS MAP, AND THAT IS AN UNMEASURED",
|
|
"CLAIM THIS FILE IS MAKING BY OMISSION. Declared here rather than left silent.",
|
|
"",
|
|
"`main_menu_jp` contains exactly the elements `main_menu` marks additive --",
|
|
"ptloop01, ptloop02, ptframe1, ptframe2, pteff10, pteff12 -- and `extras_jp`",
|
|
"contains all nine of `extras`'. This map is keyed by SCREEN NAME, and the",
|
|
"Decoder's RB_BLENDCONTROL0 log was taken by driving the game to the ENGLISH",
|
|
"screens. So the port draws these elements additive on the EN screens and",
|
|
"alpha-over on the JP ones, and nothing measured says the game does that.",
|
|
"",
|
|
"The port is therefore asserting, by omission, that the JP build blends the same",
|
|
"elements differently from the EN build -- which is the LESS likely of the two",
|
|
"possibilities. Extending the map would extrapolate a measurement onto a build",
|
|
"nobody drove to, which is not the port's to do. Both options assert something",
|
|
"unmeasured; only one of them is visible. This paragraph is how the quieter one",
|
|
"is made visible. Asked in docs/port/BLOCKED.md.",
|
|
"",
|
|
"⚠️ It does not affect the deliverable: PORT-MISSION §7 puts localisation beyond",
|
|
"English out of scope and the JP screens are not in the boot path. It affects",
|
|
"`tools/port/verify-screen`, where main_menu_jp and extras_jp DIFFER by 0.79 and",
|
|
"0.66 -- magnitudes that sit with `title`'s 0.44 sweep-phase residual rather than",
|
|
"with their own EN twins' 3.94 and 6.74, which is consistent with the JP rows",
|
|
"carrying no additive contribution at all. Consistent with, not established."
|
|
]
|
|
}
|