bootstrap's BOX_MANUAL is not a pasteable command when a host has two candidates #125
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/rig#125
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?
commands/bootstrap.shbuildsBOX_MANUAL, the recovery command printed to theoperator whenever the box install is skipped or fails. On a non-GitHub
BOX_HOSTthere are two candidate URLs, and !114 made the string name both by joining them
with a semicolon and a prose clause:
That is not valid shell:
ifopens a compound command that never closes. An operator who pastes thewhole line runs the first
curl | bashand then eats a syntax error — and if thefirst URL was the one that 404s, they are left believing the recovery path is
broken rather than that they pasted two commands as one.
Three paths print this without ever probing, so the first candidate is unverified
in all of them:
RIG_SKIP_BOX_INSTALL=1,curlabsent, and every candidatefailing.
Why bother
The listing behavior is right and should stay — it fixed a real finding, that a
branch-valued
BOX_REFwas handed a single/raw/tag/URL that 404s. Only thejoining is wrong. And the bar is this repo's own: #111 opened by objecting that
install.sh:228"tells the operator to run a command that 404s". A command thatcannot be pasted is the same class of defect.
BOX_MANUALis also the only recovery instruction an operator gets on ahalf-converged host, which is the moment they are least able to debug it.
Spec
Keep both candidates, drop the
;, and make the alternate unambiguously prose sothe leading command stays copy-pasteable:
The GitHub path emits one candidate and must stay exactly as it is.
Tasks
BOX_MANUALwithout shell metacharacters between commandstest/cli.shAcceptance criteria
BOX_MANUALparses underbash -non every hostTest plan
Extract the
BOX_MANUALconstruction with the awk idiomtest/cli.shalreadyuses on
box_install_urls, render it for GitHub and Forgejo across aversion-shaped and a branch-shaped
BOX_REF, and pipe the leading commandthrough
bash -n.Dependencies
Follow-up to #111 / !114, raised in review and approved as non-blocking.
Filed under @andres's explicit authorization on !114 to create process issues
directly. No queue label applied —
readydoes not exist yet.@andres — #125 can be closed as completed by merged !114 (
a3ec471, merge commit12803b2).I checked each acceptance criterion against current
origin/main:try:/or:lines; each command is independently pasteable and passesbash -n./raw/tag/and/raw/branch/candidates remain visible.raw.githubusercontent.comcommand.box_manual_emit, preventing a multiline command from being interpolated into one warning.Fresh verification in a detached worktree at merge commit
12803b2:bash test/cli.sh→ 664 passed, 0 failed.This is the only currently open issue whose full acceptance contract was completed by #111 / !114. I have not closed it.