rig/commands
dan-claude-bot 739db6e633 feat(bootstrap): box tenant roles — claude, codex, grok, staging (#31)
box templates collapse to thin, creds-free seeds (box#81); everything a
tenant machine BECOMES moves here, as convergent, re-runnable roles with
effective-state asserts. One mechanism (bootstrap-tenant.sh) parameterized
per tenant through a pure lib (tenant-config.sh) — never four copies —
dispatched from bootstrap.sh so 'rig bootstrap <role>' stays the single
entrypoint.

The agent tenants land the toolbelt (git, gh, tmux, …), docker, the agent's
CLI on the SYSTEM path (box exec shells read no rc files, #15), and the
agent-context file — rendered from ONE shared template that carries the
box#80 guard note once: never run box setup-host or the drill inside a box;
the box you are in is not a host you own. staging lands box#69's server
posture — docker + sshd hardening — through lib/sshd.sh, extracted verbatim
from bootstrap.sh so both families converge ONE drop-in with one converger;
its tailnet workload join stays operator-run, exactly the creds split #69
designed. Everything is asserted on effective state: the CLI must ANSWER as
the tenant user (the grok template's linked-but-cannot-run scar), docker
must answer, sshd -T must resolve.

'staging' therefore moves from the VM-host preset to the tenant role — the
thing box#81's seed will auto-run. The host shape lost nothing: it is
'dev --class server' (or custom with all three traits), the catch-all
effective-tag refusal still owns its tag policy, and a pre-#31 staging host
re-running its old command gets a loud refusal naming the new spelling —
tenants refuse host=yes boxes, agents refuse any machine-role box, staging
tolerates the workload-joined guest and leaves its marker alone.

Harness: the arg/refusal surface, the marker guards off fixture markers,
the pure parameter table, the rendered context file (guard included, all
three agents), creds-free-by-absence greps (no tailscale, no prompt), the
CLI-verified-not-trusted pin, marker-after-converge ordering, and the
re-pointed sshd-lib pins. 241 passed, 0 failed; shellcheck -x clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 19:49:20 +00:00
..
lib feat(bootstrap): box tenant roles — claude, codex, grok, staging (#31) 2026-07-18 19:49:20 +00:00
bootstrap-tenant.sh feat(bootstrap): box tenant roles — claude, codex, grok, staging (#31) 2026-07-18 19:49:20 +00:00
bootstrap.sh feat(bootstrap): box tenant roles — claude, codex, grok, staging (#31) 2026-07-18 19:49:20 +00:00
coolify-backup-install.sh fix(bootstrap): gate the host-set-up claim on 'box doctor', not on PATH 2026-07-18 16:59:43 +00:00
coolify-install.sh fix(bootstrap): gate the host-set-up claim on 'box doctor', not on PATH 2026-07-18 16:59:43 +00:00
db.sh feat(db): bring ad-hoc dump/restore on-box as rig db 2026-07-17 15:16:35 +00:00
runner-install.sh fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00
runner-remove.sh feat(runner): status, remove, and repoint — the runner lifecycle verbs 2026-07-13 13:25:27 +00:00
runner-repoint.sh fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00
runner-status.sh fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00
users-apply.sh feat(users): @root seeds the admin's keys from root's own — the one source that cannot lock you out 2026-07-18 14:53:30 +00:00
users-close-root.sh fix(close-root): the gate judges AllowGroups/DenyGroups too — same door, other hinge 2026-07-18 17:17:39 +00:00
users-status.sh fix(users): review findings — invoker gate, real SSH revocation, StrictModes-shaped close-root gate, trait-aware box role 2026-07-17 20:01:19 +00:00