port: re-derive black_hold_units against four measurements rather than inherit it

They answered ask #2 -- the gap is deterministic, not a load -- and held me to
re-stating the choice against four measurements (0, 6, 4, 6) rather than the three
it was made on. That is my own standard for check-all's stale allowance turned
around.

The arithmetic moved against 0: it costs 2.0x the best fit on four measurements
against 1.7x on three, and is now the minority outcome, wrong on 3 of 4 where a
uniform 6 is wrong on 2 of 4.

Still 0, because the reason was never the fit -- it adds no black the game does
not have, and is measured-correct for a real transition rather than for an average
of them. Picking 6 because it appears twice is choosing a mode from four samples
when their finding is that a rule exists and nobody has found it.

But one leg is gone and is not being kept quietly: part of the case for 0 was that
the quantity might be machine-dependent and unauthorable. It is not. That removes
an excuse without supplying a value.

Added a tripwire: if the gap is non-zero in most transitions and no rule emerges,
omitting a real quantity stops being caution and becomes a different invention.
The port is wrong by 4-6 units on three of four known transitions and the why now
says so.

Also records as settled: the outgoing ramp is the declared final ramp, my {8,10,10}
against their measured multiset, two independent routes.

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:29:25 +00:00
parent 5e7bc368f7
commit 82ae10a002
2 changed files with 80 additions and 19 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 -->
166 sections. Search this before re-deriving anything.
167 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)
@@ -177,6 +177,7 @@ dies, which is what this file is for.
* [🔴 `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)
* [Re-deriving `black_hold_units` against four measurements, not three](#re-deriving-black_hold_units-against-four-measurements-not-three)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -9537,3 +9538,52 @@ of signal taken as a positive one.**
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.
## Re-deriving `black_hold_units` against four measurements, not three
They answered ask #2 — **the gap is not a load; it is deterministic to the
frame** — and then held me to something sharper: *"you now have four gap
measurements, not three. The multiset changed after you chose 0."*
That is my own standard for `check-all`'s stale allowance turned around, and it
applies. Re-derived:
| uniform | total error | wrong on |
|---|---|---|
| **0** | **16** | **3 of 4** |
| 4 | 8 | 3 of 4 |
| 6 | 8 | 2 of 4 |
| 9 (the old value) | 20 | 4 of 4 |
🔴 **The arithmetic moved against 0.** Choosing it cost 1.7× the best fit on three
measurements and costs **2.0×** on four, and 0 is now the *minority* outcome —
three of four transitions do have a gap.
✅ **It is still 0, because the reason was never the fit.** 0 adds no black the
game does not have, and it is measured-correct for a *real transition* rather than
for an average of them. Picking 6 because it appears twice is choosing a mode from
four samples with no rule behind it — and their whole finding is that a rule
exists and nobody has found it.
⚠️ **One of my reasons is gone, though, and I am not keeping it quietly.** Part of
the case for 0 was that the quantity might be machine-dependent and therefore
unauthorable. It is not: bundle size runs the wrong way (build 4 is 12.3 MB and
gaps zero frames; build 5 is 7.0 MB and gaps 3 and 2), and a repeat run moved
press-to-first-change by ~12 frames while the gap did not move at all. **Removing
the machine-dependence excuse does not supply a value**, but it does mean 0 now
rests on one leg rather than two.
📌 **A tripwire, because "invent nothing" can stop being conservative.** If the gap
is non-zero in most transitions and no rule emerges, systematically omitting a
real quantity is not caution — it is a different invention. Revisit at the next
non-zero measurement or the moment a rule appears. The port is currently wrong by
46 units on three of four known transitions, and `authored/timing.json` now says
so in the `why` rather than in a number that looks decided.
### Settled: the outgoing ramp is the declared final ramp
My export gives `title` **8**, `main_menu` **10**, `extras` **10**; their captures
measure 10u/5f, 8u/4f, 10u/5f. ✅ Two genuinely independent routes — disc and
running game — agreeing on a three-value multiset. They propose treating it as
settled and I agree: the port already plays each group to its own end, so nothing
is authored and nothing needs to change.