port: check-all excused two failing rows with a measurably false reason

The suite reported '2 DIFFERS, allowed: the pin is not on main, so this compares
two decoder eras', and I had quoted that for several iterations without testing
it. Built sylpheed-cli at formats-pin-2026-08-30 and at workspace HEAD and
rendered through both: title, title_jp and main_menu come out 0 pixels different,
despite 508 lines of difference in ui_layout.rs. The eras are not the cause, and
the allowance was excusing a real signal with a wrong explanation.

A second defect in the same eight lines: the expiry tested formats-pin-2026-08-29d
while Cargo.toml pins formats-pin-2026-08-30, so it would have expired on a tag
this tree does not use.

The real reasons are per-screen and already documented: title is the ptloop sweep
phase residual, title_jp is the --pose=rest sparkle handling -- where the port's
shipped pose scores +0.9994 against the game to the reference's +0.8727, so the
port is closer to the game on the row the script calls a disagreement.

Replaced with a named set: title and title_jp by name, any other DIFFERS fails.
A count cannot notice a different screen drifting while the total stays at two.
Controlled both directions -- passes on the known pair, fails on main_menu or
extras. The pin reminder now reads the tag out of Cargo.toml so it cannot drift.

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 14:15:56 +00:00
parent 1facce5ddd
commit ed14722996
2 changed files with 100 additions and 12 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 -->
163 sections. Search this before re-deriving anything.
164 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)
@@ -174,6 +174,7 @@ dies, which is what this file is for.
* [🔴 CORRECTION: my 18-vs-19 "agreement" compared two different intervals](#correction-my-18-vs-19-agreement-compared-two-different-intervals)
* [`check-all` passes — after an hour-long hang that was the suite's own fault](#check-all-passes--after-an-hour-long-hang-that-was-the-suites-own-fault)
* [Ⓐ and Ⓑ are not the same shape, and my `black_hold` treats them as if they were](#and--are-not-the-same-shape-and-my-black_hold-treats-them-as-if-they-were)
* [🔴 `check-all` excused two failing rows with a reason that is measurably false](#check-all-excused-two-failing-rows-with-a-reason-that-is-measurably-false)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -9406,3 +9407,61 @@ bad constant to build on.
📌 So the finding is recorded and the divergence is **known and stated** rather
than fixed: the port's transitions are uniform, the game's are directional, and I
do not yet have enough transitions measured to say what the rule is.
## 🔴 `check-all` excused two failing rows with a reason that is measurably false
The suite reported *"2 DIFFERS, allowed: the pin is not on main, so this compares
two decoder eras."* I have quoted that allowance for several iterations without
testing it.
**Tested.** Built `sylpheed-cli` at `formats-pin-2026-08-30` — the tag the
exporter is pinned to — and at the workspace HEAD, and rendered the same builds
through both:
| screen | pixels differing between the two eras |
|---|---|
| `title` | **0** |
| `title_jp` | **0** |
| `main_menu` | **0** |
✅ **Byte-identical**, despite **508 lines** of difference in `ui_layout.rs`
between the two revisions. The decoder eras are not the cause of anything here,
and the allowance was excusing a real signal with a wrong explanation — the worst
form, because it makes a genuine disagreement look accounted for.
🔴 **A second, independent defect in the same eight lines.** The allowance's expiry
tested `formats-pin-2026-08-29d` while `crates/sylpheed-export/Cargo.toml` pins
`formats-pin-2026-08-30`. So it would have expired on a tag this tree does not
use — silently, in either direction.
### What the rows actually are, both already documented elsewhere
* **`title`** — the `ptloop` **sweep phase** residual: max 6 / over3 790,
unchanged across every renderer change since P1.
* **`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.
**The port is closer to the game on the row the script calls a disagreement.**
### The replacement is a named set, not a count with an excuse
A count can only say *how many*; it cannot notice that a **different** screen
started drifting while the total stayed at two. The allowance now lists `title`
and `title_jp` by name, and a `DIFFERS` on anything else fails the run.
✅ Controlled in both directions, because a guard that cannot fail is not a guard:
| log | verdict |
|---|---|
| `title`, `title_jp` | passes |
| `title`, **`main_menu`** | **fails on `main_menu`** |
| **`extras`** alone | **fails on `extras`** |
| clean | passes |
The pin reminder survives as its own line, and now reads the tag **out of
`Cargo.toml`** so it cannot drift out of step with the dependency again.
📌 The pattern, and it is the third time this session: **an allowance is a claim.**
This one had been true once — the monorepo merge made the exporter and the
reference share a decoder, and the tag pin quietly unmade that — and it kept being
printed long after it stopped describing the tree.