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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 20:17:26 +00:00
parent ec70f0257b
commit 653e317197
2 changed files with 65 additions and 2 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 -->
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)
<!-- /INDEX -->
## 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.

View File

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