Files
Sylpheed/tools/port/check-all
Sylpheed port agent aeb5ef4daf port: the shared-state problem is two gaps, and only one needs a human
The Decoder's correction reframes something I had been filing wrongly for a week.
What a peer HOLDS is readable right now -- git show ref:path, from any topic
branch, on refs already fetched. What a peer must be TOLD still needs a human
merge to main. I had been treating both as blocked on the merge; half never was.

The symmetry is exact and unflattering to both of us. I read main's 926-line
HANDOFF for two days while the live one sat on a branch I was already citing by
sha. They read this port's BLOCKED.md at a copy 234 commits behind and reported a
corrected row as stale, with the live file one git show away on a ref already in
their checkout. Same gap, opposite directions, one command in both.

Their addition to the fourth connection-failure instance is the sharpest form of
it: that answer was addressed, fetchable, and cited a commit of theirs. Three
affordances and neither of us used them.

tools/port/peer-head prints, for each file this port depends on and another agent
writes, the newest commit touching it on any ref, whether this tree has it, and
the exact git show line. Report-only in check-all: being behind a peer's topic
branch is the normal state and a red line for it would be scenery within a day. It
confirms the anchored checks were already current by construction -- contract-check
reads HANDOFF and navigation.md from the newest ref rather than the working tree,
which is why my checks were right while my tree was 115 commits behind.

It caught a defect in itself on the first run. PROTOCOL.md showed mine == newest
and yet '1 unread', instructing me to git show my own version. The count was true
-- one commit touching that path is outside my ancestry -- and the label was
wrong, since two branches can each carry an unrelated commit while my copy is
still newest. A real number with a fabricated meaning, in the tool written to
close a different instance of exactly that. Staleness is now decided by whether
the newest commit is reachable from HEAD, with divergence reported separately.

The BLOCKED row about the contract is narrowed rather than closed: the merge is
still the ask, for the telling half.

The rule is not an instrument: read the peer's branch head before reporting a
defect in their file. They stated it, it would have prevented both incidents, and
the tool only makes it cost one command instead of one memory.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
2026-08-31 02:28:41 +00:00

