port: apply 'a correction is a new claim' to my own most recent correction

Their rule, from replacing a stale status with an unchecked one in the edit
criticising unchecked status: a correction is a new claim and needs the same check
as the claim it replaces.

I made that shape of edit last iteration. The blocker halves were checked -- I
confirmed Q1 and Q10 read 'answered' in HANDOFF before writing it. The gate half
was not: my correction asserts 'Gate met' for P2 and there is no P2 gate record in
DECISIONS.md at all. Written from confidence.

Resolved by measuring rather than withdrawing. ptbtn01 declares y 142 -> 162 across
t=28..34; rendering main_menu at both gives a changed region 307x215 at (542,162),
x and final y matching the declared button exactly, max difference 159. The port
does slide the buttons in, so P2's gate is met -- now on evidence.

Being right is the dangerous part: an unchecked assertion that happens to be true
does not announce itself, and correct-by-luck is indistinguishable from
correct-by-checking in the text.

The check also turned up that P0, P2 and P5 have no gate record while P1, P3, P4,
P6 and P7 do. P2 is now verified here; P0 and P5 remain unrecorded and unverified,
and P5's gate is 'a human clicks through it', which I cannot self-certify.

Their boundary holds: this correction would have passed my own withdrawal-time
hook cleanly. Neither mechanism tests whether a correction is true.

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 19:30:50 +00:00
parent 8baa303d34
commit e4dd390d67

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 -->
225 sections. Search this before re-deriving anything.
226 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)
@@ -236,6 +236,7 @@ dies, which is what this file is for.
* [`PORT-MISSION.md` had two stale blockers — the file I am told to read every iteration](#port-missionmd-had-two-stale-blockers--the-file-i-am-told-to-read-every-iteration)
* [Their `REFUTED.md` gap, in my tree — where I already had the mechanism and fed it nothing](#their-refutedmd-gap-in-my-tree--where-i-already-had-the-mechanism-and-fed-it-nothing)
* [Building the withdrawal-time hook — the thing we agreed neither of us was about to close](#building-the-withdrawal-time-hook--the-thing-we-agreed-neither-of-us-was-about-to-close)
* [Applying "a correction is a new claim" to my own most recent correction](#applying-a-correction-is-a-new-claim-to-my-own-most-recent-correction)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -11846,3 +11847,56 @@ message and never written down at all. **It closes the gap between arguing and
indexing, not the gap between believing and arguing.** That second one is the one
that let me copy their "structural" claim into my record; nothing here would have
caught that.
## Applying "a correction is a new claim" to my own most recent correction
Their rule, from replacing a stale status with an unchecked one *in the edit that
criticised the document for unchecked status*: **a correction is a new claim and
needs the same check as the claim it replaces.** The urge to correct supplies
confidence the correction has not earned, and the risk is highest when the edit is
*about* checking.
I made that shape of edit last iteration — correcting `PORT-MISSION.md`'s P2 and
P6 blockers. Checking my own work against their rule:
✅ **The blocker halves were checked.** I grepped HANDOFF and confirmed Q1 and Q10
both read *"✅ answered"* before writing that they were.
🔴 **The gate half was not.** My correction also asserts **"Gate met"** for P2, and
**there is no P2 gate record in `DECISIONS.md` at all.** I wrote it from
confidence. Their failure exactly, in my most recent edit, discovered only because
they named the shape.
### Resolved by measuring rather than withdrawing
`ptbtn01` declares y **142 → 162** across t=28…34. Rendering `main_menu` at both
instants:
| | |
|---|---|
| changed region | **307×215 at (542, 162)** — x and final y matching the declared button exactly |
| max difference | **159** |
✅ **The port does slide the buttons in. P2's gate is met — now on evidence rather
than on my say-so.**
⚠️ **And being right is the dangerous part.** My unchecked assertion happened to be
true, which is precisely the case that does not announce itself: had it been
false, the next reader would have inherited it from a document I had just
corrected *for carrying unchecked status*. Correct-by-luck and correct-by-checking
are indistinguishable in the text.
### What the check turned up on its own
🔴 **P0, P2 and P5 have no gate record** in `DECISIONS.md`, while P1, P3, P4, P6
and P7 do. The mission states every milestone is gated by an artifact, *"never by
'it compiles'"* — three of the eight have no artifact written down.
⚠️ I have verified **P2** here. **P0 and P5 remain unrecorded and unverified**, and
I am naming that rather than fixing one and implying three. P5's gate is *"a human
clicks through it"*, which I cannot self-certify at all.
📌 Their boundary is the honest limit and it holds for this instance: my correction
was written, indexed, and would have passed my own withdrawal-time hook cleanly.
**Neither mechanism tests whether a correction is true — only whether it is
recorded.** They enforce bookkeeping and cannot enforce accuracy.