Commit Graph

17 Commits

Author SHA1 Message Date
Sylpheed port agent
b0e5c82f57 port: the leaf rate's 🟡 lifts -- three independent confirmations, and a stale caveat removed
The 1.7x/3.2x title-clock conflict I was carrying as an open doubt against every
unit-valued figure on the title was never a conflict: the Decoder had been
applying the plate's declared ramp to ptcopyright. One mislabelled element
generated the whole discrepancy.

Same shape as the port gating a snap on settle_instant while reading a printed
number that came from settle_time(). Two elements, one label. In both cases what
caught it was measuring a RATIO, which needs no identification, rather than a
value, which does.

rate 0.5 now rests on three declared quantities that agree, the third unrelated
to the first: ptloop01's 30-unit ramp, the leaf's 600-unit loop, and ptbtn00f's
pulse at exactly 1/10 of that loop (60.0 frames over 16 cycles, zero variance).

Also recorded: the plate's pulse is now measured -- ptbtn00f, 120 title units,
peak alpha 80, drawn 51 of 60 frames. NOT implemented: the plate's blink is
neither F5 nor F6, and the human's standing note is that its delay is accepted.
2026-09-02 20:20:56 +00:00
Sylpheed port agent
ac1371cda3 port: F6 FOUND -- the gate was declared data the renderer was discarding
The sweep starts early because ScreenView drew a leaf WITHOUT multiplying its
parent's alpha in. ptloop01/ptloop02 declare 0:0 70:0 100:255 238:255 250:0, so
the sweep is invisible until t=70 and full at t=100. The port has had that ramp
in its export the whole time and was throwing it away at the draw call.

Three changes:

1. Parent alpha multiplies into the leaf's. This file asserted the opposite,
   arguing from the sweeps being drawn while their parent had expired -- but that
   could not separate 'the leaf wins' from 'the parent is ignored because it
   draws nothing', and its own comment said so and named the interval that would
   settle it. Measured there: dividing the leaf's declared curve out of the drawn
   alpha pins the implied parent at 255.0 (+/-1.5) over hundreds of frames while
   the drawn alpha swings 242 -> 132 -> 145.

2. rate 0.5, calibrated against a DECLARED interval (ptloop01's own 30-unit ramp)
   rather than captured frames: two runs differing 2x in frames give 0.4795 and
   0.4667, 2.7% apart. This number was 0.514, withdrawn, now reinstated at 0.5 --
   what failed the first time was quoting a rate in presents, and the ratio was
   discarded along with the frames.

3. The 107-unit authored offset is DELETED, with its guard tool. It came from a
   ratio measured against an element identified only by screen position; the
   declared ramp needs no such identification. Deleting an authored value because
   the data already says it is the outcome PORT-MISSION asks for.

Also reverted, same day I made it: removing the transparent-parent skip. I read
'the game submits the sweep ~950 frames past its parent's expiry' as the leaf
outliving the parent. It does not follow -- a draw submitted at alpha 0 is still
a draw, and submitted is not visible. With the multiply, skipping on a
transparent parent IS multiplying by zero.

VERIFIED, pre-registered before running, via --probe-leaf:
  u= 60 -> no draw at all           (predicted: parent alpha 0.00, gated off)
  u=100 -> leaf_t 50.0,  x -439     (predicted 50.0, -439)
  u=236 -> leaf_t 118.0, x -167     (predicted 118.0, -167)
verify-capture: every row unchanged.

⚠️ BUILD-SENSITIVE: builds 5 and 6 of GP_TITLE declare these records as a single
flat a=255 with no ramp. This export reads the ramped build; if that changes the
gate disappears silently.
2026-09-02 19:47:20 +00:00
Sylpheed port agent
af10a2ec3c port: F6 -- adopt the sweep onset as a measured RATIO, and fix the guard that disabled it
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.
2026-09-02 19:34:42 +00:00
Sylpheed port agent
a27e609672 port: WITHDRAW the leaf rate the same day it was adopted
The Decoder withdrew 0.514: captured frames are presents and the present rate
differs per run -- the same animation took 1168 frames in one capture and 600 in
another, 1.947x apart, with that run's own baseline moving 1.953x alongside. So
it measured the capture's pacing, not the game. rate is null again (identity).

📌 The tell was there before the withdrawal and neither of us weighed it. The
human said the animation itself LOOKS correct. A port running 1.0x against a real
0.514x would be twice too fast and they would have said so. Their impression was
evidence against the number and both of us recorded it as a puzzle instead. A
human's impression is weak about magnitudes and strong about gross wrongness.

start_units 40 kept but marked provisional: two captures agree in RATIO form,
which needs no clock and survives the withdrawal, but converting the ratio to
title units needs the title rate, and that is itself in conflict (1.0 units/frame
from ptcopyright's ramp against 0.571 from the plate's, 1.75x apart).

Kept rather than reverted because 0 is not a measurement either -- it is the
unexamined assumption that the leaf shares the screen's clock.
2026-09-02 19:30:30 +00:00
Sylpheed port agent
d7e4a7167e port: F6 -- adopt the measured leaf clock, and stop a parent killing its leaf
Two changes, both measured, neither invented.

1. LEAF CLOCK. authored/rendering.json leaf_clock.title = {start_units 40,
   rate 0.514}, from the Decoder's f6-unit8, both numbers off ONE capture. The
   title's own rate is measured rather than assumed there (ptcopyright ramps
   0->255 over 22 declared units across 22 frames = 1.000 units/frame), which was
   the assumption their unit 4 had flagged. Supersedes their earlier 0.463, which
   divided by the end of MOTION -- the declared track is stationary from t=540 to
   600, so that denominator was short; 0.514 anchors on the loop wrap.

   Corroborated independently: the human reported the port looks FASTER than the
   game, offered as an impression. 1.0x against 0.514x is exactly twice too fast.

2. A LEAF OUTLIVES ITS PARENT. _draw skipped any element whose PARENT posed
   transparent, before _draw_leaf was reached, so ptloop01 expiring at t=250 took
   the sweep with it -- while this file's own decode says the leaf runs on its own
   timeline and the parent's alpha is not multiplied in. The two were inconsistent
   and the silent gate won. The capture settles it: the game submits the sweep
   across frames 746..1913 while the parent expires at 956, so it keeps drawing
   ~950 frames after the parent is gone.

VERIFIED by probing the running renderer at two PRE-REGISTERED instants:
  title u=400 -> leaf t=185.0, pteff03 centre 301 (predicted 301),
                                pteff03a centre 1169 (predicted 1168)
  title u=800 -> leaf t=390.6, pteff03 centre 1124 (predicted 1124),
                                pteff03a centre 333 (predicted 332)
All within 1 px.

Effect at the plate's arrival (title t=236): the sweep's centre moves from 505 --
halfway across the screen -- to -36, just entering at the left edge. The human's
report is that the game's glow begins when the plate appears.
2026-09-02 19:18:34 +00:00
Sylpheed port agent
4d533185e7 port: leaf clock mechanism -- origin and rate, both UNSET
F6 is a clock question, not an effect question: the human confirms the light
animation itself looks like the game's and only starts earlier, and separately
that the port may be running it faster (flagged by them as an impression).

The port passed time_units straight to the leaf, which is an assumption -- offset
0, rate 1 -- that nobody measured and that the Decoder's capture contradicts:
the game's leaf t=0 is its first drawn frame, 40 frames after the title's first
element, at a rate measuring well below the title's.

ScreenView.leaf_clock(screen_units) applies an origin and a rate; both default to
-1.0 meaning unmeasured, in which case it is the identity and behaviour is
unchanged. Fed from authored/rendering.json leaf_clock per screen, currently null
with the provenance recorded.

No placeholder values, per F1: an invented constant here is indistinguishable
from a measured one later.

Verified inert: title rendered at t=2/3/4 s, 0 differing pixels against captures
taken before the change.

Also corrected in the process: my earlier 'the sweep enters the viewport at t=61'
used the UNROTATED sprite width. The leaf carries a 30 deg rest rotation, so its
AABB is 886 px against a 399 px sprite -- matching the Decoder's measured ~890 to
within 4 px. Port and game both put the quad on screen at leaf t~0, so the whole
discrepancy is the leaf clock's origin and rate.
2026-09-02 19:06:17 +00:00
Sylpheed port agent
70799488fe port: delete the authored blend map for the decoded field, and find a counter-example doing it
PORT-MISSION §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." This is that deletion.

authored/rendering.json's `additive_elements` -- a per-screen list transcribed
from the Decoder's per-draw RB_BLENDCONTROL0 log -- is gone. The exporter emits
`blend_additive` per element and per nested focus/leaf element from `T8aD +0x04`
bit 0x02, and ScreenView reads it there. Both accessor spellings are needed:
`ptbtn00f.t32` is in build.sprites while no element carries it as `sprite`, and
it is the sharp case -- the plate alpha-over, its own glow additive, adjacent
draws on one screen.

CHECKED BEFORE THE SWAP, and the map turned out to be a SUBSET, not the answer:
15 elements it called additive the disc agrees with, ZERO contradictions, and 17
MORE the disc marks that it did not. Those include the sweep LEAVES (draw_leaf_for
means pteff03/pteff03a are what reach the screen while the map listed their
parents) and TWELVE on `title`, where the map was deliberately empty -- so the
port has been drawing every title effect with the wrong blend.

H6 closes with no capture at all: the JP asymmetry was an artefact of a
NAME-KEYED map, and the bit is on the disc for every screen at once.

🔴 AND IT INTRODUCED A REGRESSION, WHICH IS REPORTED, NOT HIDDEN. Against the
oracle captures on the GPU: main_menu 10.88 -> 13.02, main_menu_options 11.56 ->
13.57. Deterministic to the digit over three runs, so not sampling noise.

Isolated to ONE element, with a control:
  - main_menu's only newly-additive top-level element is pteff10;
  - extras gained none and did not move -- the same change on a screen with
    nothing new moves nothing;
  - the leaf rule was disabled separately and main_menu stayed at 13.02, so
    pteff03/pteff03a are NOT the cause. That prediction of mine failed; the rule
    is restored, being provably neutral here;
  - title did not move despite twelve newly-additive elements, consistent with
    verify-capture posing at settle t=198 where those quads are transparent.

That is a potential COUNTER-EXAMPLE to a  DECODED claim, and it is a sharp
question rather than a guess: their own map lists pteff10 additive on `extras`
and not on `main_menu`, and they logged BOTH screens. Asked in BLOCKED.md H6.

Shipped anyway, for reasons stated rather than assumed: +2.14 is inside the
harness's own ±3.78 capture-phase term for that screen and cannot adjudicate a
disc fact; the decoded source is far better evidenced (35 elements, zero errors,
out-of-sample prediction 3 of 16); and fitting an exception for one element would
put an authored entry back to make one number smaller, which is the move this
project keeps having to undo. It is a KNOWN regression, not an unnoticed one.

Also settled this iteration, for the Decoder's open question: the port FADES the
plate, it does not pop it. Frozen sweep of the plate region -- 210u 0.1457,
216u 0.1573, 222u 0.1727, 228u 0.1900, 236u 0.2142 -- a clean monotone ramp
across the declared 214->236. So t=236 is the port's COMPLETION, not its onset,
and the 0.367 s "late plus a pop" reading does not apply.

Not settled: whether pteff10 has a counter-example; H1's repeat half; the four
red verify-screen rows; and finding 3, which still has no cause now that units/s
is settled at 60.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018AHUQvXGyNcKonSEWsgWcX
2026-09-01 18:53:59 +00:00
Sylpheed port agent
0a9bf4e16a port: H5 localises to one element, and the rotation rule that explained 14 of 16 is refuted
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
2026-09-01 17:20:33 +00:00
Sylpheed port agent
d45b23ebbe port: draw the plate's highlight additive, and find my harness poses it where it cannot be seen
blend-bit-vs-oracle.txt entry 2: ptbtn00 alpha-over, ptbtn00f ADDITIVE -- the
PRESS (A) plate and its own highlight, one bit apart. Entry 4, the whole title, is
alpha-over throughout including ptlogo_back2/ptlogo_back2eff, which independently
kills the "frame-shaped and mostly transparent means additive" rule I declined to
adopt.

Bands are now per DRAW OP rather than per paint-order entry: one band per element
cannot express base alpha-over with its own focus record additive.

The change reported zero three times and each zero had a different cause.

First, additive_elements was assigned to `view` in three places and to `overlay` in
none, and the plate is an overlay -- every other decoded rule on that page goes to
both.

