- 8 new axum handler tests: health, stats, query-log, overrides CRUD,
cache, blocking stats, services CRUD, dashboard HTML
- Tests use tower::oneshot — no network, no server startup
- test_ctx() builds minimal ServerCtx for isolated testing
- `make coverage` target (cargo-tarpaulin), separate from `make all`
- 82 total tests (was 74)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Ordering::Relaxed → Acquire/Release for UDP_DISABLED/UDP_FAILURES
(ARM correctness for cross-thread coordination)
- RRSIG time validation: serial number arithmetic (RFC 4034 §3.1.5)
+ 300s clock skew fudge factor (matches BIND)
- resolve_ns_addrs_from_glue collects addresses from ALL NS names,
not just the first with glue (improves failover)
- is_special_use_domain: eliminate 16 format! allocations per
.in-addr.arpa query (parse octet instead)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Generated HTML now in site/blog/posts/ (gitignored)
- CI workflow runs pandoc + make blog before deploy
- Updated all internal blog links to /blog/posts/ path
- blog/*.md remains the source of truth
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- TCP single-write fix: combine length prefix + message to avoid split
segments that Microsoft/Azure DNS servers reject
- Mock server (spawn_tcp_dns_server) updated to use single-write too
- Tests: forward_tcp_wire_format, forward_tcp_single_segment_write
- Integration: real-server checks for Microsoft/Office/Azure domains
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- find_closest_ns checks authorities (not just answers) for NS records,
fixing TLD priming cache misses that caused redundant root queries
- Periodic UDP re-probe every 5min when disabled — re-enables UDP
after switching from a restrictive network to an open one
- Dashboard DNSSEC shield uses fixed-width container for alignment
- Blog post: tuck key-tag into trust anchor paragraph
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add dnssec field to QueryLogEntry, track validation status per query
- DnssecStatus::as_str() for API serialization
- Dashboard shows green checkmark next to DNSSEC-verified responses
- Blog post: add "How keys get there" section, transport resilience section,
trim code blocks, update What's Next
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>