No reviewers
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#28
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/host-installs-box"
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?
What
When
rig bootstrapconverges a VM-host machine (traithost=yes— rolesdev,staging,workstation, andcustom --host yes), it now installs theboxCLI globally and runs box's ownsetup-hostautomatically, instead of printingnext: install the box CLI and run 'box setup-host'. The documented to-do becomes a real, convergent step.Completes #12 (the
devrole — the Incus claudebox host) and #25 (machine classes: the host class installs box + rig users).How — rig delegates to box, never touches Incus
This upholds the design law
rig users applyalready enforces: "rig NEVER installs Incus: box's setup-host owns the daemon and its group." rig does notapt-get install incus, does not configure the daemon, does not create theincusgroup. After the role marker is written, onhost=yesit runs box's own global installer as root:BOX_YES=1makes box non-interactive and keepssetup-host(so the Incus stack is built, not just the CLI dropped on PATH). box installs Incus; rig delegates. Two tools converging one daemon is drift by construction.RIG_SKIP_BOX_INSTALL=1skips; also skips gracefully with a manual-command pointer when curl or the network is missing. box is the host extra, so a failed box install never aborts a bootstrap whose OS + tailnet core already succeeded.BOX_REPO/BOX_REF(defaultheavy-duty/box@main).rig#12's hard constraints hold: the host joins the tailnet (guests never do — box doesn't join, fine); no credentials on the host (box is creds-free, fine).
⚠️ Depends on box #71 (delivered by heavy-duty/box#73)
The world-readable global install path — box under
/opt/boxwith a/usr/local/binshim readable by every non-root user — is delivered by heavy-duty/box#73 (issue box#71). Until that merges, box's root install lands in/rootand non-root users (thedevbox's human; anybox-role rig user) can't reach it. This rig step is correct as written and convergent today; the effective multi-user outcome is gated on box#73, and no rig code changes when it lands. Called out inline inbootstrap.shand in the plan doc.Testing
bash test/cli.sh→ 154 passed, 0 failed. 8 new checks: guard onhost=yes,BOX_YES=1install, pin default,RIG_SKIP_BOX_INSTALLopt-out, a negative-grep that rig neverapt-get install … incus, box-after-marker ordering, and a manual-pointer-on-skip.shellcheck -x bin/* **/*.sh→ clean.docs/plans/2026-07-17-host-installs-box.mdfor the rehearsal that asserts effective state —incus info, andbox templates/incus listas a fresh incus-group (non-root) user, which is box#73's acceptance line.🤖 Generated with Claude Code