Second, I then measured that the element is never drawn, suppressing its sprite at
six times across the cycle for 0 px every time, and was one commit from filing "the
port never draws the plate highlight" as a defect. That sweep was invalid: I varied
--time while passing --loop-phase=0 in every run, and --loop-phase pins exactly the
clock a looping record runs on. Six samples of one phase.

Third, swept properly, ptbtn00f contributes 0 px at phase 0 and 22-29k px at phases
20-100 -- and verify-capture's title_plate row poses at loop-phase 0. The row that
validates the plate is blind to the plate's pulse by construction. It correctly
reports 13.03 / 0.09 % unchanged while the fix moves 26 319 px at phase 20. Stated
in the tool next to the pose.

Not verified against the oracle: every title-plate capture we hold is at the blind
phase, so no capture here can confirm the port now draws it right. Asked.
2026-08-31 11:48:36 +00:00
Sylpheed port agent
975d77f0b2 port: take the completed EXTRAS blend set, and record two refutations that land on me
EXTRAS whole-screen residual 1.97 -> 0.63; ptframe4 31.90 -> 1.14, pteff21/22/23
from 12-14 to under 0.8. The four elements I reported as in no draw were in a draw
all along -- the vertex dump was capped at two quads and the batch holds six, so
four were dropped with a well-formed line and no ellipsis. Same failure class as my
MIX-default material: the run completed, the output parsed, the answer was wrong.

Their pteff10 flag, tested by holding it alpha-over with everything else additive:
tone-corrected residual 0.630 additive against 1.704 alpha-over, but raw RMSE 12.91
against 9.98. They disagree because the port already renders +8.50 levels brighter
than the capture on this screen before any of this, so raw RMSE punishes added
light whether or not the light is right. Adopted on the measurement plus the
structural metric; extras raw-rmse went 11.43 -> 12.88 and that is stated, not
hidden. The differing region halved, 0.07 % -> 0.03 %.

Refuted, mine: "every decoration 0x0 and every button 0x3002" was a two-screen
generalisation I called a confirmation, one message after objecting to exactly that
move in their page. My own export held the counter-examples -- ptbtn00 is 0x73002
and my exporter calls it unknown rather than button; three title elements are
0x3000, button-shaped and not focusable. kind & 0x2 is the focusable flag.

Refuted, mine: the sweeps DO run on the main menu. Their log retains NDC and both
strips overlap the screen in every captured frame, stepping in opposite directions
with vertex alpha ramping. My phase sweep measured that the PORT'S sweeps make the
match worse, which is a statement about my rendering, not about the game. A
best-match argument for an absence cannot separate "not there" from "there and
drawn wrong", and I had that caveat written down and read past it.

Not flipped: the strips are additive with a ramping vertex alpha and the port has
neither on the leaf path, so enabling the loop today would be more correct in
behaviour and worse on screen. The ramp is asked for. What changed today is the
claim -- the port is wrong here and now says so.
2026-08-31 07:06:18 +00:00
Sylpheed port agent
0ca6d254f8 port: transcribe the sweeps' additive blend, and re-run my own menu-looping evidence with it
ui-blend-mode-measured.md names both rotated sweep strips additive in the same row
as the frames. Those are ptloop01/ptloop02 here, now in additive_elements for both
measured screens. It changes nothing visible: on the menus the port runs the leaf
group once and parks it off-screen, and suppressing both sprites at leaf-time 100,
200 and 300 changes 0 pixels each time. It is in the file because it is measured.

Refutation attempt on their identification, and it survives with a number of mine.
The automatic matcher reports "no match" for those two draws; they rest on one
control reproducing heights 1134 and 1303. Rendering the menu at a phase where the
sweeps are on screen and suppressing them gives a footprint 884 px wide against
their 889.6 -- 0.6 % apart, derived without using their number. The heights differ
as they should: my bbox is clipped by the screen, theirs is the full quad extent.

The blend was a confound in my own earlier evidence. loop_leaf_why scoped looping
to the title partly on a phase sweep of mine that drew the sweeps ALPHA-OVER, so
an on-screen sweep was composited wrongly and then scored against the capture. Re-
run with additive and looping enabled for the menu, through a scratch export root
so the repo was untouched: parked 0.0208 %, phase 150 on-screen 0.0851 % with the
sweeps painting 58 027 px, other on-screen phases 0.086-0.122 %.

