User Tools

Site Tools


provenance:design:dns

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
provenance:design:dns [2026/08/27 22:46] – New provenance page for design:dns: population rule, fold with residue and the Rapid7 guard, all hand-read verdicts, 29 quote needles, every external check with its output, rejected probes, judgement calls. Review log to follow. Authored by Claude. karel.kubicek.claudeprovenance:design:dns [2026/08/27 23:21] (current) – Add review pass 5 (generic). Purge the retracted pre-fix run, which had survived in four places in this log after being fixed on the page — the section now states no verdict counts of its own and records instead what three runs showed: identical 46 and no karel.kubicek.claude
Line 12: Line 12:
 | Content page | [[design:dns]], created 2026-08-27 | | Content page | [[design:dns]], created 2026-08-27 |
 | Report script | ''scripts/report_dns.mjs'' | | Report script | ''scripts/report_dns.mjs'' |
-| Fold | ''scripts/dns_fold.mjs'' (84 self-tests) |+| Fold | ''scripts/dns_fold.mjs'' (85 self-tests) |
 | Figure/quote check | ''scripts/verify_dns_figures.mjs'' | | Figure/quote check | ''scripts/verify_dns_figures.mjs'' |
 | External checks | ''scripts/external_checks_dns.sh'' + ''scripts/dnschk/*.py'' | | External checks | ''scripts/external_checks_dns.sh'' + ''scripts/dnschk/*.py'' |
Line 52: Line 52:
 === design:dns — every figure with its denominator === === design:dns — every figure with its denominator ===
 corpus 5859 papers, 7 venues, 2010–2026. Contracts: OK. corpus 5859 papers, 7 venues, 2010–2026. Contracts: OK.
-dns_fold self-tests: 84/84 pass.+dns_fold self-tests: 85/85 pass.
  
 --- A. POPULATION --- --- A. POPULATION ---
Line 115: Line 115:
  
 [query-tool] union 60 papers corpus-wide, 60 of them in DNSPOP — IN population [query-tool] union 60 papers corpus-wide, 60 of them in DNSPOP — IN population
-    18 papers    6 spellings  dig / drill / nslookup / host +    18 papers    6 spellings  dig / drill / nslookup / tor-resolve 
-    15 papers   12 spellings  DNS libraries (dnspython, ldns, miekg/dns, getdns)+    16 papers   13 spellings  DNS libraries (dnspython, ldns, miekg/dns, getdns)
     13 papers    2 spellings  ZDNS     13 papers    2 spellings  ZDNS
      7 papers    1 spellings  DNS fingerprinting (fpdns)      7 papers    1 spellings  DNS fingerprinting (fpdns)
Line 163: Line 163:
      1 papers    1 spellings  Open Resolver Project      1 papers    1 spellings  Open Resolver Project
  
-[custom] union 35 papers corpus-wide, 35 of them in DNSPOP — IN population +[custom] union 34 papers corpus-wide, 34 of them in DNSPOP — IN population 
-    35 papers   35 spellings  home-grown DNS code+    34 papers   34 spellings  home-grown DNS code
  
 [scanner-generic] union 156 papers corpus-wide, 38 of them in DNSPOP — reported only, NOT in the population rule [scanner-generic] union 156 papers corpus-wide, 38 of them in DNSPOP — reported only, NOT in the population rule
Line 172: Line 172:
  
 [vantage-platform] union 77 papers corpus-wide, 24 of them in DNSPOP — reported only, NOT in the population rule [vantage-platform] union 77 papers corpus-wide, 24 of them in DNSPOP — reported only, NOT in the population rule
-    77 papers    spellings  RIPE Atlas+    75 papers    spellings  RIPE Atlas 
 +     2 papers    1 spellings  MobileAtlas 
 + 
 +--- E2. FAMILY DETAIL FOR THE FAMILIES THE PAGE DESCRIBES IN PROSE --- 
 + 
 +  DNS fingerprinting (fpdns): 7 papers 
 +    by year: 2018:1 2023:3 2024:3 
 +    by spelling: fpdns x7 
 +    in DNSPOP: 7, of which IMC: 0 
 + 
 +  DNSViz and DNSSEC validators: 3 papers 
 +    by year: 2014:1 2023:1 2025:1 
 +    by spelling: DNSViz x2 | Extended DNSSEC Validator x1 | DNSSEC-downgrade tool x1 
 +    in DNSPOP: 3, of which IMC: 1 
 + 
 +  dig / drill / nslookup / tor-resolve: 18 papers 
 +    by year: 2010:2 2015:2 2019:4 2020:2 2021:4 2023:1 2024:1 2025:2 
 +    by spelling: dig x12 | nslookup x2 | Dig x1 | host name matching tool x1 | drill x1 | tor-resolve x1 
 +    in DNSPOP: 18, of which IMC: 7 
 + 
 +  RIPE Atlas: 75 papers 
 +    by year: 2015:4 2016:6 2017:7 2018:10 2019:5 2020:10 2021:5 2022:7 2023:5 2024:5 2025:6 2026:5 
 +    by spelling: RIPE Atlas x72 | RIPE Atlas API x2 | RIPE Atlas REST API x1 | RIPE Atlas streaming API x1 | RIPE Atlas measurement platform x1 | RIPE Atlas probes x1 
 +    in DNSPOP: 24, of which IMC: 21 
 + 
 +  MobileAtlas: 2 papers 
 +    by year: 2023:1 2025:1 
 +    by spelling: MobileAtlas x2 
 +    in DNSPOP: 0, of which IMC: 0
  
 Sum of family paper counts is NOT the union: a paper naming BIND and Unbound is in both rows. Sum of family paper counts is NOT the union: a paper naming BIND and Unbound is in both rows.
Line 185: Line 213:
    113  adjacent:registry-metadata — WHOIS / RDAP    113  adjacent:registry-metadata — WHOIS / RDAP
    112  scanner-generic — ZMap / XMap    112  scanner-generic — ZMap / XMap
-    77  vantage-platform — RIPE Atlas+    75  vantage-platform — RIPE Atlas
     52  adjacent:registry-metadata — Public Suffix List / TLD lists     52  adjacent:registry-metadata — Public Suffix List / TLD lists
     50  offtopic:speech — speech recognition / synthesis     50  offtopic:speech — speech recognition / synthesis
Line 203: Line 231:
       adjacent:categorisation — OpenDNS/Umbrella as a categoriser       adjacent:categorisation — OpenDNS/Umbrella as a categoriser
       offtopic:blocklist — NextDNS blocklist       offtopic:blocklist — NextDNS blocklist
 +      vantage-platform — MobileAtlas
       offtopic:misc — Graphviz DOT       offtopic:misc — Graphviz DOT
       adjacent:geolocation — RIPE IPmap       adjacent:geolocation — RIPE IPmap
Line 221: Line 250:
 ECS  (EDNS Client Subnet)                       1/510      3/768    11/1437     3/1955     2/1185        20 ECS  (EDNS Client Subnet)                       1/510      3/768    11/1437     3/1955     2/1185        20
 DNSCurve / DNSCrypt                             0/510      1/768     8/1437     2/1955     1/1185        12 DNSCurve / DNSCrypt                             0/510      1/768     8/1437     2/1955     1/1185        12
 +DoC  (DNS over CoAP)                            0/510      0/768     0/1437     0/1955     0/1185         0
 +   (bare CoAP, for contrast)                    0/510      2/768     4/1437     7/1955     7/1185        20
  
 Same sweeps restricted to DNSPOP (the papers that are actually about DNS): Same sweeps restricted to DNSPOP (the papers that are actually about DNS):
Line 232: Line 263:
 ECS  (EDNS Client Subnet)                        1/16       2/39       9/76       3/74       1/39        16 ECS  (EDNS Client Subnet)                        1/16       2/39       9/76       3/74       1/39        16
 DNSCurve / DNSCrypt                              0/16       1/39       8/76       1/74       1/39        11 DNSCurve / DNSCrypt                              0/16       1/39       8/76       1/74       1/39        11
 +DoC  (DNS over CoAP)                             0/16       0/39       0/76       0/74       0/39         0
 +   (bare CoAP, for contrast)                     0/16       0/39       0/76       1/74       0/39         1
  
 --- H. WHAT A DNS PAPER SAYS ABOUT ITS OWN METHOD --- --- H. WHAT A DNS PAPER SAYS ABOUT ITS OWN METHOD ---
Line 268: Line 301:
   ethics.notifiedAffectedParties           147 /   241    61.0%   ethics.notifiedAffectedParties           147 /   241    61.0%
   ethics.regulatorContact                  132 /   241    54.8%   ethics.regulatorContact                  132 /   241    54.8%
 +
 +ethics, DNS population vs the whole empirical corpus:
 +  ethics.reviewOutcome           DNS   72/241   29.9%   corpus  1728/5118   33.8%
 +  ethics.harmMitigation          DNS  186/241   77.2%   corpus  3186/5118   62.3%
 +  ethics.notifiedAffectedParties DNS  147/241   61.0%   corpus  2354/5118   46.0%
 +  ethics.regulatorContact        DNS  132/241   54.8%   corpus  2129/5118   41.6%
 +
 +ethics.robotsTxt over the crawled population: 53 / 1120 = 4.7%
 +
 +amplification/reflection full-text probe over DNSPOP: 58 / 244
 +  of which say so in the title or slug: 15
 +open-resolver full-text probe over DNSPOP: 54 / 244
 +
 +--- H2. LLM PROBE OVER DNSPOP (case-sensitive; a hit is not a method) ---
 +regex: /\b(?:LLM|large language model|GPT-[345]|ChatGPT|Llama|Gemini|Claude)\b/
 +papers: 16 / 244
 +by window: 2010–2013 0   2014–2017 0   2018–2021 3   2022–2024 5   2025–2026* 8
 +case-INsensitive, for contrast: 19 papers, by window 0/0/3/7/9
 +The four roles below are HAND-READ verdicts over all of the case-sensitive hits,
 +not a further probe. They are listed with their deciding text on the provenance page.
 +  2020/NDSS/flowprint-semi-supervised-mobile-app-fingerprinting-on-encrypted-network-traffic
 +  2021/IMC/the-far-side-of-dns-amplification-tracing-the-ddos-attack-ecosystem-from-the-int
 +  2021/PETS/the-cname-of-the-game-large-scale-analysis-of-dns-based-tracking-evasion
 +  2022/IMC/investigating-the-impact-of-ddos-attacks-on-dns-infrastructure
 +  2023/PETS/heads-in-the-clouds-measuring-universities-migration-to-public-clouds-implicatio
 +  2024/CCS/poster-dohunter-a-feature-fusion-based-llm-for-doh-tunnel-detection
 +  2024/USENIX/guardians-of-the-galaxy-content-moderation-in-the-interplanetary-file-system
 +  2024/IEEE-SP/practical-attacks-against-dns-reputation-systems
 +  2025/USENIX/dns-flare-a-flush-reload-attack-on-dns-forwarders
 +  2025/IMC/decoding-dnssec-errors-at-scale-an-automated-dnssec-error-resolution-framework-u
 +  2025/IMC/fishing-for-smishing-understanding-sms-phishing-infrastructure-and-strategies-by
 +  2026/NDSS/repairing-trust-in-domain-name-disputes-practices-insights-from-a-quarter-centurys-worth-of-squabbles
 +  2026/PETS/more-space-less-privacy-measuring-the-effectiveness-of-ip-based-website-fingerpr
 +  2026/USENIX/the-state-of-passkeys-studying-the-adoption-and-security-of-passkeys-on-the-web
 +  2026/WWW/unveiling-the-resilience-of-llm-enhanced-search-engines-against-black-hat-seo-ma
 +  2026/WWW/starlink-in-the-wild-multi-perspective-measurements-via-dns
 +
 +--- G2. RECORD TYPES AND ADDRESS FAMILY (denominator: DNSPOP) ---
 +  AAAA / IPv6 record                       65 / 244  26.6%
 +  CNAME record                             75 / 244  30.7%
 +  SVCB or HTTPS resource record             8 / 244  3.3%
 +  NS / delegation                          97 / 244  39.8%
 +  PTR / reverse                            61 / 244  25.0%
 +  TXT record                               24 / 244  9.8%
 +  TC bit / truncation / fallback to TCP    22 / 244  9.0%
  
 --- I. MEASURED RESULTS IN THE POPULATION (detection[].prevalence) --- --- I. MEASURED RESULTS IN THE POPULATION (detection[].prevalence) ---
Line 281: Line 359:
   - **A candidate sweep loose enough to catch the real instruments catches everything.** It has to match ''hnsd'', ''ldns'', ''resolvectl'', ''miekg/dns'' and ''gdnsd'', and any regex that loose also matches ''DeepSpeech'' (via %%/ech\b/%%), ''ImageBind'' and ''LanguageBind'' (%%/bind\b/%%), ''TransD'' (%%/nsd\b/%%), ''ATLAS.ti'' and ''MongoDB Atlas'' (%%/atlas/%%), every part-of-speech tagger, and ''Ghost.py'' / ''CyberGhost VPN'' (%%/host\b/%%). Those get named ''offtopic:'' families so the discard is a number, not a silence.   - **A candidate sweep loose enough to catch the real instruments catches everything.** It has to match ''hnsd'', ''ldns'', ''resolvectl'', ''miekg/dns'' and ''gdnsd'', and any regex that loose also matches ''DeepSpeech'' (via %%/ech\b/%%), ''ImageBind'' and ''LanguageBind'' (%%/bind\b/%%), ''TransD'' (%%/nsd\b/%%), ''ATLAS.ti'' and ''MongoDB Atlas'' (%%/atlas/%%), every part-of-speech tagger, and ''Ghost.py'' / ''CyberGhost VPN'' (%%/host\b/%%). Those get named ''offtopic:'' families so the discard is a number, not a silence.
   - **One brand, several products.** ''OpenDNS'' is a public resolver **and** a website categorisation service, and the corpus uses it both ways. ''NextDNS'' is a resolver and a published blocklist. ''DomainTools'' sells passive DNS and a WHOIS archive. Keyed exceptions run first.   - **One brand, several products.** ''OpenDNS'' is a public resolver **and** a website categorisation service, and the corpus uses it both ways. ''NextDNS'' is a resolver and a published blocklist. ''DomainTools'' sells passive DNS and a WHOIS archive. Keyed exceptions run first.
-  - **A name that cannot be resolved from the name.** Rapid7 Open Data is four datasets under one brand (FDNS, RDNS, SSL certificates, TCP/UDP liveness) and half the corpus tuples say only ''Rapid7'' or ''Rapid7 Sonar''. The Rapid7 family therefore carries a **guard** regex tested against name + the extractor's purpose sentence, requiring %%/dns/i%%. All ten Rapid7 tuples were read by hand and the guard decides all ten the way the reading did:+  - **A name that cannot be resolved from the name.** Rapid7 Open Data is four datasets under one brand (FDNS, RDNS, SSL certificates, TCP/UDP liveness) and half the corpus tuples say only ''Rapid7'' or ''Rapid7 Sonar''. The Rapid7 family therefore carries a **guard** regex tested against name + the extractor's purpose sentence, requiring %%/dns/i%%. The candidate regex matches **13 tuples under 11 distinct spellings**; all 13 were read by hand and the guard decides all 13 the way the reading did:
  
 ^ Tuple ^ Purpose ^ Guard verdict ^ ^ Tuple ^ Purpose ^ Guard verdict ^
Line 290: Line 368:
 | Rapid7 (CCS 2016) | "Internet-wide HTTPS and reverse-DNS scan datasets" | included | | Rapid7 (CCS 2016) | "Internet-wide HTTPS and reverse-DNS scan datasets" | included |
 | Rapid7 (IMC 2022, iGDB) | "Provide reverse-DNS mappings from IP addresses to hostnames" | included | | Rapid7 (IMC 2022, iGDB) | "Provide reverse-DNS mappings from IP addresses to hostnames" | included |
-| Rapid7's passive DNS (NDSS 2019NDSS 2021) | "Identify enterprise cloud-hosting IP addresses" / "Resolve domains and discover organization-controlled domains" | included |+| Rapid7's passive DNS (NDSS 2019 **and** NDSS 2021, two tuples) | "Identify enterprise cloud-hosting IP addresses" / "Resolve domains and discover organization-controlled domains" | included |
 | Rapid7 Forward DNS (IMC 2020) | "Collect reverse-DNS and zone-file domains for VPN identification" | included | | Rapid7 Forward DNS (IMC 2020) | "Collect reverse-DNS and zone-file domains for VPN identification" | included |
-| Rapid7 Sonar FDNS / RDNS (PoPETs 2021) | "Validated historical CNAME detection completeness" / "Checked historical tracker IP ownership" | included |+| Forward DNS dataset (IMC 2016, //Entropy/IP//) | "Collected actively queried DNS addresses" | included | 
 +| Rapid7 Sonar FDNS / RDNS (PoPETs 2021, two tuples) | "Validated historical CNAME detection completeness" / "Checked historical tracker IP ownership" | included |
 | Rapid7 sonar.udp (CCS 2022) | "Select open DNS resolvers for comparison" | included | | Rapid7 sonar.udp (CCS 2022) | "Select open DNS resolvers for comparison" | included |
 +| Rapid7 (IMC 2022, //iGDB//) | "Provide reverse-DNS mappings from IP addresses to hostnames" | included |
  
 **One keyed (name, category) exclusion** that no name regex can make: ''DIG'' with ''category == "program-analysis"'' (IEEE S&P 2024, //Everything is Good for Something//) is a likely-invariant inference engine, purpose //"Likely-invariant inference engine"//, not ''dig(1)''. **One keyed (name, category) exclusion** that no name regex can make: ''DIG'' with ''category == "program-analysis"'' (IEEE S&P 2024, //Everything is Good for Something//) is a likely-invariant inference engine, purpose //"Likely-invariant inference engine"//, not ''dig(1)''.
  
-**Six false positives found by reading the instrument-only list and fixed in the fold**, each of which would have added a non-DNS paper to the population: ''Khost'' (a KVM firmware-rehosting tool, matched a ''khost'' alternative that should never have been there), ''XMLdig-to-CSV converter'' (oscilloscope traces), ''DNSCAN'' (a clustering algorithm in a backdoor-forensics paper), ''USB2SOFT USB 2.0 device SIE'' (matched %%/\bsie\b/%% intended for Farsight's Security Information Exchange), ''Rapid7 NeXpose'', and ''DIG''.+**Seven mis-bucketings found by reading the instrument-only list and the folded family listings, and fixed in the fold**, each of which would have added a non-DNS paper to the population: ''Khost'' (a KVM firmware-rehosting tool, matched a ''khost'' alternative that should never have been there), ''XMLdig-to-CSV converter'' (oscilloscope traces), ''DNSCAN'' (a clustering algorithm in a backdoor-forensics paper), ''USB2SOFT USB 2.0 device SIE'' (matched %%/\bsie\b/%% intended for Farsight's Security Information Exchange), ''Rapid7 NeXpose'', and ''DIG''. A seventh, ''"Miek Gieben's DNS implementation"'', was landing in the home-grown family via a generic %%/dns.*implementation/%% alternative when it is in fact ''miekg/dns'', the Go library; that moved home-grown from 35 papers to **34** and DNS libraries from 15 to **16**, and it is why the page's home-grown claim is worded as "almost no two called it the same thing" rather than as a clean 35/35.
  
 ==== Fold residue, in full ==== ==== Fold residue, in full ====
Line 342: Line 422:
 ===== Quotes and per-paper figures ===== ===== Quotes and per-paper figures =====
  
-''scripts/verify_dns_figures.mjs'' checks every literal per-paper figure and every quoted sentence against ''paper.cols.txt'' with whitespace collapsed, smart quotes folded and dashes normalised. **29 needles, 0 not found.** Unedited output:+''scripts/verify_dns_figures.mjs'' checks every literal per-paper figure and every quoted sentence against ''paper.cols.txt'' with whitespace collapsed, smart quotes folded and dashes normalised. **31 needles, 0 not found** (30 located in ''paper.cols.txt'', 1 in ''paper.pdf'' only — see the box below). Unedited output:
  
 <code> <code>
-ok    2018/USENIX/who-is-answering-my-queries-understanding-and-characterizing-interception-of-the+ok    [.cols] 2018/USENIX/who-is-answering-my-queries-understanding-and-characterizing-interception-of-the
         259 of the 3,047 ASes (8.5%) that we inspect exhibit DNS interception behavior         259 of the 3,047 ASes (8.5%) that we inspect exhibit DNS interception behavior
-ok    2018/USENIX/who-is-answering-my-queries-understanding-and-characterizing-interception-of-the+ok    [.cols] 2018/USENIX/who-is-answering-my-queries-understanding-and-characterizing-interception-of-the
         148,478 residential and cellular IP addresses         148,478 residential and cellular IP addresses
-ok    2022/USENIX/many-roads-lead-to-rome-how-packet-headers-influence-dns-censorship-measurement+ok    [.cols] 2022/USENIX/many-roads-lead-to-rome-how-packet-headers-influence-dns-censorship-measurement
         that 37% of IPs across 56% ASes measured show some change in censorship behavior depending on source port and local source IP         that 37% of IPs across 56% ASes measured show some change in censorship behavior depending on source port and local source IP
-ok    2022/USENIX/many-roads-lead-to-rome-how-packet-headers-influence-dns-censorship-measurement+ok    [.cols] 2022/USENIX/many-roads-lead-to-rome-how-packet-headers-influence-dns-censorship-measurement
         This behavior is frequently all-or-nothing         This behavior is frequently all-or-nothing
-ok    2017/USENIX/global-measurement-of-dns-manipulation+ok    [.cols] 2017/USENIX/global-measurement-of-dns-manipulation
         41,778 responses (0.31%) as manipulated, spread across 58 countries         41,778 responses (0.31%) as manipulated, spread across 58 countries
-ok    2017/USENIX/global-measurement-of-dns-manipulation+ok    [.cols] 2017/USENIX/global-measurement-of-dns-manipulation
         1,408 domains         1,408 domains
-ok    2017/USENIX/global-measurement-of-dns-manipulation+ok    [.cols] 2017/USENIX/global-measurement-of-dns-manipulation
         13,594,683 DNS responses         13,594,683 DNS responses
-ok    2023/PETS/certainty-detecting-dns-manipulation-at-scale-using-tls-certificates+ok    [.cols] 2023/PETS/certainty-detecting-dns-manipulation-at-scale-using-tls-certificates
         17 TLS proxy vendors in 52 countries         17 TLS proxy vendors in 52 countries
-ok    2023/PETS/certainty-detecting-dns-manipulation-at-scale-using-tls-certificates+ok    [.cols] 2023/PETS/certainty-detecting-dns-manipulation-at-scale-using-tls-certificates
         55 ASes in 26 countries with ISP-level DNS manipulation         55 ASes in 26 countries with ISP-level DNS manipulation
-ok    2023/PETS/certainty-detecting-dns-manipulation-at-scale-using-tls-certificates+ok    [.cols] 2023/PETS/certainty-detecting-dns-manipulation-at-scale-using-tls-certificates
         previous work using consistency-based heuristics is inaccurate, allowing for 72.45% false positives in the cases detected as DNS manipulation         previous work using consistency-based heuristics is inaccurate, allowing for 72.45% false positives in the cases detected as DNS manipulation
-ok    2022/IMC/zdns-a-fast-dns-toolkit-for-internet-measurement+ok    [.cols] 2022/IMC/zdns-a-fast-dns-toolkit-for-internet-measurement
         90K lookups per second when using an external recursive resolver         90K lookups per second when using an external recursive resolver
-ok    2022/IMC/zdns-a-fast-dns-toolkit-for-internet-measurement+ok    [.cols] 2022/IMC/zdns-a-fast-dns-toolkit-for-internet-measurement
         solves 50M domains in 10 minutes         solves 50M domains in 10 minutes
-ok    2021/PETS/the-cname-of-the-game-large-scale-analysis-of-dns-based-tracking-evasion+ok    [.cols] 2021/PETS/the-cname-of-the-game-large-scale-analysis-of-dns-based-tracking-evasion
         we detected a total of 10,474 websites (eTLD+1) that used at least one of the trackers         we detected a total of 10,474 websites (eTLD+1) that used at least one of the trackers
-ok    2010/IMC/comparing-dns-resolvers-in-the-wild+ok    [.cols] 2010/IMC/comparing-dns-resolvers-in-the-wild
         fer in terms of subnets for approximately 2, 000 out of our         fer in terms of subnets for approximately 2, 000 out of our
-ok    2010/IMC/comparing-dns-resolvers-in-the-wild+ok    [.cols] 2010/IMC/comparing-dns-resolvers-in-the-wild
         10, 000 host names. In half of these cases, the returned IP         10, 000 host names. In half of these cases, the returned IP
-ok    2010/IMC/comparing-dns-resolvers-in-the-wild+ok    [.cols] 2010/IMC/comparing-dns-resolvers-in-the-wild
         addresses even belong to di         addresses even belong to di
-ok    2019/IMC/a-look-at-the-ecs-behavior-of-dns-resolvers+ok    [.cols] 2019/IMC/a-look-at-the-ecs-behavior-of-dns-resolvers
         3382 out of 4147 resolvers in the CDN dataset send 100% of their A and AAAA queries with an ECS option         3382 out of 4147 resolvers in the CDN dataset send 100% of their A and AAAA queries with an ECS option
-ok    2019/IMC/a-look-at-the-ecs-behavior-of-dns-resolvers+ok    [.cols] 2019/IMC/a-look-at-the-ecs-behavior-of-dns-resolvers
         103 recursive resolvers, or over half of all recursive resolvers we could study         103 recursive resolvers, or over half of all recursive resolvers we could study
-ok    2019/IMC/a-look-at-the-ecs-behavior-of-dns-resolvers+ok    [.cols] 2019/IMC/a-look-at-the-ecs-behavior-of-dns-resolvers
         don't control caching based on scope at all         don't control caching based on scope at all
-ok    2015/IMC/going-wild-large-scale-classification-of-open-dns-resolvers+ok    [.cols] 2015/IMC/going-wild-large-scale-classification-of-open-dns-resolvers
         find up to 20 million open resolvers in the weekly IPv4 scans         find up to 20 million open resolvers in the weekly IPv4 scans
-ok    2025/PETS/path-to-encrypted-dns-with-ddr-adoption-configuration-patterns-and-privacy-impli+ok    [.cols] 2025/PETS/path-to-encrypted-dns-with-ddr-adoption-configuration-patterns-and-privacy-impli
         In over 99 % of observed cases         In over 99 % of observed cases
-ok    2025/PETS/path-to-encrypted-dns-with-ddr-adoption-configuration-patterns-and-privacy-impli+ok    [.cols] 2025/PETS/path-to-encrypted-dns-with-ddr-adoption-configuration-patterns-and-privacy-impli
         DDR-compliant clients may fail to upgrade to DoE due to         DDR-compliant clients may fail to upgrade to DoE due to
-ok    2021/IMC/home-is-where-the-hijacking-is-understanding-dns-interception-by-residential-rou+ok    [.cols] 2021/IMC/home-is-where-the-hijacking-is-understanding-dns-interception-by-residential-rou
         occurrences of such trans- 3 parent interception         occurrences of such trans- 3 parent interception
-ok    2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective+ok    [.cols] 2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective
         domains with high accuracy in closed and open world settings, using 124 times less data than attacks on HTTPS flows         domains with high accuracy in closed and open world settings, using 124 times less data than attacks on HTTPS flows
-ok    2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective+ok    [.cols] 2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective
         We can identify resolvers         We can identify resolvers
-ok    2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective+ok    [.cols] 2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective
         with 95% accuracy         with 95% accuracy
 WEAK NEEDLE    2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective: "with 95% accuracy" — short enough to match by accident WEAK NEEDLE    2020/NDSS/encrypted-dns-privacy-a-traffic-analysis-perspective: "with 95% accuracy" — short enough to match by accident
-ok    2023/USENIX/user-awareness-and-behaviors-concerning-encrypted-dns-settings-in-web-browsers +ok    [PDF only] 2023/USENIX/user-awareness-and-behaviors-concerning-encrypted-dns-settings-in-web-browsers 
-        59.9% +        73% of all participants reported having heard of DNS before the survey 
-ok    2023/USENIX/user-awareness-and-behaviors-concerning-encrypted-dns-settings-in-web-browsers +ok    [.cols] 2023/USENIX/user-awareness-and-behaviors-concerning-encrypted-dns-settings-in-web-browsers 
-        79.4% +        ipants who reported having heard of DNS, only 59.9% had 
-ok    2025/IMC/decoding-dnssec-errors-at-scale-an-automated-dnssec-error-resolution-framework-u+ok    [.cols] 2023/USENIX/user-awareness-and-behaviors-concerning-encrypted-dns-settings-in-web-browsers 
 +        85 (79.4%) had the default 
 +ok    [.cols] 2025/IMC/decoding-dnssec-errors-at-scale-an-automated-dnssec-error-resolution-framework-u
         naive LLM-based prompt engineering         naive LLM-based prompt engineering
-ok    2025/IMC/decoding-dnssec-errors-at-scale-an-automated-dnssec-error-resolution-framework-u+ok    [.cols] 2025/IMC/decoding-dnssec-errors-at-scale-an-automated-dnssec-error-resolution-framework-u
         concrete, verifiably correct fixes         concrete, verifiably correct fixes
  
-30 needles checked, 0 not found, 0 papers unreadable.+31 needles checked, 0 not found, 0 papers unreadable.
  
 --- QUOTES THE PAGE NORMALISES (source spelling -> page spelling) --- --- QUOTES THE PAGE NORMALISES (source spelling -> page spelling) ---
Line 415: Line 497:
  
 --- FIGURES ON THE PAGE THAT ARE NOT FROM A CITED PAPER --- --- FIGURES ON THE PAGE THAT ARE NOT FROM A CITED PAPER ---
-  5,859 / 1,120 / 1,622 / 930 / 5,118 +  populationvenueyearstudy-shape and web-slice counts 
-      <- corpus contracts; report_dns.mjs section asserts them +      <- report_dns.mjs sections A-D 
-  108 / 202 / 66 / 244 / 136 / 14 / 82 / 1,218 / 5,855 +  composite venue shares stated in prose 
-      <report_dns.mjs section A +      <- report_dns.mjs section 
-  venue and year tables +  instrument family countsspelling counts, per-family year detail 
-      <- report_dns.mjs sections and C +      <- report_dns.mjs sections and E2 
-  186 / 40 / 76.2% / 16.4% / 33.6% / 5.1% +  fold residuecandidate-tuple countfold self-test count 
-      <- report_dns.mjs sections A and D +      <- report_dns.mjs section F and `node scripts/dns_fold.mjs`
-  instrument family counts (65/62/60/35/29/3/1/156/77/38/24) +
-      <- report_dns.mjs section E +
-  tool spelling counts and the 35/35 home-grown figure +
-      <- report_dns.mjs section +
-  976 candidate tuples2 unmapped84 self-tests +
-      <- report_dns.mjs section Fdns_fold.mjs+
   encrypted-DNS per-window probe counts   encrypted-DNS per-window probe counts
       <- report_dns.mjs section G       <- report_dns.mjs section G
-  124/103/12450.8%/42.2%/50.8%120/46/40/35/3, 49.2%+  reporting-gapvantage-bucketethics and amplification figures
       <- report_dns.mjs section H       <- report_dns.mjs section H
-  ethics 186/147/132/72 of 241 +  LLM probe counts, case-sensitive and case-insensitive 
-      <- report_dns.mjs section H +      <- report_dns.mjs section H2 
-  16 LLM papers, 0/0/3/5/8 +  the 7 lab-rig papers 
-      <- report_dns.mjs probe rerun; the four roles are hand-read +      <- the LAB_RIG hand map in report_dns.mjs, which the report cross-checks 
-  4.7% robots.txt of 1,120+  robots.txt reporting rate for the crawled population
       <- data/extract/OVERVIEW.md, "Where the field goes quiet"       <- data/extract/OVERVIEW.md, "Where the field goes quiet"
-  7 lab-rig papers +  every resolver-run figure: verdict tallies, both summary denominators, TTLs 
-      <- LAB_RIG hand map in report_dns.mjs +      <- out/dns/resolver_run.txt and resolver_run.json, from pages/resolver_disagreement.py 
-  28 75 / 25 100 / 46 / 1 / 37.3% / 61.3% / 1.3% +  the Tranco list id 
-      <- pages/resolver_disagreement.py run, out/dns/resolver_run.txt +      <- tranco-list.eu, fetched 2026-08-27; recorded in the provenance page 
-  Tranco list id 46W9X +  RFC numbers, dates, statuses and obsoleted-by 
-      <- tranco-list.eu, fetched 2026-08-27 +      <- external_checks_dns.sh, RFC block 
-  RFC numbers, dates, statuses, RFC 8499 obsoleted by 9499 +  tool versions, release and push dates, archived state, git tags 
-      <- rfc-editor.org JSON index via external_checks_dns.sh +      <- external_checks_dns.sh, GitHub/PyPI/Go-proxy blocks 
-  ZDNS v2.1.1 2026-05-28; zmap push 2026-08-24; massdns v1.1.0 2024-03-09 push 2026-04-15 +  vendor state: Farsight resolution, dnsdb.info and Rapid7 redirect targets, dataset dates 
-      <- GitHub API via external_checks_dns.sh +      <- external_checks_dns.sh, Farsight and Rapid7 blocks 
-  dnspython 2.8.0 2025-09-07; DNSViz v0.11.1 2025-04-21; dnscrypt-proxy 2.1.18 2026-07-18; miekg/dns push 2026-08-19 +  Firefox trr prefs and the DoH provider records 
-      <- GitHub API and PyPI via external_checks_dns.sh +      <- external_checks_dns.sh, Firefox blocks 
-  farsightsecurity.com does not resolve; dnsdb.info 104.244.14.71 -> domaintools.com/platform +  the APNIC DDR figures and the ANRW Crossref record 
-      <- external_checks_dns.sh +      <- external_checks_dns.sh, APNIC and ANRW blocks 
-  Rapid7 sonar.fdns_v2 2026-08-23, sonar.rdns_v2 2026-08-26 + 
-      <- opendata.rapid7.com parsed by external_checks_dns.sh +This block names artefacts, not values. Run the named artefact for the number.
-  network.trr.mode value 0; 5 DoH provider records; Cloudflare autoDefault +
-      <- StaticPrefList.yaml and Mozilla Remote Settings via external_checks_dns.sh+
 </code> </code>
  
Line 466: Line 540:
 | "95% resolver accuracy and 100% client accuracy" | "We built classifiers to distinguish resolver and client based on the TLS record length. We can identify resolvers with 95% accuracy, and we get no errors (100% accuracy) when identif[ying]…" — the 100% is the **client**, not the resolver; the page no longer pairs them | | "95% resolver accuracy and 100% client accuracy" | "We built classifiers to distinguish resolver and client based on the TLS record length. We can identify resolvers with 95% accuracy, and we get no errors (100% accuracy) when identif[ying]…" — the 100% is the **client**, not the resolver; the page no longer pairs them |
 | "DNS manipulation … 17 TLS proxy vendors in 52 countries and ISP-level manipulation in 26 countries" | two separate sentences: "CERTainty identifies 17 TLS proxy vendors in 52 countries" and "CERTainty also detects 55 ASes in 26 countries with ISP-level DNS manipulation" | | "DNS manipulation … 17 TLS proxy vendors in 52 countries and ISP-level manipulation in 26 countries" | two separate sentences: "CERTainty identifies 17 TLS proxy vendors in 52 countries" and "CERTainty also detects 55 ASes in 26 countries with ISP-level DNS manipulation" |
 +| "73% reported having heard of DNS" (Nisenoff et al., USENIX Security 2023) | **In the PDF, absent from ''paper.cols.txt''.** See the note below — this one is a checker bug, not a source problem, and it was caught by a reviewer. |
  
 The fourth is the one to remember: the extraction had fused two findings into one sentence, and quoting it would have invented a claim the paper does not make. The fourth is the one to remember: the extraction had fused two findings into one sentence, and quoting it would have invented a claim the paper does not make.
 +
 +<WRAP important>
 +**''paper.cols.txt'' can be missing content the PDF has, and checking only ''.cols'' scores a faithful quote as a fabrication.** Nisenoff et al.'s //"73% of all participants reported having heard of DNS before the survey"// is verbatim in ''paper.pdf'' and is **not in ''paper.cols.txt'' at all**; the only "73" near "heard of DNS" in the ''.cols'' rendering is the string "Firefox 73", a browser version number in a settings table. Working only from ''.cols'', this run concluded the figure was unverifiable and **removed it from the page**. The citations reviewer said it was in the paper; a ''pypdf'' re-extraction settled it in the reviewer's favour, the figure is back on the page as a verbatim quote, and ''verify_dns_figures.mjs'' now **falls back to ''pypdf'' for any needle that misses against ''.cols''** and labels the route it was found by. One of the 31 needles is ''PDF only''. Without that fallback the whole quote check was one rendering away from a false negative on every quote it examined.
 +</WRAP>
  
 **One figure was dropped, not rewritten.** The extraction reports "49 out of 220 intercepted probes" for Randall et al. (IMC 2021). Neither number could be located in ''paper.cols.txt'' by any probe tried. The page quotes the paper's own abstract claim ("over 200 occurrences of such transparent interception") instead and makes no 49/220 claim. **One figure was dropped, not rewritten.** The extraction reports "49 out of 220 intercepted probes" for Randall et al. (IMC 2021). Neither number could be located in ''paper.cols.txt'' by any probe tried. The page quotes the paper's own abstract claim ("over 200 occurrences of such transparent interception") instead and makes no 49/220 claim.
Line 480: Line 559:
  
 == run date (UTC) == run date (UTC)
-2026-08-27T22:24:29Z+2026-08-27T23:18:41Z
  
 == RFCs the page names: status, obsoleted-by, updated-by == RFCs the page names: status, obsoleted-by, updated-by
Line 494: Line 573:
 RFC7858   May 2016       PROPOSED STANDARD  obs_by=-          upd_by=RFC8310      Specification for DNS over Transport Layer Security (TLS RFC7858   May 2016       PROPOSED STANDARD  obs_by=-          upd_by=RFC8310      Specification for DNS over Transport Layer Security (TLS
 RFC7871   May 2016       INFORMATIONAL      obs_by=-          upd_by=-            Client Subnet in DNS Queries RFC7871   May 2016       INFORMATIONAL      obs_by=-          upd_by=-            Client Subnet in DNS Queries
 +RFC8310   March 2018     PROPOSED STANDARD  obs_by=-          upd_by=-            Usage Profiles for DNS over TLS and DNS over DTLS
 RFC8484   October 2018   PROPOSED STANDARD  obs_by=-          upd_by=-            DNS Queries over HTTPS (DoH) RFC8484   October 2018   PROPOSED STANDARD  obs_by=-          upd_by=-            DNS Queries over HTTPS (DoH)
 RFC8499   January 2019   BEST CURRENT PRACTICE obs_by=RFC9499    upd_by=-            DNS Terminology RFC8499   January 2019   BEST CURRENT PRACTICE obs_by=RFC9499    upd_by=-            DNS Terminology
Line 502: Line 582:
 RFC9250   May 2022       PROPOSED STANDARD  obs_by=-          upd_by=-            DNS over Dedicated QUIC Connections RFC9250   May 2022       PROPOSED STANDARD  obs_by=-          upd_by=-            DNS over Dedicated QUIC Connections
 RFC9276   August 2022    BEST CURRENT PRACTICE obs_by=-          upd_by=-            Guidance for NSEC3 Parameter Settings RFC9276   August 2022    BEST CURRENT PRACTICE obs_by=-          upd_by=-            Guidance for NSEC3 Parameter Settings
 +RFC9460   November 2023  PROPOSED STANDARD  obs_by=-          upd_by=-            Service Binding and Parameter Specification via the DNS 
 RFC9462   November 2023  PROPOSED STANDARD  obs_by=-          upd_by=-            Discovery of Designated Resolvers RFC9462   November 2023  PROPOSED STANDARD  obs_by=-          upd_by=-            Discovery of Designated Resolvers
 RFC9463   November 2023  PROPOSED STANDARD  obs_by=-          upd_by=-            DHCP and Router Advertisement Options for the Discovery  RFC9463   November 2023  PROPOSED STANDARD  obs_by=-          upd_by=-            DHCP and Router Advertisement Options for the Discovery 
 RFC9499   March 2024     BEST CURRENT PRACTICE obs_by=-          upd_by=-            DNS Terminology RFC9499   March 2024     BEST CURRENT PRACTICE obs_by=-          upd_by=-            DNS Terminology
 +RFC9520   December 2023  PROPOSED STANDARD  obs_by=-          upd_by=-            Negative Caching of DNS Resolution Failures
 RFC9539   February 2024  EXPERIMENTAL       obs_by=-          upd_by=-            Unilateral Opportunistic Deployment of Encrypted Recursi RFC9539   February 2024  EXPERIMENTAL       obs_by=-          upd_by=-            Unilateral Opportunistic Deployment of Encrypted Recursi
 +RFC9567   April 2024     PROPOSED STANDARD  obs_by=-          upd_by=-            DNS Error Reporting
 +RFC9606   June 2024      PROPOSED STANDARD  obs_by=-          upd_by=-            DNS Resolver Information
 +RFC9848   March 2026     PROPOSED STANDARD  obs_by=-          upd_by=-            Bootstrapping TLS Encrypted ClientHello with DNS Service
 +RFC9953   March 2026     PROPOSED STANDARD  obs_by=-          upd_by=-            DNS over CoAP (DoC)
  
 == GitHub repositories: archived state, last push, latest release == GitHub repositories: archived state, last push, latest release
Line 528: Line 614:
 PowerDNS/pdns              archived=False pushed=2026-08-27 stars=4456 PowerDNS/pdns              archived=False pushed=2026-08-27 stars=4456
    no GitHub release object: Not Found    no GitHub release object: Not Found
-CZ-NIC/knot-resolver       archived=False pushed=2026-08-27 stars=460+CZ-NIC/knot-resolver       archived=False pushed=2026-08-27 stars=461
    no GitHub release object: Not Found    no GitHub release object: Not Found
 imp/dnsmasq                archived=False pushed=2026-03-16 stars=389 imp/dnsmasq                archived=False pushed=2026-03-16 stars=389
Line 534: Line 620:
 DNS-OARC/dnsperf           archived=True  pushed=2026-02-04 stars=478 DNS-OARC/dnsperf           archived=True  pushed=2026-02-04 stars=478
    latest release v2.14.0 on 2024-01-18    latest release v2.14.0 on 2024-01-18
 +DNSCrypt/dnscrypt-proxy    archived=False pushed=2026-08-27 stars=13605
 +   latest release 2.1.18 on 2026-07-18
 +
 +== miekg/dns has no GitHub Release object but DOES have semver tags
 +git tags: ['v1.1.73', 'v1.1.72', 'v1.1.70', 'v1.1.69', 'v1.1.68']
 +go module proxy @latest: {"Version":"v1.1.73","Time":"2026-08-19T05:07:32Z","Origin":{"VCS":"git","URL":"https://github.com/miekg/dns","Hash":"d854399da1ee385b432e8b07f79e53bbfc1ab1b0","Ref":"refs/tags/v1.1.73"}}
 +
 +== Android Private DNS transport: Google's own announcement
 +  e devices. DNS-over-HTTP/3 (DoH3) support was released as part of a Google Play system update , so by the time you&#8217;re reading this, Android devices from Android 11 onwards 1 will use DoH3 instead of DoT for well-known 2 DNS servers which support it. Which DNS service you are using is unaffected by this change; only the transport will be upgraded. In th
 +
 +== ANRW 2026 DDR paper (not in the seven-venue corpus), doi 10.1145/3822163.3827932
 +  The Illusion of DDR Deployment
 +  Yevheniya Nosyk; Andrzej Duda; Maciej Korczynski
 +  Proceedings of the 2026 Applied Networking Research Workshop [[2026, 7, 20]]
 +
 +== APNIC DDR write-up by the ANRW authors (the figures the page quotes)
 +  ok   By Yevheniya Nosyk on 2 Sep 2025
 +  ok   Andrzej Duda and Maciej Korczy
 +  ok   321k DDR-enabled open resolvers
 +  ok   80.8% of DDR-enabled resolvers designating dns.google
 +  ok   Cloudflare came second at 12.4%
 +  ok   97.4% of DDR-enabled resolvers
  
 == PyPI: dnspython == PyPI: dnspython
Line 560: Line 668:
 200  https://www.dnsdb.info/ 200  https://www.dnsdb.info/
  
-== Rapid7 Open Data: are the FDNS/RDNS studies still published, and when last+== Rapid7 Open Data: where does the cited host redirect to, and is the data current 
 +  200  https://opendata.rapid7.com/  ->  https://sonardata.rapid7.com/ 
 +  200  https://opendata.rapid7.com/sonar.fdns_v2/  ->  https://sonardata.rapid7.com/sonar.fdns_v2/ 
 +  200  https://opendata.rapid7.com/sonar.rdns_v2/  ->  https://sonardata.rapid7.com/sonar.rdns_v2/
   /sonar.fdns_v2/          Forward DNS (FDNS)           last=08/23/2026   /sonar.fdns_v2/          Forward DNS (FDNS)           last=08/23/2026
   /sonar.rdns_v2/          Reverse DNS (RDNS)           last=08/26/2026   /sonar.rdns_v2/          Reverse DNS (RDNS)           last=08/26/2026
Line 573: Line 684:
 farsightsecurity.com       RESOLVE FAILED: [Errno -2] Name or service not known farsightsecurity.com       RESOLVE FAILED: [Errno -2] Name or service not known
 www.farsightsecurity.com   RESOLVE FAILED: [Errno -2] Name or service not known www.farsightsecurity.com   RESOLVE FAILED: [Errno -2] Name or service not known
-dnsdb.info                 A= 104.244.14.71+dnsdb.info                 A= 104.244.14.64
 200  https://www.dnsdb.info/  ->  https://www.domaintools.com/platform 200  https://www.dnsdb.info/  ->  https://www.domaintools.com/platform
 200  https://www.domaintools.com/products/farsight-dnsdb/  ->  https://www.domaintools.com/platform 200  https://www.domaintools.com/products/farsight-dnsdb/  ->  https://www.domaintools.com/platform
Line 641: Line 752:
   * **Source-address check on the reply.** It accepts a datagram only from the address it queried, and rejects a transaction-ID mismatch. This does not defend against an on-path forger — nothing at this layer does — but it stops a stray answer being recorded as that resolver's.   * **Source-address check on the reply.** It accepts a datagram only from the address it queried, and rejects a transaction-ID mismatch. This does not defend against an on-path forger — nothing at this layer does — but it stops a stray answer being recorded as that resolver's.
   * **''no-A-record'' is a separate verdict from ''insufficient''.** The first draft merged them and reported "25% insufficient", which hid the actual finding: those 25 names have no A record at the apex, which is a property of the zone and the most common way a list-driven crawl loses rows silently.   * **''no-A-record'' is a separate verdict from ''insufficient''.** The first draft merged them and reported "25% insufficient", which hid the actual finding: those 25 names have no A record at the apex, which is a property of the zone and the most common way a list-driven crawl loses rows silently.
-  * **Two summaries, and the script says which to quote.** Summary A over all names mixes "resolvers disagree(28/100) with "there was nothing to disagree about" (25/100). Summary B over the 75 comparable names gives 37.3%. Quoting 28% would understate the disagreement by hiding it behind the no-answer rate.+  * **Two summaries, and the script says which to quote.** Summary A over all names mixes "resolvers did not all agree" with "there was nothing to disagree about" (25 of 100). Summary B is over the 75 comparable names. Quoting the summary-A share would understate the disagreement by hiding it behind the no-answer rate. The values are in the run output below and are deliberately not restated here: the first version of this bullet restated the **pre-fix** classifier's numbers, and they survived the fix that retracted them.
  
 ==== The run behind the page's numbers ==== ==== The run behind the page's numbers ====
  
-Tranco top 100, list ID ''46W9X'', fetched from ''tranco-list.eu'' on 2026-08-27. Three public resolvers over Do53/UDP from a single European vantage point. Two consecutive runs against the same list gave **identical** verdict counts (46 identical / 1 same-/24 / 28 disjoint / 25 no-A-record), which is reassuring but is not a stability claim — it is two runs, minutes apart, from one place.+Tranco top 100, list ID ''46W9X'', fetched from ''tranco-list.eu'' on 2026-08-27. Three public resolvers over Do53/UDP from a single European vantage point.
  
-The %%<code>%% block on the page is generated by ''scripts/build_dns_codeblock.mjs'' from ''out/dns/resolver_run.txt'', with a mechanical abridgement rule (two header lines, the ''google.com'' stanza with address lists cut after two entries, both summary blocks). It is regenerated rather than pasted, because the first draft pasted an **earlier** run's TTLs under a **later** run's timestamp — the exact failure the builder now prevents.+**Three runs, and what moved between them.** The list was run three times over about ninety minutes: twice under the original (buggy) classifier, then again after the pairwise fix, then again after the script gained TC-bit handling. ''identical'' came back **46** in every run and ''no-A-record'' **25** in every run, so ''not identical'' was **29** in every run. The split of those 29 moved — 28 disjoint and 1 same-/24 under the buggy all-at-once intersection, then 21 partial / 8 disjoint, then 19 partial / 10 disjoint — as CDN mappings churned under the measurement. That is why the page quotes **not identical** as its headline and treats the partial-versus-disjoint split as illustrative rather than as a result. It is also why this section states no verdict counts of its own: they belong in the run output below, which is regenerated from the script. 
 + 
 +The %%<code>%% block on the page is generated by ''scripts/build_dns_codeblock.mjs'' from ''out/dns/resolver_run.txt'', with a mechanical abridgement rule (two header lines, the **first ''disjoint'' stanza** with address lists cut after two entries, both summary blocks). It is regenerated rather than pasted, because the first draft pasted an **earlier** run's TTLs under a **later** run's timestamp — the exact failure the builder now prevents.
  
 Full run output: Full run output:
Line 653: Line 766:
 <code> <code>
 # resolvers: Google (8.8.8.8), Cloudflare (1.1.1.1), Quad9 (9.9.9.9) # resolvers: Google (8.8.8.8), Cloudflare (1.1.1.1), Quad9 (9.9.9.9)
-# names: 100   run at 2026-08-27T22:31:01Z+# names: 100   run at 2026-08-27T23:17:26Z
  
-google.com   -> disjoint +google.com   -> partial 
-    Google       NOERROR     12.ms  ttl=209    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139 +    Google       NOERROR     13.ms  ttl=126    172.217.208.100, 172.217.208.101, 172.217.208.102, 172.217.208.113, 172.217.208.138, 172.217.208.139 
-    Cloudflare   NOERROR      9.8 ms  ttl=15     172.217.208.100, 172.217.208.101, 172.217.208.102, 172.217.208.113, 172.217.208.138, 172.217.208.139 +    Cloudflare   NOERROR      9.8 ms  ttl=287    172.217.208.100, 172.217.208.101, 172.217.208.102, 172.217.208.113, 172.217.208.138, 172.217.208.139  (2nd query TTL 278: served from cache) 
-    Quad9        NOERROR     14.ms  ttl=135    142.250.154.100, 142.250.154.101, 142.250.154.102, 142.250.154.113, 142.250.154.138, 142.250.154.139+    Quad9        NOERROR     14.ms  ttl=278    192.178.183.100, 192.178.183.101, 192.178.183.102, 192.178.183.113, 192.178.183.138, 192.178.183.139  (2nd query TTL 185: served from cache)
  
 cloudflare.com   -> identical cloudflare.com   -> identical
-    Google       NOERROR     11.ms  ttl=257    104.16.132.229, 104.16.133.229 +    Google       NOERROR     12.ms  ttl=300    104.16.132.229, 104.16.133.229  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=300    104.16.132.229, 104.16.133.229  (2nd query TTL 137: served from cache) +    Cloudflare   NOERROR      8.ms  ttl=37     104.16.132.229, 104.16.133.229 
-    Quad9        NOERROR     14.ms  ttl=87     104.16.132.229, 104.16.133.229  (2nd query TTL 38: served from cache)+    Quad9        NOERROR     16.ms  ttl=141    104.16.132.229, 104.16.133.229  (2nd query TTL 137: served from cache)
  
-gstatic.com   -> disjoint +gstatic.com   -> partial 
-    Google       NOERROR     10.ms  ttl=257    172.217.208.120, 172.217.208.94  (2nd query TTL 257: unchanged) +    Google       NOERROR     25.ms  ttl=300    172.217.208.120, 172.217.208.94  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=218    74.125.29.120, 74.125.29.94 +    Cloudflare   NOERROR      9.ms  ttl=200    172.217.208.120, 172.217.208.94  (2nd query TTL 169: served from cache) 
-    Quad9        NOERROR     13.ms  ttl=54     142.251.13.120, 142.251.13.94+    Quad9        NOERROR     14.ms  ttl=149    142.251.14.120, 142.251.14.94  (2nd query TTL 141: served from cache)
  
-facebook.com   -> disjoint +facebook.com   -> partial 
-    Google       NOERROR     13.ms  ttl=60     157.240.17.35  (2nd query TTL 17served from cache+    Google       NOERROR     13.ms  ttl=60     157.240.17.35  (2nd query TTL 60unchanged
-    Cloudflare   NOERROR      8.ms  ttl=6      157.240.17.35 +    Cloudflare   NOERROR     10.ms  ttl=38     157.240.17.35  (2nd query TTL 23: served from cache) 
-    Quad9        NOERROR     14.ms  ttl=29     157.240.0.35  (2nd query TTL 29: unchanged)+    Quad9        NOERROR     14.ms  ttl=21     157.240.253.35
  
-microsoft.com   -> disjoint +microsoft.com   -> partial 
-    Google       NOERROR      9.ms  ttl=1714   150.171.110.56 +    Google       NOERROR     13.ms  ttl=505    150.171.110.56  (2nd query TTL 475: served from cache) 
-    Cloudflare   NOERROR      9.ms  ttl=363    150.171.110.56 +    Cloudflare   NOERROR     10.ms  ttl=2455   150.171.110.56  (2nd query TTL 1180: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=335    150.171.109.101  (2nd query TTL 305: served from cache)+    Quad9        NOERROR     15.ms  ttl=201    150.171.109.101
  
 googleapis.com   -> disjoint googleapis.com   -> disjoint
-    Google       NOERROR     10.ms  ttl=69     74.125.29.103, 74.125.29.104, 74.125.29.105, 74.125.29.106, 74.125.29.147, 74.125.29.99  (2nd query TTL 9: served from cache) +    Google       NOERROR     39.ms  ttl=300    74.125.29.103, 74.125.29.104, 74.125.29.105, 74.125.29.106, 74.125.29.147, 74.125.29.99  (2nd query TTL 164: served from cache) 
-    Cloudflare   NOERROR      9.ms  ttl=272    74.125.29.103, 74.125.29.104, 74.125.29.105, 74.125.29.106, 74.125.29.147, 74.125.29.99  (2nd query TTL 170: served from cache) +    Cloudflare   NOERROR     10.ms  ttl=172    172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99 
-    Quad9        NOERROR     13.ms  ttl=265    142.251.13.103, 142.251.13.104, 142.251.13.105, 142.251.13.106, 142.251.13.147, 142.251.13.99  (2nd query TTL 69: served from cache)+    Quad9        NOERROR     14.ms  ttl=165    192.178.183.103, 192.178.183.104, 192.178.183.105, 192.178.183.106, 192.178.183.147, 192.178.183.99
  
 amazonaws.com   -> identical amazonaws.com   -> identical
-    Google       NOERROR     11.6 ms  ttl=884    15.197.250.250, 166.117.149.112  (2nd query TTL 884unchanged+    Google       NOERROR     10.6 ms  ttl=802    15.197.250.250, 166.117.149.112  (2nd query TTL 246served from cache
-    Cloudflare   NOERROR     10.ms  ttl=791    15.197.250.250, 166.117.149.112  (2nd query TTL 791unchanged+    Cloudflare   NOERROR      9.ms  ttl=747    15.197.250.250, 166.117.149.112  (2nd query TTL 709served from cache
-    Quad9        NOERROR     13.ms  ttl=281    15.197.250.250, 166.117.149.112+    Quad9        NOERROR     13.ms  ttl=171    15.197.250.250, 166.117.149.112  (2nd query TTL 169: served from cache)
  
 youtube.com   -> disjoint youtube.com   -> disjoint
-    Google       NOERROR     16.ms  ttl=300    172.217.208.136, 172.217.208.190, 172.217.208.91, 172.217.208.93  (2nd query TTL 300: unchanged) +    Google       NOERROR     20.ms  ttl=300    172.217.208.136, 172.217.208.190, 172.217.208.91, 172.217.208.93  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.0 ms  ttl=222    172.217.208.136, 172.217.208.190, 172.217.208.91, 172.217.208.93  (2nd query TTL 60: served from cache) +    Cloudflare   NOERROR      8.9 ms  ttl=111    192.178.170.136, 192.178.170.190, 192.178.170.91, 192.178.170.93 
-    Quad9        NOERROR     14.ms  ttl=107    142.251.127.136, 142.251.127.190, 142.251.127.91, 142.251.127.93  (2nd query TTL 107: unchanged)+    Quad9        NOERROR     15.ms  ttl=154    142.251.13.136, 142.251.13.190, 142.251.13.91, 142.251.13.93  (2nd query TTL 154: unchanged)
  
 apple.com   -> identical apple.com   -> identical
-    Google       NOERROR      9.ms  ttl=847    17.253.144.10  (2nd query TTL 847: unchanged) +    Google       NOERROR     10.ms  ttl=760    17.253.144.10  (2nd query TTL 760: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=430    17.253.144.10 +    Cloudflare   NOERROR      8.ms  ttl=617    17.253.144.10 
-    Quad9        NOERROR     14.ms  ttl=591    17.253.144.10  (2nd query TTL 591: unchanged)+    Quad9        NOERROR     14.ms  ttl=216    17.253.144.10
  
 gtld-servers.net   -> no-A-record gtld-servers.net   -> no-A-record
-    Google       NOERROR     10.ms  ttl=-      (no A record) +    Google       NOERROR     22.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     26.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     59.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     25.ms  ttl=-      (no A record)+    Quad9        NOERROR     20.ms  ttl=-      (no A record)
  
 akamai.net   -> no-A-record akamai.net   -> no-A-record
-    Google       NOERROR      9.ms  ttl=-      (no A record) +    Google       NOERROR     17.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR      9.ms  ttl=-      (no A record) +    Cloudflare   NOERROR      9.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
-instagram.com   -> disjoint +instagram.com   -> partial 
-    Google       NOERROR     15.ms  ttl=60     157.240.17.174  (2nd query TTL 21served from cache+    Google       NOERROR     14.ms  ttl=60     157.240.17.174  (2nd query TTL 60unchanged
-    Cloudflare   NOERROR     12.ms  ttl=58     157.240.17.174  (2nd query TTL 45: served from cache) +    Cloudflare   NOERROR     10.ms  ttl=4      157.240.17.174 
-    Quad9        NOERROR     16.ms  ttl=35     157.240.253.174  (2nd query TTL 35: unchanged)+    Quad9        NOERROR     15.ms  ttl=33     157.240.253.174  (2nd query TTL 33: unchanged)
  
 mail.ru   -> identical mail.ru   -> identical
-    Google       NOERROR     11.ms  ttl=26     185.180.201.1, 89.221.239.1, 90.156.232.4  (2nd query TTL 26unchanged+    Google       NOERROR     62.ms  ttl=60     185.180.201.1, 89.221.239.1, 90.156.232.4  (2nd query TTL 53served from cache
-    Cloudflare   NOERROR     11.ms  ttl=14     185.180.201.1, 89.221.239.1, 90.156.232.4  (2nd query TTL 14: unchanged) +    Cloudflare   NOERROR     10.ms  ttl=13     185.180.201.1, 89.221.239.1, 90.156.232.4 
-    Quad9        NOERROR     15.ms  ttl=1      185.180.201.1, 89.221.239.1, 90.156.232.4+    Quad9        NOERROR     13.ms  ttl=11     185.180.201.1, 89.221.239.1, 90.156.232.4
  
 ezviz7.com   -> no-A-record ezviz7.com   -> no-A-record
-    Google       NOERROR    172.ms  ttl=-      (no A record) +    Google       NOERROR    340.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR    243.ms  ttl=-      (no A record)
  
-fbcdn.net   -> disjoint +fbcdn.net   -> partial 
-    Google       NOERROR     11.ms  ttl=19     157.240.17.35  (2nd query TTL 19: unchanged) +    Google       NOERROR     14.ms  ttl=60     157.240.17.35  (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=9      157.240.17.35  (2nd query TTL 8served from cache+    Cloudflare   NOERROR      9.ms  ttl=42     157.240.17.35  (2nd query TTL 42unchanged
-    Quad9        NOERROR     15.ms  ttl=3      157.240.0.35+    Quad9        NOERROR     14.ms  ttl=32     157.240.0.35  (2nd query TTL 30: served from cache)
  
-twitter.com   -> disjoint +twitter.com   -> partial 
-    Google       NOERROR     10.ms  ttl=65     162.159.140.229 +    Google       NOERROR     11.ms  ttl=249    172.66.0.227  (2nd query TTL 120: served from cache) 
-    Cloudflare   NOERROR      9.ms  ttl=169    172.66.0.227  (2nd query TTL 168: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=263    162.159.140.229  (2nd query TTL 203: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=104    151.101.66.146  (2nd query TTL 76: served from cache)+    Quad9        NOERROR     13.ms  ttl=236    162.159.140.229
  
 dzen.ru   -> identical dzen.ru   -> identical
-    Google       NOERROR      9.ms  ttl=238    95.163.218.220  (2nd query TTL 238: unchanged) +    Google       NOERROR      9.ms  ttl=450    95.163.218.220 
-    Cloudflare   NOERROR      9.ms  ttl=102    95.163.218.220  (2nd query TTL 31served from cache+    Cloudflare   NOERROR      9.ms  ttl=29     95.163.218.220  (2nd query TTL 29unchanged
-    Quad9        NOERROR     15.ms  ttl=472    95.163.218.220  (2nd query TTL 64: served from cache)+    Quad9        NOERROR     16.ms  ttl=308    95.163.218.220  (2nd query TTL 24: served from cache)
  
 linkedin.com   -> identical linkedin.com   -> identical
-    Google       NOERROR      9.ms  ttl=237    130.211.32.14 +    Google       NOERROR     14.ms  ttl=300    130.211.32.14  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=107    130.211.32.14  (2nd query TTL 66: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=237    130.211.32.14 
-    Quad9        NOERROR     15.ms  ttl=29     130.211.32.14+    Quad9        NOERROR     15.ms  ttl=139    130.211.32.14
  
 domaincontrol.com   -> identical domaincontrol.com   -> identical
-    Google       NOERROR     27.ms  ttl=600    127.0.0.1  (2nd query TTL 600: unchanged) +    Google       NOERROR     25.ms  ttl=600    127.0.0.1  (2nd query TTL 600: unchanged) 
-    Cloudflare   NOERROR     16.ms  ttl=600    127.0.0.1  (2nd query TTL 600: unchanged) +    Cloudflare   NOERROR     18.ms  ttl=600    127.0.0.1  (2nd query TTL 600: unchanged) 
-    Quad9        NOERROR     16.ms  ttl=600    127.0.0.1  (2nd query TTL 600: unchanged)+    Quad9        NOERROR     17.ms  ttl=600    127.0.0.1  (2nd query TTL 600: unchanged)
  
 googlevideo.com   -> disjoint googlevideo.com   -> disjoint
-    Google       NOERROR     17.ms  ttl=300    74.125.29.103, 74.125.29.104, 74.125.29.105, 74.125.29.106, 74.125.29.147, 74.125.29.99  (2nd query TTL 258served from cache+    Google       NOERROR     17.ms  ttl=300    74.125.29.103, 74.125.29.104, 74.125.29.105, 74.125.29.106, 74.125.29.147, 74.125.29.99  (2nd query TTL 300unchanged
-    Cloudflare   NOERROR      9.ms  ttl=58     172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99  (2nd query TTL 22served from cache+    Cloudflare   NOERROR      9.ms  ttl=121    172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99  (2nd query TTL 121unchanged
-    Quad9        NOERROR     16.ms  ttl=292    192.178.183.103, 192.178.183.104, 192.178.183.105, 192.178.183.106, 192.178.183.147, 192.178.183.99  (2nd query TTL 56: served from cache)+    Quad9        NOERROR     14.ms  ttl=152    142.251.14.103, 142.251.14.104, 142.251.14.105, 142.251.14.106, 142.251.14.147, 142.251.14.99
  
 office.com   -> identical office.com   -> identical
-    Google       NOERROR     15.ms  ttl=10     13.107.6.156  (2nd query TTL 10: unchanged) +    Google       NOERROR     11.ms  ttl=2      13.107.6.156 
-    Cloudflare   NOERROR     11.ms  ttl=     13.107.6.156  (2nd query TTL 5: served from cache) +    Cloudflare   NOERROR     10.ms  ttl=     13.107.6.156 
-    Quad9        NOERROR     14.ms  ttl=     13.107.6.156+    Quad9        NOERROR     15.ms  ttl=     13.107.6.156  (2nd query TTL 5: served from cache)
  
 googletagmanager.com   -> disjoint googletagmanager.com   -> disjoint
-    Google       NOERROR     10.ms  ttl=258    172.217.208.97  (2nd query TTL 258: unchanged) +    Google       NOERROR     24.ms  ttl=300    172.217.208.97  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=261    74.125.29.97  (2nd query TTL 178served from cache+    Cloudflare   NOERROR     10.ms  ttl=271    74.125.29.97  (2nd query TTL 271unchanged
-    Quad9        NOERROR     15.ms  ttl=50     142.251.20.97  (2nd query TTL 12: served from cache)+    Quad9        NOERROR     15.ms  ttl=23     192.178.183.97
  
 hicloudcam.com   -> no-A-record hicloudcam.com   -> no-A-record
-    Google       NOERROR     11.1 ms  ttl=-      (no A record) +    Google       NOERROR    319.1 ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR    607.ms  ttl=-      (no A record) +    Cloudflare   NOERROR    520.ms  ttl=-      (no A record) 
-    Quad9        NOERROR    238.ms  ttl=-      (no A record)+    Quad9        NOERROR    240.ms  ttl=-      (no A record)
  
 live.com   -> identical live.com   -> identical
-    Google       NOERROR      9.ms  ttl=3285   204.79.197.212  (2nd query TTL 2887: served from cache) +    Google       NOERROR     13.ms  ttl=104    204.79.197.212 
-    Cloudflare   NOERROR      9.ms  ttl=233    204.79.197.212 +    Cloudflare   NOERROR      9.ms  ttl=2662   204.79.197.212  (2nd query TTL 2662: unchanged) 
-    Quad9        NOERROR     14.ms  ttl=2035   204.79.197.212+    Quad9        NOERROR     14.ms  ttl=2914   204.79.197.212  (2nd query TTL 2914: unchanged)
  
 akamaiedge.net   -> no-A-record akamaiedge.net   -> no-A-record
-    Google       NOERROR      9.ms  ttl=-      (no A record) +    Google       NOERROR     10.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 amazon.com   -> identical amazon.com   -> identical
-    Google       NOERROR     11.ms  ttl=635    98.82.161.185, 98.87.170.71, 98.87.170.74  (2nd query TTL 245: served from cache) +    Google       NOERROR     10.ms  ttl=158    98.82.161.185, 98.87.170.71, 98.87.170.74 
-    Cloudflare   NOERROR      9.ms  ttl=92     98.82.161.185, 98.87.170.71, 98.87.170.74 +    Cloudflare   NOERROR      9.ms  ttl=504    98.82.161.185, 98.87.170.71, 98.87.170.74  (2nd query TTL 492: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=671    98.82.161.185, 98.87.170.71, 98.87.170.74+    Quad9        NOERROR     16.ms  ttl=759    98.82.161.185, 98.87.170.71, 98.87.170.74  (2nd query TTL 506: served from cache)
  
 akadns.net   -> no-A-record akadns.net   -> no-A-record
-    Google       NOERROR     11.ms  ttl=-      (no A record)+    Google       NOERROR     20.ms  ttl=-      (no A record)
     Cloudflare   NOERROR     10.9 ms  ttl=-      (no A record)     Cloudflare   NOERROR     10.9 ms  ttl=-      (no A record)
-    Quad9        NOERROR     16.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 azure.com   -> identical azure.com   -> identical
-    Google       NOERROR     10.ms  ttl=3559   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 1200: served from cache) +    Google       NOERROR      9.ms  ttl=1261   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 
-    Cloudflare   NOERROR     10.ms  ttl=2214   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 2111: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=2975   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 2955: served from cache) 
-    Quad9        NOERROR     16.ms  ttl=1893   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 1886served from cache)+    Quad9        NOERROR     13.ms  ttl=2722   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 2722unchanged)
  
 bing.com   -> identical bing.com   -> identical
-    Google       NOERROR     10.ms  ttl=2729   150.171.27.10, 150.171.28.10 +    Google       NOERROR     10.ms  ttl=3542   150.171.27.10, 150.171.28.10  (2nd query TTL 691: served from cache) 
-    Cloudflare   NOERROR      9.ms  ttl=606    150.171.27.10, 150.171.28.10 +    Cloudflare   NOERROR     10.ms  ttl=2911   150.171.27.10, 150.171.28.10  (2nd query TTL 2719: served from cache) 
-    Quad9        NOERROR     14.ms  ttl=2570   150.171.27.10, 150.171.28.10+    Quad9        NOERROR     14.ms  ttl=533    150.171.27.10, 150.171.28.10
  
-github.com   -> same-/24 +github.com   -> partial 
-    Google       NOERROR     15.ms  ttl=60     140.82.121. (2nd query TTL 60: unchanged) +    Google       NOERROR     18.ms  ttl=60     140.82.121. (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=30     140.82.121.3  (2nd query TTL 30: unchanged) +    Cloudflare   NOERROR      9.ms  ttl=1      140.82.121.4 
-    Quad9        NOERROR     14.ms  ttl=57     140.82.121. (2nd query TTL 10: served from cache)+    Quad9        NOERROR     14.ms  ttl=51     140.82.121. (2nd query TTL 23: served from cache)
  
-wikipedia.org   -> disjoint +wikipedia.org   -> partial 
-    Google       NOERROR     10.ms  ttl=19     185.15.58.224 +    Google       NOERROR     11.ms  ttl=167    185.15.58.224 
-    Cloudflare   NOERROR      9.ms  ttl=70     185.15.58.224  (2nd query TTL 22: served from cache) +    Cloudflare   NOERROR     10.ms  ttl=57     185.15.58.224 
-    Quad9        NOERROR     15.ms  ttl=91     185.15.59.224  (2nd query TTL 79: served from cache)+    Quad9        NOERROR     17.ms  ttl=63     185.15.59.224  (2nd query TTL 49: served from cache)
  
-whatsapp.net   -> disjoint +whatsapp.net   -> partial 
-    Google       NOERROR     10.ms  ttl=18     157.240.17.60 +    Google       NOERROR     14.ms  ttl=60     157.240.17.60  (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR     11.ms  ttl=58     157.240.17.60  (2nd query TTL 8served from cache+    Cloudflare   NOERROR     10.ms  ttl=40     157.240.17.60  (2nd query TTL 40unchanged
-    Quad9        NOERROR     14.ms  ttl=14     157.240.0.60+    Quad9        NOERROR     15.ms  ttl=27     157.240.0.60  (2nd query TTL 27: unchanged)
  
 apple-dns.net   -> no-A-record apple-dns.net   -> no-A-record
-    Google       NOERROR     11.ms  ttl=-      (no A record) +    Google       NOERROR     10.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     10.9 ms  ttl=-      (no A record) +    Cloudflare   NOERROR      9.6 ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
 fastly.net   -> identical fastly.net   -> identical
-    Google       NOERROR     10.ms  ttl=2605   151.101.1.6, 151.101.129.6, 151.101.193.6, 151.101.65.6  (2nd query TTL 2605unchanged+    Google       NOERROR     11.ms  ttl=2039   151.101.1.6, 151.101.129.6, 151.101.193.6, 151.101.65.6  (2nd query TTL 633served from cache
-    Cloudflare   NOERROR     11.ms  ttl=2680   151.101.1.6, 151.101.129.6, 151.101.193.6, 151.101.65.6 +    Cloudflare   NOERROR     10.ms  ttl=3494   151.101.1.6, 151.101.129.6, 151.101.193.6, 151.101.65.6  (2nd query TTL 1394: served from cache) 
-    Quad9        NOERROR     16.ms  ttl=396    151.101.1.6, 151.101.129.6, 151.101.193.6, 151.101.65.6+    Quad9        NOERROR     16.ms  ttl=1732   151.101.1.6, 151.101.129.6, 151.101.193.6, 151.101.65.6
  
 googleusercontent.com   -> disjoint googleusercontent.com   -> disjoint
-    Google       NOERROR     40.ms  ttl=300    192.178.170.132  (2nd query TTL 300: unchanged) +    Google       NOERROR     38.ms  ttl=300    192.178.170.132  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     11.ms  ttl=109    74.125.29.132  (2nd query TTL 33: served from cache) +    Cloudflare   NOERROR     11.ms  ttl=108    74.125.29.132 
-    Quad9        NOERROR     15.ms  ttl=254    142.251.127.132  (2nd query TTL 98: served from cache)+    Quad9        NOERROR     14.ms  ttl=300    142.251.20.132  (2nd query TTL 178: served from cache)
  
 appsflyersdk.com   -> disjoint appsflyersdk.com   -> disjoint
-    Google       NOERROR     19.ms  ttl=60     3.165.190.101, 3.165.190.35, 3.165.190.39, 3.165.190.48  (2nd query TTL 60: unchanged) +    Google       NOERROR     17.ms  ttl=60     3.165.190.101, 3.165.190.35, 3.165.190.39, 3.165.190.48  (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR     11.4 ms  ttl=60     3.165.190.1013.165.190.353.165.190.393.165.190.48  (2nd query TTL 60: unchanged) +    Cloudflare   NOERROR     11.4 ms  ttl=60     108.139.243.111108.139.243.112108.139.243.114108.139.243. (2nd query TTL 60: unchanged) 
-    Quad9        NOERROR     14.ms  ttl=19     18.238.243.4518.238.243.4618.238.243.5718.238.243.93+    Quad9        NOERROR     18.ms  ttl=60     13.226.244.11113.226.244.6013.226.244.7613.226.244.9  (2nd query TTL 60: unchanged)
  
-doubleclick.net   -> disjoint +doubleclick.net   -> partial 
-    Google       NOERROR     18.ms  ttl=300    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139  (2nd query TTL 300: unchanged) +    Google       NOERROR     16.ms  ttl=300    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=234    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139  (2nd query TTL 45served from cache+    Cloudflare   NOERROR      9.ms  ttl=268    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139  (2nd query TTL 268unchanged
-    Quad9        NOERROR     14.ms  ttl=248    142.251.14.100, 142.251.14.101, 142.251.14.102, 142.251.14.113, 142.251.14.138, 142.251.14.139+    Quad9        NOERROR     14.ms  ttl=90     192.178.183.100, 192.178.183.101, 192.178.183.102, 192.178.183.113, 192.178.183.138, 192.178.183.139  (2nd query TTL 90: unchanged)
  
 aaplimg.com   -> no-A-record aaplimg.com   -> no-A-record
-    Google       NOERROR     11.ms  ttl=-      (no A record) +    Google       NOERROR     13.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     12.0 ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.0 ms  ttl=-      (no A record) 
-    Quad9        NOERROR     14.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 microsoftonline.com   -> no-A-record microsoftonline.com   -> no-A-record
-    Google       NOERROR     10.ms  ttl=-      (no A record) +    Google       NOERROR     12.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR      8.ms  ttl=-      (no A record) +    Cloudflare   NOERROR      9.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
-netflix.com   -> disjoint +netflix.com   -> partial 
-    Google       NOERROR     13.ms  ttl=60     52.214.181.141, 54.170.196.176, 54.246.79.9  (2nd query TTL 60: unchanged) +    Google       NOERROR     16.ms  ttl=60     52.214.181.141, 54.170.196.176, 54.246.79.9  (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR     13.ms  ttl=56     52.214.181.141, 54.170.196.176, 54.246.79. (2nd query TTL 56unchanged+    Cloudflare   NOERROR     11.ms  ttl=58     18.200.8.190, 54.155.246.232, 54.73.148.110  (2nd query TTL 8served from cache
-    Quad9        NOERROR     15.0 ms  ttl=56     18.200.8.190, 54.155.246.232, 54.73.148.110  (2nd query TTL 56unchanged)+    Quad9        NOERROR     15.0 ms  ttl=44     18.200.8.190, 54.155.246.232, 54.73.148.110  (2nd query TTL 37served from cache)
  
 office.net   -> no-A-record office.net   -> no-A-record
-    Google       NOERROR     10.ms  ttl=-      (no A record) +    Google       NOERROR     11.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     13.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 trafficmanager.net   -> no-A-record trafficmanager.net   -> no-A-record
-    Google       NOERROR     13.ms  ttl=-      (no A record)+    Google       NOERROR     12.ms  ttl=-      (no A record)
     Cloudflare   NOERROR     10.1 ms  ttl=-      (no A record)     Cloudflare   NOERROR     10.1 ms  ttl=-      (no A record)
-    Quad9        NOERROR     14.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
 gandi.net   -> identical gandi.net   -> identical
-    Google       NOERROR     33.ms  ttl=600    217.70.185.65  (2nd query TTL 600: unchanged) +    Google       NOERROR     36.ms  ttl=600    217.70.185.65  (2nd query TTL 600: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=559    217.70.185.65  (2nd query TTL 559: unchanged) +    Cloudflare   NOERROR     23.ms  ttl=600    217.70.185.65  (2nd query TTL 600: unchanged) 
-    Quad9        NOERROR     14.ms  ttl=559    217.70.185.65  (2nd query TTL 558: served from cache)+    Quad9        NOERROR     40.ms  ttl=600    217.70.185.65  (2nd query TTL 217: served from cache)
  
 sharepoint.com   -> identical sharepoint.com   -> identical
-    Google       NOERROR     10.ms  ttl=1132   13.107.136.10, 13.107.138.10  (2nd query TTL 1132unchanged+    Google       NOERROR     10.ms  ttl=1250   13.107.136.10, 13.107.138.10  (2nd query TTL 1087served from cache
-    Cloudflare   NOERROR      9.4 ms  ttl=1247   13.107.136.10, 13.107.138.10 +    Cloudflare   NOERROR     10.4 ms  ttl=2067   13.107.136.10, 13.107.138.10  (2nd query TTL 2067: unchanged) 
-    Quad9        NOERROR     14.ms  ttl=1604   13.107.136.10, 13.107.138.10  (2nd query TTL 1276: served from cache)+    Quad9        NOERROR     15.ms  ttl=2089   13.107.136.10, 13.107.138.10  (2nd query TTL 2020: served from cache)
  
 digicert.com   -> identical digicert.com   -> identical
-    Google       NOERROR     10.ms  ttl=65     45.60.121.229, 45.60.131.229  (2nd query TTL 19: served from cache) +    Google       NOERROR     12.ms  ttl=233    45.60.121.229, 45.60.131.229  (2nd query TTL 110: served from cache) 
-    Cloudflare   NOERROR     10.ms  ttl=288    45.60.121.229, 45.60.131.229  (2nd query TTL 169served from cache+    Cloudflare   NOERROR      8.ms  ttl=36     45.60.121.229, 45.60.131.229  (2nd query TTL 36unchanged
-    Quad9        NOERROR     15.ms  ttl=144    45.60.121.229, 45.60.131.229+    Quad9        NOERROR     14.ms  ttl=38     45.60.121.229, 45.60.131.229
  
-youtu.be   -> disjoint +youtu.be   -> partial 
-    Google       NOERROR     12.ms  ttl=259    74.125.29.136, 74.125.29.190, 74.125.29.91, 74.125.29.93  (2nd query TTL 259: unchanged) +    Google       NOERROR     24.ms  ttl=300    74.125.29.136, 74.125.29.190, 74.125.29.91, 74.125.29.93  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.4 ms  ttl=39     74.125.29.136, 74.125.29.190, 74.125.29.91, 74.125.29.93 +    Cloudflare   NOERROR     10.4 ms  ttl=66     74.125.29.136, 74.125.29.190, 74.125.29.91, 74.125.29.93  (2nd query TTL 47: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=118    142.251.127.136, 142.251.127.190, 142.251.127.91, 142.251.127.93+    Quad9        NOERROR     14.ms  ttl=98     142.250.154.136, 142.250.154.190, 142.250.154.91, 142.250.154.93
  
 wordpress.org   -> identical wordpress.org   -> identical
-    Google       NOERROR     11.ms  ttl=440    66.6.42.252  (2nd query TTL 379served from cache+    Google       NOERROR     10.ms  ttl=73     66.6.42.252  (2nd query TTL 73unchanged
-    Cloudflare   NOERROR     16.ms  ttl=600    66.6.42.252  (2nd query TTL 519: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=328    66.6.42.252  (2nd query TTL 134: served from cache) 
-    Quad9        NOERROR     14.ms  ttl=404    66.6.42.252  (2nd query TTL 60: served from cache)+    Quad9        NOERROR     15.ms  ttl=52     66.6.42.252
  
 skype.com   -> identical skype.com   -> identical
-    Google       NOERROR     10.ms  ttl=2344   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 +    Google       NOERROR     10.ms  ttl=183    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 
-    Cloudflare   NOERROR      9.ms  ttl=1704   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 +    Cloudflare   NOERROR      9.ms  ttl=26     20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 
-    Quad9        NOERROR     15.ms  ttl=952    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171+    Quad9        NOERROR     14.ms  ttl=1825   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171
  
 cloud.microsoft   -> identical cloud.microsoft   -> identical
-    Google       NOERROR     10.ms  ttl=127    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 +    Google       NOERROR      9.ms  ttl=97     20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 97: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=165    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 +    Cloudflare   NOERROR     10.ms  ttl=155    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 
-    Quad9        NOERROR     15.3 ms  ttl=129    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 75: served from cache)+    Quad9        NOERROR     13.3 ms  ttl=157    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171
  
 goo.gl   -> disjoint goo.gl   -> disjoint
-    Google       NOERROR     23.ms  ttl=300    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139  (2nd query TTL 300: unchanged) +    Google       NOERROR     25.ms  ttl=300    74.125.29.100, 74.125.29.101, 74.125.29.102, 74.125.29.113, 74.125.29.138, 74.125.29.139  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     11.ms  ttl=28     172.217.208.100, 172.217.208.101, 172.217.208.102, 172.217.208.113, 172.217.208.138, 172.217.208.139 +    Cloudflare   NOERROR      8.ms  ttl=280    172.217.208.100, 172.217.208.101, 172.217.208.102, 172.217.208.113, 172.217.208.138, 172.217.208.139  (2nd query TTL 280: unchanged) 
-    Quad9        NOERROR     15.ms  ttl=26     142.251.13.100, 142.251.13.101, 142.251.13.102, 142.251.13.113, 142.251.13.138, 142.251.13.139+    Quad9        NOERROR     15.ms  ttl=29     142.251.13.100, 142.251.13.101, 142.251.13.102, 142.251.13.113, 142.251.13.138, 142.251.13.139  (2nd query TTL 29: unchanged)
  
 cloudfront.net   -> no-A-record cloudfront.net   -> no-A-record
-    Google       NOERROR     12.ms  ttl=-      (no A record) +    Google       NOERROR     12.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.0 ms  ttl=-      (no A record)+    Quad9        NOERROR     17.0 ms  ttl=-      (no A record)
  
 googledomains.com   -> identical googledomains.com   -> identical
-    Google       NOERROR     30.ms  ttl=300    216.239.32.29  (2nd query TTL 300: unchanged) +    Google       NOERROR     32.ms  ttl=300    216.239.32.29  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     17.ms  ttl=300    216.239.32.29  (2nd query TTL 300unchanged+    Cloudflare   NOERROR     23.ms  ttl=300    216.239.32.29  (2nd query TTL 60served from cache
-    Quad9        NOERROR     17.ms  ttl=259    216.239.32.29+    Quad9        NOERROR     26.ms  ttl=300    216.239.32.29  (2nd query TTL 300: unchanged)
  
-x.com   -> disjoint +x.com   -> partial 
-    Google       NOERROR     12.ms  ttl=25     172.66.0.227 +    Google       NOERROR      9.ms  ttl=75     172.66.0.227  (2nd query TTL 74: served from cache) 
-    Cloudflare   NOERROR     10.ms  ttl=33     162.159.140.229 +    Cloudflare   NOERROR      9.ms  ttl=104    162.159.140.229  (2nd query TTL 103: served from cache) 
-    Quad9        NOERROR     15.1 ms  ttl=183    162.159.140.229  (2nd query TTL 87: served from cache)+    Quad9        NOERROR     15.1 ms  ttl=143    162.159.140.229  (2nd query TTL 89: served from cache)
  
 tiktok.com   -> disjoint tiktok.com   -> disjoint
-    Google       NOERROR     19.ms  ttl=20     2.21.22.17, 2.21.22.56  (2nd query TTL 20: unchanged) +    Google       NOERROR     23.ms  ttl=20     2.21.22.17, 2.21.22.56  (2nd query TTL 20: unchanged) 
-    Cloudflare   NOERROR     10.3 ms  ttl=16     23.55.104.30, 23.55.104.31, 23.55.104.38, 23.61.250.10223.61.250.104, 23.61.250.117, 23.61.250.119, 23.61.250.81  (2nd query TTL 16: unchanged) +    Cloudflare   NOERROR     10.3 ms  ttl=13     104.109.250.146, 104.109.250.172  (2nd query TTL 13: unchanged) 
-    Quad9        NOERROR     13.ms  ttl=15     104.126.37.123104.126.37.153104.126.37.179104.126.37.185  (2nd query TTL 15: unchanged)+    Quad9        NOERROR     14.ms  ttl=1      23.36.162.19923.36.162.20723.36.162.20923.36.162.213, 23.36.162.214, 23.36.162.215, 23.36.162.219, 23.36.162.221  (2nd query TTL 1: unchanged)
  
 pinterest.com   -> identical pinterest.com   -> identical
-    Google       NOERROR     12.0 ms  ttl=444    151.101.0.84, 151.101.128.84, 151.101.192.84, 151.101.64.84 +    Google       NOERROR     12.0 ms  ttl=316    151.101.0.84, 151.101.128.84, 151.101.192.84, 151.101.64.84  (2nd query TTL 316: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=415    151.101.0.84, 151.101.128.84, 151.101.192.84, 151.101.64.84  (2nd query TTL 328: served from cache) +    Cloudflare   NOERROR     10.ms  ttl=308    151.101.0.84, 151.101.128.84, 151.101.192.84, 151.101.64.84 
-    Quad9        NOERROR     14.ms  ttl=426    151.101.0.84, 151.101.128.84, 151.101.192.84, 151.101.64.84+    Quad9        NOERROR     14.ms  ttl=169    151.101.0.84, 151.101.128.84, 151.101.192.84, 151.101.64.84
  
 icloud.com   -> identical icloud.com   -> identical
-    Google       NOERROR      9.ms  ttl=438    17.253.144.10  (2nd query TTL 436: served from cache) +    Google       NOERROR      9.ms  ttl=45     17.253.144.10 
-    Cloudflare   NOERROR      9.5 ms  ttl=322    17.253.144.10  (2nd query TTL 322unchanged+    Cloudflare   NOERROR      9.5 ms  ttl=493    17.253.144.10  (2nd query TTL 415served from cache
-    Quad9        NOERROR     15.ms  ttl=296    17.253.144.10+    Quad9        NOERROR     14.ms  ttl=278    17.253.144.10  (2nd query TTL 94: served from cache)
  
-whatsapp.com   -> disjoint +whatsapp.com   -> partial 
-    Google       NOERROR     24.ms  ttl=60     157.240.17.60  (2nd query TTL 60: unchanged) +    Google       NOERROR     11.ms  ttl=36     157.240.17.60 
-    Cloudflare   NOERROR      9.ms  ttl=20     157.240.17.60 +    Cloudflare   NOERROR     10.ms  ttl=16     157.240.17.60 
-    Quad9        NOERROR     15.ms  ttl=16     157.240.0.60  (2nd query TTL 15: served from cache)+    Quad9        NOERROR     17.ms  ttl=21     157.240.0.60  (2nd query TTL 4: served from cache)
  
 roblox.com   -> identical roblox.com   -> identical
-    Google       NOERROR     11.ms  ttl=39     128.116.5.3 +    Google       NOERROR     20.ms  ttl=31     128.116.5.3  (2nd query TTL 20: served from cache) 
-    Cloudflare   NOERROR     11.ms  ttl=17     128.116.5.3  (2nd query TTL 2: served from cache) +    Cloudflare   NOERROR     11.ms  ttl=20     128.116.5.3 
-    Quad9        NOERROR     15.ms  ttl=51     128.116.5.3  (2nd query TTL 24: served from cache)+    Quad9        NOERROR     15.ms  ttl=45     128.116.5.3  (2nd query TTL 41: served from cache)
  
 yahoo.com   -> identical yahoo.com   -> identical
-    Google       NOERROR     12.ms  ttl=1121   74.6.143.25, 74.6.143.26, 74.6.231.20, 74.6.231.21, 98.137.11.163, 98.137.11.164  (2nd query TTL 1121unchanged+    Google       NOERROR     10.ms  ttl=400    74.6.143.25, 74.6.143.26, 74.6.231.20, 74.6.231.21, 98.137.11.163, 98.137.11.164  (2nd query TTL 105served from cache
-    Cloudflare   NOERROR      9.ms  ttl=40     74.6.143.25, 74.6.143.26, 74.6.231.20, 74.6.231.21, 98.137.11.163, 98.137.11.164 +    Cloudflare   NOERROR      9.ms  ttl=587    74.6.143.25, 74.6.143.26, 74.6.231.20, 74.6.231.21, 98.137.11.163, 98.137.11.164  (2nd query TTL 587: unchanged) 
-    Quad9        NOERROR     15.ms  ttl=273    74.6.143.25, 74.6.143.26, 74.6.231.20, 74.6.231.21, 98.137.11.163, 98.137.11.164+    Quad9        NOERROR     16.ms  ttl=724    74.6.143.25, 74.6.143.26, 74.6.231.20, 74.6.231.21, 98.137.11.163, 98.137.11.164  (2nd query TTL 200: served from cache)
  
 windowsupdate.com   -> no-A-record windowsupdate.com   -> no-A-record
-    Google       NOERROR      9.ms  ttl=-      (no A record) +    Google       NOERROR     11.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR      9.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.7 ms  ttl=-      (no A record)+    Quad9        NOERROR     14.7 ms  ttl=-      (no A record)
  
 cloudflare.net   -> identical cloudflare.net   -> identical
-    Google       NOERROR     14.ms  ttl=300    104.16.208.90, 104.17.156.85  (2nd query TTL 300: unchanged) +    Google       NOERROR     16.ms  ttl=300    104.16.208.90, 104.17.156.85  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=259    104.16.208.90, 104.17.156.85 +    Cloudflare   NOERROR     11.ms  ttl=91     104.16.208.90, 104.17.156.85 
-    Quad9        NOERROR     13.ms  ttl=102    104.16.208.90, 104.17.156.85  (2nd query TTL 102: unchanged)+    Quad9        NOERROR     15.ms  ttl=38     104.16.208.90, 104.17.156.85
  
 gvt1.com   -> no-A-record gvt1.com   -> no-A-record
-    Google       NOERROR     24.ms  ttl=-      (no A record) +    Google       NOERROR     42.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR      9.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     14.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
-googlesyndication.com   -> disjoint +googlesyndication.com   -> partial 
-    Google       NOERROR     10.ms  ttl=259    172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99 +    Google       NOERROR     25.ms  ttl=300    172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=38     172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99 +    Cloudflare   NOERROR     19.ms  ttl=300    172.217.208.103, 172.217.208.104, 172.217.208.105, 172.217.208.106, 172.217.208.147, 172.217.208.99  (2nd query TTL 300: unchanged) 
-    Quad9        NOERROR     15.ms  ttl=77     142.251.20.103, 142.251.20.104, 142.251.20.105, 142.251.20.106, 142.251.20.147, 142.251.20.99  (2nd query TTL 77: unchanged)+    Quad9        NOERROR     25.ms  ttl=300    142.251.110.103, 142.251.110.104, 142.251.110.105, 142.251.110.106, 142.251.110.147, 142.251.110.99  (2nd query TTL 300: unchanged)
  
 msn.com   -> identical msn.com   -> identical
-    Google       NOERROR     10.ms  ttl=131    204.79.197.219 +    Google       NOERROR     12.ms  ttl=1507   204.79.197.219  (2nd query TTL 523: served from cache) 
-    Cloudflare   NOERROR     10.ms  ttl=3474   204.79.197.219  (2nd query TTL 3474unchanged+    Cloudflare   NOERROR     11.ms  ttl=2504   204.79.197.219  (2nd query TTL 687served from cache
-    Quad9        NOERROR     14.ms  ttl=2249   204.79.197.219  (2nd query TTL 1844served from cache)+    Quad9        NOERROR     15.ms  ttl=717    204.79.197.219  (2nd query TTL 717unchanged)
  
 spotify.com   -> identical spotify.com   -> identical
-    Google       NOERROR     12.3 ms  ttl=4      35.186.224.24 +    Google       NOERROR     10.3 ms  ttl=131    35.186.224.24  (2nd query TTL 130: served from cache) 
-    Cloudflare   NOERROR      9.ms  ttl=108    35.186.224.24 +    Cloudflare   NOERROR      9.ms  ttl=87     35.186.224.24 
-    Quad9        NOERROR     16.ms  ttl=18     35.186.224.24+    Quad9        NOERROR     15.ms  ttl=171    35.186.224.24  (2nd query TTL 162: served from cache)
  
 windows.net   -> identical windows.net   -> identical
-    Google       NOERROR     11.ms  ttl=166    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 16served from cache+    Google       NOERROR     12.ms  ttl=48     20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 48unchanged
-    Cloudflare   NOERROR     10.ms  ttl=1314   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 1314: unchanged) +    Cloudflare   NOERROR      9.ms  ttl=2033   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 2033: unchanged) 
-    Quad9        NOERROR     15.ms  ttl=3208   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 3206served from cache)+    Quad9        NOERROR     15.ms  ttl=632    20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 632unchanged)
  
 ntp.org   -> identical ntp.org   -> identical
-    Google       NOERROR     10.ms  ttl=346    204.93.207.22, 209.148.110.246  (2nd query TTL 346: unchanged) +    Google       NOERROR     10.ms  ttl=1158   204.93.207.22, 209.148.110.246 
-    Cloudflare   NOERROR      9.ms  ttl=2645   204.93.207.22, 209.148.110.246  (2nd query TTL 2645: unchanged) +    Cloudflare   NOERROR     11.ms  ttl=3461   204.93.207.22, 209.148.110.246  (2nd query TTL 3461: unchanged) 
-    Quad9        NOERROR     15.ms  ttl=1861   204.93.207.22, 209.148.110.246  (2nd query TTL 1560: served from cache)+    Quad9        NOERROR     15.ms  ttl=2375   204.93.207.22, 209.148.110.246
  
 adobe.com   -> disjoint adobe.com   -> disjoint
-    Google       NOERROR     17.ms  ttl=20     92.123.27.153, 92.123.27.160, 92.123.27.170  (2nd query TTL 20: unchanged) +    Google       NOERROR     17.ms  ttl=20     92.123.27.153, 92.123.27.168, 92.123.27.169  (2nd query TTL 20: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=15     2.20.245.1742.20.245.187  (2nd query TTL 15unchanged+    Cloudflare   NOERROR     11.ms  ttl=3      23.36.163.2723.50.131.121  (2nd query TTL 2served from cache
-    Quad9        NOERROR     15.ms  ttl=3      2.19.126.138, 2.19.126.158+    Quad9        NOERROR     15.ms  ttl=11     2.19.126.138, 2.19.126.158  (2nd query TTL 6: served from cache)
  
 myfritz.net   -> identical myfritz.net   -> identical
-    Google       NOERROR     11.ms  ttl=7939   212.42.244.100 +    Google       NOERROR     10.ms  ttl=5152   212.42.244.100 
-    Cloudflare   NOERROR     26.ms  ttl=86400  212.42.244.100  (2nd query TTL 86400: unchanged) +    Cloudflare   NOERROR     26.ms  ttl=86400  212.42.244.100  (2nd query TTL 86400: unchanged) 
-    Quad9        NOERROR     16.ms  ttl=27929  212.42.244.100+    Quad9        NOERROR     15.ms  ttl=40413  212.42.244.100  (2nd query TTL 31027: served from cache)
  
 pv-cdn.net   -> no-A-record pv-cdn.net   -> no-A-record
-    Google       NOERROR     11.ms  ttl=-      (no A record) +    Google       NOERROR     12.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     14.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
-wa.me   -> disjoint +wa.me   -> partial 
-    Google       NOERROR     13.ms  ttl=60     157.240.17.60  (2nd query TTL 60: unchanged) +    Google       NOERROR     20.ms  ttl=60     157.240.17.60  (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=50     157.240.17.60  (2nd query TTL 50: unchanged) +    Cloudflare   NOERROR      9.ms  ttl=49     157.240.17.60  (2nd query TTL 49: unchanged) 
-    Quad9        NOERROR     15.ms  ttl=49     157.240.0.60  (2nd query TTL 49: unchanged)+    Quad9        NOERROR     14.ms  ttl=21     157.240.0.60
  
 cdninstagram.com   -> no-A-record cdninstagram.com   -> no-A-record
-    Google       NOERROR     15.ms  ttl=-      (no A record) +    Google       NOERROR     13.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR     13.ms  ttl=-      (no A record)
  
-nginx.org   -> disjoint +nginx.org   -> partial 
-    Google       NOERROR      9.ms  ttl=46     52.58.199.22 +    Google       NOERROR     10.ms  ttl=9      3.125.197.172  (2nd query TTL 9: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=51     3.125.197.172  (2nd query TTL 13: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=19     52.58.199.22 
-    Quad9        NOERROR     13.ms  ttl=35     3.125.197.172  (2nd query TTL 7: served from cache)+    Quad9        NOERROR     16.ms  ttl=18     3.125.197.172
  
 akam.net   -> no-A-record akam.net   -> no-A-record
-    Google       NOERROR     31.ms  ttl=-      (no A record) +    Google       NOERROR     47.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     12.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     21.ms  ttl=-      (no A record)+    Quad9        NOERROR     17.ms  ttl=-      (no A record)
  
 tiktokcdn.com   -> no-A-record tiktokcdn.com   -> no-A-record
-    Google       NOERROR     10.ms  ttl=-      (no A record) +    Google       NOERROR      9.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR      8.9 ms  ttl=-      (no A record) +    Cloudflare   NOERROR      9.2 ms  ttl=-      (no A record) 
-    Quad9        NOERROR     14.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
 chatgpt.com   -> identical chatgpt.com   -> identical
-    Google       NOERROR     29.ms  ttl=300    104.18.32.47, 172.64.155.209  (2nd query TTL 300: unchanged) +    Google       NOERROR     28.ms  ttl=300    104.18.32.47, 172.64.155.209  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=36     104.18.32.47, 172.64.155.209  (2nd query TTL 35: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=254    104.18.32.47, 172.64.155.209  (2nd query TTL 253: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=93     104.18.32.47, 172.64.155.209+    Quad9        NOERROR     14.ms  ttl=135    104.18.32.47, 172.64.155.209  (2nd query TTL 135: unchanged)
  
 zoom.us   -> identical zoom.us   -> identical
-    Google       NOERROR     17.ms  ttl=60     170.114.52.2  (2nd query TTL 60: unchanged) +    Google       NOERROR     13.ms  ttl=60     170.114.52.2  (2nd query TTL 60: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=39     170.114.52.2 +    Cloudflare   NOERROR     10.ms  ttl=20     170.114.52.2 
-    Quad9        NOERROR     14.ms  ttl=47     170.114.52.2+    Quad9        NOERROR     14.ms  ttl=22     170.114.52.2
  
 tiktokv.com   -> disjoint tiktokv.com   -> disjoint
-    Google       NOERROR     10.ms  ttl=12     104.126.37.129, 104.126.37.138, 104.126.37.139, 104.126.37.145, 104.126.37.153, 104.126.37.160, 104.126.37.161, 104.126.37.168, 104.126.37.185  (2nd query TTL 12unchanged+    Google       NOERROR     10.ms  ttl=8      104.126.37.128, 104.126.37.129, 104.126.37.131, 104.126.37.153, 104.126.37.155, 104.126.37.161, 104.126.37.179, 104.126.37.184, 104.126.37.186  (2nd query TTL 7served from cache
-    Cloudflare   NOERROR      8.ms  ttl=11     23.55.104.1323.55.104.2323.55.104.3423.55.104.3523.55.104.4123.55.104.4523.55.104.50, 23.55.104.57, 23.55.104.6 +    Cloudflare   NOERROR      9.ms  ttl=8      2.21.22.272.21.22.342.21.22.402.21.22.412.21.22.562.21.22.582.21.22.8, 23.10.249.81, 23.10.249.82  (2nd query TTL 3: served from cache) 
-    Quad9        NOERROR     14.ms  ttl=14     2.18.64.13, 2.18.64.16, 2.18.64.17, 2.18.64.212.18.64.22, 2.18.64.282.18.64.322.18.64.352.18.64.4+    Quad9        NOERROR     15.ms  ttl=12     2.20.142.129, 2.20.142.136, 2.20.142.144, 2.20.142.16092.122.215.2, 92.122.215.5992.122.215.7292.122.215.7392.122.215.93  (2nd query TTL 11: served from cache)
  
 vimeo.com   -> identical vimeo.com   -> identical
-    Google       NOERROR     10.ms  ttl=481    162.159.128.61, 162.159.138.60 +    Google       NOERROR     11.ms  ttl=397    162.159.128.61, 162.159.138.60  (2nd query TTL 397: unchanged) 
-    Cloudflare   NOERROR      9.5 ms  ttl=785    162.159.128.61, 162.159.138.60  (2nd query TTL 785: unchanged) +    Cloudflare   NOERROR     10.5 ms  ttl=799    162.159.128.61, 162.159.138.60  (2nd query TTL 799: unchanged) 
-    Quad9        NOERROR     24.ms  ttl=469    162.159.128.61, 162.159.138.60+    Quad9        NOERROR     15.ms  ttl=523    162.159.128.61, 162.159.138.60  (2nd query TTL 153: served from cache)
  
 edgekey.net   -> no-A-record edgekey.net   -> no-A-record
-    Google       NOERROR     10.ms  ttl=-      (no A record) +    Google       NOERROR     11.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     11.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     17.3 ms  ttl=-      (no A record)+    Quad9        NOERROR     15.3 ms  ttl=-      (no A record)
  
 baidu.com   -> identical baidu.com   -> identical
-    Google       NOERROR     12.ms  ttl=600    110.242.74.102, 111.63.65.103, 111.63.65.247, 124.237.177.164  (2nd query TTL 104served from cache+    Google       NOERROR     10.ms  ttl=502    110.242.74.102, 111.63.65.103, 111.63.65.247, 124.237.177.164  (2nd query TTL 502unchanged
-    Cloudflare   NOERROR     10.7 ms  ttl=232    110.242.74.102, 111.63.65.103, 111.63.65.247, 124.237.177.164  (2nd query TTL 201: served from cache) +    Cloudflare   NOERROR     10.7 ms  ttl=264    110.242.74.102, 111.63.65.103, 111.63.65.247, 124.237.177.164 
-    Quad9        NOERROR     15.ms  ttl=111    110.242.74.102, 111.63.65.103, 111.63.65.247, 124.237.177.164+    Quad9        NOERROR     15.ms  ttl=268    110.242.74.102, 111.63.65.103, 111.63.65.247, 124.237.177.164  (2nd query TTL 268: unchanged)
  
 cloudflare-dns.com   -> identical cloudflare-dns.com   -> identical
-    Google       NOERROR     15.ms  ttl=300    104.16.248.249, 104.16.249.249  (2nd query TTL 300: unchanged) +    Google       NOERROR     17.ms  ttl=300    104.16.248.249, 104.16.249.249  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=276    104.16.248.249, 104.16.249.249  (2nd query TTL 276: unchanged) +    Cloudflare   NOERROR      9.ms  ttl=84     104.16.248.249, 104.16.249.249 
-    Quad9        NOERROR     16.ms  ttl=148    104.16.248.249, 104.16.249.249+    Quad9        NOERROR     14.ms  ttl=51     104.16.248.249, 104.16.249.249
  
 gvt2.com   -> no-A-record gvt2.com   -> no-A-record
-    Google       NOERROR     13.ms  ttl=-      (no A record) +    Google       NOERROR     18.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     12.9 ms  ttl=-      (no A record) +    Cloudflare   NOERROR     17.9 ms  ttl=-      (no A record) 
-    Quad9        NOERROR     16.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 yandex.net   -> identical yandex.net   -> identical
-    Google       NOERROR     12.ms  ttl=590    213.180.204.242  (2nd query TTL 590: unchanged) +    Google       NOERROR     11.ms  ttl=54     213.180.204.242  (2nd query TTL 54: unchanged) 
-    Cloudflare   NOERROR     10.ms  ttl=244    213.180.204.242 +    Cloudflare   NOERROR     10.ms  ttl=547    213.180.204.242  (2nd query TTL 547: unchanged) 
-    Quad9        NOERROR     19.ms  ttl=257    213.180.204.242+    Quad9        NOERROR     15.ms  ttl=6      213.180.204.242  (2nd query TTL 6: unchanged)
  
 windows.com   -> identical windows.com   -> identical
-    Google       NOERROR     10.ms  ttl=3535   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 1892: served from cache) +    Google       NOERROR     10.ms  ttl=2705   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 623: served from cache) 
-    Cloudflare   NOERROR      9.ms  ttl=1604   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171 +    Cloudflare   NOERROR     10.ms  ttl=2600   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 2420: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=21     20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171+    Quad9        NOERROR     15.ms  ttl=2531   20.112.250.133, 20.231.239.246, 20.236.44.162, 20.70.246.20, 20.76.201.171  (2nd query TTL 107: served from cache)
  
 root-servers.net   -> no-A-record root-servers.net   -> no-A-record
-    Google       NOERROR     24.ms  ttl=-      (no A record) +    Google       NOERROR     18.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     13.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     15.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 openai.com   -> identical openai.com   -> identical
-    Google       NOERROR     12.ms  ttl=28     104.18.33.45, 172.64.154.211  (2nd query TTL 28: unchanged) +    Google       NOERROR     10.ms  ttl=1      104.18.33.45, 172.64.154.211  (2nd query TTL 1: unchanged) 
-    Cloudflare   NOERROR     10.3 ms  ttl=53     104.18.33.45, 172.64.154.211 +    Cloudflare   NOERROR      8.3 ms  ttl=60     104.18.33.45, 172.64.154.211  (2nd query TTL 26: served from cache) 
-    Quad9        NOERROR     14.ms  ttl=23     104.18.33.45, 172.64.154.211+    Quad9        NOERROR     14.ms  ttl=5      104.18.33.45, 172.64.154.211  (2nd query TTL 5: unchanged)
  
 gwfb.net   -> no-A-record gwfb.net   -> no-A-record
-    Google       NOERROR     10.ms  ttl=-      (no A record) +    Google       NOERROR    402.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR    543.ms  ttl=-      (no A record) +    Cloudflare   NOERROR    762.ms  ttl=-      (no A record) 
-    Quad9        NOERROR    243.ms  ttl=-      (no A record)+    Quad9        NOERROR    261.ms  ttl=-      (no A record)
  
 ytimg.com   -> no-A-record ytimg.com   -> no-A-record
-    Google       NOERROR     19.ms  ttl=-      (no A record) +    Google       NOERROR     29.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR      8.ms  ttl=-      (no A record) +    Cloudflare   NOERROR      9.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     16.ms  ttl=-      (no A record)+    Quad9        NOERROR     14.ms  ttl=-      (no A record)
  
 workers.dev   -> identical workers.dev   -> identical
-    Google       NOERROR     14.ms  ttl=300    104.18.12.15, 104.18.13.15  (2nd query TTL 300: unchanged) +    Google       NOERROR     13.ms  ttl=300    104.18.12.15, 104.18.13.15  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     12.ms  ttl=300    104.18.12.15, 104.18.13.15  (2nd query TTL 300unchanged+    Cloudflare   NOERROR     13.ms  ttl=300    104.18.12.15, 104.18.13.15  (2nd query TTL 257served from cache
-    Quad9        NOERROR     16.ms  ttl=82     104.18.12.15, 104.18.13.15+    Quad9        NOERROR     18.ms  ttl=300    104.18.12.15, 104.18.13.15  (2nd query TTL 160: served from cache)
  
 qq.com   -> identical qq.com   -> identical
-    Google       NOERROR     12.ms  ttl=594    113.108.81.189, 123.150.76.218, 203.205.254.157 +    Google       NOERROR    229.ms  ttl=600    113.108.81.189, 123.150.76.218, 203.205.254.157  (2nd query TTL 597: served from cache) 
-    Cloudflare   NOERROR     14.ms  ttl=268    113.108.81.189, 123.150.76.218, 203.205.254.157  (2nd query TTL 82served from cache+    Cloudflare   NOERROR      9.ms  ttl=299    113.108.81.189, 123.150.76.218, 203.205.254.157  (2nd query TTL 299unchanged
-    Quad9        NOERROR     17.ms  ttl=598    113.108.81.189, 123.150.76.218, 203.205.254.157  (2nd query TTL 316: served from cache)+    Quad9        NOERROR     15.ms  ttl=199    113.108.81.189, 123.150.76.218, 203.205.254.157  (2nd query TTL 147: served from cache)
  
 opera.com   -> identical opera.com   -> identical
-    Google       NOERROR     11.ms  ttl=226    185.26.182.103, 185.26.182.104 +    Google       NOERROR     22.ms  ttl=600    185.26.182.103, 185.26.182.104  (2nd query TTL 600: unchanged) 
-    Cloudflare   NOERROR     11.1 ms  ttl=368    185.26.182.103, 185.26.182.104  (2nd query TTL 368: unchanged) +    Cloudflare   NOERROR     22.1 ms  ttl=600    185.26.182.103, 185.26.182.104  (2nd query TTL 600: unchanged) 
-    Quad9        NOERROR     29.ms  ttl=600    185.26.182.103, 185.26.182.104  (2nd query TTL 600: unchanged)+    Quad9        NOERROR     14.ms  ttl=9      185.26.182.103, 185.26.182.104
  
 samsung.com   -> identical samsung.com   -> identical
-    Google       NOERROR     11.ms  ttl=98     211.45.27.231  (2nd query TTL 98: unchanged) +    Google       NOERROR      9.ms  ttl=155    211.45.27.231 
-    Cloudflare   NOERROR      9.ms  ttl=49     211.45.27.231  (2nd query TTL 32: served from cache) +    Cloudflare   NOERROR      9.ms  ttl=176    211.45.27.231 
-    Quad9        NOERROR     16.ms  ttl=70     211.45.27.231+    Quad9        NOERROR     13.ms  ttl=125    211.45.27.231
  
-blogspot.com   -> disjoint +blogspot.com   -> partial 
-    Google       NOERROR     23.6 ms  ttl=300    74.125.29.191  (2nd query TTL 300: unchanged) +    Google       NOERROR     24.6 ms  ttl=300    74.125.29.191  (2nd query TTL 300: unchanged) 
-    Cloudflare   NOERROR     18.ms  ttl=300    172.217.208.191  (2nd query TTL 300: unchanged) +    Cloudflare   NOERROR     16.ms  ttl=300    74.125.29.191  (2nd query TTL 300: unchanged) 
-    Quad9        NOERROR     24.ms  ttl=300    142.251.20.191  (2nd query TTL 291: served from cache)+    Quad9        NOERROR     14.ms  ttl=28     142.251.20.191
  
 mozilla.org   -> identical mozilla.org   -> identical
-    Google       NOERROR     10.ms  ttl=137    35.190.14.201  (2nd query TTL 96served from cache+    Google       NOERROR     10.ms  ttl=57     35.190.14.201  (2nd query TTL 57unchanged
-    Cloudflare   NOERROR     12.3 ms  ttl=600    35.190.14.201  (2nd query TTL 592: served from cache) +    Cloudflare   NOERROR      9.3 ms  ttl=318    35.190.14.201  (2nd query TTL 17: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=530    35.190.14.201  (2nd query TTL 230served from cache)+    Quad9        NOERROR     14.ms  ttl=582    35.190.14.201  (2nd query TTL 582unchanged)
  
 nginx.com   -> identical nginx.com   -> identical
-    Google       NOERROR     10.ms  ttl=67     159.60.134.0 +    Google       NOERROR     11.ms  ttl=123    159.60.134.0  (2nd query TTL 123: unchanged) 
-    Cloudflare   NOERROR      9.4 ms  ttl=349    159.60.134.0  (2nd query TTL 87: served from cache) +    Cloudflare   NOERROR     10.4 ms  ttl=299    159.60.134.0 
-    Quad9        NOERROR     15.ms  ttl=106    159.60.134.0+    Quad9        NOERROR     16.ms  ttl=101    159.60.134.0
  
 wordpress.com   -> identical wordpress.com   -> identical
-    Google       NOERROR     11.ms  ttl=126    192.0.78.17, 192.0.78.9 +    Google       NOERROR      9.ms  ttl=95     192.0.78.17, 192.0.78.9 
-    Cloudflare   NOERROR     11.ms  ttl=68     192.0.78.17, 192.0.78.9 +    Cloudflare   NOERROR     10.ms  ttl=51     192.0.78.17, 192.0.78.9 
-    Quad9        NOERROR     14.ms  ttl=129    192.0.78.17, 192.0.78.9  (2nd query TTL 30: served from cache)+    Quad9        NOERROR     16.ms  ttl=209    192.0.78.17, 192.0.78.9  (2nd query TTL 12: served from cache)
  
 edgesuite.net   -> no-A-record edgesuite.net   -> no-A-record
-    Google       NOERROR      9.ms  ttl=-      (no A record) +    Google       NOERROR     13.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) +    Cloudflare   NOERROR     10.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     14.ms  ttl=-      (no A record)+    Quad9        NOERROR     15.ms  ttl=-      (no A record)
  
 workbox.dk   -> no-A-record workbox.dk   -> no-A-record
-    Google       NOERROR     12.ms  ttl=-      (no A record) +    Google       NOERROR     11.ms  ttl=-      (no A record) 
-    Cloudflare   NOERROR     18.ms  ttl=-      (no A record) +    Cloudflare   NOERROR    133.ms  ttl=-      (no A record) 
-    Quad9        NOERROR     25.ms  ttl=-      (no A record)+    Quad9        NOERROR     23.ms  ttl=-      (no A record)
  
 yandex.ru   -> identical yandex.ru   -> identical
-    Google       NOERROR     10.5 ms  ttl=132    5.255.255.77, 77.88.44.55, 77.88.55.88  (2nd query TTL 132: unchanged) +    Google       NOERROR     11.5 ms  ttl=360    5.255.255.77, 77.88.44.55, 77.88.55.88  (2nd query TTL 360: unchanged) 
-    Cloudflare   NOERROR      9.ms  ttl=49     5.255.255.77, 77.88.44.55, 77.88.55.88 +    Cloudflare   NOERROR     10.ms  ttl=521    5.255.255.77, 77.88.44.55, 77.88.55.88  (2nd query TTL 285: served from cache) 
-    Quad9        NOERROR     15.ms  ttl=558    5.255.255.77, 77.88.44.55, 77.88.55.88  (2nd query TTL 530: served from cache)+    Quad9        NOERROR     15.ms  ttl=227    5.255.255.77, 77.88.44.55, 77.88.55.88  (2nd query TTL 95: served from cache)
  
 summary A: all 100 names summary A: all 100 names
   identical        46   46.0%   identical        46   46.0%
-  same-/24          1    1.0% +  partial          19   19.0% 
-  disjoint         28   28.0%+  disjoint         10   10.0%
   no-A-record      25   25.0%   no-A-record      25   25.0%
  
 summary B: the 75 names where at least two resolvers returned an address summary B: the 75 names where at least two resolvers returned an address
   identical        46   61.3%   identical        46   61.3%
-  same-/24          1    1.3% +  partial          19   25.3% 
-  disjoint         28   37.3%+  disjoint         10   13.3% 
 +  NOT identical    29   38.7%   <- the headline: at least one resolver disagreed with another
  
 Summary B is the denominator to quote. Summary A mixes two different Summary B is the denominator to quote. Summary A mixes two different
Line 1170: Line 1284:
 list has no address to disagree about. list has no address to disagree about.
  
-'disjoint' means no resolver returned an address any other resolver +'disjoint' means NO PAIR of resolvers returned an address in common, and 
-returnedIf your pipeline resolves names once, through one resolver, +no pair even shared a /24'partial' means some pair overlapped and some 
-that is the share of your dataset another resolver would have +pair did not. The number to quote for "how much does my choice of 
-disagreed with entirely -- from this vantage point, at this instant.+resolver matter" is NOT identical: that is the share of your name list 
 +where resolvers did not all agree -- from this vantage point, at this 
 +instant. 'disjoint' alone understates it; quoting 'disjoint' as though 
 +it meant "any disagreement" overstates it.
  
 wrote out/dns/resolver_run.json wrote out/dns/resolver_run.json
Line 1189: Line 1306:
 </code> </code>
  
-The 28 names with disjoint answers:+The names with fully disjoint answers, in the run below:
  
 <code> <code>
-28 names +10 names 
-google.com, gstatic.com, facebook.com, microsoft.com, googleapis.com +googleapis.com, youtube.com, googlevideo.com, googletagmanager.com 
-youtube.com, instagram.com, fbcdn.net, twitter.com, googlevideo.com +googleusercontent.com, appsflyersdk.com, goo.gl, tiktok.com, adobe.com 
-googletagmanager.com, wikipedia.org, whatsapp.net, googleusercontent.com +tiktokv.com
-appsflyersdk.com, doubleclick.net, netflix.com, youtu.be, goo.gl, x.com +
-tiktok.com, whatsapp.com, googlesyndication.com, adobe.com, wa.me, nginx.org +
-tiktokv.com, blogspot.com+
 </code> </code>
  
Line 1217: Line 1331:
   - **The seven lab-rig papers stay in the population.** They used a DNS-specific instrument, which is what the rule says. Removing them would make the rule a judgement. Publishing the count is the compromise.   - **The seven lab-rig papers stay in the population.** They used a DNS-specific instrument, which is what the rule says. Removing them would make the rule a judgement. Publishing the count is the compromise.
   - **Posters (14 of 244) are not excluded.** The page's headline claims are not reporting-gap rates where poster brevity would bias the result upward; the vantage-location and version figures are, so the poster count is stated next to the population.   - **Posters (14 of 244) are not excluded.** The page's headline claims are not reporting-gap rates where poster brevity would bias the result upward; the vantage-location and version figures are, so the poster count is stated next to the population.
 +  - **Two rhetorical sentences were re-derived and one was wrong.** The draft said "IMC is where this work lives, by a factor of three over the next venue" (true: 13.2% vs 4.3%) and "if you read only the web-measurement venues you are reading the wrong 60%" (**unsupported**). Measuring it: TheWebConf and PoPETs together are **12.3%** of the 244 and IMC, USENIX Security and NDSS together are **70.1%**. The sentence now states those two figures, which ''report_dns.mjs'' section B derives so they are not hand arithmetic beside a table.
   - **The 2010 Ager result leads failure mode 1 even though it is sixteen years old.** It is the cleanest statement of a property that has not changed, and the script's own run is the current evidence beside it. The page says both.   - **The 2010 Ager result leads failure mode 1 even though it is sixteen years old.** It is the cleanest statement of a property that has not changed, and the script's own run is the current evidence beside it. The page says both.
   - **''security:tls_certificates'' was not edited.** [[design:automated_measurements]] routes "DNS" to that page and to [[design:ip_classification]]; both routings are now wrong. The parent's routing table was corrected to point here. The TLS page itself says nothing about DNS and needed no change.   - **''security:tls_certificates'' was not edited.** [[design:automated_measurements]] routes "DNS" to that page and to [[design:ip_classification]]; both routings are now wrong. The parent's routing table was corrected to point here. The TLS page itself says nothing about DNS and needed no change.
Line 1226: Line 1341:
 | [[provenance:design:dns]] | created (this page) | | [[provenance:design:dns]] | created (this page) |
 | [[literature:bibliography]] | **23** entries appended before ''%%</bibtex>%%'', from a fresh ''?do=export_raw''. Zero key collisions, zero DOI collisions, zero URL collisions, zero title collisions against the 632 live entries. Cache purged afterwards; the page renders **29** references against **29** distinct citekeys with no unresolved warnings. | | [[literature:bibliography]] | **23** entries appended before ''%%</bibtex>%%'', from a fresh ''?do=export_raw''. Zero key collisions, zero DOI collisions, zero URL collisions, zero title collisions against the 632 live entries. Cache purged afterwards; the page renders **29** references against **29** distinct citekeys with no unresolved warnings. |
-| [[design]] | DNS row added to the namespace table and the page count corrected |+| [[:design]] | DNS row added to the namespace table and the page count corrected |
 | [[design:automated_measurements]] | the scan row of the routing table now points at [[design:dns]] for DNS rather than at the TLS and IP pages | | [[design:automated_measurements]] | the scan row of the routing table now points at [[design:dns]] for DNS rather than at the TLS and IP pages |
  
 ===== Review log ===== ===== Review log =====
  
-Reviews had not been run when this page was first assembledIf you are reading this sentence on the live wiki, the review pass did not happen and the page should be treated accordingly.+Five review passes plus three rounds of self-review. Each reviewer was told explicitly that the author's context 
 +may not be exhaustive, and each was handed the page text, the report script and 
 +its unedited output, the fold, the quote checker and the external checks. 
 + 
 +**Snapshots.** The three focused passes all read the same frozen snapshot, 
 +''out/dns/review/frozen_design_dns.txt'' (48,440 bytes, the page as published at 
 +revision 1787870384) and ''out/dns/review/frozen_provenance.txt''. Two rounds of 
 +**self-review** corrections were applied to the live page while they were 
 +running (revisions 1787870940 and 1787871092), so a reviewer reporting one of 
 +those is reporting something already fixed — the table below says which. 
 + 
 +==== Self-review, before the reviewers reported ==== 
 + 
 +Found by re-deriving the page's own framing sentences rather than its tables, 
 +which is where the site's history says unmeasured claims hide. 
 + 
 +^ Found ^ Verdict ^ 
 +| "if you read only the web-measurement venues you are reading the wrong 60%" — **unsupported**, invented while writing | Fixed. Measured: TheWebConf and PoPETs together are 12.3% of the 244; IMC, USENIX Security and NDSS together are 70.1%. Both are now derived by ''report_dns.mjs'' section B rather than being hand arithmetic beside a table. | 
 +| "the amplification literature in this corpus is large and consistent" — **unmeasured** | Fixed. 58 of 244 match an amplification/reflection probe; 15 say so in the title. Both now printed by the report. | 
 +| "the DNS population is somewhat more ethics-forthcoming than the corpus average" — a comparison with no comparison printed, and **false on one of the four fields** | Fixed. The ethics table now carries the whole-corpus column beside the DNS column, and the sentence says explicitly that ''reviewOutcome'' is **lower** (29.9% vs 33.8%) while the other three are higher. | 
 +| "most papers here answer fewer than half" of the eight-item methods checklist — the schema has a field for only two of the eight | Fixed. The page now says the extraction can measure two of the eight, gives those two rates, and calls the list a standard rather than a measurement. | 
 +| "the single most cited reason a web crawl needs a resolution step" — an unmeasured superlative | Fixed, reworded to a claim about what a request-level measurement cannot see. | 
 +| ''"Miek Gieben's DNS implementation"'' was folding into home-grown code when it is ''miekg/dns'', the Go library | Fixed in ''dns_fold.mjs''; home-grown 35→**34** papers, DNS libraries 15→**16**. The page's home-grown claim was reworded from a clean "35 distinct strings for 35 papers" to "34 distinct strings, only two of them shared, and both of those generic". | 
 +| "Seven of those papers use the software as part of an attack rig" sat under the **resolver-software** ranking, but only **six** of the seven lab-rig papers are in that family — the seventh is a DNSSEC-tool case. A figure that is right about the hand map and wrong about the section it is printed in. | Fixed. The sentence now says six, notes that all six are ''dnsmasq'', and points at the seventh separately. | 
 +| "Both of those slices are provisional years" about the LLM counts 0/0/3/5/8 — the **5** is 2022–2024, which is not provisional | Fixed. Only the 8 is in the provisional window, and the page now says so and says the growth rests on the thinnest years. | 
 + 
 +==== Pass 1 — citations and quotes (sonnet) ==== 
 + 
 +^ Finding ^ Verdict ^ 
 +| **The 73% in Nisenoff et al. is real.** This run had removed it after failing to find it in ''paper.cols.txt'' (the only "73" near "heard of DNS" there is the string "Firefox 73"). The reviewer said it was in the paper. | **Accepted — and it exposed a checker bug.** A ''pypdf'' re-extraction has //"73% of all participants reported having heard of DNS before the survey"// verbatim; it is absent from ''.cols'' entirely. The figure is back on the page as a quote, and ''verify_dns_figures.mjs'' now falls back to ''pypdf'' for any needle that misses against ''.cols'' and labels the route. 31 needles, 30 ''.cols'', **1 PDF-only**. Without this the quote check was one rendering away from a false negative on every quote it examined. | 
 +| Five papers are in ''literature:bibliography'' **twice under two keys** — ''fouad2022my''/''fouad2022_cookie'' and ''ahmad2026_ipfp''/''ahmad2026_more'' share a DOI, ''bottger2025_regional''/''boettger2025_regional'' likewise, plus ''lerner2016internet''/''lerner2016_internet'' and ''bouhoula2024automated''/''bouhoula2024_automated'' | **Accepted, out of scope, recorded.** None is cited by this page and all predate it. Filed as the ''dedup-bibliography-duplicate-papers'' work item with the fix and with the observation that a key-string collision check passes on all five — only a DOI and normalised-title scan finds them. | 
 +| ZDNS's two throughput figures come from the same external-resolver sentence (not mixed with the paper's separate internal-recursion figures); Iris's four figures share one sentence; Liu et al.'s two share the abstract sentence; CERTainty's three are correctly kept apart; Siby's 95% (resolver) is correctly not paired with the paper's 100% (client) | Confirmations, no change. These are exactly the numerator/denominator and mirror-image traps the pass was asked to hunt, and the reviewer checked each. | 
 +| ''dao2021_cname'' and ''dimova2021cname'' are two different CNAME-cloaking papers, correctly presented as such | Confirmation, no change. | 
 +| All 29 citekeys resolve; no key, DOI, title or URL collision between the 23 new entries and the 632 pre-existing ones; all ~20 prose attributions and 8 table attributions match their entry's author field; 15 entries spot-checked against Crossref and the venue landing pages | Confirmations, no change. | 
 + 
 +**Declared not checked by this pass:** the fold counts and the venue/year corpus 
 +tables (out of scope for a citations review), and most of the non-paper external 
 +figures beyond the four it re-fetched. 
 + 
 +==== Pass 2 — figures against the script (sonnet) ==== 
 + 
 +^ Finding ^ Verdict ^ 
 +| **The published script's ''verdict()'' was wrong, and the page's headline number with it.** It intersected **all** answering resolvers' address sets at once, so with three resolvers, two agreeing exactly and a third differing produced an empty three-way intersection and fell through to ''disjoint'' — contradicting the definition the script prints in its own output and the page repeats. On the committed 100-name run, **17 of the 28** names labelled disjoint had two of three resolvers returning byte-identical addresses. | **Accepted; the most serious finding of the run.** Reproduced independently from the committed JSON before changing anything. ''verdict()'' is now pairwise, with a ''partial'' verdict between ''identical'' and ''disjoint'' and a ''one-answered'' verdict for the case where exactly one resolver returns an address; ''%%--self-test%%'' checks ten cases including ''facebook.com'' and ''wikipedia.org'' from the run that caught it. The measurement was re-run; the page's headline is now **not identical, 29 of 75 (38.7%)**, replacing the published 28 / 37.3%. Per-verdict counts are deliberately not restated here — they are in the run output on this page, and see pass 5 for why the split between ''partial'' and ''disjoint'' is not a stable quantity. The page now says in the open that the first version was wrong and what it got wrong. | 
 +| **"All 7 uses [of fpdns] are pre-2024" is false** — 1 in 2018, 3 in 2023, **3 in 2024**. | Accepted. Reproduced. The row now gives the year breakdown and says what the recent uses are for. The report prints per-year and per-spelling detail for every family the page describes in prose, so this class of sentence is checkable. | 
 +| **''bhaskar2022_many'' does not use RIPE Atlas.** The page said two papers were built on it and named this one; its tools are BreadCrumb, Censys, MaxMind and Go, and its vantage record says //"we send DNS packets from an external measurement vantage point"//. | Accepted, reproduced from the paper's own record. Replaced with four papers that do use it ({[randall2021_home]}, {[moura2019_cache]}, {[aldalky2019_look]}, {[randall2020_trufflehunter]}), and the page now says explicitly that Bhaskar and Pearce do **not** — which is the point, since controlling their own source address is what their result depends on. | 
 +| The DNSViz row was 3 papers, but only **2** use DNSViz; the third is a 2014 use of the //Extended DNSSEC Validator// Firefox extension, and the row printed DNSViz's currency for all three. | Accepted. Row is now 2, with the third named and explained. | 
 +| The **16 LLM papers / 0-0-3-5-8** figure was attributed to ''report_dns.mjs'', which contained no such probe — the regex existed only as prose. And the regex is **case-sensitive**, which is load-bearing: case-insensitively it gives 19 papers and 0/0/3/7/9. | Accepted. The probe is now a section of ''report_dns.mjs'' which prints the regex, both counts, and the list of matching papers; the page says the probe is case-sensitive and gives the case-insensitive contrast. | 
 +| ''dnscrypt-proxy'' 2.1.18 / 2026-07-18 was attributed to ''external_checks_dns.sh'', which did not check that repository. | Accepted. Added to the repository list; the figure is now reproducible from the named script. | 
 +| The ''dig'' family label said "/ host" but **no paper in the corpus names ''host(1)''** — the only "host" string is one paper's own "host name matching tool". | Accepted. Family relabelled to ''dig / drill / nslookup / tor-resolve'' in the fold and on the page, with the spelling breakdown given. | 
 +| ''query()'' called ''settimeout()'' once outside the receive loop, so the timeout restarted on every datagram: a stream of unrelated packets could keep one query alive far past ''%%--timeout%%''. A bad property for a script whose subject is off-path packets. | Accepted. The timeout is now a total deadline recomputed per iteration. Tested against a blackholed resolver: it fails at the stated timeout. | 
 +| Reviewer could not confirm the run is a genuine measurement against the real public resolvers, citing TTLs that rise between a query and its immediate repeat. | **Rejected, with the reason recorded.** A rising TTL on a repeat is ordinary anycast behaviour — the two queries reach different instances of the same public resolver, with independently warmed caches — and it is visible in the run in both directions. The answers are independently checkable and check out (''example.com'' on Cloudflare addresses, three distinct Google ranges for ''gstatic.com'', Akamai returning different addresses per resolver), the per-resolver RTTs are stably ordered across 100 names, and a query to a blackholed address times out rather than returning fabricated data. The caveat is nonetheless worth having on the record, and the page already frames the run as "one machine, one instant" rather than as a claim about the Internet. | 
 +| Confirmations: no drift between the committed outputs and a fresh run of all three scripts; the ''%%<file>%%'' and ''%%<code>%%'' blocks round-trip exactly; every population, venue, year, instrument-family, ethics, reporting-gap and encrypted-DNS figure traces; the poster count, robots.txt rate and fold residue check out; all 30 per-paper figures trace to their sources. | No change. | 
 + 
 +==== Pass 3 — external currency (sonnet) ==== 
 + 
 +Every finding below was **re-verified independently** before being acted on, because a currency claim is exactly the kind a reviewer can get wrong from memory. 
 + 
 +^ Finding ^ Verdict ^ 
 +| The DDR "frontier" framing is already contested: **//The Illusion of DDR Deployment//, Nosyk, Duda and Korczyński, ANRW 2026**, argues that resolvers scored as misconfigured DDR are in many cases transparent forwarders. | **Accepted.** Verified against the Crossref record for ''10.1145/3822163.3827932'' — title, all three authors, //Proceedings of the 2026 Applied Networking Research Workshop//, published 2026-07-20. ANRW is not in the corpus, so the "one paper in this corpus" claim stays true, but the page now says the 99% figure's interpretation is disputed and names the paper. The full text is behind an ACM 403 from this host and the page says the characterisation rests on metadata, not on a reading. | 
 +| **"''miekg/dns'' … no tagged releases (pin a commit, not a tag)" is wrong.** The repo publishes no GitHub //Release// objects but does publish semver git tags. | **Accepted.** Verified two ways: ''api.github.com/repos/miekg/dns/tags'' returns ''v1.1.73'' … ''v1.1.68'', and ''proxy.golang.org/github.com/miekg/dns/@latest'' returns ''v1.1.73'', 2026-08-19. The page's own advice would have made a reader's pin **worse**. Corrected, and the distinction between a Release object and a tag is now stated so the next check does not repeat it. | 
 +| **"Android's Private DNS is DoT" is stale.** Since a July 2022 Google Play system update, Android 11+ uses DoH3 for well-known providers. | **Accepted.** Verified against Google's own Security Blog post, fetched and the sentence re-read: //"Android devices from Android 11 onwards will use DoH3 instead of DoT for well-known DNS servers which support it"//. The DoT row now says this, notes DoH3 is neither DoT nor RFC 9250 DoQ, and the check is in ''external_checks_dns.sh''. | 
 +| **RFC 9539** (encrypted **recursive-to-authoritative** DNS, Experimental, Feb 2024) was in the run's own RFC dump and never reached the page. It is a different trust boundary from everything in the protocol table. | **Accepted.** The page now has a paragraph saying the table covers only the stub-to-recursive hop, and that "we measured encrypted DNS" must say which hop. | 
 +| Several 2023–2026 DNS RFCs a "what is current" page should name are missing: **9953** (DNS over CoAP, March 2026), 9460 (SVCB/HTTPS RR), 9567 (DNS Error Reporting), 9520 (negative caching of failures), 9606 (RESINFO), 9848 (ECH bootstrap). | **Partly accepted.** All six verified against the RFC Editor index and added to the external check. **RFC 9953 (DoC) is now a row in the protocol table** with a zero corpus count, because omitting a five-month-old standardised transport from a table headed "what is actually current" is the exact failure this page is about. The other four were **not** added: 9460, 9567, 9520 and 9606 are real and relevant but each would need its own measurement-facing paragraph, and adding six RFC numbers without them would be a reading list, not guidance. Recorded here as the honest reason rather than as an oversight. | 
 +| **''opendata.rapid7.com'' 301s to ''sonardata.rapid7.com''** for every path, including both dataset directories the page cites. | **Accepted.** Verified with ''curl -L -w %{url_effective}'' on three paths. The substantive claim (data still current, updated 2026-08-23 / 2026-08-26) was unchanged. The page now names the new host and the check prints the redirect target. | 
 +| iCloud Private Relay is the largest real-world ODoH deployment, so "not a deployed default" understates it. | **Rejected.** The reviewer's support is a third-party DFIR blog. Apple's own //iCloud Private Relay Overview// PDF 404s and the relevant Apple documentation pages render client-side, so **no primary source for "Private Relay uses ODoH" could be fetched**. Under this project's rule that a load-bearing industry claim needs a primary source, it is not going on the page. If someone finds an Apple document that says it, this is worth adding — it would materially change how the ODoH row reads. | 
 +| Apple's ''DNSSettings'' MDM profile and Windows Server 2025 DoH GA are coverage gaps. | **Rejected as out of scope.** Neither is a wrong claim on the page. The Apple docs page renders client-side and could not be read; the Windows claim was supported by search results rather than a Microsoft document the reviewer fetched. A page about measuring DNS does not need an enterprise-deployment survey. | 
 +| Confirmations: all ten RFC statuses and dates the page names, every tool version, the Farsight domain failing to resolve, the Firefox prefs and the five DoH provider records, and every URL except ''data.caida.org'' (401, already disclosed). | No change. | 
 + 
 +==== Self-review, round three (after applying passes 1–3) ==== 
 + 
 +^ Found ^ Verdict ^ 
 +| The DDR tip box's **lead sentence** still said "the one paper that looked says the deployment is broken" while the rest of the box explained that the finding is contested. That is the exact pattern this site's history warns about: the careful version survives three paragraphs down, the prominent sentence loses the hedge. | Fixed. The box now leads with "what it measures is unsettled". | 
 +| The box's footnote credited "the authors' own public write-up" without that write-up having been fetched. | Fixed by fetching it. The APNIC post (Nosyk, 2 September 2025, with Duda and Korczyński) is a better source than the ACM-403 paper and gives quotable figures: //"over 321k DDR-enabled open resolvers"//, Google at 80.8%, top five at 97.4%. Five needles from it are now checked by ''external_checks_dns.sh''. The box also makes the venue point that follows: DDR work in 2025–2026 is in PoPETs, at ANRW and on an operator blog, and this corpus contains **one** of the three. | 
 +| The code-block builder pinned its example to ''google.com''; on the re-run ''google.com'' came back ''partial'' and the block would have illustrated the wrong verdict under a "disjoint" heading. | Fixed before it shipped: the builder now selects the first stanza whose verdict is ''disjoint'', and the page states that rule. | 
 + 
 +==== Pass 4 — figures re-check, after the fixes (sonnet, re-run of pass 2) ==== 
 + 
 +The pass-2 reviewer was re-run against the corrected page and scripts, as the workflow requires for any reviewer whose findings were acted on. 
 + 
 +^ Finding ^ Verdict ^ 
 +| **The ''NON_PAPER_FIGURES'' ledger in ''verify_dns_figures.mjs'' was stale in three places, left behind by the very fixes it was checking** — it still said "84 self-tests" (now 85), "35/35 home-grown" (now 34/34), and "28 / 75 / … / 37.3%" for the resolver run, which are the **pre-fix, retracted** verdict numbers. No check broke, because the correct values were independently present via the report; but a ledger whose entire purpose is "which artefact backs this figure" was pointing a future auditor at withdrawn ones. | **Accepted, and fixed at the root rather than patched.** The block now lists **where** each non-corpus figure comes from and never restates its value: a pointer cannot go stale, a copy always will. Two figures then failed the whole-page guard because their values were no longer duplicated anywhere — which is the guard doing its job. The ''robots.txt'' rate is now **derived by ''report_dns.mjs''** instead of being lifted from ''OVERVIEW.md'' (a file the guard does not read), and the ''dnsdb.info'' A record was **removed from the page**: it rotated from ''104.244.14.71'' to ''104.244.14.64'' between two runs an hour apart, which is a poor thing to pin on a page about resolver-dependent answers. | 
 +| **The Rapid7 guard's audit table claimed "all ten tuples were read" when the candidate regex matches 13 tuples under 11 spellings.** The missing row is IMC 2016 //Entropy/IP//, tool name ''"Forward DNS dataset"''. It is classified correctly and the family count (8 papers) is right — but the table was not exhaustive while saying it was. | **Accepted.** Reproduced against the raw extraction: 13 tuples, 11 spellings. The provenance table now has all 13 rows, marks the two rows that cover two tuples each, and the count is corrected in the fold comment, the report comment and the prose. This is the review layer catching an **overstatement of the page's own rigour**, which is exactly what the provenance page is most at risk of. | 
 +| ''verdict()'' fix confirmed correct and complete: 10/10 self-tests, and an independent re-implementation of the documented definitions reclassified all 100 names in the committed JSON with **zero mismatches** (46 / 21 / 8 / 25, 29 of 75 = 38.7%). ''one-answered'' and ''insufficient'' are reachable and simply do not occur in this run. | No change. | 
 +| Total-deadline fix confirmed: ''deadline'' is set once and ''remaining'' recomputed per iteration; a live query to a blackholed TEST-NET-1 address returned at **2.009 s** against a 2.0 s timeout with a useful error string. | No change. | 
 +| Population confirmed unmoved by all four fold edits: A=108, B=202, A∩B=66, **DNSPOP=244**. Every page figure matches a fresh script run; ''%%<file>%%'' and ''%%<code>%%'' blocks round-trip byte-for-byte; the code block's example is confirmed the first ''disjoint'' stanza in the current run. | No change. | 
 +| The ''frozen2'' snapshots no longer match the live page, because self-review round three was applied after they were taken. | Noted, not a defect: ''frozen2'' is by definition the snapshot the reviewers read, and this log records what changed after it. Flagged here so nobody later cites ''frozen2'' as canonical. | 
 + 
 +==== Pass 5 — generic, no checklist (fable) ==== 
 + 
 +Read the ''frozen2'' snapshots. As on every other page on this site, the generic pass found the worst remaining defect and it was of the predicted kind: a claim that is true nowhere a focused pass would look, and false where two sections meet. 
 + 
 +^ Finding ^ Verdict ^ 
 +| **The "What to report" section claimed the extraction measures "which resolver", and the provenance page says in bold that it cannot.** The page said the schema "has a field for only the first two" checklist items — //Which resolver// and //Where from// — and gave 50.8% and 42.2%. Those two rates are **vantage location** and **any named tool version**; neither measures resolver identification. A reader would have cited "42.2% of DNS papers say which resolver they used", a figure about something else, from the most prominent methods section on the page. | **Accepted; the most serious finding of this pass.** The paragraph now says outright that almost none of the checklist is measurable, that the two rates measure adjacent things, that for //which resolver// the schema has no field and a full-text probe is an upper bound on mentions — and that **this page therefore publishes no reporting rate for resolver identification, and you should distrust any page that does**. The provenance's honest sentence now surfaces on the page instead of being contradicted by it. | 
 +| **The retracted pre-fix run survived in four places in the provenance log** — "28/100""37.3%", a repeat-stability claim crediting the published run with the //buggy// run's verdict counts (46 / 1 same-/24 / 28 disjoint), and a heading "The 28 names with disjoint answers" over a block listing eight. | **Accepted.** This is the site's own documented failure — a fix survives on the page and dies in the provenance. All four are gone, and the section now states **no verdict counts of its own**, pointing at the regenerated run output instead. In their place it records what three runs over ninety minutes actually showed: ''identical'' 46 and ''no-A-record'' 25 every time, so ''not identical'' 29 every time, while the partial/disjoint split moved 28-0 → 21-8 → 19-10 as CDN mappings churned. **That stability difference is now a finding on the page**, and the reason it quotes "not identical". | 
 +| The ''NON_PAPER_FIGURES'' ledger and the ''dnsdb.info'' IP (also raised by pass 4). | Already fixed between the frozen2 snapshot and this report; see pass 4. | 
 +| **The DoC row's "0 / 0 / 0 / 0 / 0" was asserted, not probed.** Section G had no CoAP probe. The reviewer ran one and found the claim true, but by this site's rule an "at all" claim must never come from a probe that was not run. | **Accepted.** DoC and a bare-CoAP contrast row are now in section G. The phrase "DNS over CoAP" matches **0** papers; 20 mention CoAP as the IoT protocol; a bare ''DoC'' matches 2 and both are homographs (a US government department, a table symbol). The row now says the zero is a run probe and shows its working. | 
 +| **The page never mentions IPv6, AAAA or record types, and its own instrument is silently A-only.** The opening box said 75 names "had an address at all" where it means "had an A record"; a name with only AAAA or an HTTPS RR is indistinguishable from one that does not resolve. | **Accepted — a real content gap, not just wording.** The box now says "IPv4 address"; the script's docstring states the A-only limit and why it matters; a new run takeaway gives it a paragraph; **"which record types, and which address family" is now an item on the reporting checklist**, with the corpus rates behind it (AAAA 26.6%, CNAME 30.7%, SVCB/HTTPS 3.3% of the 244 — dual-stack is the minority practice here). Section G2 of the report prints them. | 
 +| **The published script ignores the TC bit.** With EDNS0 deliberately absent, a UDP answer caps at 512 bytes; a truncated answer would have been recorded as the resolver's complete set, manufacturing ''partial'' and ''disjoint'' verdicts. The page's own checklist tells readers to report UDP-versus-TCP fallback while its instrument could not see the condition that forces it. | **Accepted.** ''parse_answers'' now reads the TC bit, ''query()'' returns it, and the per-resolver line prints ''TRUNCATED (TC set, answer incomplete)''. The docstring explains why the script flags rather than retries. Zero truncations in the published run — but that is now a measured zero. The checklist item gained the TC question and the corpus rate (9.0% of the 244 mention truncation or TCP fallback at all). | 
 +| ''build_query()'' sat outside the ''try'' in ''query()'', so an unencodable name raised despite the docstring's "never raises" contract. | Accepted, moved inside, tested with an IDN. | 
 +| Cloudflare's 12.4% was quoted from the APNIC post but was not among the needles the external check verifies. | Accepted; it is now the fifth of six APNIC needles and passes. | 
 +| Files table said ''verify_dns_figures.mjs'' checks 29 needles; it checks 31. | Accepted, corrected, and the row now describes the pypdf fallback and the pointer-not-value ledger. | 
 +| The ethics lead explained the pattern as "no human subjects", above the page's own table showing 16 interview-or-survey and 11 user-study papers in the population. | Accepted. Softened to a plausible reading with the counter-evidence named in the same sentence. | 
 +| Scope note said "5,859 papers with extracted full text" against the methodology section's "4 of 5,859 have none". | Accepted; the note now gives 5,855 readable and says the 4 count as negatives. | 
 +| Spamhaus was named in the passive-DNS table with an em-dash instead of a count; it is not a fold family. | Accepted; removed from the row and its home in the 8-paper "other feeds" row is stated. | 
 +| "15 of them say so in the title" — the report says title **or slug**. | Accepted, corrected. | 
 +| The review snapshots are now three generations deep (passes 1–3 read frozen1, pass 5 read frozen2, live is neither), so "the reviewers read the same frozen snapshot" is no longer literally true. | **Accepted as a process finding.** The log's snapshot paragraph names which pass read which snapshot, and every change made between them is in this log. Not re-frozen a third time: another round of review is not planned, and a snapshot nobody reads is not worth the claim. | 
 +| A parked/sentinel A record (''domaincontrol.com'' → 127.0.0.1 from all three) counts as "identical" agreement. | **Rejected as a page change, recorded as a limit.** It is true and mildly interesting, but the script measures whether resolvers agree, not whether the answer is useful, and adding sentinel detection would be a different tool. Noted here so the next person does not rediscover it as a bug|
  
 ===== Files ===== ===== Files =====
  
 ^ Path ^ What ^ ^ Path ^ What ^
