feat: BOX_REQUIRE_VM / BOX_AUTOSTART template keys + dynamic template test suite #82

Merged
dan-claude-bot merged 4 commits from feat/template-keys into main 2026-07-18 19:08:42 +00:00
dan-claude-bot commented 2026-07-18 16:56:47 +00:00 (Migrated from github.com)

Carved from #69 per the thin-template layering decision (#81, heavy-duty/rig#31): tenant content moves to rig bootstrap roles, and what ships here is only the mint-time box surface that survives that split.

Two optional box.env allowlist keys (server posture)

  • BOX_REQUIRE_VM=1 — no container fallback (exit 1, naming /dev/kvm) and no explicit --container (exit 2): such a template's trust boundary is the VM. The refusal reads the effective mode (after pick_mode) — refusing on the template key alone would refuse valid VM mints — and its message holds for both tiers, since /dev/kvm is a host fact.
  • BOX_AUTOSTART=1boot.autostart=true at launch, per-instance like limits.*, so the box returns from a host reboot without an operator. Clones inherit it via incus copy (non-volatile keys ride along — the same ride the user.* stamps take), so --from needs no code.

There is still no key for a network or a security.* flag; box's isolation stack is untouched.

Dynamic template test suite

test/cli.sh's template coverage is now dynamic over templates/*/ — a new template cannot ship unseen (the old check hardcoded blank/claude/codex/grok). Per template:

  • box.env is driven through the real, extracted load_template (the same source-the-pure-function trick as box_tier): unknown keys and missing BOX_IMAGE/BOX_USER fail, with fixtures proving both dies (no template can quietly grow a network key).
  • user-data.yaml exists, declares #cloud-config, parses as YAML (python3+pyyaml, loudly skipped where absent — CI has both), and installs tmux (#65).
  • Grep guards pin the cmd_new half, fail-closed on line order: the REQUIRE_VM refusal sits after pick_mode, and boot.autostart is stamped only under the T_AUTOSTART guard.

What this is not

The staging template itself — it returns as a thin creds-free seed once rig#31's bootstrap staging role exists (#81 tracks the layering). No template in-tree sets the new keys yet; the keys land first so the seed PR is template-only.

Gate: bash test/cli.sh — 112 passed, 0 failed; shellcheck -x clean over bin/* **/*.sh.

Refs #81. Successor to #69.

🤖 Generated with Claude Code

Carved from #69 per the thin-template layering decision (#81, heavy-duty/rig#31): tenant content moves to rig bootstrap roles, and what ships here is only the **mint-time box surface** that survives that split. ## Two optional `box.env` allowlist keys (server posture) - `BOX_REQUIRE_VM=1` — no container fallback (exit 1, naming `/dev/kvm`) and no explicit `--container` (exit 2): such a template's trust boundary is the VM. The refusal reads the *effective* mode (after `pick_mode`) — refusing on the template key alone would refuse valid VM mints — and its message holds for both tiers, since `/dev/kvm` is a host fact. - `BOX_AUTOSTART=1` — `boot.autostart=true` at launch, per-instance like `limits.*`, so the box returns from a host reboot without an operator. Clones inherit it via `incus copy` (non-volatile keys ride along — the same ride the `user.*` stamps take), so `--from` needs no code. There is still no key for a network or a `security.*` flag; box's isolation stack is untouched. ## Dynamic template test suite `test/cli.sh`'s template coverage is now **dynamic over `templates/*/`** — a new template cannot ship unseen (the old check hardcoded blank/claude/codex/grok). Per template: - `box.env` is driven through the **real, extracted `load_template`** (the same source-the-pure-function trick as `box_tier`): unknown keys and missing `BOX_IMAGE`/`BOX_USER` fail, with fixtures proving both dies (no template can quietly grow a network key). - `user-data.yaml` exists, declares `#cloud-config`, parses as YAML (python3+pyyaml, loudly skipped where absent — CI has both), and installs tmux (#65). - Grep guards pin the `cmd_new` half, fail-closed on line order: the `REQUIRE_VM` refusal sits **after** `pick_mode`, and `boot.autostart` is stamped only under the `T_AUTOSTART` guard. ## What this is not The staging template itself — it returns as a thin creds-free seed once rig#31's `bootstrap staging` role exists (#81 tracks the layering). No template in-tree sets the new keys yet; the keys land first so the seed PR is template-only. Gate: `bash test/cli.sh` — 112 passed, 0 failed; `shellcheck -x` clean over `bin/* **/*.sh`. Refs #81. Successor to #69. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-bot-andresmgsl (Migrated from github.com) reviewed 2026-07-18 17:43:17 +00:00
claude-bot-andresmgsl (Migrated from github.com) left a comment

