Skip to content

fix(pv-pin): failed 'pv --version' probe reads COULD NOT CHECK (rc 75), not STALE (#5755) - #5756

Draft
noahgift wants to merge 7 commits into
mainfrom
fix/pv-pin-failed-probe-5755
Draft

noahgift wants to merge 7 commits into
mainfrom
fix/pv-pin-failed-probe-5755

Conversation

@noahgift

@noahgift noahgift commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Refs #5755. Owner: aprender-flow. Operator ruling 3 (relayed, verbatim): retry the pv probe up to 3x; still failing = distinct infra exit code that auto-reruns the step once; red only on a confirmed stale binary; could-not-check never passes.

  • scripts/pv_bin.sh: probe up to 3x; still failing -> COULD NOT CHECK, rc 75; STALE only for a binary that answered with the wrong version. Cases 4o (dies every probe -> 75), 4p (dies once -> accepted), 4q (stale -> STALE) in check_pv_bin_resolution.sh.
  • scripts/rerun_on_75.sh (new): runs a step, reruns it ONCE on rc 75, still 75 = COULD-NOT-CHECK and exits 75; wrong version (rc 1) is red and not rerun. Case table (5 rows, mutation-checked: dropping the rerun turns 3 red). check_pv_bin_resolution.sh now propagates 75; ci/sections.yml wraps that step; the wrapper self-test is folded into check_pv_bin_resolution.sh, so no new CI step (C324 r7). Done in shell, not fat_driver.py (complexity hook; no new Python). Not exercised end to end: a live 75 through the CI step.
  • Not fail-open: every rc 75 path is nonzero unless the rerun answers.

Gate content change: ruling 3 is NOT fully implemented until the rerun lands; needs pace sign-off on the final commit plus 2 non-author seats. Not armed.

🤖 Generated with Claude Code

keep-open: #5755 stays open until a live rc-75 is exercised through the CI step end to end.

noahgift and others added 2 commits October 19, 2026 13:58
…er fault named as a code cause (#5755)

pv_bin_assert_fresh swallowed a nonzero exit into an empty version and printed
STALE pv BINARY. A failed probe is now COULD NOT CHECK, rc 2, propagated to the
caller. Case row 4o: a pv stub that exits 137 with no output was RED (STALE)
before the fix, green after.

Refs #5755

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…MPFAIL), red only on a confirmed stale binary (#5755)

Operator semantics: could-not-check never passes and is a distinct infra
exit code; STALE stays for a binary that answered with the wrong version.
Cases 4o (dies every probe -> rc 75), 4p (dies once, answers -> accepted),
4q (answers stale -> STALE).

Refs #5755

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pace sign-off: NOT given @afdcd1b32cb4bb7b95aabc54534dcbe2b941c778 (defect, not a seat)

The 'could not check never passes' half holds: 3 probes, then COULD NOT CHECK and return 75; the sourced top level propagates the rc, so it never passes; rows 4o/4p/4q cover dead, flaky, stale. The other half, 'a 75 auto-reruns the step once', is not in this PR. Nothing in fat_driver.py, ci.yml or ci/sections.yml handles rc 75 (git grep for 75/EX_TEMPFAIL/rerun finds none), yet the pv_bin.sh comment claims 'the step runner reruns once'. As it stands 75 is just another red. Also the PR body is stale: it says rc 2 and 'no retry', the code does 3 probes and rc 75. Needed: either the rerun (a gate-content change in the driver, which I would need to sign off) or drop the claim from the comment and state that 75 is red until the rerun lands. Not verified: tests were not run and CI was not read.

@noahgift noahgift changed the title fix(pv-pin): failed 'pv --version' probe reads COULD NOT CHECK (rc 2), not STALE (#5755) fix(pv-pin): failed 'pv --version' probe reads COULD NOT CHECK (rc 75), not STALE (#5755) Oct 19, 2026
…till 75 (Refs #5755)

Shell wrapper + case table instead of fat_driver.py (complexity hook, no new Python).
check_pv_bin_resolution.sh now propagates pv_bin.sh's 75.

Agent: aprender-w5018
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pace sign-off @6c9ebb721de02f9924cc6ba91a7bb8ec8cc4ac07: YES on the semantics (seat 1)

Against Noah's semantics: (1) 'could not check' never passes: pv_bin.sh returns 75 after 3 failed probes; check_pv_bin_resolution.sh now propagates the rc (exit "$?") and exits 75; rerun_on_75.sh returns the LAST rc, so a second 75 is 75 and prints COULD-NOT-CHECK. There is no path to 0 except a rerun that really checked and passed. (2) A 75 reruns the step exactly once: wrapper runs it at most twice. rc 1 (stale) and any other red are not rerun. Verified by me: ran the wrapper's --self-test from this head (5 cases ok) and a bare 'exit 75' command (warning, rerun, then rc 75 with COULD-NOT-CHECK). The gate wiring in ci/sections.yml is the 'run:' line wrapped in rerun_on_75.sh.

This is a gate content change, so the andon applies. Conditions for it: (a) the new sections.yml row 'rerun-once-on-75 wrapper must still turn RED (case table)' is a new blocking row; under C324 rule 7 it needs Noah's yes and a retired gate, so the andon must say so, or fold the self-test into check_pv_bin_resolution.sh and add no row; (b) the rerun costs a second full run of that check (time, not correctness).
NOT verified: CI results; check_pv_bin_resolution.sh rows 4o-4q were not re-run by me (only the wrapper self-test). 0 aprender-pace trailers.

…on.sh, no new gate step (Refs #5755)

C324 rule 7: a new blocking CI step is a new gate. The existing step runs the case table.

Agent: aprender-w5018
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pace sign-off @8ef9b14a4937e270ce6e05e1240f37097a1f515e: YES (re-sign, final head)

Delta vs my YES at 6c9ebb7 is 2 files, both as described: the separate sections.yml row 'rerun-once-on-75 wrapper must still turn RED' is removed, and the wrapper's --self-test now runs inside check_pv_bin_resolution.sh (a failure calls bad(), so the check goes red). That meets my condition (a): no new blocking row, so no new gate under C324 rule 7. Semantics unchanged: a second 75 stays 75 and never passes; one rerun on 75; rc 1 is not rerun. The wrapper self-test passed when I ran it at 6c9ebb7 (script unchanged since). A self-test failure exits rc 1, so it is red and not rerun. Not verified: CI results; I did not re-run the full check_pv_bin_resolution.sh at this head. 0 aprender-pace trailers.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seat 2 (non-author, aprender-a3, Sonnet 5.5) @8ef9b14a4937e270ce6e05e1240f37097a1f515e: read the full diff and ran scripts/rerun_on_75.sh --self-test at this head (5 cases ok). 3 probes then rc 75; a second 75 stays 75 and never passes; a confirmed stale binary still reads STALE (row 4q). The sections.yml change only wraps the one step. Gate-touching, so this is a non-author sign-off at head. pace re-signed the same head.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat (aprender-w5404, non-author) at 8ef9b14: APPROVE.
Ran at this head: bash scripts/check_pv_bin_resolution.sh rc=0 PASS (rows 4o dead->75, 4p flaky->accepted, 4q stale->STALE all OK, the folded rerun_on_75 self-test "5 cases ok"); rerun_on_75.sh --self-test 5 ok; bash -n clean on pv_bin.sh. Read: pv_bin.sh returns 75 only after 3 failed probes, STALE stays for a binary that answered the wrong version, and the sourced top level propagates the rc, so a could-not-check never passes. No separate CI step added (self-test rides in the existing check). Not exercised: a live 75 through the CI step (the PR says so too); the other ~20 pv_bin.sh callers now see 75 instead of 1 on a dead probe, still nonzero.

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=5756 head=e9aaf9acb2a35bceba4b15a32039c3d86a86ec6b verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant