ci: harden 3 bare set -o pipefail oracle steps (found by L2) - #900
Merged
Conversation
Found by v0.54 lane L2, which hit the same class in its OWN new gate and then checked whether the existing ones shared it. They do. One of the three is my own v0.53 wiring for the #881 VFP spill oracle, so this is coordinator debt. `set -o pipefail` alone propagates a pipeline's failure into the pipeline's exit status -- but WITHOUT `-e` the shell does not abort, so the step's status is its LAST command's. These steps end in a marker grep, which makes them narrower than L2's original bug (a failing oracle usually fails the grep too), but the hole is real: a script that prints its summary marker and THEN fails still greens the step. Demonstrated rather than asserted: OLD: set -o pipefail bash -c 'echo "^#846 CHECKS=75/75"; exit 1' | tee out grep -q "CHECKS=75/75" out -> exit 0 (oracle FAILED, step GREEN) NEW: set -euo pipefail (same body) -> exit 1 (caught) Affected: gpio-thin #846/#879, VFP spill #881, VCR-DEC-001 join #242 -- all three added during the v0.52/v0.53 push to CI-wire shelfware oracles, i.e. the hardening pass itself shipped a softer gate than it advertised. Also stop relying on GitHub Actions' default `bash -e` implicitly; be explicit. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
avrabe
added a commit
that referenced
this pull request
Jul 30, 2026
…NGELOG after rebase Two fixes on top of the rebase onto main (which now carries L4 #896 and the bare-pipefail hardening #900). 1. **wat2wasm was missing.** Both failing sweeps died with `FileNotFoundError: 'wat2wasm'`. That is the gate DOING ITS JOB: these 63 oracles had never run in CI, so their host dependencies had never been discovered — exactly the class that made the #881 VFP oracle fail on the runner while passing locally (#850). Several fixtures build their .wasm from .wat at test time. wabt installed in all four sweep jobs. 2. **Restored this lane's CHANGELOG entries.** My conflict resolution kept the `# ci-status:` header lines plus main's side, which is correct for the repro scripts and WRONG for an additive CHANGELOG — it silently dropped all four of the lane's bullets. Recovered verbatim from the pre-rebase branch and merged with the existing entry. Caught by counting bullets after the rebase rather than trusting that a clean `rebase --continue` meant a clean result. Rebase conflict in vcr_dec_001_join_alloc_execution_differential.py resolved keeping BOTH sides: L4's updated "increments 2+3" docstring and this lane's ci-status header. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Found by v0.54 lane L2, which hit this class in its own new gate and then checked whether the existing steps shared it. They do. One of the three is my own v0.53 wiring for the #881 VFP spill oracle — coordinator debt, not a lane's.
set -o pipefailalone propagates a pipeline failure into the pipeline's status — but without-ethe shell does not abort, so the step's status is its LAST command's. These three end in a marker grep, which makes them narrower than L2's original bug (a failing oracle usually fails the grep too), but the hole is real: a script that prints its summary marker and then fails still greens the step.Demonstrated, not asserted:
Affected: gpio-thin (#846/#879), VFP spill (#881), VCR-DEC-001 join (#242) — all three added during the v0.52/v0.53 push to CI-wire shelfware oracles. The hardening pass itself shipped a softer gate than it advertised, which is the recurring shape of this release: the checker, not the checked, is the defect.
Refs #890.