CI's shellcheck sweep never lints .github/scripts/*.sh — globstar does not descend into dot-directories #116
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#116
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found during the 0.8.0 release drill. CI's shellcheck sweep does not lint
.github/scripts/*.sh— which is where the release machinery lives, including the guard #110 just shipped.The gap
.github/workflows/ci.yml:18-21:globstarmakes**descend into subdirectories, but globs still do not match dot-prefixed names withoutdotglob..githubis dot-prefixed, so**/never descends into it.Measured on
main:Why it matters more than the count suggests
The three unlinted files are not incidental — they are the release path:
changelog-armed.shis the guard #108/#110 added to stop a release disarming the changelog. It is brand new, it gates every PR, and it has never been linted.release-notes.shproduces the published release body.release.ymlruns it at :128 and :208.labels-reconcile.shdrives the label state machine.The step's own comment states the intent this defeats:
That is exactly the promise being broken: a script added under
.github/scripts/is silently unlinted, and the comment tells the next author it is covered.Current state: latent, not broken
All three pass today:
So this is not a live breakage — it is that nothing would catch a regression in them. Worth stating plainly rather than overselling.
Suggested fix
Add
dotglobalongsideglobstar:Careful:
dotglobalso makesbin/*and**/*.shmatch other dot-prefixed paths, so check what else it pulls in (a.gitdirectory is not an issue since it holds no.sh, but confirm rather than assume). An explicit.github/scripts/*.shentry is the alternative — less elegant, and it reintroduces exactly the "remember to edit this list" problem the comment was written to avoid.Whichever way, worth asserting the count so the gap cannot reopen silently: compare the globbed set against
git ls-files '*.sh'and fail if any tracked script is unlinted. That is the same shape as theeof_guard_sweepin #112 — a class check rather than a one-time fix.Siblings have it too
Same defect, same cause, and in each case it is the release-critical script that escapes:
heavy-duty/rig— misses.github/scripts/release-lib.sh(which holdschangelog_section, the extractionrelease.ymlpublishes from) andlabels-reconcile.shheavy-duty/cast— misses.github/scripts/release-notes.shandlabels-reconcile.shFiled separately in each so the record lives where the fix goes.
Refs
Found during the
release: 0.8.0drill (#114). Related: #110 (addedchangelog-armed.sh), #112 (theeof_guard_sweepclass-check precedent).