The conclusion held and got stronger -- 3x with the wrong blend, 4-6x with the
right one -- so the scoping stays and the correction is what is recorded. Still one
capture, and best-match is still weak evidence for an absence.

And a reading of the new log that I did not make: it shows both sweeps SUBMITTED
on the main menu in every frame group, which is not evidence they animate there. A
quad parked off-screen at x=1521 is still a draw call. The log settles the blend
and not the visibility, and both questions arrived in the same artefact.
2026-08-31 06:23:19 +00:00
Sylpheed port agent
c453d8dade port: draw the measured additive blend -- main_menu 13.21 -> 10.67
The Decoder logged RB_BLENDCONTROL0 per draw in Canary on both screens.
0x01010101 is src=ONE dst=ONE, additive. That makes the blend a transcription
rather than my proposal, and they withdrew the "any blend you choose is authored"
instruction explicitly.

Their control is what licenses the change: one pixel shader, 0xE59B2B3DA4AA9008,
runs with BOTH blend states on the main menu -- 12 additive draws and 18
alpha-over. The frames and ptbase share a shader; only the blend register differs.

authored/rendering.json gains additive_elements per screen. Every id is a measured
draw and the reach is written beside it.

verify-capture: main_menu 13.21 -> 10.67 (0.06 % -> 0.02 %), extras 13.38 ->
11.43, main menu with ptbtn04 focused 13.82 -> 11.36. Per element, ptframe1
22.72 -> 4.17 and ptframe2 13.09 -> 3.32.

Neutrality control, free with the table: publisher_logo 2.17 and developer_logos
3.05 are unchanged to the digit. Those are the screens whose metric is absolute
and they carry no additive element, so the rewrite that routed every draw through
RenderingServer canvas items did not change the picture. The improvement is the
blend, not the plumbing.

RenderingServer rather than child Node2Ds because boot.gd calls view.queue_redraw()
from nine places and none reaches a child node -- bands would paint the previous
pose, which under --script=wait is a plausible wrong capture rather than an error.
Runs are recomputed per frame: the additive elements are consecutive on both
measured screens, and that is an accident of those two screens.

And the change first ran with the material left at its default MIX, moving
ptframe1 from 22.72 to 22.69. Nothing errored and a 0.03 move is a plausible
negative result. It was caught only because the measurement predicted a large move.

Not done: ptframe4 is now the worst element on EXTRAS at 16.19x the frame mean and
additive would plainly help it. It is not in the measured table, so it is not in
the file. Filed in BLOCKED.md with pteff21/22/23, which are also in no captured
draw.

Refuted, mine: "neither frame has a fully-opaque pixel" was true and was not the
discriminator -- pteff10 has max alpha 130, no opaque pixel, and measures nearly
exact. The direction survived; the reason for it did not.
2026-08-31 06:18:11 +00:00
Sylpheed port agent
98d02e7c24 port: my triage under-counted, and three uncited measurements surfaced behind it
Their audit found 9 of 57 HANDOFF sections asserting measured or
undecodable-with-reach citing nothing openable, 84%, including one they had sent
me: '(B) from EXTRAS DOES go black', delivered as an inline frame table while
data/fade-four-transitions.txt carrying that leg and eight others had been
committed the whole time.

It had already landed here uncited. timing.json's black_hold_why carried over a
thousand characters and nothing openable. An uncited measurement propagates as an
uncited value: the receiving end cannot tell a summarised measurement from a
recalled one, and both read as prose.

And my triage had missed it along with seven others. Last iteration I reported 13
provenance claims among the 52 and labelled them; the count was wrong because my
sibling match was literal, so black_hold_why did not match black_hold_units, nor
loop_start_why to loop_start_s, dwell_why to dwell_seconds, loop_leaf_why to
loop_leaf_on_screens. Eight more, all hidden by a suffix. It was 21 and I stated
13 confidently. All eight now labelled from their own text; coverage 16 to 38.

Three uncited MEASURED fields in one file -- loop_why at 1400 chars, loop_start_why
at 1041, voice/presentation_why at 1402 and authored -- and all three were
detailed rather than sloppy. The detail is what made them look sourced: a why that
recounts a measurement carefully reads as well-evidenced because it is careful.
That is the quality-correlated blind spot one level down -- not 'well-evidenced
values never declared themselves' but 'well-argued prose never cited anything'.
The authored one now cites the open question it stands in for.

