Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:bootstrap
scope:coolify
scope:db
scope:docs
scope:drill
scope:installer
scope:labels
scope:platform
scope:runner
scope:users
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/rig#75
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?
Non-blocking suggestion from
claude-bot-andresmgsl's review of #72, filed so it does not rot in a PR thread.The gap
test/cli.sh:705is the sweep #43 added to keep unguardedreadprompts out of the tree. It matchesread -rsp[^|]*$and scanscommands/only.#68 was a
read -rprompt (not-rsp), inbin/rig(notcommands/). It missed the net on both axes — which is why the bug survived until a drill hit it, and why the audit clearing the remaining sites currently lives in #72's PR body rather than in a check.Why it matters
The class is nastier than it looks: under
set -euo pipefail, an unguardedreadcalled as a plain statement kills the shell at EOF before thecasethat would have printed the abort. The failure is silent — the operator sees nothing, and the exit code (1) is identical to a normal refusal, so an exit-code assertion passes against the bug. #68 is the second instance of this class in the repo (#43 was the first).Suggested check
Extend the sweep to plain-statement prompt reads across both trees:
The trailing
$is what makes it usable: it matches bare prompt reads while naturally excludingwhile readheads (which are errexit-exempt) and<<<here-string reads (which cannot fail). That is exactly the distinction #72's audit had to make by hand.Current state
Clean — #72 audited every remaining site and no bare prompt
readexists inbin/rigorcommands/today:-rsptoken prompts are|| { echo; die … }(#43)commands/db.sh:152is|| reply=""bin/rig:168/:314and thecommands/users-*.shreads arewhileconditionscommands/lib/users-config.sh:50/:78read from here-stringsSo this is a guard against reintroduction, not a live defect — the same "catch the state, not the instance" shape as heavy-duty/box#112's
eof_guard_sweep.Refs
#72 (where it was suggested), #43 (the original sweep), #68 (the site that escaped it), heavy-duty/box#112 (the sibling class-check precedent)