diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 5c90e39c..ed729bd5 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -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) ## 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.