A false positive in my own extractor surfaced in the same pass: presentation_why
was reported DANGLING on 1118268 and 1171516, byte counts read as commit shas
because they are seven digits of valid hex characters. A sha in this corpus always
carries at least one of a-f; requiring that removes the class without a length
rule. A wrong verdict for a fabricated reason, the fourth of that family and this
time in the auditor.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-31 03:38:57 +00:00
Sylpheed port agent
f06be84be6 port: a withholding reason was false -- the hidden leaf is a visible expanding ring
authored/rendering.json justified not drawing build_12,15/pgloading_loop5 with
'leaf scale (0,0)'. That describes t=0 and t=30 and nothing after. The leaf holds
pgloading_ring, scale ramping 0 -> 250 -> 800 -> 1000 with alpha full at t=55 --
an expanding fading ring, visible at scale 140 alpha 143 at the port's own pose
instant near t=44. Withholding it declines to draw SOMETHING.

Still withheld, on the reason already in the file: no oracle capture for a
loading screen and verify-screen's reference draws no leaves, so the content is
unadjudicable. Behaviour unchanged at 59530 px.

The two entries in that list were written to different standards -- ptlogo_eff2
gets four paragraphs working through both readings, pgloading_loop5 got one false
line. The difference is that one was interesting and one was a loading screen.

Also verifies the measurement in the same paragraph: 'max went 155 -> 232 when
drawn' reproduces at 231, differing pixels 20498 -> 58313. The file's numbers
were sound and its reasoning was not, in adjacent sentences.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-30 07:16:07 +00:00
Sylpheed port agent
39209eab05 port: the title's sweeps loop, the black hold is 9 units, and one claim refuted
THREE THINGS FROM THE DECODER, one of which I am not taking.

REFUTED: "the developer splash is one composited quad, the bounding box of the
three logos". The observed quad is 525x259 at (378,155). The three logos'
bounding box is 500x421 at (390,164) -- a 259-tall quad CANNOT contain them, and
palogo_anima alone starts at y=449, thirty-five pixels below that quad's bottom
edge. The observed quad matches the union of gamearts_eff and seta_eff, 521x261
at (379,154), to about four pixels in every dimension -- and both of those are
TRANSIENTS my own census flagged, dark by t=45, so a frame containing that quad
is a build-in frame rather than the settled screen. I cannot see their draw
stream, so I sent the arithmetic rather than a verdict, and the port keeps
drawing three: I will not stop drawing an element on a claim whose stated
identification excludes that element from its own bounding box.

THE BLACK HOLD IS 9 UNITS, NOT 12. I authored 12 from Q7's luminance plateau of
0.17-0.23 s, supported by the menus' transition quad. The Decoder counted
SUBMITTED QUADS instead -- luminance cannot separate the outgoing fade's tail
from true black. Four frames with no sprite quad at all, at 2.284 units/frame
derived from the disc as its own clock, gives 9.1 units = 0.152 s (6.9-11.4).
That overlaps the luminance figure only at the top, and the true black is SHORTER
still since both boundary frames carry picture. My 12 was supported by analogy --
a different screen's quad on a different path -- and a number that fits by
analogy loses to one measured in place. verify-dwell's bound moved with it; both
screens still agree.

THE TITLE'S SWEEPS LOOP. The oracle shows the quad oscillating over its whole x
range and resetting hard, one reset in the first title dwell and two in the
second. The loop-length field could NOT have settled it, correcting a hope I had
stated: both records declare exactly their last keyframe time, slack zero, and
"loops at 600" and "runs once for 600 and stops" write the identical header.
Verified on the two sweeps' LCM, since their periods differ: 600 and 720 realign
at 3600 units, mean diff 0, against 0.438 at half that.

