From 653e317197767cb2ac2ca460f1d6cc9135616c12 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 20:17:26 +0000 Subject: [PATCH] port: full regression passes; the phase term moved two published rows Ran the suite after a session of edits to boot.gd, screen_view.gd, four tools and two authored files. Every asserting check passes, and verify-screen's two DIFFERS are the named pair with per-screen reasons. Two oracle rows moved: title_plate 12.83/0.00% to 13.04/0.09%, title_band 15.31/0.35% to 12.86/0.00%. Opposite directions, which is a phase change rather than a regression, and the cause is mine -- adding --leaf-time=0 to verify-capture's render sites pinned the sweeps while the captures froze them wherever the shutter caught them. That makes the capture-phase term concrete: I documented +/-5.56 for title from a sweep, and here it moved two published rows from a one-line harness change. It also touches a number I published -- the boot-end-frame 0.00% was measured before the pin, and the equivalent row now reads 0.09%. Both inside the term, and the right reading is that neither is 'the' number. Also narrowed the withdrawal-time hook. Its regex matched headings ABOUT corrections rather than headings making them, so 33 was a measurement of the regex; narrowed to a leading WITHDRAWN/CORRECTION/Refuted, it gives 10, all genuine retractions. Residual limit named: several of the ten are flagged because the registered phrase does not appear in that section -- the corrected JP heading reads 'does NOT go against the port', which does not contain 'goes against the port'. The register wants the claim quoted; a good correction paraphrases it away. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 59 ++++++++++++++++++++++++++++++++++++++++- tools/port/check-claims | 8 +++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index a8a2b331..374be2e1 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -230 sections. Search this before re-deriving anything. +232 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) @@ -241,6 +241,8 @@ dies, which is what this file is for. * [Their sufficiency gap, run on `authored/` — clean, after I nearly reported 35 false positives](#their-sufficiency-gap-run-on-authored--clean-after-i-nearly-reported-35-false-positives) * [Their absence shape on my own citations — and the wording gap in my P0 closure](#their-absence-shape-on-my-own-citations--and-the-wording-gap-in-my-p0-closure) * [The off-edge splash residual, localised — three mechanisms ruled out, one honest description](#the-off-edge-splash-residual-localised--three-mechanisms-ruled-out-one-honest-description) +* [Full regression after a session of edits — and the phase term moving two published rows](#full-regression-after-a-session-of-edits--and-the-phase-term-moving-two-published-rows) +* [Narrowing my own hook — 33 was a measurement of the regex](#narrowing-my-own-hook--33-was-a-measurement-of-the-regex) ## P0 — the exporter, 2026-08-28 @@ -12095,3 +12097,58 @@ levels inside the lit logo, with no consistent direction.** ⚠️ Still no mechanism. That is now a much smaller and better-posed question than it was — but naming what it is *not* four times over is not the same as finding what it is, and I am not going to invent a fifth candidate to close it. + +## Full regression after a session of edits — and the phase term moving two published rows + +I had changed `boot.gd`, `screen_view.gd`, four tools and two authored files +without a full suite run. Ran it. + +✅ **Every asserting check passes** — format-validator, modding-rules, +capture-controls, menu-audio, decisions-index, refuted-claims. `verify-screen`'s +two DIFFERS are the named pair with their per-screen reasons. + +### 🟡 Two oracle rows moved, and not as a regression + +| row | before | now | +|---|---|---| +| `title_plate` | 12.83 / **0.00 %** | 13.04 / **0.09 %** | +| `title_band` | 15.31 / **0.35 %** | 12.86 / **0.00 %** | + +**They moved in opposite directions**, which is the signature of a *phase change* +rather than a regression — and the cause is mine: adding `--leaf-time=0` to +`verify-capture`'s render sites pinned the sweeps to one pose, and the captures +froze them at whatever pose the shutter caught. + +📌 **This makes the capture-phase term concrete rather than theoretical.** I +documented ±5.56 RMSE for `title` from a sweep; here it moved two *published* rows +by 0.09 and 0.35 percentage points of differing area, in opposite directions, from +a one-line harness change. The annotation was not decoration. + +⚠️ **And it touches a number I published.** My boot-end-frame verification quoted +**0.00 % differing**, measured before the pin, with the boot's leaf free-running. +The equivalent row now reads 0.09 %. Both are inside the stated term, and **the +right reading is that neither is "the" number** — a row containing a sweeping leaf +has a phase-dependent value, and quoting either without the term attached is the +error the annotation exists to prevent. + +## Narrowing my own hook — 33 was a measurement of the regex + +The withdrawal-time hook reported **33** correction sections registering nothing. +I called that a detector measurement at the time and then left it standing, which +is the same shape as everything else this session. + +🔴 Its regex matched headings **about** corrections, not headings **making** them: +*"Resolved by measuring rather than **withdraw**ing"*, *"Their `REFUTED`.md gap"*, +*"Building the **withdrawal**-time hook"*. Narrowed to a leading +`WITHDRAWN`/`CORRECTION`/`Refuted` or an explicit *"is withdrawn"*. + +✅ **33 → 10, and every one of the ten is a genuine retraction.** The list is now +actionable where it was noise. + +⚠️ **A residual limit worth naming:** several of the ten are flagged because the +registered phrase does not appear *in that section* — the corrected JP heading +reads *"does **NOT go** against the port"*, which does not contain the registered +*"goes against the port"*. **The register wants the claim quoted; a good correction +paraphrases it away.** Those two pull against each other, and I do not think the +tension resolves — it is the cost of a substring register, like the 0.32 collision +that made that claim unregistrable. diff --git a/tools/port/check-claims b/tools/port/check-claims index 67dd3bd7..27e80edf 100755 --- a/tools/port/check-claims +++ b/tools/port/check-claims @@ -84,7 +84,13 @@ doc = open("docs/port/DECISIONS.md").read() heads = [(m.start(), m.group(0)) for m in re.finditer(r"(?m)^##+ .*$", doc)] flagged = 0 for i, (pos, head) in enumerate(heads): - if not re.search(r"WITHDRAWN|CORRECTION|refuted|withdraw", head, re.I): + # 🔴 THE FIRST REGEX MATCHED HEADINGS *ABOUT* CORRECTIONS, NOT HEADINGS + # MAKING THEM -- "withdraw" caught "rather than withdrawing", "refuted" + # caught a section discussing the register itself. 33 candidates was a + # measurement of the regex. Narrowed to headings that RETIRE something: + # a leading WITHDRAWN/CORRECTION/Refuted, or an explicit "is withdrawn". + if not re.search(r"^#+\s*(?:[^A-Za-z]*\s*)?(WITHDRAWN|CORRECTION|Refuted)\b" + r"|\bis withdrawn\b|\bnow refuted\b", head): continue end = heads[i + 1][0] if i + 1 < len(heads) else len(doc) if not any(c in doc[pos:end] for c in reg):