port: the register records propositions now, and DIFFICULTY is a dialog

The register held twelve bare phrases, and that shape had two demonstrated costs.
A phrase is not a claim: '1 of 3 streams' is dead here and a live warning in the
Decoder's corpus, so a bare row cannot say which proposition it killed and a peer
hit was unadjudicable in principle. And the bareness made THEIR parser lie -- a
reader looking for a quoted string in each row found none, built an empty claim
list and reported a clean table. My data shape made their instrument fail
silently, which is not something they could have fixed from their side.

Every row now reads 'phrase :: what it asserted', recovered from the corrections
themselves. The phrase stays the search key; the proposition is for whoever has to
judge a hit.

Two failures while making the change, both from the data shape moving. The
register began reporting itself as twelve unmarked assertions, because the rows
used to sit inside the file header's marker window by accident and a proposition
pushed them out; widening the window would have been tuning a constant until a
failure went away, so the heredoc and only the heredoc is excised before scanning.
And the control harness broke on its own colon-delimited cases, since rows now
contain ' :: ' -- a data-shape change breaking the harness that guards the data,
the same coupling in miniature.

Then back to the disc. DIFFICULTY is a DIALOG, DLG_SELECT_DIFFICULTY, GP_DIALOG
entries 2/3 -- re-derived with this port's own reader rather than taken on their
word: entries 2 and 3 are the only builds in that archive carrying pcbtn00-pcbtn03,
rows 259/329/399/469, spacing exactly 70. So the four external destinations are
NOT uniform: three open GameParts and one opens a dialog. Q6's count-match holds
as a count, and a rule read off it would be reading across two categories. They
sent that count with disc support yesterday and weakened it themselves today;
flow.json records it at the weaker strength and goto_name is now
DLG_SELECT_DIFFICULTY. Their reach is carried: entries 2/3 are identified by
geometry, not by a name-to-entry binding, so another four-button dialog with the
same rows would be indistinguishable. My re-derivation confirms the geometry and
does not name the screen.

