Uh oh!
There was an error while loading. Please reload this page.
fix(ci): coverage workflow globbed a flat tests/unit that no longer exists - #980
Merged
Merged
Conversation
…xists The nightly coverage run has failed every night since 2026-08-02. Its file list came from `ls tests/unit/*_test.sh`, and #960 moved every unit test into a per-module subdirectory, so the glob matched nothing, `ls` exited non-zero and the step died under `bash -e`. Nobody noticed because this workflow is deliberately non-blocking: it never runs on push or pull_request, so a red nightly is not a status check on anything. There were two stale paths, and the second is the one that mattered. The exclusion `grep -v '/coverage_'` was written for flat filenames; the coverage engine's meta-tests are now tests/unit/coverage/. Fixing only the glob would have restored the run while silently pulling those meta-tests back in -- and the workflow's own comment explains why they are excluded: measuring them under --coverage double-instruments src/coverage/ and corrupts their assertions. Both are now one `find` with explicit exclusions for coverage/ and fixtures/. That also picks up two files a two-level glob would still have missed. 65 files selected, from 76 total minus 9 meta-tests and 2 fixtures; smoke-tested against a real --coverage run that writes lcov. The contract test is the point of this change. It existed already and did not catch this, because it only looked at tests.yml -- #972 fixed the instance and I did not go looking for the class. It now checks every workflow, for any shape: a tests/ path or glob a workflow names must resolve to something. Mutation- tested against both files. Two bugs in that test worth recording. It documented stripping comments and did not, so the broken globs the workflows describe in prose read as live references. And an unanchored `tests/` matched the tail of `sample_tests/pass_test.sh`, a file test-action.yml writes at runtime, reporting it missing. Both fixed; the match is anchored on a boundary now.
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
🤔 Background
The nightly coverage run has failed every night since 2026-08-02.
Its file list came from
ls tests/unit/*_test.sh, and #960 moved every unit test into a per-module subdirectory. The glob matched nothing,lsexited non-zero, the step died underbash -e. Nobody noticed because this workflow is deliberately non-blocking — it never runs on push or pull_request, so a red nightly isn't a status check on anything.🐛 Two stale paths — the second is the one that mattered
The exclusion
grep -v '/coverage_'was written for flat filenames; the coverage engine's meta-tests are nowtests/unit/coverage/. Fixing only the glob would have restored the run while silently pulling those meta-tests back in — and the workflow's own comment explains why they're excluded: measuring them under--coveragedouble-instrumentssrc/coverage/and corrupts their assertions.Both are now one
findwith explicit exclusions forcoverage/andfixtures/. That also picks up two files a two-level glob would still have missed.65 files selected — 76 total, minus 9 meta-tests, minus 2 fixtures. Smoke-tested against a real
--coveragerun that writes lcov.🧪 The contract test is the point
It existed already and didn't catch this, because it only looked at
tests.yml. #972 fixed the instance; I didn't go looking for the class. It now checks every workflow, for any shape: atests/path or glob a workflow names must resolve to something. Mutation-tested against both files.Two bugs in that test, worth recording:
tests/matched the tail ofsample_tests/pass_test.sh— a filetest-action.ymlwrites at runtime — and reported it missing✅ Verification
make sa·make lint·bash build.sh bin -v→✅ Build verified ✅· 1658 sequential / 1617 parallel-simple-strict.