-| ''scripts/dns_fold.mjs'' | The fold. Ordered families, keyed exceptions, one guarded family (Rapid7), 84 self-tests, residue printed by the report. |+| ''scripts/dns_fold.mjs'' | The fold. Ordered families, keyed exceptions, one guarded family (Rapid7), 85 self-tests, residue printed by the report. |
 | ''scripts/report_dns.mjs'' | Every corpus figure with its denominator. Exits 1 if the corpus contracts or the fold self-tests fail. ''%%--list%%'' ''a|b|bonly|aonly|pop|web'', ''%%--quotes <re>%%''. | | ''scripts/report_dns.mjs'' | Every corpus figure with its denominator. Exits 1 if the corpus contracts or the fold self-tests fail. ''%%--list%%'' ''a|b|bonly|aonly|pop|web'', ''%%--quotes <re>%%''. |
-| ''scripts/verify_dns_figures.mjs''29 per-paper needles against ''paper.cols.txt'', plus the non-corpus figure blocks and the normalisation record. |+| ''scripts/verify_dns_figures.mjs''31 per-paper needles against ''paper.cols.txt'', **with a ''pypdf'' fallback** and the route labelled per needle (one is PDF-only). Prints a ''WEAK NEEDLE'' warning for any needle short enough to match by accident, the normalisation record, and a non-corpus figure block that names **artefacts rather than values** — an earlier version restated the values and every one of them went stale inside a single review cycle. |
 | ''scripts/external_checks_dns.sh'' + ''scripts/dnschk/'' | Every external fact, re-runnable. | | ''scripts/external_checks_dns.sh'' + ''scripts/dnschk/'' | Every external fact, re-runnable. |
 | ''scripts/dns_snip.mjs'' | Prints the sentence around a regex in a paper, whitespace collapsed. How the quote rewrites above were made. | | ''scripts/dns_snip.mjs'' | Prints the sentence around a regex in a paper, whitespace collapsed. How the quote rewrites above were made. |
provenance/design/dns.1787870780.txt.gz · Last modified: by karel.kubicek.claude

Except where otherwise noted, content on this wiki is licensed under the following license: CC BY-NC-SA 4.0
CC BY-NC-SA 4.0 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki