Onset: 0.500 of (title first visible element -> plate onset), measured by the
Decoder as 0.489 and 0.507 across two independent captures, 3.7% apart. A RATIO,
which is the point -- it needs no clock, and every unit-valued figure from those
captures has been withdrawn: the rate because frames are presents (1168 vs 600
for the same animation), the '+40 units' because its conversion put
title-start->plate at 75 units where the declared data puts the plate at 238, a
3.2x conflict that is still open and is F4's.
Resolved against THIS export: 0.500 x (214 - 0) = 107.0 units.
tools/port/check-leaf-onset recomputes it and fails if a re-timing moves the
anchors; it has a selftest in both directions and is in check-all.
🔴 AND THE ADOPTION WAS A NO-OP UNTIL THIS COMMIT. leaf_clock() read
'if start < 0.0 OR rate <= 0.0: return screen_units', so when the withdrawn rate
went back to null the adopted OFFSET stopped applying too -- silently, while
authored/rendering.json still stated it. The two fields are independent now.
It was caught only because the offset was re-verified by PROBING THE RENDERER
instead of re-reading the file I had just edited. Both my earlier verifications
of this feature passed while it did nothing: one compared frames that were all
being forced to the same pose, the other ran when both fields happened to be set.
Verified, pre-registered before running, via --probe-leaf:
title u=236 -> leaf_t 129.0, x -123 (predicted 129, -123)
title u=400 -> leaf_t 293.0, x 533 (predicted 293, 533)
Effect: at the plate's arrival the sweep sits at x=-123, just entering the frame,
where before it was at x=305, well across it.
212 lines
12 KiB
JSON
212 lines
12 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.",
|
|
"",
|
|
" \ud83d\udd34 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.",
|
|
"",
|
|
"\ud83d\udd34 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.",
|
|
"",
|
|
"\u26a0\ufe0f 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.",
|
|
"",
|
|
"\ud83d\udd34 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 %",
|
|
"",
|
|
"\u2705 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.",
|
|
"",
|
|
"\u26a0\ufe0f 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.",
|
|
"",
|
|
"\ud83d\udccc 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_deleted_why": [
|
|
"\u2705 DELETED 2026-09-01, and the deletion is the point.",
|
|
"",
|
|
"This held `additive_elements`, a per-screen list of element ids transcribed",
|
|
"from the Decoder's per-draw RB_BLENDCONTROL0 log. PORT-MISSION section 3: 'When",
|
|
"the RE agent later decodes something you had authored, delete the authored",
|
|
"entry and let the exporter emit it. That deletion is the measure of progress.'",
|
|
"",
|
|
"The blend is now DECODED -- `T8aD +0x04` bit 0x02, docs/re/structures/",
|
|
"ui-blend-mode-decoded.md -- and reachable since formats-pin-2026-09-01 exposed",
|
|
"`ui_layout::sprite_blend_additive` and `blend_additive_by_name`. The exporter",
|
|
"emits `blend_additive` per element and per nested focus/leaf element, and",
|
|
"ScreenView reads it there.",
|
|
"",
|
|
"\ud83d\udd34 CHECKED BEFORE THE SWAP, and the map turned out to be a SUBSET rather than",
|
|
"the answer. Over main_menu, extras, press_start and title:",
|
|
"",
|
|
" 15 the map called additive AND the disc agrees",
|
|
" 0 the map called additive and the disc does not <- no contradictions",
|
|
" 17 the disc calls additive and the map did not",
|
|
"",
|
|
"So nothing transcribed was wrong; it was incomplete, and was being read as",
|
|
"complete. The 17 include `pteff03`/`pteff03a` -- the sweep LEAVES, which are",
|
|
"what `draw_leaf_for` actually puts on screen while the map listed their parents",
|
|
"`ptloop01`/`ptloop02` -- and TWELVE on `title`, where this map was deliberately",
|
|
"empty and the port therefore drew every title effect alpha-over.",
|
|
"",
|
|
"A name-keyed map can only answer for a screen somebody drove the game to. That",
|
|
"is what made the Japanese menus an open question (BLOCKED.md H6): the port drew",
|
|
"main_menu additive and main_menu_jp alpha-over, asserting by omission that the",
|
|
"JP build blends differently. The bit is on the disc for every screen at once, so",
|
|
"that asymmetry is now answered statically and H6 needs no capture."
|
|
],
|
|
"leaf_clock": {
|
|
"title": {
|
|
"start_units": 107.0,
|
|
"rate": null,
|
|
"start_fraction": 0.5,
|
|
"fraction_from": "title first visible element (t=0)",
|
|
"fraction_to": "press_start ptbtn00 onset (t=214)"
|
|
}
|
|
},
|
|
"leaf_clock_why": [
|
|
"leaf_t = screen_t - start_units. rate is null = the leaf runs at the screen's",
|
|
"rate; nobody has a clock-free measurement of a rate and the one attempt was",
|
|
"withdrawn (below).",
|
|
"",
|
|
"start_units 107 = 0.500 x (214 - 0), resolved HERE from this export's own",
|
|
"declared keyframes. The 0.500 is the measurement; the 107 is arithmetic on it.",
|
|
"",
|
|
"MEASURED as a RATIO, which is the point: (onset - title start) / (plate - title",
|
|
"start) = 0.489 and 0.507 across two independent captures, 3.7% apart",
|
|
"(Decoder, docs/re/f6-unit9-sweep-period-and-onset.md + 15670f4). A ratio needs",
|
|
"no clock, which is why it survived when every unit-valued number did not.",
|
|
"",
|
|
"\ud83d\udd34 EVERY TITLE-UNIT FIGURE FROM THE CAPTURES IS WITHDRAWN, twice over:",
|
|
" - rate 0.514 units/frame: captured frames are PRESENTS and the present rate",
|
|
" differs per run -- 1168 frames vs 600 for the same animation, 1.947x.",
|
|
" - offset '+40 units': converted through the plate's declared 12-unit ramp,",
|
|
" a calibration that puts title-start->plate at 75 units where the declared",
|
|
" data puts the plate at 238. That is a 3.2x clock conflict, still open, and",
|
|
" it is F4's `clock: shared` question.",
|
|
"Both were adopted here and both were reverted before shipping.",
|
|
"",
|
|
"\ud83d\udccc The human said the animation LOOKS correct while we were carrying a rate",
|
|
"that would have made it twice too fast. That was evidence against the number",
|
|
"and both agents filed it as a puzzle. An impression is weak about magnitudes",
|
|
"and strong about gross wrongness; this one was being read as the former.",
|
|
"",
|
|
"\u26a0\ufe0f 107 is arithmetic on THIS export's keyframes. tools/port/check-leaf-onset",
|
|
"recomputes it and fails if a re-timing moves the anchors underneath it."
|
|
]
|
|
}
|