v0.29.0
Structural cleanup of the DNS propagation module: the 1k-line propagation.rs is split into the canonical seer module-folder layout, and NS-record-specific propagation data is consolidated behind a single Option<NameserverDetails> instead of leaking across three top-level fields and one per-ServerResult field.
Breaking changes
PropagationResult JSON shape changes for /propagation/* endpoints and the equivalent MCP / Python results. Three NS-only fields are replaced by one optional nameserver_details object; ServerResult no longer carries nameserver_ips.
| Before (NS lookup) | After (NS lookup) |
|---|---|
resolved_ips: { "ns1.example.com.": ["1.2.3.4"] } |
nameserver_details.consensus: { "ns1.example.com.": ["1.2.3.4"] } |
nameserver_inconsistencies: [ ... ] |
nameserver_details.inconsistencies: [ ... ] |
results[i].nameserver_ips: { ... } |
nameserver_details.per_vantage[<server_ip>]: { ... } |
Non-NS lookups omit nameserver_details from the serialized form entirely (was three empty collections on the wire).
What changed
seer-core/src/dns/propagation.rs→propagation/{types,checker,analysis,servers}.rs: the 1096-line file is split into the canonical seer module layout used bywhois/,rdap/, anddns/dnssec.rs. Largest resulting file is 411 lines.seer-core/src/dns/propagation/types.rs: newNameserverDetails { consensus, per_vantage, inconsistencies }struct holds all NS-specific propagation data behind a single optional field.ServerResultis now a pure generic shape.seer-core/src/dns/propagation/checker.rs:resolve_nameserver_details(&[ServerResult]) -> Option<NameserverDetails>is a pure transformation — no more&mut [ServerResult]borrow.query_serverno longer initializes empty NS-only state on every result.seer-core/src/dns/propagation/analysis.rs:analyze_resultsreturns anAnalysisOutcomestruct (was a 4-tuple).build_nameserver_consensus/build_nameserver_inconsistenciestake the per-vantage map as an explicit argument instead of reading fromServerResult.seer-core/src/output/grouping.rs(new): sharedrender_groupedhelper consolidates the "group items by key, collapse subheader when one group" template that was duplicated across bothhuman.rsandmarkdown.rspropagation sections.seer-core/src/output/{human,markdown}.rs: hoistlet ns_details = result.nameserver_details.as_ref()once and use it for both the inconsistency block and the per-vantage IP lookup in the per-region results.
Health
cargo test --workspace: 467 unit tests + 18 doc-tests + 2 lib tests pass. cargo clippy --workspace -- -D warnings clean. cargo fmt --check clean. CI green on Format, Clippy, Check, Security Audit, and Test (ubuntu/macos/windows).