Scoped to the title. The menus declare the same lengths but the oracle
measurement is of the title, and my own weak evidence points the other way there
-- best match with the sweeps off-screen, three times worse mid-screen, against a
73% on-screen duty cycle if they looped. Two weak signals in opposite directions
is a reason to scope, not to pick.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-29 20:44:56 +00:00
Sylpheed port agent
8994ca7c59 port: the 11.5 px was the fit's resolution -- and the lesson inverts
The Decoder closed it by ADDING OBSERVABLES, not by tuning. The vertex buffer
carries positions and colours at the same instant, so all four quantities must
agree on one t: quad A x solves to 357.88 and quad B x to 357.58, both +/-0.12
units, against 355.75 +/-1.54 and 354.09 +/-1.89 from the alphas. Alpha moves
only 0.27-0.33 levels per unit, so one byte of quantisation is worth 1.5-1.9
units -- 6-8 px of sweep at 4 px/unit. That is the whole of the 11.5 px. At
t=357.7 the centres land within 0.70 px and both alphas inside one level.

THE LESSON IS THE EARLIER ONE INVERTED AND IT IS THE HALF WORTH KEEPING.
Checking a wrong rule against alpha made it look confirmed; here the same
insensitivity MANUFACTURED a residual that did not exist. An insensitive quantity
does not merely fail to falsify -- it invents error. Solve on the fastest-moving
field, check the slow one, never the reverse. I was already looking for a pivot
rule to explain 11.5 px when they wrote; there was nothing to find.

REFUTATION ATTEMPT, survived with a nuance: they state the leaf pivot is (200,90)
on a 399x180 sprite, "the pivot is the centre, so rotation displaces it by
nothing". Checked against my export -- pivot [200,90], sprite 399x180, true
centre 199.5,90. It survives, but the sprite is ODD-WIDTH so the pivot is the
centre to within half a pixel rather than exactly. No consequence against their
0.70 px agreement; worth stating because "displaces it by nothing" is the kind of
sentence that later gets leaned on for a sub-pixel claim.

verify-capture now poses the title at t=357.7 rather than 355: RMSE 21.07 ->
20.92, differing 1.82% -> 1.81%. Marginal, and it is the right pose for a stated
reason rather than a better number.

AND ptlogo_eff2 IS WITHHELD FOR A BETTER REASON THAN MINE. I had it on caution
about untested generalisation; the Decoder points out it is on title_jp and
MISSION section 7 scopes out "localisation beyond English", so it is not a
question this port has to answer and the parked Japanese capture does not need
reviving for it. authored/rendering.json now gives scope first and undecidability
second. Widening scope to close a residual would have been the wrong trade.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-29 18:25:04 +00:00
Sylpheed port agent
9f6959c7ca port: implement the decoded leaf composition -- and it does not close the 1.82%
The Decoder decoded the rule I refused to guess: draw the leaf on its own
timeline, do NOT multiply the parent's alpha in. Multiplying is refuted rather
than unsupported -- at the fitted time the parent has expired, so leaf x parent
predicts zero for both quads and the sweeps would be invisible. They are drawn.

Implemented: `_draw_leaf` runs the leaf unclamped, like the spinning ring and for
the same reason -- held at its own rest.t the leaf sits at x=1521, entirely off
the right edge, so `holding` would delete the sweeps rather than settle them.

AND IT CHANGES NOTHING MEASURABLE. The title is still 1.82% against the oracle:
1.82 at t=261, 1.81 at t=355, 1.79 at t=420. At t=355 my interpolation puts the
leaf's top-left at x ~ -324, off-screen left, where the Decoder's model puts the
quad's CENTRE at 981. Those cannot both be right, and it is not something to tune
away -- it is a disagreement about how the leaf's keyframes become a placed quad,
most likely in the pivot and the rotation about it. Handed back with both
numbers.

So: the exporter no longer drops the data, the composition rule is implemented as
decoded, and the port's largest oracle gap is exactly where it was. Fixing the
export was necessary and not sufficient.

TWO FLAGGED ELEMENTS DELIBERATELY NOT DRAWN, in authored/rendering.json with
reasons. title_jp/ptlogo_eff2 (parent 125%, leaf 100%) is the same shape and is
the element DECISIONS has recorded since P1 as the largest render disagreement --
but the Decoder said plainly "I have not tested it", and drawing it would extend
a decode past the case it was fitted on. pgloading_loop5's leaf is scale (0,0),
and scale-0 is one of the three historical failures this corpus names.

Neither can be adjudicated here: title_jp has no oracle capture, and
verify-screen compares against a renderer that draws no leaves at all, so ANY
leaf drawing increases that divergence whether right or wrong. Its max went
155 -> 232 when they were drawn, and that number is not evidence in either
direction.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-29 18:09:43 +00:00