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):