diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index adc80593..6e5c86bb 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -188 sections. Search this before re-deriving anything. +189 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) @@ -199,6 +199,7 @@ dies, which is what this file is for. * [The off-edge splash residual is **not** tonal — and I was comparing it to the wrong floor](#the-off-edge-splash-residual-is-not-tonal--and-i-was-comparing-it-to-the-wrong-floor) * [Their linearity gate, applied to my side of the ratio — and an inversion](#their-linearity-gate-applied-to-my-side-of-the-ratio--and-an-inversion) * [The leaf thread, closed — one export value verified against the game, one self-check abandoned](#the-leaf-thread-closed--one-export-value-verified-against-the-game-one-self-check-abandoned) +* [Delivering the phase term where the numbers are, not where I found them](#delivering-the-phase-term-where-the-numbers-are-not-where-i-found-them) ## P0 — the exporter, 2026-08-28 @@ -10674,3 +10675,47 @@ self-check as inconclusive is the end state**, not a step toward another attempt ⚠️ Still open and now parked: whether the port's leaf advance is wrong at all. Four models refuted means the input to my 1.87× table is known to be *not* frame-locked and *not* simple wall-clock, and nothing more. + +## Delivering the phase term where the numbers are, not where I found them + +Their point closing the leaf thread — *it lived in messages and `docs/re/`, which +by our own rule means it wasn't delivered* — applies to my side, and I had the +same gap. The capture-phase term was written up in `DECISIONS.md`. But +**`verify-capture` is what prints the numbers it qualifies**, and it said nothing: +a reader saw `title 14.16 / 0.21 %` with no indication that ±5.56 of it is +inherited from where the shutter fell. + +✅ Now printed per row, in the tool's own metric: + +``` +main_menu 13.21 0.06% rendered with authored initial focus; +/-3.78 capture-phase term +title 14.16 0.21% settle t=198; +/-5.56 capture-phase term -- regression only +publisher_logo 2.17 0.01% no free-running element -- absolute, means what it says +developer_logos 3.05 0.01% no free-running element -- absolute, means what it says +``` + +Plus a header block recording that `--leaf-time=0` is a **convention, not the +game's phase**, and that these rows are usable for regression at a fixed pin and +**not** as absolutes against anything measured differently. + +### ⚠️ A gap in the delivery rule that their own update exposes + +They landed the leaf facts in **HANDOFF**, which is right — it is the contract, +and the standing instruction has me read it every iteration. **It is not in my +checkout.** Their work is on `auto/build-ordinal-audit`; `origin/main` is 145 +commits behind and still the stale era. So: + +* `docs/port/HANDOFF.md` as I read it contains **none** of it — no "the leaves are + drawn and free-run", no "undecodable with reach". +* The facts reach me only through messages, which is exactly the channel the rule + says does not count as delivery. + +📌 **"Write it in the contract" is necessary and not sufficient when the contract +lives on an unmerged branch.** Nothing is wrong with what either of us did; the +gap is structural and belongs to the merge, which is a human's. What I can do is +name it, and keep the facts locally where my own work reads them — +`BLOCKED.md` and `DECISIONS.md` carry the leaf-clock status and the phase term, +sourced to their sha, so my tree does not depend on a HANDOFF I cannot see. + +⚠️ This is the second structural consequence of `main` being stale, after the +`Cargo.toml` pin being load-bearing. Both are recorded rather than worked around. diff --git a/tools/port/verify-capture b/tools/port/verify-capture index 924889a8..4f46bbdd 100755 --- a/tools/port/verify-capture +++ b/tools/port/verify-capture @@ -215,9 +215,28 @@ for row in "${MAP[@]}"; do raw=$(convert "$OUT/$name.crop.png" "$cap" -metric RMSE -compare -format "%[distortion]" info: 2>&1 | tail -1) raw=$(python3 -c "print('%.2f' % (float('$raw')*255))" 2>/dev/null || echo "?") note="" + # 🔴 EVERY ROW WITH A SWEEPING LEAF CARRIES A CAPTURE-PHASE TERM, AND THIS + # TOOL USED TO PRINT THE NUMBER WITHOUT IT. + # + # `ptloop01`/`ptloop02` free-run on a settled screen -- a settled screen is not + # a static screen -- so a capture froze them wherever the shutter fell, and the + # render is pinned at `--leaf-time=0` by CONVENTION, not because 0 is the + # game's phase. Measured by sweeping the phase against each capture: + # + # title 5.56 main_menu 3.78 extras 3.73 splashes 0.00 + # + # Those are RMSE, in this tool's own metric, and larger than most margins + # anyone has quoted from these rows. So: usable for REGRESSION at a fixed pin, + # run to run; NOT usable as an absolute against anything measured differently. + # + # ✅ The two splash rows carry no free-running element at all. They are the + # only absolutes here that mean what they say. case "$name" in - main_menu|extras) note="rendered with authored initial focus" ;; - title) note="settle t=198; residual is the SWEEP PHASE -- see DECISIONS.md" ;; + title) note="settle t=198; +/-5.56 capture-phase term -- regression only" ;; + title_jp) note="+/-5.6 capture-phase term (same leaves as build 4)" ;; + main_menu) note="rendered with authored initial focus; +/-3.78 capture-phase term" ;; + extras) note="rendered with authored initial focus; +/-3.73 capture-phase term" ;; + publisher_logo|developer_logos) note="no free-running element -- absolute, means what it says" ;; esac # Where the difference lives. This comes FIRST because it is what the gamma # sweep has to be protected from.