fix(drill): stop demanding an empty host — assert OUR boxes, not NO boxes #44

Merged
dan-claude-bot merged 1 commit from fix/drill-shared-host into main 2026-07-14 12:12:06 +00:00
dan-claude-bot commented 2026-07-14 12:09:46 +00:00 (Migrated from github.com)

Run 11 on the live host: 45 passed, 2 failed — and the isolation contract passed whole (A3 sibling BLOCKED — tcp dropped + no icmp reply, enumeration closed, box→host and host→box dropped, IPv6 off). Both failures were one non-fact: the host had two operator boxes (t1, t2, tagged user.claudebox=1) minted before the run.

FAIL why it fired
empty-host message wrong claudebox list cannot say "no boxes yet" on a host with tenants. The CLI's message is correct; the check was untestable, and reported untestable as broken.
a box survived teardown The rm loop deliberately removes only the names the drill minted (drill clone archive peer) — the multi-tenant discipline. Then the assertion demanded a globally empty host, flagging that very restraint as a failure.

The second one is the sharper bug: the check contradicted the discipline of the loop directly above it. A drill that can only pass on a single-tenant host would teach operators to "clean up" boxes it had no business touching — the exact reflex claudebox rm's tag boundary exists to prevent.

The fix

  • Empty-host check: when tenants pre-exist, skip with a note naming them (host already has claudebox boxes (t1 t2) — the empty-host message cannot be tested this run). It still runs — and still bites — on a genuinely empty host.
  • Teardown check: assert the drill's own four names are gone from claudebox list; when one survives, name it instead of pointing at the whole host.

Expected on the run-11 host: 45 passed, 0 failed, one note.

🤖 Generated with Claude Code

Run 11 on the live host: **45 passed, 2 failed — and the isolation contract passed whole** (A3 sibling `BLOCKED — tcp dropped + no icmp reply`, enumeration closed, box→host and host→box dropped, IPv6 off). Both failures were one non-fact: the host had two operator boxes (`t1`, `t2`, tagged `user.claudebox=1`) minted before the run. | FAIL | why it fired | | --- | --- | | `empty-host message wrong` | `claudebox list` cannot say "no boxes yet" on a host with tenants. The CLI's message is correct; the check was untestable, and reported *untestable* as *broken*. | | `a box survived teardown` | The rm loop deliberately removes **only the names the drill minted** (`drill clone archive peer`) — the multi-tenant discipline. Then the assertion demanded a globally empty host, flagging that very restraint as a failure. | The second one is the sharper bug: the check contradicted the discipline of the loop directly above it. A drill that can only pass on a single-tenant host would teach operators to "clean up" boxes it had no business touching — the exact reflex `claudebox rm`'s tag boundary exists to prevent. ## The fix - **Empty-host check**: when tenants pre-exist, skip with a note naming them (`host already has claudebox boxes (t1 t2) — the empty-host message cannot be tested this run`). It still runs — and still bites — on a genuinely empty host. - **Teardown check**: assert the drill's own four names are gone from `claudebox list`; when one survives, **name it** instead of pointing at the whole host. Expected on the run-11 host: 45 passed, 0 failed, one note. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No reviewers
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#44
No description provided.