Skip to content

ci: harden 3 bare set -o pipefail oracle steps (found by L2) - #900

Merged
avrabe merged 1 commit into
mainfrom
fix/bare-pipefail-gate-holes
Jul 30, 2026
Merged

ci: harden 3 bare set -o pipefail oracle steps (found by L2)#900
avrabe merged 1 commit into
mainfrom
fix/bare-pipefail-gate-holes

Conversation

@avrabe

@avrabe avrabe commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

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 pipefail alone propagates a pipeline failure into the pipeline's status — but without -e the 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:

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. 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.

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

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe
avrabe merged commit bc1dc40 into main Jul 30, 2026
46 checks passed
@avrabe
avrabe deleted the fix/bare-pipefail-gate-holes branch July 30, 2026 14:45
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
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