docs(register): C-345 — verification tooling reported a green suite that was red - #433
Conversation
… member of it Tier 2. Twice in one session a failing suite was reported as passing. uv run pytest -q | tail -2; echo "EXIT=$?" A pipeline's exit status is its LAST element's, so tail returned 0 while pytest had exited 1. Then a backgrounded run's task notification said "exit code 0" for the same reason — the command ended in an echo. The second was caught only by reading the output file, after the user had already been told the suite was running and would be folded in. One step from reporting green on red. Registered rather than remembered because this project has two recorded false-readiness incidents that each cost a full day; because the suite is the gate on every story in this epic; and because C-343 means a defect that slips through can sit in production for two months. C-339 is the precedent for registering a workflow hazard rather than a code one. The shape is the cluster's own, which is the uncomfortable part. C-330 was a nightly no-op exiting 0. C-337 was a lockfile frozen with no error. C-343 was a deploy that deployed nothing. This is the same defect in the instrument used to find all three. Mitigation adopted and explicitly NOT a control: redirect to a file, capture $? unpiped, grep ^FAILED as a second independent reader. A habit is not machinery. The instrument — refusing to report a result not obtained unpiped — is proposed for #424. Also carries the changelog note on what was NOT registered: the unbounded poll loop (one-line fix, no consequence) and the group-writable dotfiles (group has no other members, already inside C-344 as a killed hypothesis). The guard-narrower-than-the-property pattern went to C-336 as a second addendum during #432. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
/code-review medium fact-checked the entry against the repository rather than against memory, and found two claims that do not survive it. 1. "up to two months in production", attributed to C-343. C-343 says ONE month and never derives the larger figure — the two-month version requires an unstated compounding worst case. Present in TWO places: C-345, and inside C-331 where it had already shipped in #432. Both corrected, in the register and the changelog, with a visible correction note rather than a silent edit. 2. "two recorded false-readiness incidents that each cost a full day." A grep of the register, the changelog and every post-mortem returns only the sentence making the claim. The incidents are real and known to the operator, but THIS REPOSITORY RECORDS NEITHER. Citing evidence a reader cannot find is how a register stops being checkable, which is C-336's subject. Removed rather than softened, and the fact that they went unrecorded is now flagged for the next post-mortem. C-345's tier now rests on the one basis that is verifiable in the repo: it fired twice in one session. That is stated as deliberately the only evidence cited. Also from the review, verified and left alone: the shell claim is exactly right (pipefail changes it, the mitigation works), the header arithmetic is correct and guarded, the cluster section's counts match its eleven rows and nine open members, and every cross-reference points at an entry in the state implied. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ritual complete —
|
Part of #421.
/register-riskoutput from Story 2's close-out — not a story, a finding about how the stories are being verified.What happened, twice
A pipeline's exit status is that of its last element.
tailsucceeds regardless, so the status reported wastail's. Then a backgrounded run's harness task-notification reported "exit code 0" for the same reason — that command ended in anecho.The second was caught only by reading the output file instead of the notification. By then the user had already been told the suite was running and would be folded in. One step from reporting a green suite that was red.
Why Tier 2, stated rather than assumed
Not Tier 3 — this is not a maintainability cost. The suite is the gate on every story in this epic; a false green means a defect merges, and per C-343 it can then sit in production for up to two months. Not Tier 1 — nothing was corrupted and no model output was wrong; the failure is in knowing whether the work is sound.
The trigger is not hypothetical: it fired twice in one session, and this project has two recorded false-readiness incidents that each cost a full day.
The shape is the cluster's own
An epic about mechanisms that report success while doing nothing spent a week using one. Cluster is now nine open of eleven rows.
Mitigation, and why it is not enough
Unpiped
$?, plus a second independent reader. Adopted mid-session and used for every check since — including this PR's. But a habit is not a control: nothing prevents the next pipeline masking a status the same way. The instrument would refuse to report a result it did not obtain unpiped. Proposed for #424, which now carries three:uv lock --check(C-342), the tag-vs-HEAD pre-flight (C-343), and this.Not registered, and why
until … sleep 30poll that died on a transient DNS failure — one-line fix (bound the loop), no consequence, below the register's bar..local/.config/.cacheand.zshrcon the host — checked during C-344's sweep;getent group views-deployhas no other members. Already recorded inside C-344 as a killed hypothesis.test_heartbeat_secret.py) — merged into C-336 as a second addendum during fix: the heartbeat URL leaves the command line (C-331, #423) #432. Same mechanism, new location.Precedent check
C-339 registered an assistant-authored command that destroyed a production log. That is the precedent for tracking a workflow hazard here rather than treating it as something to remember.
Verification
ruff check .→ All checks passedpytest→ PYTEST_EXIT=0,FAILED count: 0— captured unpiped, two readers, per the entry's own mitigationdocs/validate_docs.sh→ PASSEDNote
#432 merged while this work was uncommitted on that branch — C-340 mechanism 2 exactly. Stashed, moved to a fresh branch off
development, and verified the entry survived intact rather than assuming it had. That is the concern #426 exists to automate.🤖 Generated with Claude Code