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 1a81ca1c1a
commit f208e1526d
4 changed files with 212 additions and 26 deletions

View File

@@ -43,18 +43,18 @@ fail=0; total_marked=0; scanned=0; peer_hits=0; _peer_probe_done=0
# is the check.
MARKER='[refuted]'
REGISTER=$(cat <<'ROWS'
TAIL of the kept stream
known too fast
only thing making the plate
no loop-point field has been identified
AUDIBLY WRONG AT THE SEAM
1 of 3 streams
six expected DIFFERS
goes against the port
the capture turns out to determine it
COMPOSITED rather than standalone
structural limit, not an unrun experiment
HANDOFF Q10 says nothing on the disc
TAIL of the kept stream :: the leading chunk of a voice region duplicates the end of the kept stream, so it can be dropped
known too fast :: the boot plays both splashes faster than the game does
only thing making the plate :: the plate reappears because of one authored cause
no loop-point field has been identified :: nothing anywhere on the disc or in the runtime states where a bank loops
AUDIBLY WRONG AT THE SEAM :: replaying the menu bed from sample 0 puts audible fade-out and silence at the loop seam
1 of 3 streams :: the exporter ships one of a voice region's three streams
six expected DIFFERS :: six screens are expected to differ from the reference renderer
goes against the port :: the JP title capture adjudicates title_jp against this port's rendering
the capture turns out to determine it :: the leaf's phase is fixed by the capture rather than being an arbitrary choice
COMPOSITED rather than standalone :: the four screens without an opaque-black primitive are drawn composited over another screen
structural limit, not an unrun experiment :: EXTRAS cannot be strengthened past n=1 because this archive holds no second destination
HANDOFF Q10 says nothing on the disc :: nothing on the disc names which track the menu plays, so the port must choose one
ROWS
)
@@ -95,7 +95,13 @@ fi
if [ "${1:-}" = "--control" ]; then
probe="docs/port/.claims-control-probe.md"
trap 'rm -f "$probe"' EXIT INT TERM
# The PHRASE only: rows now read `phrase :: proposition`, and the case strings
# below are colon-delimited, so passing a whole row made the harness parse the
# proposition as a field and report its own cases broken. A data-shape change
# breaking the harness that guards the data is this iteration's small version
# of my rows making the Decoder's parser fail silently.
claim=$(printf '%s\n' "$REGISTER" | grep -m1 '[^[:space:]]')
claim="${claim%% :: *}"
ok=0
run() { CLAIMS_CONTROL=1 "$0" >/dev/null 2>&1; echo $?; }
rm -f "$probe"
@@ -222,6 +228,20 @@ print(" none -- every correction section names a registered claim" if not flagg
HOOK
while IFS= read -r claim; do
# 🔴 ROWS CARRY A PROPOSITION NOW, `phrase :: what it asserted`.
#
# They were bare phrases, and that had two costs. A phrase is not a claim:
# `1 of 3 streams` [refuted] is dead here and a LIVE warning in the Decoder's
# corpus, and the bare row cannot say which proposition it killed -- so a peer
# hit was unadjudicable even in principle. And the bareness made THEIR parser
# fail silently: 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 lie.
#
# The phrase is still the search key; the proposition is for whoever has to
# judge a hit, here or in another corpus.
proposition="${claim#* :: }"
claim="${claim%% :: *}"
[ -z "$claim" ] && continue
hits=0; bad=0; marked=0
while IFS= read -r loc; do
@@ -232,6 +252,20 @@ while IFS= read -r claim; do
import sys
f, claim, marker, w = sys.argv[1], sys.argv[2], sys.argv[3], int(sys.argv[4])
s = open(f, encoding="utf-8", errors="ignore").read()
# 🔴 THE REGISTER BLOCK IS ITS OWN VERBATIM HOME, and is excised before
# scanning rather than relying on marker proximity. The rows used to be bare
# phrases that happened to sit within the marker window of the file header;
# adding a proposition to each pushed them out of it, and the check began
# reporting its own register as twelve unmarked assertions. Widening the window
# would have been tuning a constant to make a failure go away. Excising exactly
# the heredoc -- and nothing else in this file -- keeps every other occurrence
# in `check-claims` under the same rule as any other file, which matters because
# the comments here quote dead phrases constantly.
if f.endswith("check-claims"):
a = s.find("REGISTER=$(cat <<'ROWS'")
b = s.find("\nROWS", a) if a >= 0 else -1
if a >= 0 and b > a:
s = s[:a] + (" " * (b - a)) + s[b:]
i = n = 0
low, claim_low = s.lower(), claim.lower()
while True:
@@ -327,6 +361,8 @@ PY
scanned=$((scanned + hits))
if [ "$bad" -eq 0 ]; then
printf ' %-42s %d file(s), %d occurrence(s) suppressed\n' "$claim" "$hits" "$marked"
[ -n "$proposition" ] && [ "$proposition" != "$claim" ] \
&& printf ' it asserted: %s\n' "$proposition"
total_marked=$((total_marked + marked))
else
printf ' %-42s 🔴 %d file(s) assert it unmarked\n' "$claim" "$bad"; fail=1