No reviewers
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#73
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/multiuser-hosts"
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
Fixes the first half of the multi-user-host bug —
box: command not foundfor other operators — and gives box the CI + tests it never had. Folds in and supersedes #66 (its 5 commits are preserved, crediting @claude-bot-andresmgsl — please confirm before closing #66).Closes #71, #65; carries #66's #63/#64.
#71 — global install
Run as root, box installs once to
/opt/boxwith a/usr/local/binshim, world-readable (chmod -R a+rX, root-guarded) — so every operator hasboxon PATH. Per-user ($HOME/.local) install is byte-identical to before;BOX_HOME/BOX_BINstill override. This is the path rig installs box through (rig#24'sboxrole; companion rig PR #28).Verified on real hardware: as root,
install.sh+setup-hostbuilt the whole stack end-to-end (btrfs pool,boxnet,box-isolateACL,box-netprofile, nft box-to-box drop, firewall) on a fresh Debian 13 / Incus 6.0.4 host.#65 — tmux
box tmuxrunstmux new-sessioninside the box, but the templates didn't install tmux (tmux: command not found).tmuxis now in every template's cloud-init (blankneeded it; the others already had it).CI + tests (new — box had neither)
.github/workflows/ci.ymlmirrors rig's: onecheckjob = globstarshellcheck -xoverbin/* **/*.sh, thenbash test/cli.sh. The suite is dependency-free, non-root, no-Incus: the full CLI contract;install.sh's DEST/BINDIR branch driven functionally against a shimid(both tiers +BOX_HOME/BOX_BINoverrides); the root-onlya+rXand #66's confirm/no-op flow grep-guarded; tmux asserted in every template. Pre-existing repo shellcheck findings were resolved so CI is green over the whole tree.Testing
bash test/cli.sh→ 33 passed, 0 failed (non-root, no Incus).shellcheck -x bin/* **/*.sh→ clean.setup-hostexercised end-to-end on a real Incus 6.0.4 host.🤖 Generated with Claude Code
🔴 Task-0 rehearsal run — the substrate vetoes the #72 design
Ran the rehearsal on a real Debian 13 / Incus 6.0.4 host (nested KVM). Full write-up in the plan doc (
docs/plans/2026-07-17-multiuser-hosts.md, just pushed).Verified GOOD (mergeable):
setup-hostbuilt the entire stack end-to-end (btrfs pool, boxnet, box-isolate ACL, box-net profile, nft box-to-box drop, firewall).incus-user.socketships enabled + active.incus-userconfinement works: a plainincus-group user is auto-confined to a restricted project (user-<uid>), seeing only their own instances.The veto (criteria a/b FAIL):
incus-user does not share
boxnet. It gives each user a private auto-bridgeincusbr-<uid>and setsrestricted.networks.access: incusbr-<uid>:incus network show boxnetas the user →Error: Network not foundbox new --profile box-net/ensure_boxnet_profile→ fails (profile references a network they can't use)So box's whole isolation stack lives on boxnet, which restricted users never touch —
box newdoesn't work for them as written. The fix is real but is a redesign: an admin must setrestricted.networks.access boxnet,incusbr-<uid>(both — boxnet alone conflicts with the auto default profile) and install the box-net profile per-project, and the restricted project doesn't exist until first use — so it needs an admin convergence hook, notsetup-host.Recommendation: split this PR. #71 + #65 + CI + folded #66 are verified and can merge. #72 (restricted tier) is NOT ready — it stays behind the Task-0 gate and moves to a redesign issue built on these measured facts. Keeping this PR in draft until we decide the split.
Re-scoped + force-pushed. After the Task-0 rehearsal vetoed the #72 restricted-tier design (comment above), I split #72 out to #74 (redesign on the measured incus-user facts) and preserved that code on
feat/restricted-tier-wip. This branch is now #71 (global install) + #65 (tmux) + CI/tests, folding #66 — all verified, no substrate gate. Global install +setup-hostwere exercised end-to-end on a real Debian 13 / Incus 6.0.4 host. Ready to come out of draft once #66's fold is acknowledged.