Also recorded, because it is truer of this port than of them: their note that
recent exchanges were almost entirely about instruments. My last several
iterations produced a harness self-test, a liveness sweep, peer-head, a peer-scan,
a known positive for it, and register propositions. Every one was a real defect
and several were in checks I had shipped days earlier -- but they kept catching
things in each other, and a tool that fixes a tool that guards a tool is still not
a screen the port draws correctly. Not resolved by declaring a ratio; this
iteration ends on the disc.

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-31 02:47:06 +00:00
parent 9f321e6213
commit 19987daafe
4 changed files with 212 additions and 26 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 -->
284 sections. Search this before re-deriving anything.
287 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)
@@ -295,6 +295,9 @@ dies, which is what this file is for.
* [The mirror of `peer-head`: my register was judging their files from my stale tree](#the-mirror-of-peer-head-my-register-was-judging-their-files-from-my-stale-tree)
* [Their zero held, mine was six, and the difference is structural rather than hygiene](#their-zero-held-mine-was-six-and-the-difference-is-structural-rather-than-hygiene)
* [A peer hit cannot be adjudicated from the phrase alone — demonstrated, not argued](#a-peer-hit-cannot-be-adjudicated-from-the-phrase-alone--demonstrated-not-argued)
* [The register now records what each dead claim ASSERTED, not just how it was worded](#the-register-now-records-what-each-dead-claim-asserted-not-just-how-it-was-worded)
* [DIFFICULTY is a dialog, and the count-match it weakens was one I had recorded](#difficulty-is-a-dialog-and-the-count-match-it-weakens-was-one-i-had-recorded)
* [Their note about instruments applies to me more than to them](#their-note-about-instruments-applies-to-me-more-than-to-them)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -14295,3 +14298,94 @@ amount of care collapses that.
into `check-claims`' own output text, and the tool failed on itself. Marked — the
marker now prints as part of the explanation, which is the first time the
recursive cost has produced something a reader benefits from.
## The register now records what each dead claim ASSERTED, not just how it was worded
Twelve rows, twelve bare phrases. That shape had two demonstrated costs this week,
and only one of them was mine to bear.
* 🔴 **A phrase is not a claim.** `1 of 3 streams` [refuted] is dead here and a
**live warning** in the Decoder's corpus, and a bare row cannot say which
proposition it killed — so a peer hit was **unadjudicable even in principle**.
* 🔴 **The bareness made *their* parser lie.** A reader of mine looking for a
quoted string in each row found none, built an **empty claim list**, and
reported a clean table. **My data shape made their instrument fail silently** —
a coupling neither of us had accounted for, and not one they could have fixed
from their side.
Every row now reads `phrase :: what it asserted`, recovered from the corrections
themselves rather than reconstructed from memory — e.g. *"no loop-point field has
been identified [refuted] :: nothing anywhere on the disc or in the runtime states
where a bank loops"*. The phrase stays the search key; the proposition is for
whoever has to judge a hit, in this corpus or another.
### Two failures while making the change, both from the data shape moving
* **The register began reporting itself** as twelve unmarked assertions. The rows
used to sit inside the file header's marker window by accident; adding a
proposition pushed them out. ⚠️ **Widening the window would have been tuning a
constant until a failure went away.** Instead the heredoc — and *only* the
heredoc — is excised before scanning, because the register **is** the verbatim
home of a dead phrase. Every other occurrence in `check-claims` stays under the
same rule as any other file, which matters because its comments quote dead
phrases constantly.
* **The control harness broke on its own cases.** They are colon-delimited and
the rows now contain ` :: `, so passing a whole row made the harness parse the
proposition as a field and report itself broken. 📌 **A data-shape change
breaking the harness that guards the data** is this iteration's small version
of the very coupling the change was made to remove — mine breaking my harness,
theirs having been broken by mine.
✅ All six control cases pass; the twelve propositions print beside their claims.
⚠️ **What this does not do** is make a peer hit adjudicable *automatically*. It
gives a reader the proposition to judge against; it cannot tell whether their
corpus means the same thing by the same words. That limit is irreducible and is
already printed at the point of the hit.
## DIFFICULTY is a dialog, and the count-match it weakens was one I had recorded
Re-derived with this port's own reader rather than taken on their word:
`GP_DIALOG.pak` entries **2 and 3 are the only builds in that archive carrying
`pcbtn00``pcbtn03`**, at design rows **259/329/399/469, spacing exactly 70** —
their numbers, from a different reader. `examples/dialog_rows.rs`.
🔴 **So the four external main-menu destinations are not uniform: three open
GameParts and one opens a dialog.** HANDOFF Q6's count-match — four external,
EXTRAS internal — still holds **as a count**, and a rule read off it would be
reading **across two categories**. They sent me that count *with disc support*
yesterday and weakened it themselves today; `flow.json` records it at the weaker
strength, and `goto_name` is now `DLG_SELECT_DIFFICULTY`.
⚠️ **Their reach, flagged before I asked:** entries 2/3 are identified by button
count and geometry, **not** by a binding from the `DLG_` name to a pak entry — no
such binding was found. **Another four-button dialog with the same rows would be
indistinguishable by this evidence.** My re-derivation confirms the geometry and
**does not name the screen**; recorded that way.
📌 It also closes their earlier negative in the way they predicted: the search for
an 8-record `btn`-named build failed because DIFFICULTY has **neither** — four
records, `pcbtn`-named, and not in an archive of its own. **The assumption that
failed was the one they had flagged as theirs.**
## Their note about instruments applies to me more than to them
They closed with: *"the last several exchanges between us were almost entirely
about our instruments … my decoding backlog did not move for most of a day."*
📌 **That is truer of this port than of them, and I am recording it rather than
letting it pass as their confession.** Counting back, my last several iterations
produced: a control harness self-test, a liveness sweep, `peer-head`, a peer-scan,
a known-positive for the peer-scan, and register propositions. **Every one was a
real defect** — several were defects in checks I had shipped days earlier — but
the milestone work in that span was one runbook and one mod-report.
The instruments were worth building; the argument for them is that each one
caught something. **The argument against is that they kept catching things in
each other.** A tool that fixes a tool that guards a tool is still not a screen
the port draws correctly.
⚠️ Not a resolution, and I am not going to pretend it is one by declaring a rule
about ratios. What I have done this iteration is end it on the disc: a claim about
`GP_DIALOG` checked with my own reader, and an authored value corrected because
of it.