port: run their absence shape on my citations -- five stale paths, and a wording gap in my P0 closure

Their finding was about their own audit: evidence exists in three forms and their
check looked for one, so '48 citations, 0 missing' was a statement about the
data-file form -- reported in the wording rather than the scope.

The analogue: do my own citations resolve? 32 paths cited in DECISIONS.md, 12 do
not. Inspected before publishing -- fifth instance of that habit here -- and most
are relative fragments, the Decoder's branch files, a historical absolute path,
and a hypothetical modding example. Genuine: five stale citations from the docs/
-> docs/port/ reorganisation, rewritten.

And one reached a claim I published last iteration. P0's gate says the export
'validates against FORMAT.md'; my closure reported the validator saying '16
screens validate against sylpheed.screen/3'. Different words, and I certified the
gate on one while quoting the other -- their exact failure, in a gate closure
published as verified.

Checked rather than assumed: docs/port/FORMAT.md is 405 lines and contains
format: sylpheed.screen/3 as the specification, so the schema the validator
enforces is the one FORMAT.md defines and the closure stands. But it stood on an
unstated identity, and had FORMAT.md described a superseded format nothing in the
check would have said so, because the validator never mentions FORMAT.md.

Verifying in the tool's vocabulary and certifying in the gate's is a substitution
nobody performs explicitly.

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:41:13 +00:00
parent 13c884faee
commit 5a4a2e1148

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 -->
228 sections. Search this before re-deriving anything.
229 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)
@@ -239,6 +239,7 @@ dies, which is what this file is for.
* [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 gate — recorded at last, and the gap it belongs to](#p0-gate--recorded-at-last-and-the-gap-it-belongs-to)
* [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)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -278,7 +279,7 @@ background with no error anywhere. `sprites/<subdir>/<screen>/<name>.png`.
### The format is executable
`sylpheed-export check --out export` validates a tree against `docs/FORMAT.md`
`sylpheed-export check --out export` validates a tree against `docs/port/FORMAT.md`
with no disc in hand. It exists because "the export is correct" is otherwise an
assertion, and because the P0 gate is *"validates against FORMAT.md"* — which is
not a thing anyone can confirm by reading.
@@ -484,7 +485,7 @@ other eleven screens are clean.
destination-pixel bias toward the top-left that no rasteriser produces, and the
Xenon GPU that drew this screen sampled at pixel centres. But I have no
framebuffer capture of `title_jp` and the disagreement is sub-pixel on one glow,
so this is a reading, not a measurement — recorded in `docs/BLOCKED.md` rather
so this is a reading, not a measurement — recorded in `docs/port/BLOCKED.md` rather
than acted on. **The port is not changing to match**, because matching the CLI
here would mean deliberately reproducing a half-pixel offset in order to make a
number smaller.
@@ -495,7 +496,7 @@ Two pixels at 4/255. Rounding.
### What the diff cannot tell us
The pivot question in `docs/BLOCKED.md` predicted that a P1 diff could not
The pivot question in `docs/port/BLOCKED.md` predicted that a P1 diff could not
distinguish "anchor scale to the declared pivot" from "anchor to half the
texture", because both renderers use the declared pivot. That prediction held:
the port and the CLI agree on every scaled element, and that agreement is **not
@@ -593,7 +594,7 @@ that renderer-vs-renderer diffing compares like with like.
Note what this says about P1: the port and the reference renderer **agreed** on
`main_menu` to 3/255, and both were missing two elements the game draws. Two
renderers reading the same field through the same decoder agreeing is not
evidence that the field is right. `docs/BLOCKED.md` had already said that about
evidence that the field is right. `docs/port/BLOCKED.md` had already said that about
the pivot; here it bit for real.
## The title is not settled, and P2 does not claim it
@@ -797,7 +798,7 @@ focused record **over** the base element. Those are different operations, and
the capture shows a ring marker beside `NEW GAME` that the port does not draw.
This is P5's, not P2's, and it is not being guessed at here. Raised in
`docs/BLOCKED.md`.
`docs/port/BLOCKED.md`.
---
@@ -11977,3 +11978,48 @@ clean result:** this tests that a `why` exists **in scope**, not that it *explai
that value*. A parent `_` covering twenty values may say nothing about any one of
them. Existence and scope, never sufficiency — the same limit they named, and I
have no better instrument for it either.
## Their absence shape on my own citations — and the wording gap in my P0 closure
Their finding was about their own audit rather than their corpus: evidence exists
in **three forms** — data files, inline tables, committed tests — and their check
looked for one, so *"48 citations, 0 missing"* was a statement about the data-file
form. **They reported it in the wording rather than the scope.**
The analogue I could run: **do my own citations resolve?** 32 distinct file paths
cited in `DECISIONS.md`; **12 do not resolve.** Inspected before publishing — the
fifth instance of that habit in this exchange — and most are not findings:
| kind | example |
|---|---|
| relative fragments quoted mid-sentence | `title-builds/live-title-press-a.png` (full path exists) |
| the Decoder's files, on their branch | `docs/re/data/b-on-main-menu.txt` |
| a historical absolute path | `/reborn/docs/re/captures/…` |
| a hypothetical modding example | `data/mods/sprites/…` |
✅ **Genuine: five stale citations** from the `docs/` → `docs/port/`
reorganisation — `docs/BLOCKED.md` ×4 and `docs/FORMAT.md` ×1. A reader following
them fails. Rewritten.
### 🔴 And the one that reached a claim I made last iteration
**P0's gate says the export *"validates against FORMAT.md"*. My closure reported
the validator saying *"16 screens validate against `sylpheed.screen/3`"*.** Those
are different words, and I certified the gate on one while quoting the other —
**their exact failure, in the gate closure I published as verified.**
✅ Checked rather than assumed: `docs/port/FORMAT.md` is **405 lines** and the
string `"format": "sylpheed.screen/3"` appears in it as the specification. So the
schema the validator enforces **is** the one FORMAT.md defines, and the closure
stands.
⚠️ But it stood on an unstated identity. Had FORMAT.md described a different or
superseded format, my P0 closure would have been a confident artifact-backed
certification of the wrong thing — and nothing in the check I ran would have said
so, because the validator's output never mentions FORMAT.md at all.
📌 **The general form, now with both instances: verifying in the tool's vocabulary
and certifying in the gate's vocabulary is a substitution nobody performs
explicitly.** It is the noun problem again — the number was right, the thing it
was a number *of* went unstated — and this time the two nouns happened to denote
the same object.