fix(drill): the NIC inside a VM is enp5s0, not eth0 — read the address by subnet #28

Merged
dan-claude-bot merged 1 commit from fix/drill-nic-name into main 2026-07-13 23:33:40 +00:00
dan-claude-bot commented 2026-07-13 23:32:50 +00:00 (Migrated from github.com)

A3 — the one probe this whole audit exists for — has never fired, in six runs. It was never the network.

The profile names the device eth0. Inside a VM guest, predictable naming renames it enp5s0. So every address lookup the drill has used was hunting an interface that does not exist:

  • the original CSV match /\(eth0\)$/ → never matched
  • its replacement, ip -4 -o addr show dev eth0 → also never matched

I fixed that symptom twice — first blaming incus list's (genuinely non-regex) name filter, then a DHCP race — without ever questioning the interface name underneath both. The live incus list output on the drill host said enp5s0 in plain text.

The fix

Read the address from inside the box and select by subnet (10.87.x, what claudenet hands out), not by interface name. docker0's 172.17.x is the decoy; what the guest calls its NIC is the guest's business.

Plus a guard A3 should always have had

If the peer and the source hold the same address, refuse to probe. Not hypothetical — clones were inheriting their source's machine-id, hence its DHCP lease, hence its address (fixed separately). So archive → peer was archive probing itself, and a cheerful "reachable" would have been reported as a sibling-isolation failure. A3 now refuses that measurement instead of lying about it.

RUNS.md trap 4 is rewritten with the general lesson: when the same probe fails three different ways, stop patching the probe and go look at the thing itself.

🤖 Generated with Claude Code

**A3 — the one probe this whole audit exists for — has never fired, in six runs. It was never the network.** The profile names the *device* `eth0`. Inside a **VM guest**, predictable naming renames it **`enp5s0`**. So every address lookup the drill has used was hunting an interface that does not exist: - the original CSV match `/\(eth0\)$/` → never matched - its replacement, `ip -4 -o addr show dev eth0` → also never matched I fixed that symptom twice — first blaming `incus list`'s (genuinely non-regex) name filter, then a DHCP race — without ever questioning the interface name underneath both. The live `incus list` output on the drill host said `enp5s0` in plain text. ## The fix Read the address from inside the box and select by **subnet** (`10.87.x`, what claudenet hands out), not by interface name. `docker0`'s `172.17.x` is the decoy; what the guest calls its NIC is the guest's business. ## Plus a guard A3 should always have had If the peer and the source hold the **same** address, refuse to probe. Not hypothetical — clones were inheriting their source's machine-id, hence its DHCP lease, hence its address (fixed separately). So `archive → peer` was archive probing *itself*, and a cheerful "reachable" would have been reported as a sibling-isolation **failure**. A3 now refuses that measurement instead of lying about it. `RUNS.md` trap 4 is rewritten with the general lesson: **when the same probe fails three different ways, stop patching the probe and go look at the thing itself.** 🤖 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#28
No description provided.