fix(doctor): read the isolation off the bridge, not off the config #39

Merged
dan-claude-bot merged 1 commit from fix/isolation-ground-truth into main 2026-07-14 02:18:30 +00:00
dan-claude-bot commented 2026-07-14 02:17:00 +00:00 (Migrated from github.com)

Two bugs, opposite directions.

1. The new assertion cried wolf

WARNING: the box-to-box drop is NOT active — boxes can reach each other.

setup-host.sh ran nft list table bridge claudebox without sudo. nft needs root, so it failed with permission denied and warned about a rule that is demonstrably present:

$ sudo nft list table bridge claudebox
table bridge claudebox { chain forward { ... drop } }

A check that cries wolf is worse than no check. Fixed.

2. Every check so far asked the config, not the kernel

This is the deeper one, and it is the same shape as the original bug.

Boxes still reach each other. security.port_isolation: "true" is in the profile. So either Incus did not accept it, or it accepted it and the kernel never set isolated on on the VM's tap — in which case every config in sight says the boxes are isolated and they are not. That is exactly how the ACL fooled us: it looked airtight, and it never saw the traffic.

So doctor.sh now reads the kernel's view:

sudo bridge -d link show | grep -A1 'master claudenet'
#   ... hairpin off guard off ... isolated on|off

isolated on is the fact. The profile key is a claim. If they disagree, we learn it in one second instead of after another ten-minute drill — and we learn that VM taps don't honour the flag, which sends the fix somewhere else entirely.

No more mechanisms proposed until the kernel says what it is doing. I have guessed three times (ACL, nft bridge hook, port_isolation) and been wrong three times; the pattern is that I keep reasoning about the mechanism instead of measuring it.

🤖 Generated with Claude Code

Two bugs, opposite directions. ## 1. The new assertion cried wolf ``` WARNING: the box-to-box drop is NOT active — boxes can reach each other. ``` `setup-host.sh` ran `nft list table bridge claudebox` **without sudo**. `nft` needs root, so it failed with permission denied and warned about a rule that is demonstrably present: ``` $ sudo nft list table bridge claudebox table bridge claudebox { chain forward { ... drop } } ``` A check that cries wolf is worse than no check. Fixed. ## 2. Every check so far asked the config, not the kernel This is the deeper one, and it is the *same shape as the original bug*. Boxes still reach each other. `security.port_isolation: "true"` is in the profile. So either Incus did not accept it, or **it accepted it and the kernel never set `isolated on` on the VM's tap** — in which case every config in sight says the boxes are isolated and they are not. That is exactly how the ACL fooled us: it looked airtight, and it never saw the traffic. So `doctor.sh` now reads the **kernel's** view: ```sh sudo bridge -d link show | grep -A1 'master claudenet' # ... hairpin off guard off ... isolated on|off ``` `isolated on` is the fact. The profile key is a claim. If they disagree, we learn it in one second instead of after another ten-minute drill — and we learn that VM taps don't honour the flag, which sends the fix somewhere else entirely. **No more mechanisms proposed until the kernel says what it is doing.** I have guessed three times (ACL, nft bridge hook, port_isolation) and been wrong three times; the pattern is that I keep reasoning about the mechanism instead of measuring it. 🤖 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#39
No description provided.