port: audit every kind label, and seven rested on a neighbour's argument

tools/port/audit-kinds reports what each  in authored/ rests on. Nothing
had ever checked them, which is the point -- the disciplines that fail this way
are the ones that never visibly failed.

Seven of fifteen labels, every goto_name_kind, had no  of their own. Four
scored ok on the first run because the audit fell back to the parent's ,
which argues the DESTINATION while the label is about where the NAME came from.
That is the same error I was corrected for the previous iteration, one level
down: crediting a claim with evidence that does not bear on it. Borrowed evidence
is now its own outcome, and all seven carry a why citing HANDOFF Q4's own words
and stating that the port never branches on the field.

The audit refuted itself twice first. It counted only paths, shas and filenames
as citations, so HANDOFF Q1 and PORT-MISSION section 7 read as citing nothing --
four false positives, and an audit that invents defects is worse than none
because its false positives are indistinguishable from its true ones until each
is opened. It also resolved paths against committed refs only, failing on a
citation to the tool being written. Both fixed. It still cannot read a cited page
to confirm it says what the why claims, and prints that every run.

MEASURED and measured both existed; a consumer comparing == measured misses the
other, and a label that fails to match reads as ABSENT rather than wrong.
Normalised.

Refutation attempt on HANDOFF Q2's map of GP_TITLE. The headline survives and is
exactly right: 4 UI states + 2 loading variants + 2 boot splashes = 8 states
shipped twice = the 16 entries the archive holds, confirmed against my export's
entry map. But the row enumerates six of those eight -- entries 10, 11, 13 and 14,
publisher_logo and developer_logos, appear nowhere in it. A reader counting Q2
gets twelve, and this is the row already corrected once for an ordinal-versus-
entry error, which is the mistake four unlisted entries feed. The port is
unaffected; both splashes are exported, named and verified at RMSE 2.17 and 3.05.

Every asserting check passes, audit-kinds included.

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 21:51:51 +00:00
parent f1e249a606
commit 7c2a47f8be
5 changed files with 370 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 -->
242 sections. Search this before re-deriving anything.
244 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)
@@ -253,6 +253,8 @@ dies, which is what this file is for.
* [The pin moves to `formats-pin-2026-08-30b`, and the port stops owning `+0x08`](#the-pin-moves-to-formats-pin-2026-08-30b-and-the-port-stops-owning-0x08)
* [The menu remembers its cursor — a measured P5 defect, fixed and scoped](#the-menu-remembers-its-cursor--a-measured-p5-defect-fixed-and-scoped)
* [🔴 Correction, same day: I encoded an absence of measurement as a finding](#correction-same-day-i-encoded-an-absence-of-measurement-as-a-finding)
* [The `kind` sweep I said I owed: 15 labels, and 7 rested on a neighbour's argument](#the-kind-sweep-i-said-i-owed-15-labels-and-7-rested-on-a-neighbours-argument)
* [A refutation attempt on Q2's map of `GP_TITLE` — the count is right, the list is short](#a-refutation-attempt-on-q2s-map-of-gp_title--the-count-is-right-the-list-is-short)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -12633,3 +12635,74 @@ Delivery-confirmation went to Ⓐ and Ⓑ because those broke once; the d-pad ha
always quietly worked, so nothing directed attention at it. `kind: "measured"` is
the same shape — it has never visibly failed, so nothing has been checking what
each instance of it actually rests on.
## The `kind` sweep I said I owed: 15 labels, and 7 rested on a neighbour's argument
Every authored entry carries a `kind` — `measured`, `authored`, `name match, not
measured` — and the label is the load-bearing part: `measured` tells a reader
downstream that the port is repeating something observed off the running game.
**Nothing had ever checked them**, which is the point — the Decoder's sharpening
is that *the disciplines that fail this way are the ones that never visibly
failed*. `tools/port/audit-kinds` now reports what each label rests on.
### 🔴 It found the same error I was corrected for, one level down
Seven of fifteen labels — **every `goto_name_kind`** — had no `why` of their own.
Four of them scored `ok` on the first run because the audit fell back to the
parent's `why`, which argues **the destination**. `goto_name_kind` is about
**where the NAME came from**. Different claims, and the audit was crediting one
with the other's evidence.
That is precisely what I had been corrected for the previous iteration: treating
evidence as bearing on a claim it does not bear on. Borrowed evidence is now its
own outcome, `BORROW`, because *a label resting on a neighbour's argument reads
as evidenced and is not*. All seven now carry a `why` citing HANDOFF Q4's own
words — *"the screens are measured; the ids are a name match onto the
executable's class names"* — and state that the port never branches on the field.
### And the audit refuted itself twice before it was worth trusting
* **Four false positives.** The first version counted only paths, shas and
filenames as citations, so `HANDOFF Q1` and `PORT-MISSION section 7` read as
*cites nothing*. **An audit that invents defects is worse than no audit**: its
false positives are indistinguishable from its true ones until each is opened
by hand.
* **Seven false dangling.** It resolved paths against committed refs only, so a
`why` citing the tool being written this iteration failed. Working-tree paths
count now.
⚠️ **What it cannot do** is read the cited page and confirm it says what the `why`
claims, and it prints that on every run. Fifteen labels with resolving citations
is not fifteen verified labels.
📌 One cosmetic find with teeth: `MEASURED` and `measured` both existed. **A
consumer comparing `== "measured"` misses the other, and a label that fails to
match reads as ABSENT rather than as wrong.** Normalised.
## A refutation attempt on Q2's map of `GP_TITLE` — the count is right, the list is short
Q2 is titled *"which build is which screen state"* and reads: **`GP_TITLE` is 8
screens shipped twice, EN/JP** — `2/3` plate, `4/7` title, `5/8` main menu, `6/9`
EXTRAS, and `0/1` and `12/15` the loading screen. The port ships **16** screen
files, so I checked the enumeration against my own export's entry map:
| entries | state |
|---|---|
| 0/1, 12/15 | loading, two variants — ✅ in Q2 |
| 2/3, 4/7, 5/8, 6/9 | plate, title, main menu, EXTRAS — ✅ in Q2 |
| **10/13, 11/14** | **`publisher_logo`, `developer_logos` — absent from Q2** |
✅ **The headline survives and is exactly right.** Four UI states + two loading
variants + **two boot splashes** = 8 states, each shipped twice = **16 entries**,
which is what the archive holds. The count is confirmed by a second reading.
🔴 **The row's own enumeration lists 6 of those 8.** A reader who counts Q2's
entries gets twelve and has no slot for the splashes — and **this is the row
already corrected once for an ordinal-versus-entry error**, which is exactly the
mistake an incomplete map feeds: four unlisted entries are four places for an
off-by-three to hide. The splashes are not obscure to the contract either; the
190/145 dwell retraction is about these very entries.
Not a defect in the port — `publisher_logo` and `developer_logos` are exported,
named and verified against captures at RMSE 2.17 and 3.05. Reported because the
map is what the next reader will trust.