port: black_hold_units 9 -> 0, and not the value that fits best

The Decoder measured the black gap on three transitions: menu->title 0 units,
title->menu 4, EXTRAS->menu 6. Not a constant, and 9 was outside the range
entirely -- wrong for all three by up to a sixth of a second of black the game
does not show.

Did not take the best-fitting value. A uniform 4 minimises total error (6 against
0's 10); that is fitting three samples. 0 has a reason that is not a fit -- it
adds no black the game does not have, the tie-breaker input_during_transition
already uses, and it is measured-correct for one real transition. The error is now
a missing gap of at most 6 units on two transitions rather than an invented one of
up to 9 on all three. Boot artifact unchanged at 0.0009% differing.

Their EXTRAS run vindicates the earlier refusal: B from EXTRAS goes black for two
completely empty frames, so the two-line change I declined would have been wrong
for two of three transitions.

Also: the declared final ramp is confirmed from my side (title 8, main_menu 10,
extras 10 -- their exact multiset), needing no constant. And exit_ramp_units
defaults to 24.0, the number HANDOFF told me to author and I refused, on a branch
that cannot execute: 866 keyframes across 16 screens, 0 untimed.

And origin/main is the stale era -- verified 0 145 left-right, tip 2026-08-29,
still carrying the pre-fix association. The per-iteration merge has been a no-op
for days, its 'Already up to date' reading as 'I am current' while meaning 'main
has nothing'.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 14:21:37 +00:00
parent ed14722996
commit 2b79c74586
2 changed files with 239 additions and 195 deletions

View File

@@ -9,7 +9,7 @@ dies, which is what this file is for.
<!-- INDEX: generated by tools/port/index-decisions -- do not hand-edit -->
164 sections. Search this before re-deriving anything.
166 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)
@@ -175,6 +175,8 @@ dies, which is what this file is for.
* [`check-all` passes — after an hour-long hang that was the suite's own fault](#check-all-passes--after-an-hour-long-hang-that-was-the-suites-own-fault)
* [Ⓐ and Ⓑ are not the same shape, and my `black_hold` treats them as if they were](#and--are-not-the-same-shape-and-my-black_hold-treats-them-as-if-they-were)
* [🔴 `check-all` excused two failing rows with a reason that is measurably false](#check-all-excused-two-failing-rows-with-a-reason-that-is-measurably-false)
* [`black_hold_units` 9 → 0, and why not the value that fits best](#black_hold_units-9--0-and-why-not-the-value-that-fits-best)
* ["Already up to date" is not evidence that I am current](#already-up-to-date-is-not-evidence-that-i-am-current)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -9465,3 +9467,73 @@ The pin reminder survives as its own line, and now reads the tag **out of
This one had been true once — the monorepo merge made the exporter and the
reference share a decoder, and the tag pin quietly unmade that — and it kept being
printed long after it stopped describing the tree.
## `black_hold_units` 9 → 0, and why not the value that fits best
The Decoder measured the black gap on **three** transitions off the running game.
It is not a constant:
| transition | measured gap | my hold of 9 |
|---|---|---|
| menu → title | **0 units** | +9 |
| title → menu | 4 | +5 |
| EXTRAS → menu | 6 | +3 |
🔴 **9 was outside the measured range entirely** — wrong for all three, by up to a
sixth of a second of black the game does not show. Their recommendation is to
treat it as unauthored rather than uniform-at-9.
⚠️ **I did not take the value that fits best.** A uniform **4** minimises total
error (6 units against 0's 10). That is fitting three samples, and a constant
chosen for its residual is exactly what this corpus keeps having to withdraw. **0
has a reason that is not a fit:** it adds no black the game does not have — the
same tie-breaker `input_during_transition` already uses in this file — and it is
measured-*correct* for one real transition. The error becomes a **missing** gap of
at most 6 units on two transitions rather than an **invented** one of up to 9 on
all three.
✅ The verified boot artifact survives: the end frame is still **0.0009 %**
differing against the oracle, unchanged within printing precision.
📌 And their EXTRAS run vindicates the refusal. "Ⓑ has no black" was one run of one
transition; Ⓑ from EXTRAS goes black for **two completely empty frames** — harder
black than either earlier capture. Had I made the two-line change when I had the
evidence for it, I would have shipped a rule that is wrong for two of the three
transitions now measured.
### The declared final ramp, confirmed from my side
They report the outgoing ramp is the declared final ramp **three for three**
against three different values. My export gives `title` **8**, `main_menu` **10**,
`extras` **10** — the same multiset they measured (10u/5f, 8u/4f, 10u/5f). ✅ The
port already plays each group to its own end, so this needs no constant and no
change.
### 🔴 `exit_ramp_units` is dead code carrying the number I refused to author
`ScreenView.exit_ramp_units` defaults to **24.0** — the very constant HANDOFF ask
2 told me to author and that I declined. It synthesises a time for a group's
*untimed* final keyframe.
**There are no untimed keyframes.** 866 across all 16 screens, **0** untimed. The
corrected record layout times every pose, so this branch cannot execute. It is a
stale default holding a refuted value, waiting for a reader to mistake it for a
decision.
## "Already up to date" is not evidence that I am current
The Decoder found `origin/main` is the **stale** era. Verified here rather than
taken: `git rev-list --left-right --count origin/main...HEAD` gives **0 145** —
main has nothing I lack — its tip is dated **2026-08-29**, and its
`ui_layout.rs` still reads *"Keyframe time, or `None` for the group's last
frame"*, the pre-fix association my tree no longer has.
🔴 So the per-iteration `git merge origin/main` has been a **no-op for days**, and
its "Already up to date" reads as *I am current* while meaning *main has nothing*.
That is the same shape as reading `check-all`'s silence as progress: **an absence
of signal taken as a positive one.**
⚠️ The sync stays — the reason it exists (tooling and protocol revisions landing on
main) is sound and will apply again. What changes is that its output is not
reassurance. And my `Cargo.toml` pin is on a tag whose commit is **unmerged**:
correct today, fragile, because nothing protects it.