diff --git a/tests/HARNESS-MANIFEST b/tests/HARNESS-MANIFEST
index 22b3060..e5ccc62 100644
--- a/tests/HARNESS-MANIFEST
+++ b/tests/HARNESS-MANIFEST
@@ -23,6 +23,7 @@
dc-dc-whole-host-budget
dc-edge-wan-import
dc-mirror
+dc-node-v6-carve
dc-plane-ipam
dc-rack-mgmt-import
dc-rack-net
diff --git a/tests/dc-node-v6-carve/run-tests.sh b/tests/dc-node-v6-carve/run-tests.sh
new file mode 100755
index 0000000..48d0a58
--- /dev/null
+++ b/tests/dc-node-v6-carve/run-tests.sh
@@ -0,0 +1,108 @@
+#!/usr/bin/env bash
+# tests/dc-node-v6-carve/run-tests.sh -- offline harness for scripts/dc-node-v6-carve.py.
+# Stubs `maas` with a fakebin returning controlled JSON. Never touches live MAAS.
+# Exit: 0 all pass | 1 any case failed. ASCII + LF.
+set -uo pipefail
+HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO="$(cd "$HERE/../.." && pwd)"
+TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
+PASS=0; FAIL=0
+ok() { PASS=$((PASS+1)); printf ' PASS %s\n' "$1"; }
+bad() { FAIL=$((FAIL+1)); printf ' FAIL %s\n' "$1"; shift; [ $# -gt 0 ] && printf '%s\n' "$*" | sed 's/^/ /'; }
+
+# mkbin
+mkbin() {
+ local d="$1"; mkdir -p "$d/fakebin"
+ cat > "$d/fakebin/maas" < "$d/subnets.py" < "$d/machines.py" <