diff --git a/.gitignore b/.gitignore
index 06af9cc..42dace2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,9 @@ go.work.sum
# env file
.env
+# Reference Ruby dnstraverse (GPL-3, dev-only golden-test generator; see tools/golden/run-reference.sh)
+tools/dnstraverse-ruby/
+
+# Local Claude Code session config
+.claude/
+
diff --git a/docs/captures/dnstraverse-ruby-example.com-MX.txt b/docs/captures/dnstraverse-ruby-example.com-MX.txt
new file mode 100644
index 0000000..2c45c50
--- /dev/null
+++ b/docs/captures/dnstraverse-ruby-example.com-MX.txt
@@ -0,0 +1,69 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using a.root-servers.net (198.41.0.4) as initial root
+Running query example.com type MX
+1 a.root-servers.net (198.41.0.4)
+1.1 l.gtld-servers.net (192.41.162.30)
+1.1.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162)
+1.1.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228)
+1.2 j.gtld-servers.net (192.48.79.30)
+1.2.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.2.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.3 h.gtld-servers.net (192.54.112.30)
+1.3.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.3.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.4 d.gtld-servers.net (192.31.80.30)
+1.4.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.4.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.5 b.gtld-servers.net (192.33.14.30)
+1.5.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.5.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.6 f.gtld-servers.net (192.35.51.30)
+1.6.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.6.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.7 k.gtld-servers.net (192.52.178.30)
+1.7.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.7.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.8 m.gtld-servers.net (192.55.83.30)
+1.8.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.8.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.9 i.gtld-servers.net (192.43.172.30)
+1.9.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.9.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.10 g.gtld-servers.net (192.42.93.30)
+1.10.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.10.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.11 a.gtld-servers.net (192.5.6.30)
+1.11.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.11.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.12 c.gtld-servers.net (192.26.92.30)
+1.12.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.12.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.13 e.gtld-servers.net (192.12.94.30)
+1.13.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.13.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+
+Results:
+ 16.7%: Answer from hera.ns.cloudflare.com (108.162.192.162)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (108.162.195.228)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (162.159.44.228)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from hera.ns.cloudflare.com (172.64.32.162)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (172.64.35.228)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from hera.ns.cloudflare.com (173.245.58.162)
+ example.com. 300 IN MX 0 .
+
+Summary Results:
+ 100% answered with example.com. 300 IN MX 0 .
diff --git a/docs/captures/dnstraverse-ruby-hansenits.com.au-A.txt b/docs/captures/dnstraverse-ruby-hansenits.com.au-A.txt
new file mode 100644
index 0000000..e55ce93
--- /dev/null
+++ b/docs/captures/dnstraverse-ruby-hansenits.com.au-A.txt
@@ -0,0 +1,635 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using g.root-servers.net (192.112.36.4) as initial root
+Running query hansenits.com.au type a
+1 g.root-servers.net (192.112.36.4)
+1.1 r.au (65.22.197.1)
+1.1.1 ns-a.hansenits.com -- resolving
+1.1.1.0.1 g.root-servers.net (192.112.36.4)
+1.1.1.0.1.1 f.gtld-servers.net (192.35.51.30)
+1.1.1.0.1.1.1 ns-101.awsdns-12.com (205.251.192.101)
+1.1.1.0.1.1.2 ns-639.awsdns-15.net
+1.1.1.0.1.1.2.0.1 g.root-servers.net (192.112.36.4)
+1.1.1.0.1.1.2.0.1.1 l.gtld-servers.net (192.41.162.30)
+1.1.1.0.1.1.2.0.1.1.1 g-ns-464.awsdns-15.net (205.251.193.208)
+1.1.1.0.1.1.2.0.1.1.2 g-ns-785.awsdns-15.net (205.251.195.17)
+1.1.1.0.1.1.2.0.1.1.3 g-ns-1359.awsdns-15.net (205.251.197.79)
+1.1.1.0.1.1.2.0.1.1.4 g-ns-1935.awsdns-15.net (205.251.199.143)
+1.1.1.0.1.1.2.0.1.2 h.gtld-servers.net (192.54.112.30)
+1.1.1.0.1.1.2.0.1.2.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.2.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.2.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.2.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.3 d.gtld-servers.net (192.31.80.30)
+1.1.1.0.1.1.2.0.1.3.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.3.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.3.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.3.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.4 c.gtld-servers.net (192.26.92.30)
+1.1.1.0.1.1.2.0.1.4.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.4.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.4.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.4.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.5 e.gtld-servers.net (192.12.94.30)
+1.1.1.0.1.1.2.0.1.5.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.5.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.5.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.5.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.6 b.gtld-servers.net (192.33.14.30)
+1.1.1.0.1.1.2.0.1.6.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.6.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.6.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.6.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.7 m.gtld-servers.net (192.55.83.30)
+1.1.1.0.1.1.2.0.1.7.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.7.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.7.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.7.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.8 f.gtld-servers.net (192.35.51.30)
+1.1.1.0.1.1.2.0.1.8.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.8.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.8.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.8.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.9 i.gtld-servers.net (192.43.172.30)
+1.1.1.0.1.1.2.0.1.9.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.9.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.9.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.9.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.10 a.gtld-servers.net (192.5.6.30)
+1.1.1.0.1.1.2.0.1.10.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.10.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.10.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.10.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.11 k.gtld-servers.net (192.52.178.30)
+1.1.1.0.1.1.2.0.1.11.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.11.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.11.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.11.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.12 j.gtld-servers.net (192.48.79.30)
+1.1.1.0.1.1.2.0.1.12.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.12.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.12.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.12.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.13 g.gtld-servers.net (192.42.93.30)
+1.1.1.0.1.1.2.0.1.13.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.13.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.13.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.13.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2 ns-639.awsdns-15.net (205.251.194.127)
+1.1.1.0.1.1.3 ns-1168.awsdns-18.org
+1.1.1.0.1.1.3.0.1 g.root-servers.net (192.112.36.4)
+1.1.1.0.1.1.3.0.1.1 c0.org.afilias-nst.info (199.19.53.1)
+1.1.1.0.1.1.3.0.1.1.1 g-ns-724.awsdns-18.org (205.251.194.212)
+1.1.1.0.1.1.3.0.1.1.2 g-ns-1618.awsdns-18.org (205.251.198.82)
+1.1.1.0.1.1.3.0.1.1.3 g-ns-146.awsdns-18.org (205.251.192.146)
+1.1.1.0.1.1.3.0.1.1.4 g-ns-1045.awsdns-18.org (205.251.196.21)
+1.1.1.0.1.1.3.0.1.2 d0.org.afilias-nst.org (199.19.57.1)
+1.1.1.0.1.1.3.0.1.2.1 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.2.2 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.2.3 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.2.4 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.3 b0.org.afilias-nst.org (199.19.54.1)
+1.1.1.0.1.1.3.0.1.4 a0.org.afilias-nst.info (199.19.56.1)
+1.1.1.0.1.1.3.0.1.4.1 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.4.2 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.4.3 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.4.4 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.5 b2.org.afilias-nst.org (199.249.120.1)
+1.1.1.0.1.1.3.0.1.5.1 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.5.2 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.5.3 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.5.4 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.6 a2.org.afilias-nst.info (199.249.112.1)
+1.1.1.0.1.1.3.0.1.6.1 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.6.2 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.6.3 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.6.4 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3 ns-1168.awsdns-18.org (205.251.196.144,No data)
+1.1.1.0.1.1.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.1.4.0.1 g.root-servers.net (192.112.36.4)
+1.1.1.0.1.1.4.0.1.1 nsa.nic.uk (156.154.100.3)
+1.1.1.0.1.1.4.0.1.1.1 g-ns-1836.awsdns-40.co.uk (205.251.199.44)
+1.1.1.0.1.1.4.0.1.1.2 g-ns-1515.awsdns-40.co.uk (205.251.197.235)
+1.1.1.0.1.1.4.0.1.1.3 g-ns-360.awsdns-40.co.uk (205.251.193.104)
+1.1.1.0.1.1.4.0.1.1.4 g-ns-936.awsdns-40.co.uk (205.251.195.168)
+1.1.1.0.1.1.4.0.1.2 dns1.nic.uk (213.248.216.1)
+1.1.1.0.1.1.4.0.1.2.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.2.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.2.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.2.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.3 nsc.nic.uk (156.154.102.3)
+1.1.1.0.1.1.4.0.1.3.1 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.3.2 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.3.3 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.3.4 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.4 dns2.nic.uk (103.49.80.1)
+1.1.1.0.1.1.4.0.1.4.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.4.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.4.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.4.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.5 nsb.nic.uk (156.154.101.3)
+1.1.1.0.1.1.4.0.1.5.1 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.5.2 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.5.3 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.5.4 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.6 nsd.nic.uk (156.154.103.3)
+1.1.1.0.1.1.4.0.1.6.1 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.6.2 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.6.3 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.6.4 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.7 dns3.nic.uk (213.248.220.1)
+1.1.1.0.1.1.4.0.1.7.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.7.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.7.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.7.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.8 dns4.nic.uk (43.230.48.1)
+1.1.1.0.1.1.4.0.1.8.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.8.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.8.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.8.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4 ns-1863.awsdns-40.co.uk (205.251.199.71)
+1.1.1.0.1.2 i.gtld-servers.net (192.43.172.30)
+1.1.1.0.1.2.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.2.2 ns-639.awsdns-15.net
+1.1.1.0.1.2.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.2.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.2.3 ns-1168.awsdns-18.org
+1.1.1.0.1.2.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.2.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.2.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.2.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.2.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.3 k.gtld-servers.net (192.52.178.30)
+1.1.1.0.1.3.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.3.2 ns-639.awsdns-15.net
+1.1.1.0.1.3.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.3.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.3.3 ns-1168.awsdns-18.org
+1.1.1.0.1.3.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.3.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.3.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.3.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.3.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.4 e.gtld-servers.net (192.12.94.30)
+1.1.1.0.1.4.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.4.2 ns-639.awsdns-15.net
+1.1.1.0.1.4.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.4.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.4.3 ns-1168.awsdns-18.org
+1.1.1.0.1.4.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.4.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.4.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.4.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.4.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.5 b.gtld-servers.net (192.33.14.30)
+1.1.1.0.1.5.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.5.2 ns-639.awsdns-15.net
+1.1.1.0.1.5.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.5.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.5.3 ns-1168.awsdns-18.org
+1.1.1.0.1.5.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.5.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.5.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.5.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.5.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.6 d.gtld-servers.net (192.31.80.30)
+1.1.1.0.1.6.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.6.2 ns-639.awsdns-15.net
+1.1.1.0.1.6.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.6.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.6.3 ns-1168.awsdns-18.org
+1.1.1.0.1.6.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.6.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.6.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.6.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.6.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.7 j.gtld-servers.net (192.48.79.30)
+1.1.1.0.1.7.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.7.2 ns-639.awsdns-15.net
+1.1.1.0.1.7.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.7.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.7.3 ns-1168.awsdns-18.org
+1.1.1.0.1.7.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.7.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.7.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.7.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.7.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.8 a.gtld-servers.net (192.5.6.30)
+1.1.1.0.1.8.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.8.2 ns-639.awsdns-15.net
+1.1.1.0.1.8.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.8.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.8.3 ns-1168.awsdns-18.org
+1.1.1.0.1.8.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.8.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.8.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.8.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.8.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.9 g.gtld-servers.net (192.42.93.30)
+1.1.1.0.1.9.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.9.2 ns-639.awsdns-15.net
+1.1.1.0.1.9.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.9.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.9.3 ns-1168.awsdns-18.org
+1.1.1.0.1.9.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.9.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.9.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.9.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.9.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.10 m.gtld-servers.net (192.55.83.30)
+1.1.1.0.1.10.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.10.2 ns-639.awsdns-15.net
+1.1.1.0.1.10.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.10.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.10.3 ns-1168.awsdns-18.org
+1.1.1.0.1.10.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.10.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.10.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.10.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.10.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.11 l.gtld-servers.net (192.41.162.30)
+1.1.1.0.1.11.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.11.2 ns-639.awsdns-15.net
+1.1.1.0.1.11.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.11.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.11.3 ns-1168.awsdns-18.org
+1.1.1.0.1.11.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.11.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.11.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.11.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.11.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.12 h.gtld-servers.net (192.54.112.30)
+1.1.1.0.1.12.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.12.2 ns-639.awsdns-15.net
+1.1.1.0.1.12.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.12.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.12.3 ns-1168.awsdns-18.org
+1.1.1.0.1.12.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.12.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.12.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.12.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.12.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.13 c.gtld-servers.net (192.26.92.30)
+1.1.1.0.1.13.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.13.2 ns-639.awsdns-15.net
+1.1.1.0.1.13.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.13.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.13.3 ns-1168.awsdns-18.org
+1.1.1.0.1.13.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.13.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.1.0.1.13.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.13.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.1.0.1.13.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1 ns-a.hansenits.com (110.173.233.130,No data)
+1.1.2 ns-c.hansenits.com -- resolving
+1.1.2.0.1 g.root-servers.net (192.112.36.4)
+1.1.2.0.1.1 l.gtld-servers.net (192.41.162.30)
+1.1.2.0.1.1.1 ns-101.awsdns-12.com (205.251.192.101)
+1.1.2.0.1.1.2 ns-639.awsdns-15.net
+1.1.2.0.1.1.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.1.2 ns-639.awsdns-15.net (205.251.194.127)
+1.1.2.0.1.1.3 ns-1168.awsdns-18.org
+1.1.2.0.1.1.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.1.3 ns-1168.awsdns-18.org (205.251.196.144,No data)
+1.1.2.0.1.1.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.1.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.1.4 ns-1863.awsdns-40.co.uk (205.251.199.71)
+1.1.2.0.1.2 c.gtld-servers.net (192.26.92.30)
+1.1.2.0.1.2.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.2.2 ns-639.awsdns-15.net
+1.1.2.0.1.2.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.2.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.2.3 ns-1168.awsdns-18.org
+1.1.2.0.1.2.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.2.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.2.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.2.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.2.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.3 f.gtld-servers.net (192.35.51.30)
+1.1.2.0.1.3.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.3.2 ns-639.awsdns-15.net
+1.1.2.0.1.3.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.3.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.3.3 ns-1168.awsdns-18.org
+1.1.2.0.1.3.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.3.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.3.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.3.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.3.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.4 e.gtld-servers.net (192.12.94.30)
+1.1.2.0.1.4.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.4.2 ns-639.awsdns-15.net
+1.1.2.0.1.4.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.4.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.4.3 ns-1168.awsdns-18.org
+1.1.2.0.1.4.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.4.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.4.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.4.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.4.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.5 b.gtld-servers.net (192.33.14.30)
+1.1.2.0.1.5.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.5.2 ns-639.awsdns-15.net
+1.1.2.0.1.5.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.5.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.5.3 ns-1168.awsdns-18.org
+1.1.2.0.1.5.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.5.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.5.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.5.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.5.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.6 k.gtld-servers.net (192.52.178.30)
+1.1.2.0.1.6.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.6.2 ns-639.awsdns-15.net
+1.1.2.0.1.6.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.6.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.6.3 ns-1168.awsdns-18.org
+1.1.2.0.1.6.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.6.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.6.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.6.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.6.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.7 d.gtld-servers.net (192.31.80.30)
+1.1.2.0.1.7.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.7.2 ns-639.awsdns-15.net
+1.1.2.0.1.7.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.7.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.7.3 ns-1168.awsdns-18.org
+1.1.2.0.1.7.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.7.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.7.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.7.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.7.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.8 i.gtld-servers.net (192.43.172.30)
+1.1.2.0.1.8.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.8.2 ns-639.awsdns-15.net
+1.1.2.0.1.8.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.8.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.8.3 ns-1168.awsdns-18.org
+1.1.2.0.1.8.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.8.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.8.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.8.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.8.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.9 j.gtld-servers.net (192.48.79.30)
+1.1.2.0.1.9.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.9.2 ns-639.awsdns-15.net
+1.1.2.0.1.9.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.9.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.9.3 ns-1168.awsdns-18.org
+1.1.2.0.1.9.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.9.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.9.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.9.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.9.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.10 g.gtld-servers.net (192.42.93.30)
+1.1.2.0.1.10.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.10.2 ns-639.awsdns-15.net
+1.1.2.0.1.10.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.10.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.10.3 ns-1168.awsdns-18.org
+1.1.2.0.1.10.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.10.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.10.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.10.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.10.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.11 a.gtld-servers.net (192.5.6.30)
+1.1.2.0.1.11.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.11.2 ns-639.awsdns-15.net
+1.1.2.0.1.11.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.11.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.11.3 ns-1168.awsdns-18.org
+1.1.2.0.1.11.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.11.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.11.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.11.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.11.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.12 m.gtld-servers.net (192.55.83.30)
+1.1.2.0.1.12.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.12.2 ns-639.awsdns-15.net
+1.1.2.0.1.12.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.12.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.12.3 ns-1168.awsdns-18.org
+1.1.2.0.1.12.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.12.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.12.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.12.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.12.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.13 h.gtld-servers.net (192.54.112.30)
+1.1.2.0.1.13.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.13.2 ns-639.awsdns-15.net
+1.1.2.0.1.13.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.13.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.13.3 ns-1168.awsdns-18.org
+1.1.2.0.1.13.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.13.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.2.0.1.13.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.13.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.2.0.1.13.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2 ns-c.hansenits.com (13.54.63.231,No data)
+1.1.3 ns-b.hansenits.com -- resolving
+1.1.3.0.1 g.root-servers.net (192.112.36.4)
+1.1.3.0.1.1 e.gtld-servers.net (192.12.94.30)
+1.1.3.0.1.1.1 ns-101.awsdns-12.com (205.251.192.101)
+1.1.3.0.1.1.2 ns-639.awsdns-15.net
+1.1.3.0.1.1.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.1.2 ns-639.awsdns-15.net (205.251.194.127)
+1.1.3.0.1.1.3 ns-1168.awsdns-18.org
+1.1.3.0.1.1.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.1.3 ns-1168.awsdns-18.org (205.251.196.144,No data)
+1.1.3.0.1.1.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.1.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.1.4 ns-1863.awsdns-40.co.uk (205.251.199.71)
+1.1.3.0.1.2 c.gtld-servers.net (192.26.92.30)
+1.1.3.0.1.2.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.2.2 ns-639.awsdns-15.net
+1.1.3.0.1.2.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.2.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.2.3 ns-1168.awsdns-18.org
+1.1.3.0.1.2.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.2.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.2.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.2.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.2.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.3 f.gtld-servers.net (192.35.51.30)
+1.1.3.0.1.3.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.3.2 ns-639.awsdns-15.net
+1.1.3.0.1.3.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.3.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.3.3 ns-1168.awsdns-18.org
+1.1.3.0.1.3.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.3.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.3.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.3.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.3.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.4 k.gtld-servers.net (192.52.178.30)
+1.1.3.0.1.4.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.4.2 ns-639.awsdns-15.net
+1.1.3.0.1.4.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.4.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.4.3 ns-1168.awsdns-18.org
+1.1.3.0.1.4.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.4.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.4.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.4.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.4.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.5 b.gtld-servers.net (192.33.14.30)
+1.1.3.0.1.5.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.5.2 ns-639.awsdns-15.net
+1.1.3.0.1.5.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.5.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.5.3 ns-1168.awsdns-18.org
+1.1.3.0.1.5.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.5.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.5.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.5.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.5.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.6 d.gtld-servers.net (192.31.80.30)
+1.1.3.0.1.6.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.6.2 ns-639.awsdns-15.net
+1.1.3.0.1.6.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.6.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.6.3 ns-1168.awsdns-18.org
+1.1.3.0.1.6.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.6.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.6.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.6.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.6.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.7 j.gtld-servers.net (192.48.79.30)
+1.1.3.0.1.7.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.7.2 ns-639.awsdns-15.net
+1.1.3.0.1.7.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.7.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.7.3 ns-1168.awsdns-18.org
+1.1.3.0.1.7.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.7.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.7.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.7.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.7.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.8 i.gtld-servers.net (192.43.172.30)
+1.1.3.0.1.8.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.8.2 ns-639.awsdns-15.net
+1.1.3.0.1.8.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.8.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.8.3 ns-1168.awsdns-18.org
+1.1.3.0.1.8.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.8.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.8.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.8.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.8.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.9 a.gtld-servers.net (192.5.6.30)
+1.1.3.0.1.9.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.9.2 ns-639.awsdns-15.net
+1.1.3.0.1.9.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.9.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.9.3 ns-1168.awsdns-18.org
+1.1.3.0.1.9.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.9.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.9.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.9.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.9.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.10 h.gtld-servers.net (192.54.112.30)
+1.1.3.0.1.10.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.10.2 ns-639.awsdns-15.net
+1.1.3.0.1.10.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.10.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.10.3 ns-1168.awsdns-18.org
+1.1.3.0.1.10.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.10.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.10.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.10.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.10.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.11 l.gtld-servers.net (192.41.162.30)
+1.1.3.0.1.11.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.11.2 ns-639.awsdns-15.net
+1.1.3.0.1.11.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.11.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.11.3 ns-1168.awsdns-18.org
+1.1.3.0.1.11.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.11.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.11.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.11.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.11.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.12 m.gtld-servers.net (192.55.83.30)
+1.1.3.0.1.12.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.12.2 ns-639.awsdns-15.net
+1.1.3.0.1.12.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.12.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.12.3 ns-1168.awsdns-18.org
+1.1.3.0.1.12.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.12.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.12.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.12.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.12.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.13 g.gtld-servers.net (192.42.93.30)
+1.1.3.0.1.13.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.13.2 ns-639.awsdns-15.net
+1.1.3.0.1.13.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.13.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.13.3 ns-1168.awsdns-18.org
+1.1.3.0.1.13.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.13.3 ns-1168.awsdns-18.org (205.251.196.144,No data) -- completed earlier
+1.1.3.0.1.13.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.13.4.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.1.3.0.1.13.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3 ns-b.hansenits.com (110.173.233.132,No data)
+1.2 q.au (65.22.196.1)
+1.2.1 ns-a.hansenits.com -- resolving
+1.2.1.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.2.1 ns-a.hansenits.com (110.173.233.130,No data) -- completed earlier (1.1.1)
+1.2.2 ns-c.hansenits.com -- resolving
+1.2.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.2.2 ns-c.hansenits.com (13.54.63.231,No data) -- completed earlier (1.1.2)
+1.2.3 ns-b.hansenits.com -- resolving
+1.2.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.2.3 ns-b.hansenits.com (110.173.233.132,No data) -- completed earlier (1.1.3)
+1.3 t.au (65.22.199.1)
+1.3.1 ns-a.hansenits.com -- resolving
+1.3.1.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.3.1 ns-a.hansenits.com (110.173.233.130,No data) -- completed earlier (1.1.1)
+1.3.2 ns-b.hansenits.com -- resolving
+1.3.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.3.2 ns-b.hansenits.com (110.173.233.132,No data) -- completed earlier (1.1.3)
+1.3.3 ns-c.hansenits.com -- resolving
+1.3.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.3.3 ns-c.hansenits.com (13.54.63.231,No data) -- completed earlier (1.1.2)
+1.4 s.au (65.22.198.1)
+1.4.1 ns-b.hansenits.com -- resolving
+1.4.1.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.4.1 ns-b.hansenits.com (110.173.233.132,No data) -- completed earlier (1.1.3)
+1.4.2 ns-c.hansenits.com -- resolving
+1.4.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.4.2 ns-c.hansenits.com (13.54.63.231,No data) -- completed earlier (1.1.2)
+1.4.3 ns-a.hansenits.com -- resolving
+1.4.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.4.3 ns-a.hansenits.com (110.173.233.130,No data) -- completed earlier (1.1.1)
+1.5 a.au (58.65.254.1)
+1.5.1 ns-b.hansenits.com -- resolving
+1.5.1.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.5.1 ns-b.hansenits.com (110.173.233.132,No data) -- completed earlier (1.1.3)
+1.5.2 ns-c.hansenits.com -- resolving
+1.5.2.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.5.2 ns-c.hansenits.com (13.54.63.231,No data) -- completed earlier (1.1.2)
+1.5.3 ns-a.hansenits.com -- resolving
+1.5.3.0.1 g.root-servers.net (192.112.36.4) -- completed earlier
+1.5.3 ns-a.hansenits.com (110.173.233.130,No data) -- completed earlier (1.1.1)
+
+Results:
+ 31.9%: Answer from ns-a.hansenits.com (110.173.233.130)
+ hansenits.com.au. 1400 IN A 13.54.63.231
+
+ 31.9%: Answer from ns-b.hansenits.com (110.173.233.132)
+ hansenits.com.au. 1400 IN A 13.54.63.231
+
+ 31.9%: Answer from ns-c.hansenits.com (13.54.63.231)
+ hansenits.com.au. 1400 IN A 13.54.63.231
+
+ 4.2%: NODATA (for this type) at b0.org.afilias-nst.org (199.19.54.1)
+ While querying ns-1168.awsdns-18.org/IN/A
+
+Summary Results:
+ 95.8% answered with hansenits.com.au. 1400 IN A 13.54.63.231
+ 4.2% found no such record
diff --git a/docs/captures/dnstraverse-ruby-nxdomain.hansenits.com.au-A.txt b/docs/captures/dnstraverse-ruby-nxdomain.hansenits.com.au-A.txt
new file mode 100644
index 0000000..00b5d16
--- /dev/null
+++ b/docs/captures/dnstraverse-ruby-nxdomain.hansenits.com.au-A.txt
@@ -0,0 +1,53 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using l.root-servers.net (199.7.83.42) as initial root
+Running query doesnotexist-exploredns-test.hansenits.com.au type a
+1 l.root-servers.net (199.7.83.42)
+1.1 a.au (58.65.254.1)
+1.1.1 ns-a.hansenits.com -- resolving
+1.1.1 ns-a.hansenits.com (110.173.233.130)
+1.1.2 ns-b.hansenits.com -- resolving
+1.1.2 ns-b.hansenits.com (110.173.233.132)
+1.1.3 ns-c.hansenits.com -- resolving
+1.1.3 ns-c.hansenits.com (13.54.63.231)
+1.2 q.au (65.22.196.1)
+1.2.1 ns-a.hansenits.com -- resolving
+1.2.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.2.2 ns-c.hansenits.com -- resolving
+1.2.2 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.2.3 ns-b.hansenits.com -- resolving
+1.2.3 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.3 r.au (65.22.197.1)
+1.3.1 ns-c.hansenits.com -- resolving
+1.3.1 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.3.2 ns-b.hansenits.com -- resolving
+1.3.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.3.3 ns-a.hansenits.com -- resolving
+1.3.3 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.4 s.au (65.22.198.1)
+1.4.1 ns-a.hansenits.com -- resolving
+1.4.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.4.2 ns-b.hansenits.com -- resolving
+1.4.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.4.3 ns-c.hansenits.com -- resolving
+1.4.3 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.5 t.au (65.22.199.1)
+1.5.1 ns-a.hansenits.com -- resolving
+1.5.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.5.2 ns-b.hansenits.com -- resolving
+1.5.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.5.3 ns-c.hansenits.com -- resolving
+1.5.3 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+
+Results:
+ 33.3%: No such domain (NXDOMAIN) at ns-a.hansenits.com (110.173.233.130)
+
+ 33.3%: No such domain (NXDOMAIN) at ns-b.hansenits.com (110.173.233.132)
+
+ 33.3%: No such domain (NXDOMAIN) at ns-c.hansenits.com (13.54.63.231)
+
+Summary Results:
+ 100% resulted in an error
diff --git a/docs/captures/dnstraverse-ruby-testcname.yellowtealpurple.net-A.txt b/docs/captures/dnstraverse-ruby-testcname.yellowtealpurple.net-A.txt
new file mode 100644
index 0000000..c97af19
--- /dev/null
+++ b/docs/captures/dnstraverse-ruby-testcname.yellowtealpurple.net-A.txt
@@ -0,0 +1,112 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using e.root-servers.net (192.203.230.10) as initial root
+Running query testcname.yellowtealpurple.net type a
+1 e.root-servers.net (192.203.230.10)
+1.1 a.gtld-servers.net (192.5.6.30)
+1.1.1 ns1.dreamhost.com -- resolving
+1.1.1 ns1.dreamhost.com (162.159.26.14)
+1.1.2 ns2.dreamhost.com -- resolving
+1.1.2 ns2.dreamhost.com (162.159.26.81)
+1.1.3 ns3.dreamhost.com -- resolving
+1.1.3 ns3.dreamhost.com (162.159.27.84)
+1.2 b.gtld-servers.net (192.33.14.30)
+1.2.1 ns1.dreamhost.com -- resolving
+1.2.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.2.2 ns2.dreamhost.com -- resolving
+1.2.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.2.3 ns3.dreamhost.com -- resolving
+1.2.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.3 c.gtld-servers.net (192.26.92.30)
+1.3.1 ns1.dreamhost.com -- resolving
+1.3.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.3.2 ns2.dreamhost.com -- resolving
+1.3.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.3.3 ns3.dreamhost.com -- resolving
+1.3.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.4 d.gtld-servers.net (192.31.80.30)
+1.4.1 ns1.dreamhost.com -- resolving
+1.4.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.4.2 ns2.dreamhost.com -- resolving
+1.4.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.4.3 ns3.dreamhost.com -- resolving
+1.4.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.5 e.gtld-servers.net (192.12.94.30)
+1.5.1 ns1.dreamhost.com -- resolving
+1.5.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.5.2 ns2.dreamhost.com -- resolving
+1.5.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.5.3 ns3.dreamhost.com -- resolving
+1.5.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.6 f.gtld-servers.net (192.35.51.30)
+1.6.1 ns1.dreamhost.com -- resolving
+1.6.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.6.2 ns2.dreamhost.com -- resolving
+1.6.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.6.3 ns3.dreamhost.com -- resolving
+1.6.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.7 g.gtld-servers.net (192.42.93.30)
+1.7.1 ns1.dreamhost.com -- resolving
+1.7.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.7.2 ns2.dreamhost.com -- resolving
+1.7.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.7.3 ns3.dreamhost.com -- resolving
+1.7.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.8 h.gtld-servers.net (192.54.112.30)
+1.8.1 ns1.dreamhost.com -- resolving
+1.8.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.8.2 ns2.dreamhost.com -- resolving
+1.8.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.8.3 ns3.dreamhost.com -- resolving
+1.8.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.9 i.gtld-servers.net (192.43.172.30)
+1.9.1 ns1.dreamhost.com -- resolving
+1.9.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.9.2 ns2.dreamhost.com -- resolving
+1.9.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.9.3 ns3.dreamhost.com -- resolving
+1.9.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.10 j.gtld-servers.net (192.48.79.30)
+1.10.1 ns1.dreamhost.com -- resolving
+1.10.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.10.2 ns2.dreamhost.com -- resolving
+1.10.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.10.3 ns3.dreamhost.com -- resolving
+1.10.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.11 k.gtld-servers.net (192.52.178.30)
+1.11.1 ns1.dreamhost.com -- resolving
+1.11.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.11.2 ns2.dreamhost.com -- resolving
+1.11.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.11.3 ns3.dreamhost.com -- resolving
+1.11.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.12 l.gtld-servers.net (192.41.162.30)
+1.12.1 ns1.dreamhost.com -- resolving
+1.12.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.12.2 ns2.dreamhost.com -- resolving
+1.12.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.12.3 ns3.dreamhost.com -- resolving
+1.12.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.13 m.gtld-servers.net (192.55.83.30)
+1.13.1 ns1.dreamhost.com -- resolving
+1.13.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.13.2 ns2.dreamhost.com -- resolving
+1.13.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.13.3 ns3.dreamhost.com -- resolving
+1.13.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+
+Results:
+ 33.3%: Answer from ns1.dreamhost.com (162.159.26.14)
+ yellowtealpurple.net. 60 IN A 69.163.142.106
+
+ 33.3%: Answer from ns2.dreamhost.com (162.159.26.81)
+ yellowtealpurple.net. 60 IN A 69.163.142.106
+
+ 33.3%: Answer from ns3.dreamhost.com (162.159.27.84)
+ yellowtealpurple.net. 60 IN A 69.163.142.106
+
+Summary Results:
+ 100% answered with yellowtealpurple.net. 60 IN A 69.163.142.106
diff --git a/docs/captures/dnstraverse-ruby-www.example.com-A-verbose.txt b/docs/captures/dnstraverse-ruby-www.example.com-A-verbose.txt
new file mode 100644
index 0000000..1c8c219
--- /dev/null
+++ b/docs/captures/dnstraverse-ruby-www.example.com-A-verbose.txt
@@ -0,0 +1,76 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using b.root-servers.net (170.247.170.2) as initial root
+Running query www.example.com type a
+1 [www.example.com] b.root-servers.net (170.247.170.2) <>
+1.1 [www.example.com] a.gtld-servers.net (192.5.6.30)
+1.1.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162)
+1.1.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228)
+1.2 [www.example.com] b.gtld-servers.net (192.33.14.30)
+1.2.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.2.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.3 [www.example.com] c.gtld-servers.net (192.26.92.30)
+1.3.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.3.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.4 [www.example.com] d.gtld-servers.net (192.31.80.30)
+1.4.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.4.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.5 [www.example.com] e.gtld-servers.net (192.12.94.30)
+1.5.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.5.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.6 [www.example.com] f.gtld-servers.net (192.35.51.30)
+1.6.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.6.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.7 [www.example.com] g.gtld-servers.net (192.42.93.30)
+1.7.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.7.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.8 [www.example.com] h.gtld-servers.net (192.54.112.30)
+1.8.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.8.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.9 [www.example.com] i.gtld-servers.net (192.43.172.30)
+1.9.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.9.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.10 [www.example.com] j.gtld-servers.net (192.48.79.30)
+1.10.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.10.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.11 [www.example.com] k.gtld-servers.net (192.52.178.30)
+1.11.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.11.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.12 [www.example.com] l.gtld-servers.net (192.41.162.30)
+1.12.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.12.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.13 [www.example.com] m.gtld-servers.net (192.55.83.30)
+1.13.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.13.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+
+Results:
+ 16.7%: Answer from hera.ns.cloudflare.com (108.162.192.162)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (108.162.195.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (162.159.44.228)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+ 16.7%: Answer from hera.ns.cloudflare.com (172.64.32.162)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (172.64.35.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from hera.ns.cloudflare.com (173.245.58.162)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+Summary Results:
+ 100% answered with www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
diff --git a/docs/captures/dnstraverse-ruby-www.example.com-A.txt b/docs/captures/dnstraverse-ruby-www.example.com-A.txt
new file mode 100644
index 0000000..f8d6c69
--- /dev/null
+++ b/docs/captures/dnstraverse-ruby-www.example.com-A.txt
@@ -0,0 +1,98 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using m.root-servers.net (202.12.27.33) as initial root
+Running query www.example.com type a
+1 m.root-servers.net (202.12.27.33)
+1.1 c.gtld-servers.net (192.26.92.30)
+1.1.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162)
+1.1.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228)
+1.2 b.gtld-servers.net (192.33.14.30)
+1.2.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.2.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.3 k.gtld-servers.net (192.52.178.30)
+1.3.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.3.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.4 h.gtld-servers.net (192.54.112.30)
+1.4.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.4.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.5 a.gtld-servers.net (192.5.6.30)
+1.5.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.5.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.6 f.gtld-servers.net (192.35.51.30)
+1.6.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.6.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.7 d.gtld-servers.net (192.31.80.30)
+1.7.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.7.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.8 g.gtld-servers.net (192.42.93.30)
+1.8.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.8.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.9 m.gtld-servers.net (192.55.83.30)
+1.9.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.9.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.10 j.gtld-servers.net (192.48.79.30)
+1.10.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.10.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.11 e.gtld-servers.net (192.12.94.30)
+1.11.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.11.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.12 l.gtld-servers.net (192.41.162.30)
+1.12.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.12.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.13 i.gtld-servers.net (192.43.172.30)
+1.13.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.13.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+
+The following servers were encountered:
+ hera.ns.cloudflare.com: 108.162.192.162 No match found
+ hera.ns.cloudflare.com: 172.64.32.162 No match found
+ hera.ns.cloudflare.com: 173.245.58.162 No match found
+elliott.ns.cloudflare.com: 108.162.195.228 No match found
+elliott.ns.cloudflare.com: 162.159.44.228 No match found
+elliott.ns.cloudflare.com: 172.64.35.228 No match found
+ a.gtld-servers.net: 192.5.6.30 TIMEOUT
+ b.gtld-servers.net: 192.33.14.30 TIMEOUT
+ c.gtld-servers.net: 192.26.92.30 VeriSign ATLAS (ATLAS)
+ d.gtld-servers.net: 192.31.80.30 VeriSign ATLAS (ATLAS)
+ e.gtld-servers.net: 192.12.94.30 VeriSign ATLAS (ATLAS)
+ f.gtld-servers.net: 192.35.51.30 VeriSign ATLAS (ATLAS)
+ g.gtld-servers.net: 192.42.93.30 VeriSign ATLAS (ATLAS)
+ h.gtld-servers.net: 192.54.112.30 VeriSign ATLAS (ATLAS)
+ i.gtld-servers.net: 192.43.172.30 VeriSign ATLAS (ATLAS)
+ j.gtld-servers.net: 192.48.79.30 VeriSign ATLAS (ATLAS)
+ k.gtld-servers.net: 192.52.178.30 VeriSign ATLAS (ATLAS)
+ l.gtld-servers.net: 192.41.162.30 VeriSign ATLAS (ATLAS)
+ m.gtld-servers.net: 192.55.83.30 VeriSign ATLAS (ATLAS)
+ m.root-servers.net: 202.12.27.33 Meilof Veeningen Posadis (9.16)
+
+Results:
+ 16.7%: Answer from hera.ns.cloudflare.com (108.162.192.162)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (108.162.195.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (162.159.44.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from hera.ns.cloudflare.com (172.64.32.162)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (172.64.35.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from hera.ns.cloudflare.com (173.245.58.162)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+Summary Results:
+ 100% answered with www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
diff --git a/docs/captures/exploredns-go-doesnotexist-exploredns-test.hansenits.com.au-A.txt b/docs/captures/exploredns-go-doesnotexist-exploredns-test.hansenits.com.au-A.txt
new file mode 100644
index 0000000..833a582
--- /dev/null
+++ b/docs/captures/exploredns-go-doesnotexist-exploredns-test.hansenits.com.au-A.txt
@@ -0,0 +1,53 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using m.root-servers.net (202.12.27.33) as initial root
+Running query doesnotexist-exploredns-test.hansenits.com.au type a
+1 m.root-servers.net (202.12.27.33)
+1.1 t.au (65.22.199.1)
+1.1.1 ns-a.hansenits.com -- resolving
+1.1.1 ns-a.hansenits.com (110.173.233.130)
+1.1.2 ns-b.hansenits.com -- resolving
+1.1.2 ns-b.hansenits.com (110.173.233.132)
+1.1.3 ns-c.hansenits.com -- resolving
+1.1.3 ns-c.hansenits.com (13.54.63.231)
+1.2 a.au (58.65.254.1)
+1.2.1 ns-a.hansenits.com -- resolving
+1.2.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.2.2 ns-c.hansenits.com -- resolving
+1.2.2 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.2.3 ns-b.hansenits.com -- resolving
+1.2.3 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.3 q.au (65.22.196.1)
+1.3.1 ns-b.hansenits.com -- resolving
+1.3.1 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.3.2 ns-a.hansenits.com -- resolving
+1.3.2 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.3.3 ns-c.hansenits.com -- resolving
+1.3.3 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.4 r.au (65.22.197.1)
+1.4.1 ns-a.hansenits.com -- resolving
+1.4.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.4.2 ns-b.hansenits.com -- resolving
+1.4.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.4.3 ns-c.hansenits.com -- resolving
+1.4.3 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.5 s.au (65.22.198.1)
+1.5.1 ns-c.hansenits.com -- resolving
+1.5.1 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.5.2 ns-a.hansenits.com -- resolving
+1.5.2 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.5.3 ns-b.hansenits.com -- resolving
+1.5.3 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+
+Results:
+ 33.3%: No such domain (NXDOMAIN) at ns-a.hansenits.com (110.173.233.130)
+
+ 33.3%: No such domain (NXDOMAIN) at ns-b.hansenits.com (110.173.233.132)
+
+ 33.3%: No such domain (NXDOMAIN) at ns-c.hansenits.com (13.54.63.231)
+
+Summary Results:
+ 100% resulted in an error
diff --git a/docs/captures/exploredns-go-example.com-MX.txt b/docs/captures/exploredns-go-example.com-MX.txt
new file mode 100644
index 0000000..3971640
--- /dev/null
+++ b/docs/captures/exploredns-go-example.com-MX.txt
@@ -0,0 +1,69 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using e.root-servers.net (192.203.230.10) as initial root
+Running query example.com type MX
+1 e.root-servers.net (192.203.230.10)
+1.1 a.gtld-servers.net (192.5.6.30)
+1.1.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162)
+1.1.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228)
+1.2 b.gtld-servers.net (192.33.14.30)
+1.2.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.2.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.3 c.gtld-servers.net (192.26.92.30)
+1.3.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.3.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.4 d.gtld-servers.net (192.31.80.30)
+1.4.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.4.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.5 e.gtld-servers.net (192.12.94.30)
+1.5.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.5.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.6 f.gtld-servers.net (192.35.51.30)
+1.6.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.6.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.7 g.gtld-servers.net (192.42.93.30)
+1.7.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.7.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.8 h.gtld-servers.net (192.54.112.30)
+1.8.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.8.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.9 i.gtld-servers.net (192.43.172.30)
+1.9.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.9.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.10 j.gtld-servers.net (192.48.79.30)
+1.10.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.10.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.11 k.gtld-servers.net (192.52.178.30)
+1.11.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.11.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.12 l.gtld-servers.net (192.41.162.30)
+1.12.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.12.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.13 m.gtld-servers.net (192.55.83.30)
+1.13.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.13.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+
+Results:
+ 16.7%: Answer from hera.ns.cloudflare.com (108.162.192.162)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (108.162.195.228)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (162.159.44.228)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from hera.ns.cloudflare.com (172.64.32.162)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (172.64.35.228)
+ example.com. 300 IN MX 0 .
+
+ 16.7%: Answer from hera.ns.cloudflare.com (173.245.58.162)
+ example.com. 300 IN MX 0 .
+
+Summary Results:
+ 100% answered with example.com. 300 IN MX 0 .
diff --git a/docs/captures/exploredns-go-hansenits.com.au-A.txt b/docs/captures/exploredns-go-hansenits.com.au-A.txt
new file mode 100644
index 0000000..f973e58
--- /dev/null
+++ b/docs/captures/exploredns-go-hansenits.com.au-A.txt
@@ -0,0 +1,635 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using h.root-servers.net (198.97.190.53) as initial root
+Running query hansenits.com.au type a
+1 h.root-servers.net (198.97.190.53)
+1.1 a.au (58.65.254.1)
+1.1.1 ns-a.hansenits.com -- resolving
+1.1.1.0.1 h.root-servers.net (198.97.190.53)
+1.1.1.0.1.1 a.gtld-servers.net (192.5.6.30)
+1.1.1.0.1.1.1 ns-101.awsdns-12.com (205.251.192.101)
+1.1.1.0.1.1.2 ns-639.awsdns-15.net
+1.1.1.0.1.1.2.0.1 h.root-servers.net (198.97.190.53)
+1.1.1.0.1.1.2.0.1.1 a.gtld-servers.net (192.5.6.30)
+1.1.1.0.1.1.2.0.1.1.1 g-ns-464.awsdns-15.net (205.251.193.208)
+1.1.1.0.1.1.2.0.1.1.2 g-ns-785.awsdns-15.net (205.251.195.17)
+1.1.1.0.1.1.2.0.1.1.3 g-ns-1359.awsdns-15.net (205.251.197.79)
+1.1.1.0.1.1.2.0.1.1.4 g-ns-1935.awsdns-15.net (205.251.199.143)
+1.1.1.0.1.1.2.0.1.2 b.gtld-servers.net (192.33.14.30)
+1.1.1.0.1.1.2.0.1.2.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.2.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.2.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.2.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.3 c.gtld-servers.net (192.26.92.30)
+1.1.1.0.1.1.2.0.1.3.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.3.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.3.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.3.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.4 d.gtld-servers.net (192.31.80.30)
+1.1.1.0.1.1.2.0.1.4.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.4.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.4.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.4.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.5 e.gtld-servers.net (192.12.94.30)
+1.1.1.0.1.1.2.0.1.5.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.5.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.5.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.5.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.6 f.gtld-servers.net (192.35.51.30)
+1.1.1.0.1.1.2.0.1.6.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.6.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.6.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.6.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.7 g.gtld-servers.net (192.42.93.30)
+1.1.1.0.1.1.2.0.1.7.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.7.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.7.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.7.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.8 h.gtld-servers.net (192.54.112.30)
+1.1.1.0.1.1.2.0.1.8.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.8.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.8.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.8.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.9 i.gtld-servers.net (192.43.172.30)
+1.1.1.0.1.1.2.0.1.9.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.9.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.9.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.9.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.10 j.gtld-servers.net (192.48.79.30)
+1.1.1.0.1.1.2.0.1.10.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.10.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.10.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.10.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.11 k.gtld-servers.net (192.52.178.30)
+1.1.1.0.1.1.2.0.1.11.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.11.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.11.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.11.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.12 l.gtld-servers.net (192.41.162.30)
+1.1.1.0.1.1.2.0.1.12.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.12.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.12.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.12.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2.0.1.13 m.gtld-servers.net (192.55.83.30)
+1.1.1.0.1.1.2.0.1.13.1 g-ns-464.awsdns-15.net (205.251.193.208) -- completed earlier
+1.1.1.0.1.1.2.0.1.13.2 g-ns-785.awsdns-15.net (205.251.195.17) -- completed earlier
+1.1.1.0.1.1.2.0.1.13.3 g-ns-1359.awsdns-15.net (205.251.197.79) -- completed earlier
+1.1.1.0.1.1.2.0.1.13.4 g-ns-1935.awsdns-15.net (205.251.199.143) -- completed earlier
+1.1.1.0.1.1.2 ns-639.awsdns-15.net (205.251.194.127)
+1.1.1.0.1.1.3 ns-1168.awsdns-18.org
+1.1.1.0.1.1.3.0.1 h.root-servers.net (198.97.190.53)
+1.1.1.0.1.1.3.0.1.1 a0.org.afilias-nst.info (199.19.56.1)
+1.1.1.0.1.1.3.0.1.1.1 g-ns-146.awsdns-18.org (205.251.192.146)
+1.1.1.0.1.1.3.0.1.1.2 g-ns-1045.awsdns-18.org (205.251.196.21)
+1.1.1.0.1.1.3.0.1.1.3 g-ns-724.awsdns-18.org (205.251.194.212)
+1.1.1.0.1.1.3.0.1.1.4 g-ns-1618.awsdns-18.org (205.251.198.82)
+1.1.1.0.1.1.3.0.1.2 a2.org.afilias-nst.info (199.249.112.1)
+1.1.1.0.1.1.3.0.1.2.1 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.2.2 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.2.3 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.2.4 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.3 b0.org.afilias-nst.org (199.19.54.1)
+1.1.1.0.1.1.3.0.1.3.1 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.3.2 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.3.3 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.3.4 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.4 b2.org.afilias-nst.org (199.249.120.1)
+1.1.1.0.1.1.3.0.1.4.1 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.4.2 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.4.3 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.4.4 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.5 c0.org.afilias-nst.info (199.19.53.1)
+1.1.1.0.1.1.3.0.1.5.1 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.5.2 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.5.3 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.5.4 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3.0.1.6 d0.org.afilias-nst.org (199.19.57.1)
+1.1.1.0.1.1.3.0.1.6.1 g-ns-1045.awsdns-18.org (205.251.196.21) -- completed earlier
+1.1.1.0.1.1.3.0.1.6.2 g-ns-146.awsdns-18.org (205.251.192.146) -- completed earlier
+1.1.1.0.1.1.3.0.1.6.3 g-ns-724.awsdns-18.org (205.251.194.212) -- completed earlier
+1.1.1.0.1.1.3.0.1.6.4 g-ns-1618.awsdns-18.org (205.251.198.82) -- completed earlier
+1.1.1.0.1.1.3 ns-1168.awsdns-18.org (205.251.196.144)
+1.1.1.0.1.1.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.1.4.0.1 h.root-servers.net (198.97.190.53)
+1.1.1.0.1.1.4.0.1.1 nsa.nic.uk (156.154.100.3)
+1.1.1.0.1.1.4.0.1.1.1 g-ns-360.awsdns-40.co.uk (205.251.193.104)
+1.1.1.0.1.1.4.0.1.1.2 g-ns-1515.awsdns-40.co.uk (205.251.197.235)
+1.1.1.0.1.1.4.0.1.1.3 g-ns-936.awsdns-40.co.uk (205.251.195.168)
+1.1.1.0.1.1.4.0.1.1.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44)
+1.1.1.0.1.1.4.0.1.2 nsb.nic.uk (156.154.101.3)
+1.1.1.0.1.1.4.0.1.2.1 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.2.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.2.3 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.2.4 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.3 nsc.nic.uk (156.154.102.3)
+1.1.1.0.1.1.4.0.1.3.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.3.2 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.3.3 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.3.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.4 nsd.nic.uk (156.154.103.3)
+1.1.1.0.1.1.4.0.1.4.1 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.4.2 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.4.3 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.4.4 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.5 dns1.nic.uk (213.248.216.1)
+1.1.1.0.1.1.4.0.1.5.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.5.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.5.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.5.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.6 dns2.nic.uk (103.49.80.1)
+1.1.1.0.1.1.4.0.1.6.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.6.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.6.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.6.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.7 dns3.nic.uk (213.248.220.1)
+1.1.1.0.1.1.4.0.1.7.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.7.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.7.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.7.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4.0.1.8 dns4.nic.uk (43.230.48.1)
+1.1.1.0.1.1.4.0.1.8.1 g-ns-360.awsdns-40.co.uk (205.251.193.104) -- completed earlier
+1.1.1.0.1.1.4.0.1.8.2 g-ns-936.awsdns-40.co.uk (205.251.195.168) -- completed earlier
+1.1.1.0.1.1.4.0.1.8.3 g-ns-1515.awsdns-40.co.uk (205.251.197.235) -- completed earlier
+1.1.1.0.1.1.4.0.1.8.4 g-ns-1836.awsdns-40.co.uk (205.251.199.44) -- completed earlier
+1.1.1.0.1.1.4 ns-1863.awsdns-40.co.uk (205.251.199.71)
+1.1.1.0.1.2 b.gtld-servers.net (192.33.14.30)
+1.1.1.0.1.2.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.2.2 ns-639.awsdns-15.net
+1.1.1.0.1.2.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.2.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.2.3 ns-1168.awsdns-18.org
+1.1.1.0.1.2.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.2.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.2.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.2.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.2.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.3 c.gtld-servers.net (192.26.92.30)
+1.1.1.0.1.3.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.3.2 ns-639.awsdns-15.net
+1.1.1.0.1.3.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.3.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.3.3 ns-1168.awsdns-18.org
+1.1.1.0.1.3.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.3.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.3.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.3.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.3.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.4 d.gtld-servers.net (192.31.80.30)
+1.1.1.0.1.4.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.4.2 ns-639.awsdns-15.net
+1.1.1.0.1.4.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.4.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.4.3 ns-1168.awsdns-18.org
+1.1.1.0.1.4.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.4.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.4.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.4.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.4.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.5 e.gtld-servers.net (192.12.94.30)
+1.1.1.0.1.5.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.5.2 ns-639.awsdns-15.net
+1.1.1.0.1.5.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.5.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.5.3 ns-1168.awsdns-18.org
+1.1.1.0.1.5.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.5.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.5.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.5.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.5.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.6 f.gtld-servers.net (192.35.51.30)
+1.1.1.0.1.6.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.6.2 ns-639.awsdns-15.net
+1.1.1.0.1.6.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.6.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.6.3 ns-1168.awsdns-18.org
+1.1.1.0.1.6.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.6.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.6.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.6.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.6.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.7 g.gtld-servers.net (192.42.93.30)
+1.1.1.0.1.7.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.7.2 ns-639.awsdns-15.net
+1.1.1.0.1.7.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.7.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.7.3 ns-1168.awsdns-18.org
+1.1.1.0.1.7.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.7.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.7.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.7.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.7.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.8 h.gtld-servers.net (192.54.112.30)
+1.1.1.0.1.8.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.8.2 ns-639.awsdns-15.net
+1.1.1.0.1.8.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.8.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.8.3 ns-1168.awsdns-18.org
+1.1.1.0.1.8.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.8.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.8.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.8.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.8.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.9 i.gtld-servers.net (192.43.172.30)
+1.1.1.0.1.9.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.9.2 ns-639.awsdns-15.net
+1.1.1.0.1.9.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.9.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.9.3 ns-1168.awsdns-18.org
+1.1.1.0.1.9.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.9.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.9.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.9.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.9.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.10 j.gtld-servers.net (192.48.79.30)
+1.1.1.0.1.10.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.10.2 ns-639.awsdns-15.net
+1.1.1.0.1.10.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.10.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.10.3 ns-1168.awsdns-18.org
+1.1.1.0.1.10.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.10.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.10.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.10.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.10.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.11 k.gtld-servers.net (192.52.178.30)
+1.1.1.0.1.11.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.11.2 ns-639.awsdns-15.net
+1.1.1.0.1.11.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.11.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.11.3 ns-1168.awsdns-18.org
+1.1.1.0.1.11.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.11.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.11.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.11.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.11.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.12 l.gtld-servers.net (192.41.162.30)
+1.1.1.0.1.12.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.12.2 ns-639.awsdns-15.net
+1.1.1.0.1.12.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.12.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.12.3 ns-1168.awsdns-18.org
+1.1.1.0.1.12.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.12.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.12.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.12.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.12.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1.0.1.13 m.gtld-servers.net (192.55.83.30)
+1.1.1.0.1.13.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.1.0.1.13.2 ns-639.awsdns-15.net
+1.1.1.0.1.13.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.13.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.1.0.1.13.3 ns-1168.awsdns-18.org
+1.1.1.0.1.13.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.13.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.1.0.1.13.4 ns-1863.awsdns-40.co.uk
+1.1.1.0.1.13.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.1.0.1.13.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.1 ns-a.hansenits.com (110.173.233.130)
+1.1.2 ns-b.hansenits.com -- resolving
+1.1.2.0.1 h.root-servers.net (198.97.190.53)
+1.1.2.0.1.1 a.gtld-servers.net (192.5.6.30)
+1.1.2.0.1.1.1 ns-101.awsdns-12.com (205.251.192.101)
+1.1.2.0.1.1.2 ns-639.awsdns-15.net
+1.1.2.0.1.1.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.1.2 ns-639.awsdns-15.net (205.251.194.127)
+1.1.2.0.1.1.3 ns-1168.awsdns-18.org
+1.1.2.0.1.1.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.1.3 ns-1168.awsdns-18.org (205.251.196.144)
+1.1.2.0.1.1.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.1.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.1.4 ns-1863.awsdns-40.co.uk (205.251.199.71)
+1.1.2.0.1.2 b.gtld-servers.net (192.33.14.30)
+1.1.2.0.1.2.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.2.2 ns-639.awsdns-15.net
+1.1.2.0.1.2.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.2.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.2.3 ns-1168.awsdns-18.org
+1.1.2.0.1.2.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.2.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.2.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.2.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.2.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.3 c.gtld-servers.net (192.26.92.30)
+1.1.2.0.1.3.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.3.2 ns-639.awsdns-15.net
+1.1.2.0.1.3.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.3.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.3.3 ns-1168.awsdns-18.org
+1.1.2.0.1.3.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.3.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.3.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.3.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.3.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.4 d.gtld-servers.net (192.31.80.30)
+1.1.2.0.1.4.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.4.2 ns-639.awsdns-15.net
+1.1.2.0.1.4.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.4.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.4.3 ns-1168.awsdns-18.org
+1.1.2.0.1.4.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.4.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.4.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.4.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.4.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.5 e.gtld-servers.net (192.12.94.30)
+1.1.2.0.1.5.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.5.2 ns-639.awsdns-15.net
+1.1.2.0.1.5.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.5.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.5.3 ns-1168.awsdns-18.org
+1.1.2.0.1.5.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.5.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.5.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.5.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.5.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.6 f.gtld-servers.net (192.35.51.30)
+1.1.2.0.1.6.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.6.2 ns-639.awsdns-15.net
+1.1.2.0.1.6.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.6.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.6.3 ns-1168.awsdns-18.org
+1.1.2.0.1.6.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.6.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.6.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.6.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.6.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.7 g.gtld-servers.net (192.42.93.30)
+1.1.2.0.1.7.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.7.2 ns-639.awsdns-15.net
+1.1.2.0.1.7.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.7.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.7.3 ns-1168.awsdns-18.org
+1.1.2.0.1.7.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.7.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.7.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.7.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.7.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.8 h.gtld-servers.net (192.54.112.30)
+1.1.2.0.1.8.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.8.2 ns-639.awsdns-15.net
+1.1.2.0.1.8.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.8.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.8.3 ns-1168.awsdns-18.org
+1.1.2.0.1.8.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.8.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.8.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.8.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.8.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.9 i.gtld-servers.net (192.43.172.30)
+1.1.2.0.1.9.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.9.2 ns-639.awsdns-15.net
+1.1.2.0.1.9.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.9.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.9.3 ns-1168.awsdns-18.org
+1.1.2.0.1.9.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.9.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.9.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.9.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.9.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.10 j.gtld-servers.net (192.48.79.30)
+1.1.2.0.1.10.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.10.2 ns-639.awsdns-15.net
+1.1.2.0.1.10.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.10.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.10.3 ns-1168.awsdns-18.org
+1.1.2.0.1.10.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.10.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.10.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.10.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.10.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.11 k.gtld-servers.net (192.52.178.30)
+1.1.2.0.1.11.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.11.2 ns-639.awsdns-15.net
+1.1.2.0.1.11.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.11.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.11.3 ns-1168.awsdns-18.org
+1.1.2.0.1.11.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.11.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.11.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.11.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.11.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.12 l.gtld-servers.net (192.41.162.30)
+1.1.2.0.1.12.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.12.2 ns-639.awsdns-15.net
+1.1.2.0.1.12.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.12.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.12.3 ns-1168.awsdns-18.org
+1.1.2.0.1.12.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.12.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.12.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.12.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.12.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2.0.1.13 m.gtld-servers.net (192.55.83.30)
+1.1.2.0.1.13.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.2.0.1.13.2 ns-639.awsdns-15.net
+1.1.2.0.1.13.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.13.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.2.0.1.13.3 ns-1168.awsdns-18.org
+1.1.2.0.1.13.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.13.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.2.0.1.13.4 ns-1863.awsdns-40.co.uk
+1.1.2.0.1.13.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.2.0.1.13.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.2 ns-b.hansenits.com (110.173.233.132)
+1.1.3 ns-c.hansenits.com -- resolving
+1.1.3.0.1 h.root-servers.net (198.97.190.53)
+1.1.3.0.1.1 a.gtld-servers.net (192.5.6.30)
+1.1.3.0.1.1.1 ns-101.awsdns-12.com (205.251.192.101)
+1.1.3.0.1.1.2 ns-639.awsdns-15.net
+1.1.3.0.1.1.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.1.2 ns-639.awsdns-15.net (205.251.194.127)
+1.1.3.0.1.1.3 ns-1168.awsdns-18.org
+1.1.3.0.1.1.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.1.3 ns-1168.awsdns-18.org (205.251.196.144)
+1.1.3.0.1.1.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.1.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.1.4 ns-1863.awsdns-40.co.uk (205.251.199.71)
+1.1.3.0.1.2 b.gtld-servers.net (192.33.14.30)
+1.1.3.0.1.2.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.2.2 ns-639.awsdns-15.net
+1.1.3.0.1.2.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.2.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.2.3 ns-1168.awsdns-18.org
+1.1.3.0.1.2.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.2.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.2.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.2.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.2.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.3 c.gtld-servers.net (192.26.92.30)
+1.1.3.0.1.3.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.3.2 ns-639.awsdns-15.net
+1.1.3.0.1.3.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.3.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.3.3 ns-1168.awsdns-18.org
+1.1.3.0.1.3.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.3.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.3.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.3.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.3.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.4 d.gtld-servers.net (192.31.80.30)
+1.1.3.0.1.4.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.4.2 ns-639.awsdns-15.net
+1.1.3.0.1.4.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.4.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.4.3 ns-1168.awsdns-18.org
+1.1.3.0.1.4.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.4.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.4.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.4.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.4.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.5 e.gtld-servers.net (192.12.94.30)
+1.1.3.0.1.5.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.5.2 ns-639.awsdns-15.net
+1.1.3.0.1.5.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.5.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.5.3 ns-1168.awsdns-18.org
+1.1.3.0.1.5.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.5.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.5.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.5.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.5.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.6 f.gtld-servers.net (192.35.51.30)
+1.1.3.0.1.6.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.6.2 ns-639.awsdns-15.net
+1.1.3.0.1.6.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.6.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.6.3 ns-1168.awsdns-18.org
+1.1.3.0.1.6.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.6.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.6.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.6.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.6.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.7 g.gtld-servers.net (192.42.93.30)
+1.1.3.0.1.7.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.7.2 ns-639.awsdns-15.net
+1.1.3.0.1.7.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.7.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.7.3 ns-1168.awsdns-18.org
+1.1.3.0.1.7.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.7.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.7.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.7.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.7.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.8 h.gtld-servers.net (192.54.112.30)
+1.1.3.0.1.8.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.8.2 ns-639.awsdns-15.net
+1.1.3.0.1.8.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.8.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.8.3 ns-1168.awsdns-18.org
+1.1.3.0.1.8.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.8.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.8.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.8.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.8.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.9 i.gtld-servers.net (192.43.172.30)
+1.1.3.0.1.9.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.9.2 ns-639.awsdns-15.net
+1.1.3.0.1.9.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.9.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.9.3 ns-1168.awsdns-18.org
+1.1.3.0.1.9.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.9.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.9.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.9.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.9.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.10 j.gtld-servers.net (192.48.79.30)
+1.1.3.0.1.10.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.10.2 ns-639.awsdns-15.net
+1.1.3.0.1.10.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.10.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.10.3 ns-1168.awsdns-18.org
+1.1.3.0.1.10.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.10.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.10.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.10.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.10.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.11 k.gtld-servers.net (192.52.178.30)
+1.1.3.0.1.11.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.11.2 ns-639.awsdns-15.net
+1.1.3.0.1.11.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.11.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.11.3 ns-1168.awsdns-18.org
+1.1.3.0.1.11.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.11.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.11.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.11.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.11.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.12 l.gtld-servers.net (192.41.162.30)
+1.1.3.0.1.12.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.12.2 ns-639.awsdns-15.net
+1.1.3.0.1.12.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.12.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.12.3 ns-1168.awsdns-18.org
+1.1.3.0.1.12.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.12.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.12.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.12.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.12.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3.0.1.13 m.gtld-servers.net (192.55.83.30)
+1.1.3.0.1.13.1 ns-101.awsdns-12.com (205.251.192.101) -- completed earlier
+1.1.3.0.1.13.2 ns-639.awsdns-15.net
+1.1.3.0.1.13.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.13.2 ns-639.awsdns-15.net (205.251.194.127) -- completed earlier
+1.1.3.0.1.13.3 ns-1168.awsdns-18.org
+1.1.3.0.1.13.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.13.3 ns-1168.awsdns-18.org (205.251.196.144) -- completed earlier
+1.1.3.0.1.13.4 ns-1863.awsdns-40.co.uk
+1.1.3.0.1.13.4.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.1.3.0.1.13.4 ns-1863.awsdns-40.co.uk (205.251.199.71) -- completed earlier
+1.1.3 ns-c.hansenits.com (13.54.63.231)
+1.2 q.au (65.22.196.1)
+1.2.1 ns-a.hansenits.com -- resolving
+1.2.1.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.2.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.2.2 ns-b.hansenits.com -- resolving
+1.2.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.2.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.2.3 ns-c.hansenits.com -- resolving
+1.2.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.2.3 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.3 r.au (65.22.197.1)
+1.3.1 ns-c.hansenits.com -- resolving
+1.3.1.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.3.1 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.3.2 ns-b.hansenits.com -- resolving
+1.3.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.3.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.3.3 ns-a.hansenits.com -- resolving
+1.3.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.3.3 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.4 s.au (65.22.198.1)
+1.4.1 ns-c.hansenits.com -- resolving
+1.4.1.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.4.1 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+1.4.2 ns-b.hansenits.com -- resolving
+1.4.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.4.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.4.3 ns-a.hansenits.com -- resolving
+1.4.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.4.3 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.5 t.au (65.22.199.1)
+1.5.1 ns-a.hansenits.com -- resolving
+1.5.1.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.5.1 ns-a.hansenits.com (110.173.233.130) -- completed earlier (1.1.1)
+1.5.2 ns-b.hansenits.com -- resolving
+1.5.2.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.5.2 ns-b.hansenits.com (110.173.233.132) -- completed earlier (1.1.2)
+1.5.3 ns-c.hansenits.com -- resolving
+1.5.3.0.1 h.root-servers.net (198.97.190.53) -- completed earlier
+1.5.3 ns-c.hansenits.com (13.54.63.231) -- completed earlier (1.1.3)
+
+Results:
+ 33.3%: Answer from ns-a.hansenits.com (110.173.233.130)
+ hansenits.com.au. 1400 IN A 13.54.63.231
+
+ 33.3%: Answer from ns-b.hansenits.com (110.173.233.132)
+ hansenits.com.au. 1400 IN A 13.54.63.231
+
+ 33.3%: Answer from ns-c.hansenits.com (13.54.63.231)
+ hansenits.com.au. 1400 IN A 13.54.63.231
+
+Summary Results:
+ 100% answered with hansenits.com.au. 1400 IN A 13.54.63.231
diff --git a/docs/captures/exploredns-go-testcname.yellowtealpurple.net-A.txt b/docs/captures/exploredns-go-testcname.yellowtealpurple.net-A.txt
new file mode 100644
index 0000000..502b560
--- /dev/null
+++ b/docs/captures/exploredns-go-testcname.yellowtealpurple.net-A.txt
@@ -0,0 +1,112 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using d.root-servers.net (199.7.91.13) as initial root
+Running query testcname.yellowtealpurple.net type a
+1 d.root-servers.net (199.7.91.13)
+1.1 a.gtld-servers.net (192.5.6.30)
+1.1.1 ns1.dreamhost.com -- resolving
+1.1.1 ns1.dreamhost.com (162.159.26.14)
+1.1.2 ns2.dreamhost.com -- resolving
+1.1.2 ns2.dreamhost.com (162.159.26.81)
+1.1.3 ns3.dreamhost.com -- resolving
+1.1.3 ns3.dreamhost.com (162.159.27.84)
+1.2 b.gtld-servers.net (192.33.14.30)
+1.2.1 ns1.dreamhost.com -- resolving
+1.2.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.2.2 ns2.dreamhost.com -- resolving
+1.2.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.2.3 ns3.dreamhost.com -- resolving
+1.2.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.3 c.gtld-servers.net (192.26.92.30)
+1.3.1 ns1.dreamhost.com -- resolving
+1.3.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.3.2 ns2.dreamhost.com -- resolving
+1.3.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.3.3 ns3.dreamhost.com -- resolving
+1.3.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.4 d.gtld-servers.net (192.31.80.30)
+1.4.1 ns1.dreamhost.com -- resolving
+1.4.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.4.2 ns2.dreamhost.com -- resolving
+1.4.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.4.3 ns3.dreamhost.com -- resolving
+1.4.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.5 e.gtld-servers.net (192.12.94.30)
+1.5.1 ns1.dreamhost.com -- resolving
+1.5.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.5.2 ns2.dreamhost.com -- resolving
+1.5.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.5.3 ns3.dreamhost.com -- resolving
+1.5.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.6 f.gtld-servers.net (192.35.51.30)
+1.6.1 ns1.dreamhost.com -- resolving
+1.6.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.6.2 ns2.dreamhost.com -- resolving
+1.6.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.6.3 ns3.dreamhost.com -- resolving
+1.6.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.7 g.gtld-servers.net (192.42.93.30)
+1.7.1 ns1.dreamhost.com -- resolving
+1.7.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.7.2 ns2.dreamhost.com -- resolving
+1.7.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.7.3 ns3.dreamhost.com -- resolving
+1.7.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.8 h.gtld-servers.net (192.54.112.30)
+1.8.1 ns1.dreamhost.com -- resolving
+1.8.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.8.2 ns2.dreamhost.com -- resolving
+1.8.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.8.3 ns3.dreamhost.com -- resolving
+1.8.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.9 i.gtld-servers.net (192.43.172.30)
+1.9.1 ns1.dreamhost.com -- resolving
+1.9.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.9.2 ns2.dreamhost.com -- resolving
+1.9.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.9.3 ns3.dreamhost.com -- resolving
+1.9.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.10 j.gtld-servers.net (192.48.79.30)
+1.10.1 ns1.dreamhost.com -- resolving
+1.10.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.10.2 ns2.dreamhost.com -- resolving
+1.10.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.10.3 ns3.dreamhost.com -- resolving
+1.10.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.11 k.gtld-servers.net (192.52.178.30)
+1.11.1 ns1.dreamhost.com -- resolving
+1.11.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.11.2 ns2.dreamhost.com -- resolving
+1.11.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.11.3 ns3.dreamhost.com -- resolving
+1.11.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.12 l.gtld-servers.net (192.41.162.30)
+1.12.1 ns1.dreamhost.com -- resolving
+1.12.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.12.2 ns2.dreamhost.com -- resolving
+1.12.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.12.3 ns3.dreamhost.com -- resolving
+1.12.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+1.13 m.gtld-servers.net (192.55.83.30)
+1.13.1 ns1.dreamhost.com -- resolving
+1.13.1 ns1.dreamhost.com (162.159.26.14) -- completed earlier (1.1.1)
+1.13.2 ns2.dreamhost.com -- resolving
+1.13.2 ns2.dreamhost.com (162.159.26.81) -- completed earlier (1.1.2)
+1.13.3 ns3.dreamhost.com -- resolving
+1.13.3 ns3.dreamhost.com (162.159.27.84) -- completed earlier (1.1.3)
+
+Results:
+ 33.3%: Answer from ns1.dreamhost.com (162.159.26.14)
+ yellowtealpurple.net. 60 IN A 69.163.142.106
+
+ 33.3%: Answer from ns2.dreamhost.com (162.159.26.81)
+ yellowtealpurple.net. 60 IN A 69.163.142.106
+
+ 33.3%: Answer from ns3.dreamhost.com (162.159.27.84)
+ yellowtealpurple.net. 60 IN A 69.163.142.106
+
+Summary Results:
+ 100% answered with yellowtealpurple.net. 60 IN A 69.163.142.106
diff --git a/docs/captures/exploredns-go-www.example.com-A-verbose.txt b/docs/captures/exploredns-go-www.example.com-A-verbose.txt
new file mode 100644
index 0000000..639ad4e
--- /dev/null
+++ b/docs/captures/exploredns-go-www.example.com-A-verbose.txt
@@ -0,0 +1,76 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using d.root-servers.net (199.7.91.13) as initial root
+Running query www.example.com type a
+1 [www.example.com] d.root-servers.net (199.7.91.13) <>
+1.1 [www.example.com] a.gtld-servers.net (192.5.6.30)
+1.1.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162)
+1.1.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228)
+1.2 [www.example.com] b.gtld-servers.net (192.33.14.30)
+1.2.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.2.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.3 [www.example.com] c.gtld-servers.net (192.26.92.30)
+1.3.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.3.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.4 [www.example.com] d.gtld-servers.net (192.31.80.30)
+1.4.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.4.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.5 [www.example.com] e.gtld-servers.net (192.12.94.30)
+1.5.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.5.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.6 [www.example.com] f.gtld-servers.net (192.35.51.30)
+1.6.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.6.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.7 [www.example.com] g.gtld-servers.net (192.42.93.30)
+1.7.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.7.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.8 [www.example.com] h.gtld-servers.net (192.54.112.30)
+1.8.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.8.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.9 [www.example.com] i.gtld-servers.net (192.43.172.30)
+1.9.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.9.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.10 [www.example.com] j.gtld-servers.net (192.48.79.30)
+1.10.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.10.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.11 [www.example.com] k.gtld-servers.net (192.52.178.30)
+1.11.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.11.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.12 [www.example.com] l.gtld-servers.net (192.41.162.30)
+1.12.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.12.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.13 [www.example.com] m.gtld-servers.net (192.55.83.30)
+1.13.1 [www.example.com] hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.13.2 [www.example.com] elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+
+Results:
+ 16.7%: Answer from hera.ns.cloudflare.com (108.162.192.162)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (108.162.195.228)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (162.159.44.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from hera.ns.cloudflare.com (172.64.32.162)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (172.64.35.228)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+ 16.7%: Answer from hera.ns.cloudflare.com (173.245.58.162)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+Summary Results:
+ 100% answered with www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
diff --git a/docs/captures/exploredns-go-www.example.com-A.txt b/docs/captures/exploredns-go-www.example.com-A.txt
new file mode 100644
index 0000000..4cda3ff
--- /dev/null
+++ b/docs/captures/exploredns-go-www.example.com-A.txt
@@ -0,0 +1,76 @@
+# Using fast mode
+# Limiting traverse to one root
+# UDP size 2048 (EDNS0 is on)
+# Retries 2, max depth 20
+# Allow TCP is true, always TCP is false
+Using e.root-servers.net (192.203.230.10) as initial root
+Running query www.example.com type a
+1 e.root-servers.net (192.203.230.10)
+1.1 a.gtld-servers.net (192.5.6.30)
+1.1.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162)
+1.1.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228)
+1.2 b.gtld-servers.net (192.33.14.30)
+1.2.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.2.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.3 c.gtld-servers.net (192.26.92.30)
+1.3.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.3.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.4 d.gtld-servers.net (192.31.80.30)
+1.4.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.4.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.5 e.gtld-servers.net (192.12.94.30)
+1.5.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.5.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.6 f.gtld-servers.net (192.35.51.30)
+1.6.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.6.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.7 g.gtld-servers.net (192.42.93.30)
+1.7.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.7.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.8 h.gtld-servers.net (192.54.112.30)
+1.8.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.8.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.9 i.gtld-servers.net (192.43.172.30)
+1.9.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.9.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.10 j.gtld-servers.net (192.48.79.30)
+1.10.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.10.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.11 k.gtld-servers.net (192.52.178.30)
+1.11.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.11.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.12 l.gtld-servers.net (192.41.162.30)
+1.12.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.12.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+1.13 m.gtld-servers.net (192.55.83.30)
+1.13.1 hera.ns.cloudflare.com (108.162.192.162,172.64.32.162,173.245.58.162) -- completed earlier (1.1.1)
+1.13.2 elliott.ns.cloudflare.com (108.162.195.228,162.159.44.228,172.64.35.228) -- completed earlier (1.1.2)
+
+Results:
+ 16.7%: Answer from hera.ns.cloudflare.com (108.162.192.162)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (108.162.195.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (162.159.44.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from hera.ns.cloudflare.com (172.64.32.162)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+ 16.7%: Answer from elliott.ns.cloudflare.com (172.64.35.228)
+ www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
+
+ 16.7%: Answer from hera.ns.cloudflare.com (173.245.58.162)
+ www.example.com. 300 IN A 172.66.147.243
+ www.example.com. 300 IN A 104.20.23.154
+
+Summary Results:
+ 100% answered with www.example.com. 300 IN A 104.20.23.154
+ www.example.com. 300 IN A 172.66.147.243
diff --git a/docs/codebase-review-2026-07-07.md b/docs/codebase-review-2026-07-07.md
new file mode 100644
index 0000000..1448d2f
--- /dev/null
+++ b/docs/codebase-review-2026-07-07.md
@@ -0,0 +1,91 @@
+# ExploreDNS Codebase Review
+
+## 1. What it is and how it's architected
+
+ExploreDNS (module `gitea.hansenits.com.au/hits/ExploreDNS`) is a Go rewrite of the Ruby `dnstraverse` tool. Its stated purpose: walk the DNS delegation tree from the root servers down, exploring *every* resolution path a real iterative resolver might take, assigning each branch a probability, and reporting per-path answers/failures plus server software fingerprints. It ships two binaries.
+
+**CLI path.** `cmd/exploredns/main.go` parses ~30 stdlib flags into `config.Config` (`internal/config/config.go:25-51`), validates ranges (config.go:112-140), then fans out into three engine configs — `dns.QueryConfig`, `dns.RootDiscoveryConfig`, `traverse.TraverserConfig` (main.go:150-171) — plus an `output.Config` (main.go:199-214). `output.RunTraversal` (internal/output/runner.go:12-45) attaches progress hooks, runs the traversal, fingerprints every encountered server IP via `version.bind` CHAOS TXT probes (internal/fingerprint/fingerprint.go), and renders either a streaming colored text tree (internal/output/text.go) or a buffered JSON document (internal/output/json.go).
+
+**The engine.** `internal/traverse/traverser.go` runs a LIFO work-stack loop (Traverse, traverser.go:88-202): discover roots via an upstream recursive resolver (internal/dns/roots.go, hardcoded IANA hints as fallback), pop a referral, query its addresses (`processReferral`, traverser.go:221-274), classify the response (internal/dns/decode.go:86-120), and on a referral push one child branch per NS name with probability = parent/N (internal/traverse/response.go:143-185, 248-256). Glue-less NS names are resolved first via a hardcoded local resolver at 127.0.0.1:53, then via a secondary from-root traversal (`ResolveNS`, traverser.go:276-410). `internal/dns/query.go` does the wire work: UDP with exponential backoff, TCP fallback on truncation, EDNS0 at 2048 bytes.
+
+**Web path.** `cmd/server` + `web/api` wrap the same engine as an async job service: POST `/api/traverse` spawns a goroutine and returns a job ID (handler.go:206-243), GET polls, GET `.../stream` delivers SSE progress, and an embedded single-file SPA (`web/api/static/index.html`, served via `go:embed`) is the UI. Jobs live in an in-memory map with a 1-hour TTL. Importantly, the web path builds its **own** hooks and serialization (handler.go:357-450) and bypasses `internal/output` and `internal/fingerprint` entirely — no dedup, no summary, no fingerprints in web results.
+
+## 2. Current health
+
+Green on the surface. `go build ./...`, `go vet ./...`, and the full test suite (`-race`, all seven packages) pass cleanly on go 1.26.4; `make build`/`build-server` produce working binaries and the repo stays clean. Live CLI runs work end-to-end (`./bin/exploredns example.com` produces a correct tree, fingerprints, and a 100%-answered summary in ~15-30s; NXDOMAIN and `--json` runs behave; exit 0). The web server serves the SPA, health endpoint, job creation, polling, and SSE correctly against real domains.
+
+CI (`.gitea/workflows/ci.yml`) runs vet/test/build with a pinned toolchain and Docker builds of both images; Dockerfiles, module path, and port config are all consistent. Two soft spots: the "coverage check" step (ci.yml:29-32) echoes an average but enforces nothing — it can never fail; and several tests hit the real network or 127.0.0.1:53 with self-skip guards (internal/traverse/coverage_test.go:328, internal/dns/resolver_test.go:466-471), so offline pass/skip counts silently differ. `internal/config/config_test.go:291-310` fails gofmt, uncaught because `make lint` is only `go vet` (Makefile:25).
+
+The critical caveat: the tests pass because **every traverse test injects a mock exchange**, which routes through a different code path (RD=0) than production traffic takes (RD=1) — see below. CI green does not mean the core behaviour is correct.
+
+## 3. Where reality diverges from the README (ranked by user impact)
+
+1. **"Full iterative traversal" is false — production queries are recursive.** `buildQuery` hardcodes `RecursionDesired=true` (internal/dns/query.go:221) and `dns.Query` never clears it. The RD=0 path (`IterativeQueryWithExchange`, query.go:146-155) is reached only when a test exchange is injected (traverser.go:416-419). `ensureRDFalse` (traverser.go:445-459) just flips the RD bit on the *response* — cosmetic — and its `t.exchange != nil` branch is unreachable. Any recursion-capable server on the path returns a final recursive answer, which `classify()` accepts as legitimate (decode.go:103-107), silently collapsing the traversal into a plain recursive lookup. This directly contradicts README:3-18 and the package doc (query.go:4-6), and is the single strongest candidate for "doesn't quite work the way I want."
+
+2. **"Follows every referral exhaustively" — only per NS *name*, and fragile per IP.** `processReferral` iterates a referral's addresses in order and returns the **first non-SERVFAIL** response (traverser.go:263-268). Only SERVFAIL advances to the next IP; a timeout or network error on IP #1 kills the whole branch even if IP #2 works. There is no per-address branching at all.
+
+3. **"Query all 13 root server sets in parallel" (README:19, 195-196) — neither all, nor parallel.** All root IPs are packed into ONE initial referral (traverser.go:96-97), so with `--all-root-servers` typically exactly one root is queried (first non-SERVFAIL wins). Nothing in the engine is concurrent — the mutexes at traverser.go:103-106 guard a single-threaded loop. Default runs use a single root chosen as `nsSet[0]` by the upstream resolver (roots.go:110-127), a different one each run.
+
+4. **`--root-server ` is broken end-to-end.** Config accepts only IP literals (config.go:149-158), but `discoverRootOverride` treats the value as a DNS *name* and looks up the IP-as-hostname (roots.go:100-107), always failing with "no addresses for root server 198.41.0.4" — verified live. Unlike the other paths, this one has no hints fallback (roots.go:54-56), so the run aborts.
+
+5. **Fast mode "shares glue across branches" (README:26-27, 352-355) — a no-op beyond the root.** Non-root referrals get a throwaway `rootCache.Child()` (traverser.go:120-127) and `InfoCache` writes never propagate to the parent (cache.go:66-81), so glue learned in one branch is discarded, not shared. `--fast=true` vs `false` differ only marginally.
+
+6. **"No-glue resolution" works but is contaminated and lossy.** It first asks a hardcoded recursive resolver at `127.0.0.1:53`, A-records only (resolveGlueViaSystem, traverser.go:461-501, literal at :484), ignoring `--dns-upstream` and `/etc/resolv.conf`. The fallback `ResolveNS` queries TypeA only (traverser.go:305 — IPv6-only nameservers unresolvable) and its visited-guard (traverser.go:290, 385-387) prunes *every* glue-less child in the sub-traversal, so any NS whose resolution path itself contains a no-glue delegation fails with "resolution exhausted without answer" (traverser.go:406-409).
+
+7. **`--follow-aaaa` (README:110) is a dead flag.** Parsed and stored (main.go:23,74) but never read anywhere in the repo. Related: `discoverRoots` hardcodes IPv4-only (traverser.go:216), discarding AAAA roots even with `--root-aaaa`.
+
+8. **"Configurable... timeouts" (README:25) — no timeout is configurable.** No `--timeout` flag exists; `QueryConfig.Timeout` is hardcoded to 5s at main.go:152 and is *dead* anyway — `realExchange` uses its own hardcoded 5s timeouts (query.go:53-74).
+
+9. **JSON output (README:254-264) is an object, not the documented array, and duplicates every result.** With defaults, each terminal result is appended twice — once by `WriteResult` (json.go:90-96), again by `WriteSummary` with no dedup (json.go:99-103) — so answer probabilities in `results[]` sum to ~2.0 while `summary` sums to 1.0 in the same document (verified: each example.com answer appears 26×).
+
+10. **Smaller doc breaks:** `--quiet` suppresses only the banner line, not "supplementary information" (README:127; `output.Config.Quiet` is never read — formatter.go:40); `-dd` is behaviourally identical to `-d` (Debug>0 is the only check anywhere: main.go:175,224, formatter.go:89); "Requires Go 1.21" (README:43) is wrong — go.mod pins 1.24.0; README omits `--dns-upstream` while built-in `--help` omits `--json`; `--retries` means total *attempts*, and `--retries 0` (allowed per README and validation, config.go:125) makes every query fail with the malformed error `failed after 0 retries: %!w()` (query.go:97,133).
+
+What *does* match the README: fingerprinting (CLI only), the web endpoints/SSE replay/done semantics, the 1-hour job TTL, and the CLI flag inventory itself — every documented flag parses.
+
+## 4. Notable issues, half-finished pieces, surprises (ranked)
+
+**Correctness — high impact:**
+1. Resolve sub-traversal results pollute main output: `AttachHooks` fires `WriteResult` on every EventComplete with no `IsResolve` guard (internal/output/formatter.go:101), so NS hosts' own A records appear as answers in both text and JSON — verified live on hansenits.com.au, where answer probabilities summed to 2.29.
+2. `Referral.Bailiwick` is overloaded to carry the NS **hostname**, not a zone (response.go:173-180; acknowledged comment at traverser.go:230-232), while the intended `NSName` field (referral.go:44) is never assigned yet is read by output (text.go:275, stats.go:182). This makes in-bailiwick filtering meaningless (response.go:154, masked by the accept-all fallback at :160-166), leaks "bailiwick":"m.gtld-servers.net" into the JSON/SSE public API, and lists root servers under their bare IPs.
+3. `Traverser.visited` is never written and `Traverser.depth` never incremented (traverser.go:60-73, 223-228), so nested no-glue resolutions have no loop protection — circular NS dependencies recurse unboundedly, contained only by an accidental pruning bug and ctx timeouts. The seeding workaround (traverser.go:311-313) is a no-op because `StoreGlue` ignores empty slices (cache.go:67-69).
+4. CNAME follows re-query the **same servers** instead of restarting from the root (response.go:200-204); out-of-zone targets hit the wrong authoritative servers. `--type CNAME` also misbehaves: a correct CNAME answer is classified as follow-me (response.go:129-141) and chased instead of reported. Loop detection checks only the final chain target (response.go:191).
+5. `queryServer` swallows query errors entirely — a failed server yields `Response{Type: RespError}` with no message or server recorded (traverser.go:425-431); depth-limit rejections synthesize the same empty error with no hook events (traverser.go:157-167). Output can never say *why* a branch failed.
+6. Root discovery silently degrades: any upstream failure falls back to hardcoded hints with the error discarded (roots.go:58-73); the discovery query path itself has no EDNS0, no retries, no TCP fallback (roots.go:204-224).
+
+**Web stack:**
+7. Frontend type `` offers SRV and CAA (index.html:490-491) but `ParseQueryType` rejects both (config.go:53-77) → HTTP 400 in the UI. A likely "doesn't work" candidate.
+8. SSE subscribe-then-snapshot race duplicates events (handler.go:303-314); slow clients silently *lose* events (32-slot drop-on-full, handler.go:93-96). Frontend `onerror` renders a running job as "Complete — no results" and re-enables the form (index.html:725-729, 790-806); Enter bypasses the disabled button and starts a second job (index.html:668).
+9. Cancellation is half-built: `job.cancel` is plumbed (handler.go:228,236) but no endpoint calls it, shutdown doesn't cancel jobs, traversals have no timeout, never-finishing jobs leak forever (cleanup requires `DoneAt`, handler.go:150-157), and wildcard CORS with no auth or job cap lets any website spawn unbounded traversals (server.go:99).
+10. The result "tree" indentation never renders — plain spaces collapse in HTML (index.html:829 vs :338); progress count is ~2× steps because start and complete both emit events.
+11. The 127.0.0.1:53 hardcode hits the Docker web image hardest: alpine has no local resolver, so every glue lookup burns a timeout before falling back.
+
+**Surprises and paper cuts:**
+12. `--show-X=false` is silently ignored — the truthiness override at main.go:86-120 only honours `--no-show-X` — inconsistent with `--fast=false`, which README documents as the disable syntax.
+13. Flags after the positional domain are silently dropped (stdlib flag behaviour): `exploredns example.com --type NS` queries type A with no warning (verified live).
+14. `--help` prints its flag groups in random order (map iteration, config.go:218; observed 3 orderings in 4 runs).
+15. ANSI color is gated solely on `NO_COLOR` with no TTY check (main.go:212, formatter.go:59) — escape codes end up in piped files. Server list sorts descending, almost certainly a `>` for `<` typo (text.go:89-91).
+16. All exits are 0/1/2: NXDOMAIN, SERVFAIL, and success all exit 0 — useless for scripting.
+17. Fingerprinting fires by default against every server encountered (runner.go:33-35) — chatty; and `--show-versions --no-show-servers` silently does nothing (runner.go:33).
+18. Dead-code inventory suggesting abandoned plans: `dns.Resolver`/`BasicResolver`/`CachingResolver` (resolver.go, zero production callers), `Referral.Resolve` (~130-line duplicate of ResolveNS, referral.go:125-257), `ParseUDPSize`/`ParseMaxDepth`/`ParseRetries` (config.go:79-110), vestigial mutexes implying a shelved concurrency design, empty `dns.go`, unused `MinEDNS0UDPSize`.
+
+## 5. External context
+
+Commit history references a Jira project (HAN-*): HAN-410 (Go toolchain pin, PR #25), HAN-400 (host selection), HAN-388/389 (web SPA/API with SSE), HAN-384 (fingerprinting), HAN-383 (output formatting). PR #23 ("Fix NS resolution: NS name bug, glue bypass, FormatRecord duplicate header, result deduplication") shows the NS-name/Bailiwick area has already been patched once — the overload survives it. The repo is hosted on a private Gitea (gitea.hansenits.com.au/hits), with three stale `agent/go-expert-developer/*` remote branches; recent work has been housekeeping (module rename, CI pinning, untracking binaries) rather than engine correctness.
+
+## 6. Clarifying questions for the owner
+
+1. **Recursion:** When you run a traversal against a server that offers recursion, do you expect referrals or are you seeing final answers appear "too early"? Production queries currently go out with RD=1 (query.go:221; traverser.go:419) — should every traversal query be non-recursive like dnstraverse, making the fix "use IterativeQuery and delete ensureRDFalse"?
+
+2. **Per-IP behaviour:** Should each nameserver *address* get its own branch with probability split across IPs (dnstraverse-style), or is first-responsive-IP acceptable? Today it's neither consistently — SERVFAIL falls through to the next IP but a timeout kills the branch (traverser.go:263-268) — and `--all-root-servers` effectively queries one root.
+
+3. **The 127.0.0.1:53 hardcodes:** Are the local-resolver shortcuts in glue resolution (traverser.go:484) and root discovery fallback (roots.go:199) intentional speed hacks or placeholders? On machines/containers without localhost DNS they add 5s stalls per lookup, and they contaminate the "pure traversal" result — should they honour `--dns-upstream` / resolv.conf, or be removed?
+
+4. **Fast mode:** What did you intend "shared glue cache" to mean? For sibling branches to actually reuse glue, writes must land in the shared root cache instead of throwaway `Child()` layers (traverser.go:120-127, cache.go:66-81) — is cross-branch sharing the goal, or per-branch isolation?
+
+5. **CNAME follows:** When a target is out-of-zone (www.example.com → cdn.other.net), should the traversal restart from the root for the new name (dnstraverse behaviour) rather than re-asking the current servers (response.go:200-204)?
+
+6. **Output shape:** In JSON, which is canonical — the streamed per-query results or the deduplicated terminal set (currently both are appended, doubling everything, json.go:90-103)? And should resolve sub-traversals be hidden, indented under their parent, or shown flat as now? Relatedly, should `--quiet` mean "results only"?
+
+7. **Web scope:** Should the web API expose the CLI's knobs (max-depth, retries, all-roots variants, dns-upstream) and reuse the CLI's summary/dedup/fingerprint pipeline, or stay minimal? Concretely: the UI offers SRV/CAA that the backend rejects (index.html:490-491 vs config.go:53-77), and web results have no summary or fingerprints — which side is wrong?
+
+8. **Scripting contract:** Do you need distinct exit codes (answer vs NXDOMAIN vs infrastructure failure)? Everything currently exits 0 on any completed traversal, which makes the CLI hard to use in automation.
diff --git a/docs/dnstraverse-reference-spec.md b/docs/dnstraverse-reference-spec.md
new file mode 100644
index 0000000..8109a82
--- /dev/null
+++ b/docs/dnstraverse-reference-spec.md
@@ -0,0 +1,242 @@
+# dns.squish.net / dnstraverse — Reference Behaviour Spec
+
+Compiled 2026-07-07 for diffing ExploreDNS against the original. Source precedence used throughout: **archived/live site output > Ruby source (squish/dnstraverse @ 733cc0b, v0.1.13) > secondhand accounts**. Each claim is tagged [LIVE] (probed 2026-07-07), [WB] (Wayback capture, date given), [SRC] (Ruby source file), or [DOC] (author's own docs at www.squish.net/dnstraverse/). Raw artifacts referenced are preserved under `/private/tmp/claude-502/-Users-ghansen-src-ExploreDNS/8c18e9d7-a07d-43e8-a21b-b9aad8182912/scratchpad/` (subdirs `squish/`, `websweep/`, Ruby clone in `dnstraverse/`).
+
+---
+
+## 1. Availability
+
+**The site is UP.** [LIVE] `https://dns.squish.net/` and `http://dns.squish.net/` both return HTTP 200 (Cloudflare edge; backend `X-Powered-By: Phusion Passenger 5.0.30`, Rails session cookie `_dnstraverseweb_session`). Footer: **"UI 2.0.1 / Engine 0.1.14"** — the engine is the Ruby `dnstraverse` gem; the Rails wrapper ("dnstraverseweb") is closed-source (not in any public repo of GitHub user `squish`). "Kindly hosted by the ISC"; author James Ponder.
+
+Practical constraints on the live site:
+
+- Anonymous submission requires solving a Google reCAPTCHA v2 (a captcha-less POST to `/traverses/create_anon` gets 302 → `/` with flash `Sorry, the captcha did not succeed, please try again.`). [LIVE]
+- **Old traverse data is purged**: pre-2026 traverse IDs still return the page shell (Name/Type/Date), but `/fetch` replies only `setTimeout("poll()", 1000);` forever and `/detail/fetch` replies `count = 0; setTimeout("poll()", 1000);` — results are never re-rendered. [LIVE] So a fresh captcha-solved run in a browser is the only way to capture new complete output.
+
+Best archival/primary sources, in order of authority:
+
+1. **Wayback Machine** — ~4,076 archived `/traverses/<32-hex>` show pages and 114 `/detail/fetch` RJS streams (CDX API). Best complete artifacts: careerhosts.net/A show+detail+servers (2016-03), learningsuite.byu.edu/A (2015-03), dadzi.ir/A all-failure (2019-06), www.ilpd-afrique.com/A NXDOMAIN (2017-11), intellivida.ca/A mixed (2011-09), www.nike.com CNAME chain detail/fetch (2018-03), `/info?packet=N` popups (aruba.it, 2021-01). Site captured live as recently as 2026-06-20; page wording is essentially unchanged 2011→2026 (engine only moved 0.1.11→0.1.14), so any era is representative. [WB]
+2. **Ruby engine source** — github.com/squish/dnstraverse master @ 733cc0b (2011-12-17, v0.1.13; rubygems shows 0.1.14 released 2012-04-30). Cloned locally; this is the exact engine behind the site.
+3. **Author's engine docs** — `http://www.squish.net/dnstraverse/` (+ manual.html, switches.html), live. [DOC]
+4. **Old v1 Perl service** — `http://www.squish.net/dnscheck/dnscheck.cgi` **still executes live queries with no captcha** (verified 2026-07-07; full www.example.com/A run captured). It is a different, cruder engine (author's FAQ: the new one "is more accurate than the Perl-based dnscheck service, including DNS bailiwick concepts, simulation of the resolver cache"; v1 source "is not available") — useful only for cross-checking aggregate percentage math, not wording.
+
+---
+
+## 2. Inputs
+
+### 2.1 Web form (dns.squish.net, confirmed identical 2011→live 2026) [LIVE][WB]
+
+Form `id=new_traverse`, POST `/traverses/create_anon`, submit button `name=commit value=Create`:
+
+| Field | Details | Default |
+|---|---|---|
+| `traverse[domain_name]` | text, size 30, hint "e.g. www.example.com". Help: "This is the full DNS entry to check. For example: www.google.com, news.bbc.co.uk, or www.cnn.com" / "If your web site is http://www.example.com/ you should enter the www.example.com component only." | (empty) |
+| `traverse[domain_type]` | select, options exactly in order: **A, NS, MX, PTR, TXT, AAAA, SOA, SPF**. Caption: "Leave as 'A' unless you know what you're doing." Help notes PTR format is `D.C.B.A.in-addr.arpa`. | **A** |
+| Human Check | reCAPTCHA v2 (sitekey `6LdIf08UAAAAAJgYP1bvi7vmf-EXEHWXH_AqthF9`), required for anonymous; "Registration is optional, but means you don't need to enter a reCAPTCHA every time!" | — |
+| `authenticity_token` | Rails CSRF, session-bound | — |
+
+That is the **entire** web surface: no root-server, depth, retries, UDP size, fast-mode or IPv6 options ("Currently this is IPv4 only."). Success redirects to `/traverses/<32-hex-id>` (ID is random per submission, **not** md5(name/type) — tested [WB]; "Friendly URLs for emailing"). Other routes: `/traverses//detail`, `/traverses//servers`, `/traverses//info?packet=N`, POST `/traverses//fetch` and `/detail/fetch?count=N` (1 s Prototype.js polls); `/login`, `/register`; `/traverses` index requires login.
+
+Note the web type menu (adds SPF; lacks SRV/WKS/CNAME/HINFO/MINFO/ANY) is a deliberate restriction of the engine's larger CLI list.
+
+### 2.2 CLI options (`dnstraverse [options] DOMAIN`) — [DOC manual.html, confirmed against SRC bin/dnstraverse]
+
+| Option | Meaning | Default |
+|---|---|---|
+| `-v/--[no-]verbose` | verbose progress ([qname]/ shown) | false |
+| `-d/--[no-]debug` | debug; twice = library debug | 0 |
+| `-r/--root-server HOST` | initial root | nil (ask local resolver) |
+| `-a/--all-root-servers` | traverse all roots | **false** (one root) |
+| `-t/--type TYPE` | A, AAAA, SRV, WKS, NS, CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, ANY | `:a` |
+| `--udp-size SIZE` | 512 turns EDNS0 off | **2048** |
+| `--allow-tcp` | retry over TCP on truncation | true |
+| `--always-tcp` | | false |
+| `--max-depth DEPTH` | | **20** |
+| `--retries TIMES` | "Number of 2s retries before timing out" | **2** |
+| `--[no-]follow-aaaa`, `--[no-]root-aaaa` | documented "isn't implemented yet" | false |
+| `--[no-]show-progress` | | true |
+| `--[no-]show-resolves` | | false |
+| `--[no-]show-servers` | | false |
+| `--[no-]show-versions` | | true |
+| `--[no-]show-all-stats` | | false |
+| `--[no-]show-results` | | true |
+| `--[no-]show-summary-results` | | true |
+| `--save-objects` | | false |
+| `--[no-]fast` | "Fast mode (default true) turn off to be more accurate" | **true** |
+| `-q/--quiet`, `-V/--version`, `-h/--help` | | |
+
+Caveat [SRC]: the `Traverser` library class internally defaults to maxdepth 10 / udpsize 512 / fast false — the **CLI overrides** to 20/2048/true, and observed web behaviour matches the CLI-style config (fast mode "completed earlier" labels, single root), except the web's packet dumps show **EDNS0 payloadsize 4096** [WB 2021 `/info?packet` pages] — the web app evidently runs with udp_size 4096, not 2048. Archived output wins here.
+
+### 2.3 Old v1 form (www.squish.net/dnscheck/v1.html — different engine, listed for completeness) [LIVE]
+
+`host` text; `type` select: Choose…/A/SOA/CNAME/MX/NS/PTR/AAAA/ANY; checkboxes (checked by default unless noted): show_rootservers, findroot (unchecked), removebroken, cnameprocessing ("Indirect through CNAMEs encountered"), show_mainworkings, show_resolving (unchecked), show_allservers, getbindversions; `retries`=3 (exponential delay); `querylevel`=10 (max query depth).
+
+---
+
+## 3. Traversal semantics
+
+All from [SRC] unless noted; web/CLI observations corroborate.
+
+### 3.1 Entry and roots
+
+- `Traverser#run_query` builds a root pseudo-Referral ("rootroot", server=nil) with qname/qtype and runs an **explicit stack loop** (not recursion); `:calc_resolve`/`:calc_answer` markers give post-order stats computation after all children finish.
+- **Default is ONE root server** per run: `get_a_root` queries `'' NS` at the local resolver and picks the first root with an A record in additional (else resolves root names). `--all-root-servers` asks that root for the full set. Rationale [DOC FAQ]: "since most DNS problems are not because of a root server problem, the default mode is to only use one." The web service also uses a single root, which **varies per run** (f/m/e/b roots observed): detail page shows `Initial Root: f.root-servers.net, 192.5.5.241` + `(1 roots returned)` [WB]. Rootroot's children (one per root) combine with equal weight.
+
+### 3.2 Branching
+
+- `Referral#process` queries **each IP** of the current server (recursion-desired off; EDNS0 OPT added when udp_size>512). Children referrals are created for statuses `:referral` and `:restart` — one child per nameserver returned in the referral, **including glueless ones** (shown with empty parens `ns1.virtualempire.com ( )` on the web [WB]). Child order is randomized per run [WB].
+- **Refids**: dotted path per node — `1`, `1.1`, `1.1.1`… Children number from 1; a **resolve subtree inserts a `.0` component** (e.g. `1.2.0.1`); nested resolves nest further (`1.1.2.0.1.4.2.0.2.0.2` observed [WB]). If more than one IP of a server produced children, an extra "childset" digit is added.
+- **Depth limit**: refid components excluding `0` counted against maxdepth (CLI/web 20); exceeding injects RuntimeError `Maxdepth N exceeded` as an `:exception` response.
+
+### 3.3 Response classification (`DecodedQuery#process`, in order)
+
+1. network exception → `:exception`
+2. follow CNAMEs **within the message** (`msg_follow_cnames`; a chain leaving the bailiwick stops following and returns the target; an in-message loop returns nil → `:cname_loop`)
+3. rcode != NOERROR → `:error` with messages: `Formate error (FORMERR)` [sic, typo in source], `Server failure (SERVFAIL)`, `No such domain (NXDOMAIN)`, `Not implemented (NOTIMP)`, `Refused`, else rcode string
+4. answers exist for endname/qtype → `:answered`
+5. endname != qname (CNAME landed elsewhere) → `:restart`
+6. SOA in authority, or no NS in authority → `:nodata`
+7. NS in authority → `:referral`; else `:restart`
+
+Response layer adds `:referral_lame`; the resolve phase adds `:noglue` and `:loop`. Full outcome vocabulary: **answered, nodata, referral, restart, referral_lame, error, exception, cname_loop, noglue, loop**.
+
+### 3.4 Bailiwick and per-branch cache
+
+- `inside_bailiwick?(name)` = bailiwick nil, or name == bailiwick (case-insensitive), or name ends with `.`.
+- `msg_cacheable` partitions **all** sections (answer/authority/additional; OPT discarded) into in-bailiwick "good" (cached) vs out-of-bailiwick "bad" (discarded). [DOC FAQ confirms: "keeps track of the bailiwick from the referring parent and discards entries that are outside… additional record hints are typically ignored".]
+- **InfoCache is hierarchical per branch** (each Response creates `InfoCache.new(parent)`); `add()` clears same name:class:type key before storing; lookups recurse to the parent. `get_startservers(domain)` walks labels upward to the nearest cached NS RRset; returns `[{:name, :ips-or-nil}]` plus newbailiwick = NS owner.
+- **Lame referral detection**: a `:referral` becomes `:referral_lame` unless the new zone is *strictly deeper* than the current bailiwick (`starters_bailiwick =~ /\.#{bailiwick}$/i`, or bailiwick nil). Warning `Referred authority names do not match query cache expectations` when starter names ≠ referred NS names.
+
+### 3.5 Glue / resolve / loop
+
+- Child with ips=nil: if the server name is **inside the current bailiwick** with no glue → `:noglue` dead end (probability mass retained). [DOC FAQ: "dnstraverse has nobody to go to next, so this error is generated as the domain is unreachable."]
+- If an ancestor Referral had the same qname/qclass/qtype/server with unresolved IPs → `:loop` dead end.
+- Otherwise a **resolve sub-traversal** for `A ` starts (refid `.0.` component), starting from `get_startservers(server)` in this branch's cache — never the local resolver [DOC FAQ]. Every `:answered` leaf of the resolve distributes its probability evenly across returned A records into `serverweights[ip]`; non-answered outcomes carry the failure probability up as pseudo-IP `key:...` entries.
+
+### 3.6 Probability model (exact)
+
+- On Referral creation with known IPs: `serverweight = 1.0/serverips.length` per IP.
+- `stats_calculate_children(stats, children, weight)`: `percent = (1.0/children.length) * weight`; each child stat's prob accumulates `child_prob * percent`. I.e. **equal split among sibling children, multiplied down the tree**; all root-level probabilities sum to 1.0.
+- Leaf aggregation key: `key:#{status}:#{ip}:#{server}:#{qname}:#{qclass}:#{qtype}` (+`:#{exception message}` for :exception, +`:#{parent_ip}` for :referral_lame; NoGlue/Loop use `key:#{status}:#{ip}:#{qname}:#{qclass}:#{qtype}:#{server}:#{bailiwick}`). Identical keys merge by adding prob.
+- **Summary** groups by status, summing probs; answered entries additionally grouped by sorted rdata strings joined `@@@` (so one summary line per distinct RRset content).
+- Corroborating observations: 13 gTLDs → 7.7% each; 7 google NS → 14.3%; 2 NS → 50.0%; 3 → 33.3%; 4 → 25.0% [WB, DOC]; deep resolve failures → 0.2%/0.0% [mcgill.org.za CLI run, 2017].
+
+### 3.7 Fast mode and low-level cache
+
+- **Fast mode (default on)**: global hash keyed `"#{qname}:#{qclass}:#{qtype}:#{server}:#{txt_ips_verbose}".downcase` (txt_ips_verbose embeds per-IP weights like `50.0%=1.2.3.4`). A completed `:normal` Referral with no `:referral_lame` response is stored; a hit replaces the child before processing and marks it "completed earlier". [DOC FAQ: fast mode "will make the assumption that the cache won't make any difference to the result"; normal mode re-walks because per-branch caches may differ.]
+- Independently, a **low-level packet cache** ensures each (server IP, question, udp_size) is asked only once per run regardless of options (`CachingResolver`, key `key:res:#{ip}:#{name}:#{klass}:#{type}:#{udp_size}`).
+
+### 3.8 CNAME restarts
+
+`:restart` children are built like referrals but with qname = CNAME target, starters from the **per-branch cache** — so the restart resumes from the deepest cached zone, not always the root. Confirmed [WB www.nike.com 2018 detail/fetch]: restart for `www-geo.nike.com.akadns.net` began at a root (nothing cached); later restarts began directly at `` / `` servers. Each restart adds a new Query Key legend entry; in CLI the bracketed qname simply changes mid-tree (`[www.google.com]` → `[www.l.google.com]`) with refid numbering continuing. In-packet CNAME chains are followed silently inside one response (byu.edu answers show only the target's A records [WB 2015]).
+
+### 3.9 Resolver details
+
+Retries default 2 (2 s delay, 2 s timeout); recurse off; dnssec off; src 0.0.0.0. EDNS fallback: on FORMERR/NOTIMP/SERVFAIL with udpsize>512, retry at 512; success adds warning `#{answerfrom} doesn't seem to support EDNS0`. Other warnings: `... allows recursion`, `... doesn't allow recursion` (local queries), `... sent truncated packet`. IPv4 only.
+
+---
+
+## 4. Output format
+
+### 4.1 Web show page `/traverses/` [WB, structure confirmed LIVE]
+
+Details table: **Name / Type / Date** (e.g. `2016-03-13 19:05:26 -0700`; live 2013 shell shows UTC) and, while running, **Progress** (` - ` + integer percent, e.g. `1.9 - testcname.yellowtealpurple.net` / `61%`, updated by 1 s polls to `/fetch`). Then:
+
+**Summary** (`div#traverse_summary_stats`, heading "Summary"):
+```html
+100% answered with
careerhosts.net. 86400 IN A 38.71.67.100
+```
+[WB 2016 careerhosts.net]. Percent format = `sprintf("%.1f%%", prob*100).sub(/\.0%/, '%')` right-justified to width 5 [SRC summary_stats.rb:135-136] — so `100%`, ` 93.3%`, ` 6.7%`, ` 50%` (archived HTML shows the `100%` case unpadded; padding is whitespace-collapsed in rendering). Category wordings [SRC:76-99, all confirmed in WB captures except the last three]: `N% answered with `, `found no such record`, `resulted in a lame referral`, `resulted in an exception`, `resulted in an error`, `found no glue`, `resulted in a loop`, `resulted in a CNAME loop`. Multiple RRs join with ` `; CSS renders the answer italic, offset under its line. Observed mixes: `93.3% answered with … / 6.7% resulted in an exception` [WB 2011 intellivida.ca]; `100% resulted in an error` (all-NXDOMAIN) [WB 2017]; `100% resulted in an exception` [WB 2019 dadzi.ir]; `100% resulted in a lame referral` [WB 2013 g-p.es].
+
+**Results** (`div#results`, heading "Results"), one `` per aggregated outcome, percent as `%5.1f%%` (no colon on web):
+```html
+
+ 50.0%
+ Answered from ns1.virtualempire.com (38.71.66.4)
+
careerhosts.net. 86400 IN A 38.71.67.100
+
+
+```
+(note **two spaces after "from"**, tab-separated dig-style RRs in ``; failure lines have no ``). Verbatim failure catalogue from archived pages [WB]:
+- `No such domain (NXDOMAIN) at ns1.cctld.co (156.154.100.25)`
+- `Query timed out at ns2.twisted4life.com (194.152.92.62)`
+- `Server failure (SERVFAIL) at casper.ln1x.ablesky.com (173.255.217.216)`
+- `Refused at ns1.afdns.net (190.183.61.2)`
+- `NODATA (for this type) at ns1.iranfirewall.in (148.251.110.146)`
+- `Lame referral received from f.nic.es (130.206.1.2) to dns2.namecheaphosting.com (69.160.33.71)` — web adds "received"; CLI says `Lame referral from …` [SRC referral.rb:506]
+- `recvfrom failed from 185.208.174.92; No route to host - recvfrom(2) at ns1.dadzi.ir (185.208.174.92)` (exception text verbatim from Ruby)
+- Failures inside a resolve append `While querying ns1.twisted4life.com/IN/A
` (CLI: `While querying #{qname}/#{qclass}/#{qtype}`).
+
+Then links: **"Traversal detail"** → `/detail`; **"Server location and version information"** → `/servers`; while running: "Please wait while your traversal is completed, or alternatively watch the traversal as it progresses."
+
+### 4.2 Web detail page `/traverses//detail` [WB streams; shell confirmed LIVE]
+
+Adds table rows **Initial Root** (`f.root-servers.net, 192.5.5.241` + `(1 roots returned)`) and **Query Key** — one coloured dotted-border chip per query, text like `A careerhosts.net`; colours cycle `#fefecc, #ccfecc, #ccfefe, #ccccfe, #feccfe, #fee5cc`. Banner node: `Traversing for careerhosts.net type A starting at the root(s)`.
+
+Tree rows are `div.node_line` tables: indentation drawn with 32×23 px spacer images (`spacer_gap/line/tee/end.png`); node text is `#{server} (#{ip}) <#{bailiwick}>` (root renders `<>`; glueless renders `( )` with a placeholder span later filled, truncated by the UI, e.g. `95.130.252.149,Loop encounter...`). Node extras: progress spinner → status icon linking `info_url('/traverses//info?packet=N')` (`referral.png` / `success.png` / `warning.png`), `show resolve`/`hide resolve` toggle revealing the hidden `.0` resolve subtree, and italic `completed earlier` span for fast-mode hits. Colour lifecycle: inserted muted (`#ededdd`; resolve nodes `#ddeddd`) → active `border:1px solid black` + query-key colour → completed. Updates arrive as Prototype.js RJS from `/detail/fetch?count=N` (`Element.insert`, `visualEffect`, `setStyle`), each chunk ending `count = N; setTimeout("poll()", 1000);`. On completion: Results injected (same stats_line HTML as show page), then a **Fingerprinting** phase cycling every server name, then the "further" (servers) link appears.
+
+### 4.3 Web packet popup `/info?packet=N` [WB 2021]
+
+`What is arudns1.aruba.it type A? ` + `Answer from 192.12.192.5 (dns.nic.it)
` + `` dnsruby dump (`;; Answer received from 192.12.192.5 (189 bytes)`, `;; Security Level : UNCHECKED`, header/flags/sections, `OPT pseudo-record : payloadsize 4096, xrcode 0, version 0, flags 0`) + `Status: referral ` "A referral occured. This means that the resolver did not know the answer, but indicated that results can be found elsewhere." (or `Status: answered` / "The server was able to answer the question successfully.") + `The following records were considered worthy of caching: ` + `These servers were chosen in bailiwick 'aruba.it' for the referral: ` (`name (ip)` lines) + `Results after processing this node and all branches beneath: ` with subtree-scoped stats_lines. Fast-mode variant prepends blue `This was completed earlier (fast mode)`.
+
+### 4.4 Web servers page `/traverses//servers` [WB 2016/2025; shell LIVE]
+
+Google map + `table#servers_table`, columns exactly: **Country | City | Area code | Postal code | Servers | Software guess |** (+Show on map). Servers cell: `38.71.66.4 (ns1.virtualempire.com) …` grouped by geolocation; Software guess: ` ISC BIND 9.2.3rc1 -- 9.4.0a4 (9.6.1-P1)`, ` VeriSign ATLAS ` (2025 adds ` (ATLAS)` suffix), ` TIMEOUT`, ` No match found`. Fingerprint DB is fpdns-derived ("Portions Copyright (c) 2003,2004,2005 Roy Arends & Jakob Schlyter").
+
+### 4.5 CLI output [DOC home page sample + mcgill.org.za 2017 run + SRC]
+
+Header (unless -q): `# Using fast mode` / `# Limiting traverse to one root` / `# UDP size N (EDNS0 is on)` [always prints "on" due to source bug `options[:udpsize == 512]`] / `# Retries N, max depth N` / `# Allow TCP is true, always TCP is false`; then `Using E.ROOT-SERVERS.NET (192.203.230.10) as initial root` / `Running query www.google.com type a`.
+
+Progress, verbose (`refid [qname] server (ips) `) [DOC, verbatim]:
+```
+1 [www.google.com] E.ROOT-SERVERS.NET (192.203.230.10) <>
+1.1 [www.google.com] B.GTLD-SERVERS.NET (192.33.14.30)
+1.1.1 [www.google.com] ns1.google.com (216.239.32.10)
+1.1.1.1 [www.l.google.com] a.l.google.com (209.85.139.9)
+```
+Non-verbose omits `[qname]`/`` [mcgill 2017, verbatim]:
+```
+1.2.2 ns1.coza.net.za -- resolving
+1.2.2 ns1.coza.net.za (66.135.62.20,Loop encountered resolving ns.coza.net.za)
+1.3.1 ns4.iafrica.com (196.7.142.131) -- completed earlier (1.2.3)
+```
+
+`Results:` — blocks with `printf "%5.1f%%: "` then per status [SRC referral.rb:503-532]: `Answer from ()` + RRs indented 12 spaces; `No glue at () for `; `Lame referral from () to ()`; `Loop encountered at `; `CNAME loop encountered at `; ` at ()`; `NODATA (for this type) at ()`; ` at …`; fallback `Stopped at ())` [trailing `)` is a source bug]; plus `While querying //` when the failing query differs. [DOC, verbatim]:
+```
+ 14.3%: Answer from e.l.google.com (209.85.137.9)
+ www.l.google.com. 300 IN A 74.125.77.99
+```
+
+`Summary Results:` — same wording set as web (Section 4.1), prefix two spaces, e.g. ` 99.8% answered with co.za. 3600 IN NS ns0.is.co.za.` … ` 0.2% resulted in a loop` [mcgill 2017]. RR whitespace collapsed to single spaces; continuation RRs aligned under text start.
+
+`--show-servers`: `The following servers were encountered:` then `printf "%#{w}s: %-15s%s"` rows sorted by lowercased reversed name [DOC, verbatim]:
+```
+ ns1.google.com: 216.239.32.10 ISC BIND 9.2.3rc1 -- 9.4.0a0 (9.4.2-P1)
+a.gtld-servers.net: 192.5.6.30 VeriSign ATLAS
+```
+
+### 4.6 Legacy v1 (Perl dnscheck) — different engine, different wording [LIVE run 2026-07-07]
+
+Nested-table HTML; sections: root-server workings and SOA-serial check, then `Traversal of DNS for .` with units `Asking a.gtld-servers.net (192.5.6.30) for www.example.com (type A)` / `Referral: example.com is at hera.ns.cloudflare.com (108.162.192.162)` / `Response is:` with per-branch `16.7% () with `; dedupe `[see above for results]`; final `Results`: `16.1% of queries will be returned by 108.162.195.228 (elliott.ns.cloudflare.com)` + RRset, `3.5% of queries will end in failure at too many nested queries`, `0.0% of queries will end in failure at 192.5.6.30 (a.gtld-servers.net) - failed to resolve h.gtld-servers.net due to 192.5.6.30 - nameserver loop detected`. **Do not copy this wording into ExploreDNS comparisons against dns.squish.net** — only the aggregate math (probability multiplication/summation) transfers.
+
+---
+
+## 5. Confidence notes
+
+**Confirmed by primary sources (archived/live site output + Ruby source agree):**
+- Web form fields/defaults, routes, captcha behaviour, polling protocol (LIVE + WB, identical 2011–2026).
+- Single-initial-root default, equal-split probability model and exact aggregation formulas, bailiwick filtering, hierarchical per-branch cache, fast mode, refid scheme with `.0` resolve subtrees, CNAME restart-from-cache, depth 20 / retries 2 (SRC, corroborated by WB output and DOC).
+- Result/Summary wording and percent formatting for: answered, error (NXDOMAIN/SERVFAIL/Refused), exception (timeout/recvfrom), nodata, lame referral, "While querying" suffix (WB verbatim + SRC format strings, verified in the local clone: `summary_stats.rb:76-99,135-136`, `referral.rb:503-532`).
+- CLI output shapes (DOC's own annotated sample + one full independent 0.1.14 run from mcgill.org.za 2017 + SRC).
+
+**Confirmed by source only (never seen in captured output):** web wording for `noglue` ("found no glue" / "No glue at X (ip) for Y"), `loop` and `cname_loop` result/summary lines on the *web* (CLI loop lines are confirmed via mcgill); `Stopped at` fallback; `Formate error (FORMERR)` typo; fast-cache key details; lame-referral "strictly deeper zone" rule. These are near-certain — the site runs this gem — but flagged CONFIRMED-by-source, not by output.
+
+**Known divergences to be careful with when diffing:** web "Answered from␣␣" (double space) vs CLI "Answer from"; web "Lame referral received from" vs CLI without "received"; web EDNS payloadsize 4096 vs CLI default 2048 (archived output preferred for the web service); library-vs-CLI internal defaults (10/512/false vs 20/2048/true); source bugs worth deciding whether to replicate (`(9.4.2-P1)`-style CLI EDNS banner always "on", `Stopped at …)` stray paren, answered-merge prob discard in `stats_display`, "CNANE loop" typo in `DecodedQuery#to_s`).
+
+**Not recovered / open items:**
+- The Rails front-end (dnstraverseweb) source — closed; web-only wording is reconstructed from captures.
+- Exactly one engine version gap: site runs 0.1.14; the cloned source is 0.1.13 master (rubygems has 0.1.14; diff not fetched — format strings match 0.1.14 outputs observed, so risk is low).
+- No archived web sample of a *completed* SPF/TXT/SOA traversal, of the web progress-percent computation, or of web noglue/loop/cname_loop result lines.
+- A fresh end-to-end capture is achievable: the live site works behind one reCAPTCHA — solve it once in a browser and record `/traverses/`, `/detail` (streaming XHRs to `/fetch` and `/detail/fetch`), and `/servers`. The author's test domains `yellowtealpurple.net` / `testcname.yellowtealpurple.net` (seen Aug 2025) are candidate CNAME test vectors. The v1 CGI remains captcha-free for aggregate-math cross-checks.
+
+Where sources conflicted, archived site output was used (traverse IDs random not md5 — WB tests; EDNS 4096 on web — WB packet dumps; web "received"/double-space wordings — WB HTML), with the Ruby source as tie-breaker for everything unobserved.
diff --git a/docs/engine-rework-design.md b/docs/engine-rework-design.md
new file mode 100644
index 0000000..56b38d4
--- /dev/null
+++ b/docs/engine-rework-design.md
@@ -0,0 +1,208 @@
+# ExploreDNS Engine Rework — Design
+
+Goal: make ExploreDNS's traversal semantics and CLI output match the Ruby
+`dnstraverse` 0.1.14 engine (the engine behind dns.squish.net). The authoritative
+behaviour spec is [dnstraverse-reference-spec.md](dnstraverse-reference-spec.md);
+the current-state review is [codebase-review-2026-07-07.md](codebase-review-2026-07-07.md).
+The reference Ruby source is at `tools/dnstraverse-ruby/` (run it via
+`tools/golden/run-reference.sh`). Golden captures live in `docs/captures/`.
+
+When this document and the Ruby source disagree, **the Ruby source wins** —
+read the relevant `.rb` file before implementing each piece.
+
+## Ground rules
+
+1. Every traversal query is **non-recursive (RD=0)**. RD=1 is permitted only for
+ the initial root discovery against the configured upstream resolver.
+ Delete the current split where production takes `dns.Query` (RD=1) and tests
+ take `IterativeQueryWithExchange`; there must be exactly one query path, used
+ by both production and tests (tests inject a mock exchange into *that* path).
+ Remove `ensureRDFalse` and the hardcoded `127.0.0.1:53` shortcuts entirely.
+2. **Packet cache**: within one run, each (server IP, qname, qclass, qtype,
+ udpsize) is sent at most once (`caching_resolver.rb`). This is separate from
+ fast mode.
+3. **EDNS0**: OPT added when udp-size > 512 (default 2048). On FORMERR/NOTIMP/
+ SERVFAIL with udpsize > 512, retry once at 512 and record warning
+ ` doesn't seem to support EDNS0`. UDP→TCP retry on truncation when
+ allow-tcp (default true). Timeout 2s, retries default 2 (mirror dnsruby
+ retry semantics — read how dnsruby uses retry_times before implementing).
+4. **IPv4 only** for server selection, like the reference. AAAA records still
+ decode and display in answers; they are never used for transport.
+5. Probabilities at the root **must sum to 1.0** across aggregated leaves.
+ Add a test asserting this invariant on mock topologies.
+
+## Type mapping (Ruby → Go, all in internal/traverse unless noted)
+
+| Ruby file | Go file | Notes |
+|---|---|---|
+| `referral.rb` | `referral.go` | The core. Rewrite, keep the name. |
+| `info_cache.rb` | `cache.go` | Hierarchical per-branch cache. Rewrite. |
+| `decoded_query.rb` + `decoded_query_cache.rb` | `decoded_query.go` | Classification + packet cache. |
+| `response*.rb` | `response.go` | Response wrapper + noglue/loop variants. |
+| `summary_stats.rb` | `stats.go` (move from internal/output) | Leaf aggregation + summary. |
+| `traverser.rb` | `traverser.go` | Stack loop, roots, resolve orchestration. |
+| `caching_resolver.rb` | `internal/dns` | Packet-level dedupe. |
+
+### Referral
+
+- Fields: `refid string`, `parent *Referral`, `qname/qclass/qtype`,
+ `server string` (NS hostname; a synthetic "rootroot" node has server="" and
+ is never displayed), `serverIPs []string` (nil ⇒ needs resolving),
+ `bailiwick string`, `infoCache *InfoCache` (per-branch), `children`,
+ per-IP responses, `serverWeights map[string]float64`, warnings.
+- **RefID grammar**: dotted path, children numbered from 1 (`1`, `1.1`, `1.1.2`).
+ A glue-resolution subtree inserts a `.0` component (`1.2.0.1`); nested
+ resolves nest further. If more than one IP of a server produced children, an
+ extra childset digit is appended. Depth = count of non-`0` components;
+ exceeding max-depth (default 20) injects an exception response
+ `Maxdepth N exceeded`.
+- `process()`: query **each IP** in serverIPs (weight 1/len(ips) each) through
+ the packet cache; classify each response; statuses `referral` and `restart`
+ produce children (one child per NS name in the referral, **including
+ glueless NS** with serverIPs=nil).
+
+### Classification (decoded_query.rb — mirror the order exactly)
+
+1. network exception → `exception`
+2. follow CNAMEs **within the message** (`msg_follow_cnames`); chain leaving
+ the bailiwick stops following and returns the target; in-message loop →
+ `cname_loop`
+3. rcode != NOERROR → `error` with messages exactly:
+ `Format error (FORMERR)`, `Server failure (SERVFAIL)`,
+ `No such domain (NXDOMAIN)`, `Not implemented (NOTIMP)`, `Refused`,
+ else the rcode string. (The Ruby source has a typo "Formate error" — we
+ deliberately fix it; this is a documented deviation.)
+4. answers exist for endname/qtype → `answered`
+5. endname != qname (CNAME landed elsewhere) → `restart`
+6. SOA in authority, or no NS in authority → `nodata`
+7. NS in authority → `referral`; else `restart`
+
+Full status vocabulary: **answered, nodata, referral, restart, referral_lame,
+error, exception, cname_loop, noglue, loop**.
+
+### Bailiwick + InfoCache
+
+- `insideBailiwick(name)`: bailiwick == "" (root), or equal fold, or name ends
+ with "." + bailiwick.
+- `msgCacheable`: partition **all** sections (answer/authority/additional; OPT
+ dropped) into in-bailiwick (cached) vs out-of-bailiwick (discarded).
+- InfoCache is hierarchical: each Response wraps a child cache
+ (`InfoCache{parent}`); `add()` **replaces** any existing same
+ name:class:type key; lookups recurse to parent. `getStartServers(domain)`
+ walks labels upward to the nearest cached NS RRset; returns
+ `[{name, ips-or-nil}]` plus newbailiwick = the NS owner name.
+- **Lame referral**: a `referral` becomes `referral_lame` unless the new zone
+ is *strictly deeper* than the current bailiwick.
+
+### Glue resolution (no local resolver — ever)
+
+Child with serverIPs == nil:
+- NS name **inside the current bailiwick** with no glue → `noglue` dead end
+ (probability retained on the failure).
+- An ancestor referral with the same qname/qclass/qtype/server still
+ unresolved → `loop` dead end.
+- Otherwise: **resolve subtree** for `A ` (refid `.0.` component),
+ starting from `getStartServers(servername)` in *this branch's* cache. Every
+ `answered` leaf distributes its probability evenly across the returned A
+ records into `serverWeights[ip]`; failed leaves carry their probability as
+ pseudo-IP `key:...` entries so failures surface in Results.
+
+### CNAME restarts
+
+`restart` children get qname = CNAME target, starters from the branch cache
+(deepest cached zone — root only if nothing deeper cached), and the new
+bailiwick from getStartServers. Loop check against the ancestor chain must
+cover **every** target in a multi-record chain, not just the last.
+
+### Probability model (summary_stats.rb — exact)
+
+- serverweight = 1/len(serverIPs) per IP at referral creation.
+- `percent = (1.0/len(children)) * weight`; child probability accumulates
+ multiplied down the tree.
+- Leaf aggregation key: `key::::::`
+ (+ exception message for exception; + parent_ip for referral_lame; NoGlue/
+ Loop use their own field order — read the Ruby). Identical keys merge by
+ summing probability.
+- Summary groups by status; answered additionally by sorted rdata strings, so
+ one summary line per distinct RRset content.
+
+### Fast mode (default on)
+
+Global memo keyed
+`"::::"` (lowercased;
+txt_ips_verbose embeds per-IP weights). A completed referral with no
+referral_lame response is stored; a hit replaces the child before processing
+and is reported as `completed earlier ()`. Non-fast mode
+re-walks every branch.
+
+## Roots
+
+- Default: ask the upstream resolver (`--dns-upstream`, else system resolver
+ from /etc/resolv.conf — **not** hardcoded 127.0.0.1) for `. NS`, pick ONE
+ root. `--all-root-servers`: fetch the full set, create one top-level child
+ per root with equal weight.
+- `--root-server VALUE`: accept hostname **or** IP literal. Hostname →
+ resolve to A via upstream; IP → use directly. Fix the current
+ IP-looked-up-as-hostname bug.
+
+## CLI output (text) — match the reference byte-for-byte where shown in spec §4.5
+
+- Header block (suppressed by `--quiet`): `# Using fast mode`,
+ `# Limiting traverse to one root`, `# UDP size N (EDNS0 is )`
+ (fix the Ruby always-on bug — documented deviation), `# Retries N, max depth N`,
+ `# Allow TCP is , always TCP is `, then
+ `Using () as initial root`, `Running query type `.
+- Progress: ` (,)`; verbose adds `[qname]` and
+ ``; markers ` -- resolving`, ` -- completed earlier ()`.
+- Results (spec §4.5 wording catalogue, `%5.1f%%` with trailing `.0` trimmed):
+ `Answer from ()` + dig-style RRs indented 12 spaces;
+ `No glue at () for `;
+ `Lame referral from () to ()`;
+ `Loop encountered at `; `CNAME loop encountered at `;
+ `NODATA (for this type) at ()`; ` at ()`;
+ ` at ()`; plus
+ `While querying //` when the failing query differs.
+- Summary Results: `%5.1f%% answered with ` /
+ `resulted in a lame referral` / `resulted in an exception` /
+ `resulted in an error` / `found no such record` / `found no glue` /
+ `resulted in a loop` / `resulted in a CNAME loop`.
+- Servers (`--show-servers`): `The following servers were encountered:`,
+ rows `%*s: %-15s %s`, sorted by **lowercased reversed name**.
+- **Defaults change to match the reference CLI**: show-progress true,
+ show-resolves **false**, show-servers **false**, show-versions true,
+ show-all-stats **false**, show-results true, show-summary-results true.
+ `--show-X=false` must work (fix the truthiness-override bug).
+- Colour: honour NO_COLOR **and** only colour when stdout is a TTY.
+- `--json`: keep, but emit each aggregated leaf exactly once:
+ `{domain, qtype, root, results: [...], summary: [...], servers: [...]}`.
+ No duplication between results and summary.
+
+### Documented deviations from the Ruby reference
+
+We intentionally do NOT replicate these Ruby source bugs: the "Formate error"
+typo, the EDNS0 banner always printing "on", the stray `)` in `Stopped at
+ ())`, and the "CNANE loop" typo. Everything else matches.
+
+## Web (this pass: compile + function only)
+
+Adapt `web/api` to the new engine API with minimal change: jobs still run
+traversals and stream progress events (extend events with refid/status).
+Full web output parity (Summary/Results sections, detail tree) is a later pass.
+Remove SRV/CAA from the SPA type dropdown (backend rejects them) — align the
+select to the supported list.
+
+## Testing
+
+- Rewrite/port unit tests so mocks inject into the **single** query path.
+- Invariant test: aggregated leaf probabilities sum to 1.0 (mock topologies:
+ plain 2-NS answer, glueless NS, lame referral, CNAME restart, depth-limit).
+- Golden harness `tools/golden/`: run `run-reference.sh` and
+ `bin/exploredns` on the same domain, normalize (strip ANSI, sort aggregated
+ result blocks, canonicalise whitespace) and diff percentages + statuses +
+ RRsets. Network goldens are dev tools, not CI gates.
+
+## Out of scope (later passes)
+
+fpdns-style fingerprint database, web UI output parity, geolocation/servers
+map, IPv6 traversal (`--follow-aaaa` remains a documented no-op), SPF type,
+distinct exit codes.
diff --git a/tools/golden/compare.sh b/tools/golden/compare.sh
new file mode 100755
index 0000000..87f078e
--- /dev/null
+++ b/tools/golden/compare.sh
@@ -0,0 +1,214 @@
+#!/bin/sh
+# Compare a Ruby dnstraverse capture against an ExploreDNS capture, ignoring
+# run-to-run noise that is not a behaviour difference:
+# - ANSI colour codes
+# - which root server was picked (the reference picks one at random)
+# - TTL drift between the two runs
+# - RR ordering within one RRset / answer block
+# - per-run child ordering (the reference shuffles children, so refids are
+# assigned to different servers each run; refids are reduced to their
+# structural shape and progress lines compared as a sorted multiset)
+# What IS compared: aggregated Results percentages + statuses + server(ip)
+# attribution, Summary lines, all wording, refid structure and the shape of
+# every progress line. Server-version fingerprints are ignored (different
+# fingerprint databases), but the servers-encountered name:IP rows compare.
+#
+# Usage: tools/golden/compare.sh REFERENCE_CAPTURE GO_CAPTURE
+# Exit 0 when equivalent; exit 1 with a unified diff of the normalized forms.
+set -eu
+
+if [ $# -ne 2 ]; then
+ echo "usage: $0 REFERENCE_CAPTURE GO_CAPTURE" >&2
+ exit 2
+fi
+
+tmpdir=$(mktemp -d)
+trap 'rm -rf "$tmpdir"' EXIT
+
+normalize() {
+ python3 - "$1" <<'PYEOF'
+import re
+import sys
+
+path = sys.argv[1]
+with open(path, encoding="utf-8", errors="replace") as f:
+ text = f.read()
+
+# Strip ANSI escape sequences.
+text = re.sub(r"\x1b\[[0-9;]*[A-Za-z]", "", text)
+lines = text.split("\n")
+
+# The initial root is a per-run random choice: find it and substitute
+# placeholders everywhere (progress line 1, servers rows, results).
+rootname = rootip = None
+m_root = re.compile(r"^Using (\S+) \(([^)]+)\) as initial root$")
+for ln in lines:
+ m = m_root.match(ln)
+ if m:
+ rootname, rootip = m.group(1), m.group(2)
+ break
+
+def subst_root(s):
+ if rootname:
+ s = re.sub(re.escape(rootname), "ROOTNAME", s, flags=re.IGNORECASE)
+ s = s.replace(rootip, "ROOTIP")
+ return s
+
+def norm_rr(s):
+ # dig-style RR: name ttl class type rdata... -> collapse whitespace and
+ # blank the TTL so it cannot drift between the two runs.
+ parts = s.split()
+ if len(parts) >= 4 and parts[1].isdigit() and parts[2] in ("IN", "CH", "HS"):
+ parts[1] = "TTL"
+ return " ".join(parts)
+
+def refid_shape(refid):
+ # Reduce a refid to its structure: every component is 'd' except the
+ # literal 0 that marks a glue-resolution subtree (1.2.0.1 -> d.d.0.d).
+ return ".".join("0" if p == "0" else "d" for p in refid.split("."))
+
+re_progress = re.compile(r"^(\d+(?:\.\d+)*) (.*)$")
+re_result_head = re.compile(r"^\s*\d+(?:\.\d+)?%: ")
+re_summary_head = re.compile(r"^\s*\d+(?:\.\d+)?% ")
+re_completed = re.compile(r"completed earlier \((\d+(?:\.\d+)*)\)")
+
+header, progress, servers, results, summary = [], [], [], [], []
+section = "header"
+i = 0
+while i < len(lines):
+ ln = lines[i].rstrip()
+ if ln == "The following servers were encountered:":
+ section = "servers"
+ i += 1
+ continue
+ if ln == "Results:":
+ section = "results"
+ i += 1
+ continue
+ if ln == "Summary Results:":
+ section = "summary"
+ i += 1
+ continue
+
+ if section == "header":
+ m = re_progress.match(ln)
+ if m:
+ section = "progress"
+ continue # reprocess as progress
+ if ln:
+ header.append(subst_root(ln))
+ i += 1
+ continue
+
+ if section == "progress":
+ m = re_progress.match(ln)
+ if m:
+ rest = m.group(2)
+ # sort the IP list inside "(ip1,ip2,...)" -- RRset order noise
+ def sort_ips(mm):
+ return "(" + ",".join(sorted(mm.group(1).split(","))) + ")"
+ rest = re.sub(r"\(([^)]*)\)$", sort_ips, rest)
+ rest = re.sub(
+ r"\(([^)]*)\)( -- .*)$",
+ lambda mm: "(" + ",".join(sorted(mm.group(1).split(","))) + ")" + mm.group(2),
+ rest,
+ )
+ rest = re_completed.sub(
+ lambda mm: "completed earlier (%s)" % refid_shape(mm.group(1)), rest
+ )
+ progress.append("%s %s" % (refid_shape(m.group(1)), subst_root(rest)))
+ elif ln:
+ progress.append(subst_root(ln))
+ i += 1
+ continue
+
+ if section == "servers":
+ if ln:
+ # " name: ip version-text" -> keep name:ip, drop versions
+ m = re.match(r"^\s*(\S+): (\S+)", ln)
+ if m:
+ servers.append(subst_root("%s: %s" % (m.group(1), m.group(2))))
+ else:
+ servers.append(subst_root(ln.strip()))
+ i += 1
+ continue
+
+ if section == "results":
+ if re_result_head.match(ln):
+ head = subst_root(" ".join(ln.split()))
+ rrs, extra = [], []
+ i += 1
+ while i < len(lines):
+ nxt = lines[i].rstrip()
+ if not nxt or re_result_head.match(nxt) or nxt in (
+ "Results:", "Summary Results:",
+ "The following servers were encountered:",
+ ):
+ break
+ if nxt.lstrip().startswith("While querying"):
+ extra.append(" ".join(nxt.split()))
+ else:
+ rrs.append(norm_rr(nxt))
+ i += 1
+ block = [head] + sorted(rrs) + extra
+ results.append("\n".join(" " + b if n else b for n, b in enumerate(block)))
+ continue
+ i += 1
+ continue
+
+ if section == "summary":
+ if re_summary_head.match(ln):
+ flat = " ".join(ln.split())
+ m = re.match(r"^(\d+(?:\.\d+)?% answered with )(.*)$", flat)
+ if m:
+ rrs = [norm_rr(m.group(2))]
+ i += 1
+ while i < len(lines):
+ nxt = lines[i].rstrip()
+ if not nxt or re_summary_head.match(nxt):
+ break
+ rrs.append(norm_rr(nxt))
+ i += 1
+ summary.append(m.group(1) + " | ".join(sorted(rrs)))
+ continue
+ summary.append(flat)
+ i += 1
+ continue
+
+ i += 1
+
+out = []
+out.append("== HEADER ==")
+out.extend(header)
+out.append("== PROGRESS (sorted shapes) ==")
+out.extend(sorted(progress))
+if servers:
+ out.append("== SERVERS (name: ip) ==")
+ out.extend(sorted(servers))
+out.append("== RESULTS (sorted blocks) ==")
+out.extend(sorted(results))
+out.append("== SUMMARY (sorted) ==")
+out.extend(sorted(summary))
+
+# Sanity: aggregated Results percentages should sum to ~100.
+total = 0.0
+for r in results:
+ m = re.match(r"^\s*(\d+(?:\.\d+)?)%:", r)
+ if m:
+ total += float(m.group(1))
+if results:
+ out.append("== RESULTS TOTAL ~ %d%% ==" % round(total))
+
+print("\n".join(out))
+PYEOF
+}
+
+normalize "$1" > "$tmpdir/ref.norm"
+normalize "$2" > "$tmpdir/go.norm"
+
+if diff -u --label "reference:$1" --label "exploredns:$2" \
+ "$tmpdir/ref.norm" "$tmpdir/go.norm"; then
+ echo "MATCH: $1 == $2 (normalized)"
+else
+ exit 1
+fi
diff --git a/tools/golden/run-reference.sh b/tools/golden/run-reference.sh
new file mode 100755
index 0000000..7c04089
--- /dev/null
+++ b/tools/golden/run-reference.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Run the reference Ruby dnstraverse — the exact engine behind dns.squish.net.
+# Used to generate golden outputs for comparing ExploreDNS behaviour.
+#
+# Setup (one-time, no sudo needed):
+# gem install dnsruby -v 1.72.4 --user-install --no-document
+# gem install logger -v 1.6.6 --user-install --no-document
+#
+# The tools/dnstraverse-ruby clone is gitignored (GPL-3, dev-only). If missing:
+# git clone https://github.com/squish/dnstraverse tools/dnstraverse-ruby
+# then comment out the `require 'rdoc/usage'` line in bin/dnstraverse
+# (rdoc/usage was removed from Ruby after 1.8).
+#
+# Usage: tools/golden/run-reference.sh [dnstraverse options] DOMAIN
+set -eu
+DIR="$(cd "$(dirname "$0")/../dnstraverse-ruby" && pwd)"
+exec ruby -I"$DIR/lib" "$DIR/bin/dnstraverse" "$@"