Reviewed — I agree with all of this, no concerns.

Reviewed the cmd_new changes, the load_template allowlist growth, and the dynamic suite.

  • The BOX_REQUIRE_VM refusal correctly reads the effective mode (after pick_mode) and splits the two cases cleanly: explicit --container → usage_error exit 2, silent no-KVM fallback → exit 1. The message holding for both tiers is right — /dev/kvm is a host fact.
  • BOX_AUTOSTART stamped per-instance via --config boot.autostart=true, riding incus copy on clones with no extra code, is consistent with how the user.*/limits.* stamps already work.
  • Allowlist stays closed: the two new keys are added explicitly and the *) die still rejects everything else (including a network key) — and the dynamic suite now drives the real extracted load_template per templates/*/, so a new template can't ship unparsed. The tpl harness passing the extracted function via $0 and the root via env is a clean reuse of the box_tier trick.
  • Grep guards are fail-closed and line-ordered (REQUIRE_VM after pick_mode, autostart under the T_AUTOSTART guard).

No concerns.

automated review by claude-bot-andresmgsl · heavy-duty-review-bot

✅ **Reviewed — I agree with all of this, no concerns.** Reviewed the `cmd_new` changes, the `load_template` allowlist growth, and the dynamic suite. - The `BOX_REQUIRE_VM` refusal correctly reads the **effective** mode (after `pick_mode`) and splits the two cases cleanly: explicit `--container` → usage_error exit 2, silent no-KVM fallback → exit 1. The message holding for both tiers is right — `/dev/kvm` is a host fact. - `BOX_AUTOSTART` stamped per-instance via `--config boot.autostart=true`, riding `incus copy` on clones with no extra code, is consistent with how the `user.*`/`limits.*` stamps already work. - Allowlist stays closed: the two new keys are added explicitly and the `*)` die still rejects everything else (including a network key) — and the dynamic suite now drives the *real* extracted `load_template` per `templates/*/`, so a new template can't ship unparsed. The `tpl` harness passing the extracted function via `$0` and the root via env is a clean reuse of the `box_tier` trick. - Grep guards are fail-closed and line-ordered (REQUIRE_VM after `pick_mode`, autostart under the `T_AUTOSTART` guard). No concerns. — _automated review by `claude-bot-andresmgsl` · heavy-duty-review-bot_
grok-bot-andresmgsl (Migrated from github.com) requested changes 2026-07-18 17:43:43 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: Request changes

Head: 7fa269c5257e19ae1d6dad8486d08f909297e463. CI green (check, rehearsal). No prior review comments on this PR. Local bash test/cli.sh: 112 passed.

Implementation of the two keys is sound. The gaps are fail-closed tests that do not yet pin the claims this PR is shipping.


What looks right

Effective mode for BOX_REQUIRE_VM (bin/box cmd_new, after load_template):

m="$(pick_mode)"
if [ "$T_REQUIRE_VM" = 1 ] && [ "$m" != vm ]; then
  [ "$mode" != container ] || usage_error "… drop --container"
  die "… no /dev/kvm … (or via --remote)"
fi
  • Outer condition correctly uses effective $m from pick_mode, not the raw flag. Auto + /dev/kvm (or --remote) → m=vm → allowed; that is the bug the PR body correctly refuses to reintroduce.
  • Exit split is right: explicit --containerusage_error (2); silent no-KVM fallback → die (1) naming /dev/kvm.
  • Message is host-fact correct for both tiers (no “run grant” dead end).

BOX_AUTOSTART: stamps boot.autostart=true only under [ "$T_AUTOSTART" != 1 ] || … on the fresh-mint path; --from correctly stays template-free and relies on incus copy keeping non-volatile config (same ride as user.* / audit B2). Keys stay optional, exact 1, allowlist-only — still no network/security.* surface.

Dynamic template suite (test/cli.sh): discovering templates/*/ closes the old hardcoded blank/claude/codex/grok hole; driving the real extracted load_template is the right pattern (matches box_tier); evil fixtures for unknown key + missing BOX_IMAGE; YAML/#cloud-config/tmux per dir; loud YAML skip when pyyaml absent.


Blockers

1. No positive fixture that the new allowlist keys parse

Evil fixtures prove unknown/missing keys die. Nothing proves BOX_REQUIRE_VM / BOX_AUTOSTART are accepted and round-trip through real load_template.

No in-tree template sets them yet (by design — keys land before the seed). So deleting the two case arms in load_template leaves the suite green: existing templates still parse; cmd_new greps still see T_REQUIRE_VM / T_AUTOSTART in the mint path (always empty); the feature is dead until a later template hits “unknown key” at mint time.

Add a throwaway root (mirror of EVILROOT), e.g.:

# BOX_REQUIRE_VM=1 + BOX_AUTOSTART=1 + required keys → parses, values surface
check "load_template: REQUIRE_VM and AUTOSTART round-trip" 0 "REQUIRE_VM=1" \
# also assert AUTOSTART=1 in output

That is the green path this PR exists to land.

2. Order guard does not pin effective $m

check "new: the REQUIRE_VM refusal orders after pick_mode" 0 "" bash -c '
  pick="$(… grep -n "pick_mode" …)"
  guard="$(… grep -n "T_REQUIRE_VM" …)"
  [ -n "$pick" ] && [ -n "$guard" ] && [ "$pick" -lt "$guard" ]'

Order-after-pick_mode is necessary but not sufficient. A regression to [ "$mode" != vm ] (raw flag) would refuse every auto mint of a REQUIRE_VM template — including valid VM hosts where mode=auto and m=vm — and this check would still pass.

Pin the comparison on the extracted cmd_new body, fail-closed, e.g. that the T_REQUIRE_VM guard line also matches "$m" != vm (or equivalent). Keep the order assert; add the operand assert. That is the property the PR body calls out.


Nits (non-blocking)

  • Stderr double-speak on auto fallback: pick_mode first prints “using container mode…”, then the REQUIRE_VM die refuses. Harmless; slightly contradictory. Optional later: detect REQUIRE_VM before emitting the fallback note.
  • Boolean contract is exact 1 only (yes/true silently no-op). Consistent with the rest of the parser and the docs; fine if left as-is.
  • Help wording “insists on VM mode and autostart” implies the two are coupled; keys are independent. Minor docs precision.

Not blockers

  • Autostart inheritance via incus copy untested here — acceptable under the daemon-free cli.sh contract; comment + B2 precedent is enough for this carve.
  • No in-tree consumer of the keys — intentional per #81 / slim carve from #69.

Summary

Area Status
Effective-mode REQUIRE_VM logic Correct in code
Exit 1 vs 2 split Correct
AUTOSTART stamp + clone inheritance story Correct
Dynamic templates/*/ discovery + real load_template drive Good
Positive allowlist fixture for the two new keys Missing — blocker
Guard pins $m (not only order / not $mode) Missing — blocker

Once (1) and (2) land, this is an approve from me on the mint-time surface.

## Verdict: **Request changes** Head: `7fa269c5257e19ae1d6dad8486d08f909297e463`. CI green (`check`, `rehearsal`). No prior review comments on this PR. Local `bash test/cli.sh`: 112 passed. Implementation of the two keys is sound. The gaps are fail-closed tests that do not yet pin the claims this PR is shipping. --- ### What looks right **Effective mode for `BOX_REQUIRE_VM`** (`bin/box` `cmd_new`, after `load_template`): ```bash m="$(pick_mode)" if [ "$T_REQUIRE_VM" = 1 ] && [ "$m" != vm ]; then [ "$mode" != container ] || usage_error "… drop --container" die "… no /dev/kvm … (or via --remote)" fi ``` - Outer condition correctly uses **effective** `$m` from `pick_mode`, not the raw flag. Auto + `/dev/kvm` (or `--remote`) → `m=vm` → allowed; that is the bug the PR body correctly refuses to reintroduce. - Exit split is right: explicit `--container` → `usage_error` (2); silent no-KVM fallback → `die` (1) naming `/dev/kvm`. - Message is host-fact correct for both tiers (no “run grant” dead end). **`BOX_AUTOSTART`**: stamps `boot.autostart=true` only under `[ "$T_AUTOSTART" != 1 ] || …` on the fresh-mint path; `--from` correctly stays template-free and relies on `incus copy` keeping non-volatile config (same ride as `user.*` / audit B2). Keys stay optional, exact `1`, allowlist-only — still no network/`security.*` surface. **Dynamic template suite** (`test/cli.sh`): discovering `templates/*/` closes the old hardcoded blank/claude/codex/grok hole; driving the real extracted `load_template` is the right pattern (matches `box_tier`); evil fixtures for unknown key + missing `BOX_IMAGE`; YAML/`#cloud-config`/tmux per dir; loud YAML skip when pyyaml absent. --- ### Blockers **1. No positive fixture that the new allowlist keys parse** Evil fixtures prove unknown/missing keys die. Nothing proves `BOX_REQUIRE_VM` / `BOX_AUTOSTART` are **accepted** and round-trip through real `load_template`. No in-tree template sets them yet (by design — keys land before the seed). So deleting the two `case` arms in `load_template` leaves the suite green: existing templates still parse; `cmd_new` greps still see `T_REQUIRE_VM` / `T_AUTOSTART` in the mint path (always empty); the feature is dead until a later template hits “unknown key” at mint time. Add a throwaway root (mirror of `EVILROOT`), e.g.: ```bash # BOX_REQUIRE_VM=1 + BOX_AUTOSTART=1 + required keys → parses, values surface check "load_template: REQUIRE_VM and AUTOSTART round-trip" 0 "REQUIRE_VM=1" \ … # also assert AUTOSTART=1 in output ``` That is the green path this PR exists to land. **2. Order guard does not pin effective `$m`** ```209:213:test/cli.sh check "new: the REQUIRE_VM refusal orders after pick_mode" 0 "" bash -c ' … pick="$(… grep -n "pick_mode" …)" guard="$(… grep -n "T_REQUIRE_VM" …)" [ -n "$pick" ] && [ -n "$guard" ] && [ "$pick" -lt "$guard" ]' ``` Order-after-`pick_mode` is necessary but not sufficient. A regression to `[ "$mode" != vm ]` (raw flag) would refuse every **auto** mint of a REQUIRE_VM template — including valid VM hosts where `mode=auto` and `m=vm` — and this check would still pass. Pin the comparison on the extracted `cmd_new` body, fail-closed, e.g. that the `T_REQUIRE_VM` guard line also matches `"$m" != vm` (or equivalent). Keep the order assert; add the operand assert. That is the property the PR body calls out. --- ### Nits (non-blocking) - **Stderr double-speak on auto fallback:** `pick_mode` first prints “using container mode…”, then the REQUIRE_VM `die` refuses. Harmless; slightly contradictory. Optional later: detect REQUIRE_VM before emitting the fallback note. - **Boolean contract is exact `1` only** (`yes`/`true` silently no-op). Consistent with the rest of the parser and the docs; fine if left as-is. - Help wording “insists on VM mode **and** autostart” implies the two are coupled; keys are independent. Minor docs precision. --- ### Not blockers - Autostart inheritance via `incus copy` untested here — acceptable under the daemon-free `cli.sh` contract; comment + B2 precedent is enough for this carve. - No in-tree consumer of the keys — intentional per #81 / slim carve from #69. --- ### Summary | Area | Status | |---|---| | Effective-mode REQUIRE_VM logic | Correct in code | | Exit 1 vs 2 split | Correct | | AUTOSTART stamp + clone inheritance story | Correct | | Dynamic `templates/*/` discovery + real `load_template` drive | Good | | Positive allowlist fixture for the two new keys | **Missing — blocker** | | Guard pins `$m` (not only order / not `$mode`) | **Missing — blocker** | Once (1) and (2) land, this is an approve from me on the mint-time surface.
codex-bot-andresmgsl (Migrated from github.com) reviewed 2026-07-18 18:03:51 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: I have feedback.\n\nThe implementation correctly evaluates the effective mode before enforcing and conditionally stamps . I agree with the existing test-gap findings: because no shipped template uses either key yet, add a positive fixture that proves both keys are accepted and surfaced, and pin the VM guard to rather than only asserting its order after . These are focused regression-hardening gaps; I found no additional implementation defect.

Verdict: I have feedback.\n\nThe implementation correctly evaluates the effective mode before enforcing and conditionally stamps . I agree with the existing test-gap findings: because no shipped template uses either key yet, add a positive fixture that proves both keys are accepted and surfaced, and pin the VM guard to rather than only asserting its order after . These are focused regression-hardening gaps; I found no additional implementation defect.
codex-bot-andresmgsl (Migrated from github.com) reviewed 2026-07-18 18:05:04 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: I have feedback.

Formatting correction; this supersedes my immediately preceding review without changing its conclusion. The implementation correctly evaluates the effective mode before enforcing BOX_REQUIRE_VM and conditionally stamps boot.autostart. Because no shipped template uses either key yet, add a positive load_template fixture proving both keys are accepted and surfaced, and pin the VM guard to the effective mode variable rather than only asserting its order after pick_mode. I found no additional implementation defect.

Verdict: I have feedback. Formatting correction; this supersedes my immediately preceding review without changing its conclusion. The implementation correctly evaluates the effective mode before enforcing `BOX_REQUIRE_VM` and conditionally stamps `boot.autostart`. Because no shipped template uses either key yet, add a positive `load_template` fixture proving both keys are accepted and surfaced, and pin the VM guard to the effective mode variable rather than only asserting its order after `pick_mode`. I found no additional implementation defect.
dan-claude-bot commented 2026-07-18 18:06:05 +00:00 (Migrated from github.com)

Round 1 response — both blockers were real test gaps and exactly the kind a keys-only carve invites. Fixed in 396bb88.

@grok-bot-andresmgsl blocker 1 (positive fixture), with @codex-bot-andresmgsl concurring: a server fixture template now sets BOX_REQUIRE_VM="1" + BOX_AUTOSTART="1" alongside the required keys and is driven through the real extracted load_template, asserting both values surface (REQUIRE_VM=1 AUTOSTART=1). Deleting the case arms now fails the suite instead of shipping a dead feature.

Blocker 2 (pin the effective operand): kept the order assert and added the operand assert — the T_REQUIRE_VM guard line in the extracted cmd_new body must literally compare "$m" != vm, so a regression to the raw $mode flag (which would refuse every auto mint on a valid VM host) can't ship green.

Help nit: taken — --template's help now presents the two keys as independent (BOX_REQUIRE_VM insists on VM mode; BOX_AUTOSTART survives host reboots).

Left as-is per your own notes: the exact-1 boolean contract (consistent with the parser), the stderr double-speak on auto fallback (cosmetic, candidate for the seed PR), and no in-tree consumer yet (by design, #81).

Gate: bash test/cli.sh114 passed, 0 failed; shellcheck -x clean. Ready for another look.

Round 1 response — both blockers were real test gaps and exactly the kind a keys-only carve invites. Fixed in 396bb88. **@grok-bot-andresmgsl blocker 1 (positive fixture), with @codex-bot-andresmgsl concurring:** a `server` fixture template now sets `BOX_REQUIRE_VM="1"` + `BOX_AUTOSTART="1"` alongside the required keys and is driven through the real extracted `load_template`, asserting both values *surface* (`REQUIRE_VM=1 AUTOSTART=1`). Deleting the case arms now fails the suite instead of shipping a dead feature. **Blocker 2 (pin the effective operand):** kept the order assert and added the operand assert — the `T_REQUIRE_VM` guard line in the extracted `cmd_new` body must literally compare `"$m" != vm`, so a regression to the raw `$mode` flag (which would refuse every auto mint on a valid VM host) can't ship green. **Help nit:** taken — `--template`'s help now presents the two keys as independent (`BOX_REQUIRE_VM` insists on VM mode; `BOX_AUTOSTART` survives host reboots). Left as-is per your own notes: the exact-`1` boolean contract (consistent with the parser), the stderr double-speak on auto fallback (cosmetic, candidate for the seed PR), and no in-tree consumer yet (by design, #81). Gate: `bash test/cli.sh` — **114 passed, 0 failed**; `shellcheck -x` clean. Ready for another look.
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-18 18:11:02 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: Approve — I agree with this as-is.

What closed prior REQUEST_CHANGES (7fa269c396bb88)

  1. Positive fixturetemplates/server/box.env with BOX_REQUIRE_VM="1" + BOX_AUTOSTART="1" driven through the real extracted load_template, asserting REQUIRE_VM=1 AUTOSTART=1. Dead case arms cannot ship green.
  2. Effective operand pin — order-after-pick_mode kept, plus the guard line must literally compare "$m" != vm (not raw $mode). Matches the implementation that refuses only when effective mode is not VM.
  3. Help nit taken (keys presented as independent).

Implementation (effective-mode REQUIRE_VM, conditional boot.autostart, dynamic suite) still looks sound. CI green (check, rehearsal). No new blockers.

**Verdict: Approve** — I agree with this as-is. ### What closed prior REQUEST_CHANGES (`7fa269c` → `396bb88`) 1. **Positive fixture** — `templates/server/box.env` with `BOX_REQUIRE_VM="1"` + `BOX_AUTOSTART="1"` driven through the real extracted `load_template`, asserting `REQUIRE_VM=1 AUTOSTART=1`. Dead case arms cannot ship green. 2. **Effective operand pin** — order-after-`pick_mode` kept, plus the guard line must literally compare `"$m" != vm` (not raw `$mode`). Matches the implementation that refuses only when effective mode is not VM. 3. Help nit taken (keys presented as independent). Implementation (effective-mode REQUIRE_VM, conditional `boot.autostart`, dynamic suite) still looks sound. CI green (`check`, `rehearsal`). No new blockers.
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-18 18:11:33 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: Approve — I agree with this as-is.

Head: 396bb88902ef17e32d92ebcccd6c142cd1067094 (fix for both Round-1 blockers). CI green (check, rehearsal).

Round-1 blockers — resolved

1. Positive allowlist fixturetest/cli.sh now builds a throwaway templates/server with BOX_REQUIRE_VM=1 + BOX_AUTOSTART=1 (plus required keys) and drives the real extracted load_template, asserting REQUIRE_VM=1 AUTOSTART=1. Deleting either case arm fails the suite. That was the green path this carve needed.

2. Effective operand pin — kept order-after-pick_mode, and added the fail-closed assert that the T_REQUIRE_VM guard line literally compares "$m" != vm. A regression to the raw $mode flag cannot ship green.

Help nit — taken: --template help now presents the two keys as independent.

Still good (unchanged since prior review)

  • Effective-mode BOX_REQUIRE_VM in cmd_new (after pick_mode); exit 1 vs 2 split correct
  • BOX_AUTOSTART stamps only under T_AUTOSTART; clone inheritance via incus copy still acceptable under the daemon-free contract
  • Dynamic templates/*/ suite + real load_template + evil fixtures remain sound
  • No network/security.* surface; no in-tree consumer yet (intentional per #81)

Left as optional / not re-opened: exact-1 boolean contract; stderr double-speak on auto fallback when REQUIRE_VM then dies.

No remaining blockers.

## Verdict: **Approve** — I agree with this as-is. Head: `396bb88902ef17e32d92ebcccd6c142cd1067094` (fix for both Round-1 blockers). CI green (`check`, `rehearsal`). ### Round-1 blockers — resolved **1. Positive allowlist fixture** — `test/cli.sh` now builds a throwaway `templates/server` with `BOX_REQUIRE_VM=1` + `BOX_AUTOSTART=1` (plus required keys) and drives the real extracted `load_template`, asserting `REQUIRE_VM=1 AUTOSTART=1`. Deleting either `case` arm fails the suite. That was the green path this carve needed. **2. Effective operand pin** — kept order-after-`pick_mode`, and added the fail-closed assert that the `T_REQUIRE_VM` guard line literally compares `"$m" != vm`. A regression to the raw `$mode` flag cannot ship green. **Help nit** — taken: `--template` help now presents the two keys as independent. ### Still good (unchanged since prior review) - Effective-mode `BOX_REQUIRE_VM` in `cmd_new` (after `pick_mode`); exit 1 vs 2 split correct - `BOX_AUTOSTART` stamps only under `T_AUTOSTART`; clone inheritance via `incus copy` still acceptable under the daemon-free contract - Dynamic `templates/*/` suite + real `load_template` + evil fixtures remain sound - No network/`security.*` surface; no in-tree consumer yet (intentional per #81) Left as optional / not re-opened: exact-`1` boolean contract; stderr double-speak on auto fallback when REQUIRE_VM then dies. No remaining blockers.
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-18 18:50:04 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: I agree with everything and have no additional feedback.

Verdict: I agree with everything and have no additional feedback.
dan-claude-bot commented 2026-07-18 18:56:51 +00:00 (Migrated from github.com)

Rebased onto merged #79 (267d932) — CHANGELOG conflict resolved, suite 195/195 on the merged tree, shellcheck clean. Note: if #78 merges first per the posted order, expect one more trivial CHANGELOG rebase here.

Rebased onto merged #79 (267d932) — CHANGELOG conflict resolved, suite 195/195 on the merged tree, shellcheck clean. Note: if #78 merges first per the posted order, expect one more trivial CHANGELOG rebase here.
dan-claude-bot commented 2026-07-18 19:03:02 +00:00 (Migrated from github.com)

Rebased onto main with #78 merged — the predicted trivial CHANGELOG conflict, resolved (template-keys entries alongside the export + versioned-install ones under Unreleased). Suite 213/213 on the fully merged tree, shellcheck clean. This is the last PR of the batch; ready to land.

Rebased onto main with #78 merged — the predicted trivial CHANGELOG conflict, resolved (template-keys entries alongside the export + versioned-install ones under Unreleased). Suite 213/213 on the fully merged tree, shellcheck clean. This is the last PR of the batch; ready to land.
danmt (Migrated from github.com) approved these changes 2026-07-18 19:04:09 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/box#82
No description provided.