161 lines
8.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Run every check this port has, and say which ones assert.
#
# tools/port/check-all
#
# There are fourteen tools under `tools/port/` (eleven when this was written --
# the count is stated because it dates the sentence) and nothing ran them
# together, so
# each had to be remembered individually. That is the ninth instance of this
# port's recurring shape -- something correct, documented and unexercised -- one
# level up: the checks themselves were the thing nobody was running.
#
# ⚠️ It runs the tools that ASSERT. The exploratory ones -- `screen-strip`,
# `which-focus`, `strip-padding`, `verify-dwell`, `check-capture`,
# `verify-video-audio` -- produce artifacts for a person to look at and have no
# verdict to collect. Listing them here as passes would be inventing six.
set -euo pipefail
cd "${PROJECT_DIR:-/work}"
export DISPLAY="${DISPLAY:-:97}"
OUT="${OUT:-${TMPDIR:-/tmp}/check-all}"; mkdir -p "$OUT"
BIN="${CARGO_TARGET_DIR:-/sylph-home/port/target-container}/debug/sylpheed-export"
fail=0
step() { # name, expectation, command...
local name="$1" expect="$2"; shift 2
local log="$OUT/${name}.log" rc=0
"$@" >"$log" 2>&1 || rc=$?
case "$expect" in
must-pass)
[ $rc -eq 0 ] && printf ' %-24s ok\n' "$name" \
|| { printf ' %-24s 🔴 FAILED (rc=%d) -- %s\n' "$name" "$rc" "$log"; fail=1; }
;;
report-only)
printf ' %-24s ran (no verdict -- see below)\n' "$name"
;;
esac
}
echo "asserting checks:"
step format-validator must-pass "$BIN" check
# The contract lives on a branch this checkout does not merge: HANDOFF on `main`
# is frozen at 926 lines while the live one is 4 111. Reading 70 unread sections
# by hand is how two days of deliveries went unread. These are the values that
# have been reduced to a check; the rest are still read by eye, or not at all.
step contract-values must-pass tools/port/contract-check
step contract-control must-pass tools/port/contract-check --control
# 🔴 The control harness itself is asserted. Every --control run says "each check
# fails on a perturbed contract"; none of them said "a broken control reports
# broken". A harness that silently approves a dead check is exactly as useless as
# a check that silently approves a dead value.
step control-harness must-pass tools/port/contract-check --selftest
step modding-rules must-pass tools/port/check-modding
# Every `kind` in authored/ is a claim about where a value came from, and until
# 2026-08-30 nothing checked what any of them rested on -- seven were resting on
# a sibling `why` that argued a different claim.
step authored-kinds must-pass tools/port/audit-kinds
# The classifier is asked whether it can tell grounded from ungrounded at all,
# rather than only what it found. Exit 2 = the harness is broken.
step kinds-harness must-pass tools/port/audit-kinds --selftest
# Band levels are alignment-free and carry their own known negative on every run;
# the difference-signal half of the same tool stays report-only and asserts
# nothing. See docs/port/DECISIONS.md -- the waveform question is still open.
step transcode-bands must-pass tools/port/verify-transcode-fidelity
# Asks whether the band measurement is LIVE, not just what it found. An empty
# band list makes every comparison read 0.0 dB and pass; that now exits 2.
step bands-harness must-pass tools/port/verify-transcode-fidelity --selftest
step capture-controls must-pass tools/port/check-capture-controls
step menu-audio must-pass env OUT="$OUT/audio" tools/port/verify-menu-audio
# A stale index is worse than none: it answers "is this already decided?" with a
# confident no. That is not hypothetical -- see the entry it was built after.
step decisions-index must-pass tools/port/index-decisions --check
# A refuted claim asserted outside its correction is a lie the corpus tells a
# reader who greps for it. Registered claims must carry an explicit `[refuted]`.
# 🔴 The register check had NO executable control until 2026-08-31 -- every
# "planted a revival and it failed" in DECISIONS was done by hand, once. Four
# cases now drive it as a subprocess and read its real exit code, including an
# EMPTY REGISTER, which used to report clean forever.
step claims-control must-pass tools/port/check-claims --control
step refuted-claims must-pass tools/port/check-claims
echo
echo "reported, not asserted:"
# Not an assertion: being behind a peer's topic branch is the normal state, and a
# red line for it would be scenery within a day. It is here so the affordance is
# visible on every run -- reading a peer's head needs no merge and no human.
step peer-heads report-only tools/port/peer-head
step oracle-captures report-only env OUT="$OUT/oracle" tools/port/verify-capture
sed -n '/^screen /,$p' "$OUT/oracle-captures.log" | sed 's/^/ /'
# 🔴 `verify-capture` prints and always exits 0. Its own header is right that the
# numbers are not a target -- the captures carry the game's tone ramp, so RMSE has
# a floor and driving it lower is fitting the ramp. But "not a target" is not the
# same as "not a regression detector", and nothing here would notice `title_plate`
# moving off 0.00 %. Asserting it needs a stored baseline per row, which is a real
# design decision about what a baseline means when the pose is fitted. NAMED, not
# quietly skipped.
echo
echo "consistency (expected to differ, for a stated reason):"
rc=0; env OUT="$OUT/screens" tools/port/verify-screen >"$OUT/verify-screen.log" 2>&1 || rc=$?
differs=$(grep -c DIFFERS "$OUT/verify-screen.log" || true)
unexpected=$(grep DIFFERS "$OUT/verify-screen.log" | awk '{print $1}' \
| grep -vx -e title -e title_jp || true)
# 🔴 THE OLD ALLOWANCE WAS FALSE, AND MY FIRST REPLACEMENT REASON WAS ALSO
# WRONG. Both are recorded because the second error is the more instructive.
#
# It said: "the pin is not on main, so this compares two decoder eras". I
# replaced that with "the eras render identically -- 0 pixels different on three
# screens". 🔴 **That measurement was void**: the two binaries I compared had the
# same md5. I built one in a worktree at the pinned tag and one from the
# workspace, and both commits carry the record-layout fix, so I compared a
# binary with itself and reported the zero as evidence.
#
# Rebuilt properly against `origin/main`, which is the genuinely stale era
# (`rest t=70 [12 70 80 -]` against the fixed `rest t=12 [0 12 70 80]`):
#
# title 0 px main_menu 0 px title_jp 74 507 px
#
# ✅ The eras DO change pixels, and `title_jp` is one of the seven bundles where
# they do -- reproducing the Decoder's figure exactly, under their flags and
# mine. My "--animated masks it" hypothesis was wrong too.
#
# ✅ BUT THE ERA STILL CANNOT EXPLAIN THIS SCRIPT'S ROWS, for a reason I had not
# established: BOTH SIDES OF THIS COMPARISON ARE THE FIXED ERA. The exporter is
# pinned to `formats-pin-2026-08-30` and this reference is built from the
# workspace, and a binary built from each has the SAME md5. There is no era
# mismatch here to explain anything. Right answer, wrong evidence, and the wrong
# evidence was a broken experiment.
#
# The real reasons are per-screen and already documented:
# title -- the ptloop SWEEP PHASE residual, max 6 / over3 790, unchanged
# across every renderer change since P1 (DECISIONS.md).
# title_jp -- the `--pose=rest` sparkle handling. Adjudicated against the
# oracle: the port's SHIPPED pose scores r +0.9994 against the
# game where the reference scores +0.8727, and `--pose=rest` is
# what this script compares.
# ⚠️ title_jp is ALSO an era-sensitive bundle, so if this reference is ever
# built from a different era than the exporter's pin, that row's cause changes
# and this note stops applying. Check the md5s before trusting it again.
#
# So the allowance is now a NAMED SET, not a count with an excuse. A DIFFERS on
# any other screen fails the run, which a count never could.
if [ -n "$unexpected" ]; then
printf ' %-24s 🔴 DIFFERS on %s -- not in the allowed set\n' verify-screen "$(echo $unexpected | tr '\n' ' ')"
fail=1
else
printf ' %-24s %d DIFFERS, both named and explained per screen:\n' verify-screen "$differs"
printf ' %-24s title = sweep phase; title_jp = rest-pose sparkles (the port is\n' ""
printf ' %-24s closer to the GAME there than the reference is).\n' ""
fi
# Separately, and unrelated to the rows above: revert to the path dependency when
# the pin lands. Read from Cargo.toml so it cannot drift out of step again.
pin=$(sed -n 's/.*tag = "\([^"]*\)".*/\1/p' crates/sylpheed-export/Cargo.toml | head -1)
if [ -n "$pin" ] && git merge-base --is-ancestor "$pin" origin/main 2>/dev/null; then
printf ' %-24s ⚠️ %s has landed on main -- revert Cargo.toml to the path dep\n' pin "$pin"
fi
echo
[ $fail -eq 0 ] && echo "every asserting check passes" || echo "🔴 a check failed"
exit $fail