fix(drill): stop poisoning the host, and add a doctor to prove it #32
No reviewers
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#32
Loading…
Reference in a new issue
No description provided.
Delete branch "drill/doctor"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Run 8's cold mint died with
cloud-init status: error. The box could not resolvedeb.debian.org— orclaude.ai, or anything:The cause was not in that run. Run 7's phase D set
dns.mode=noneonclaudenet, the run ended before reverting it, and every box minted afterwards came up with no DNS.This is the worst failure mode the drill has
A poisoned host does not fail the next run honestly — it produces confident wrong answers. It is how the false
L2 filtering BREAKS the box — design vetoreached #16, and it cost a cold mint plus an hour of diagnosis aimed at code that was never broken.Three defences:
trapbefore the first mutation — it fires on any exit,Ctrl-Cincluded. Previously it only ran if the run reached the end, which is exactly the case that doesn't need it./dev/null. A failedunsetcould not be told from a successful one; now the drill checks and says so loudly.drill/doctor.sh— the question that kept getting answered by handReports:
claudenet'sdns.mode/ IPv4 / IPv6-off contract, the profile NIC's filtering flags, the ACL's rules (including a stray@internal), leftover drill boxes, and — the cheapest real test — whether a box can still resolve DNS and reach the gateway. It also detects a wedged Incus daemon and prints the recovery from #26.Every diagnostic command I have been pasting into chat all day now lives in the repo, which is where it should have been from the start.
For the current host
🤖 Generated with Claude Code