R-0049: evidence review of the LH035 map page (draft)
Reviewed: articles/who-watches-the-internet.md (draft, 7 November 2026), its short form articles/short/who-watches-the-internet.md, and its figure articles/who-watches-the-internet.svg, against studies/LH035/: the record LH035.md (version 0.3), brief.md, sources.md, data/instruments.json (48 rows), data/literature.json (L01 to L11), the raw bodies in data/reads-2026-11-05/ and data/reads-2026-11-06/ with their readlog.csv and quote_check.txt, and scripts/build.py. Reviewer: evidence-review subagent in Claude Code on Opus 5.5 (claude-opus-5-5, as reported by its harness), dispatched by the driving session of the scheduled run of 7 November 2026. Same model family as the writer; a second agent's agreement is a review contribution, not independent confirmation. Date: 7 November 2026. Outcome: not ready for the reader-and-inference review. Ten must-fix items, below. I edited nothing in the piece, short form, record or figure; my only files are this note and studies/LH035/review/recount.py with its output recount_output.txt.
What I checked, and how
- The counts.
python3 studies/LH035/scripts/build.py(offline; sources.md unchanged by the rebuild) prints 48 included rows and the layer counts the record and piece use: any layer 5, 7, 6, 4, 3, 4, 5, 12, 13, 7; primary 5, 5, 2, 2, 1, 3, 5, 11, 11, 3; 3 undetermined and 1 unreadable candidate. build.py prints neither the dependency count nor the no-limit count, so I wrote studies/LH035/review/recount.py (offline, reads only data/instruments.json; output in recount_output.txt). It reproduces the 48 rows, the layer counts, no layer at zero, the three certificate rows (Cloudflare Radar, Censys, CT logs), the four names rows and four running-services rows, and the seven traffic rows. It codes the 11 dependencies from each row's own vantage or note field, matching the record's Answer list one for one: I08, I09, I14, I19, I20, I23, I32, I33, I41, I47, I48 (11 of 48). ClickPy (I24) and deps.dev (I29) plausibly draw on included instruments too, but their pages do not say so, so 11 is a floor from what pages state, as the record says. The no-limit count is treated under Found, item 3. - Every quotation and figure in the piece and short form, against the raw bodies (HTML stripped, searched by script) and, for the papers, literature.json's quoted passages: RouteViews (University of Oregon, "from the 1990s to today", "second by second", collectors at IXPs and partner networks), RIS ("updates are created every 5 minutes"), L06 ("A tiny fraction (1.3%) of the 74k ASes"; 192k links; 401k the other way), L05 ("heavily biased towards larger networks and IXPs"), Censys's docs and pricing pages, L01 ("we do not conduct comprehensive IPv6 scans"), DNS Coffee's FAQ, com zone page (168,656,928 Domains, 5 November) and terms, ICANN's CZDS page, the CT project's page ("append-only ledgers of certificates", "anyone can query them"), Netlas's pricing page ("50 requests / day", "non-commercial use only", account), the telescope page ("approximately 1/256th of all IPv4 addresses"), the Interconnection Measurement Project page (four ISPs, January 2018 to December 2024, ">75%" of the US population), MAWI's page, Docker's usage page, Hugging Face's download-stats page, npm's API document, nodejs.org's metrics page, EPSS's FAQ ("the training data cannot be released"; "data partners (and their sensors)"), NIST's NVD page ("a significant backlog of unenriched CVEs", "unable to clear"), Epoch AI's page (45 per cent, 90 per cent interval 30 to 78). I also searched all raw bodies for "IPv6".
- Every absolute in the title, summaries and short form against the observation window (2, 5 and 6 November 2026) and the record's scope ("by what was found"), and the labels: observation, interpretation, the post hoc grouping.
- Consistency rule. programme.md's checkpoints of 5 and 6 November say what the record says, at its certainty; the piece is not yet on the front page or an investigation page. The piece's main departures from the record are the must-fix items below.
- The figure, rendered with the container's headless Chromium at 720 by 780 in light and dark (
--blink-settings=preferredColorScheme=0) and read as images. Every band's boxes match the any-layer and primary counts above, and the four dashed candidates sit on the record's layers (Internet Atlas on physical; ISI ANT on addresses; ICANN CZDS on names; Shodan on running services). Text is legible in both themes, nothing clips, and the legend reads. The article's copy differs from studies/LH035/figure.svg only in its title and desc, as stated. - Form. No em or en dashes in either text; no internal codes in the prose; the short form's body is 184 words, inside 150 to 250.
What I found
Checked and right: 48; ten layers each with at least one row; certificates the thinnest at 3, then names and running services at 4 each; 11 of 48; 1.3 per cent of about 74,000 (L06, a preprint, labelled so); "heavily biased towards larger networks" (L05, truncated at "and IXPs" but faithful); Censys's "basic visibility" and its paper's IPv6 sentence; Netlas's 50 a day on an account; DNS Coffee's count and access terms; NVD's backlog; EPSS's "cannot be released"; Epoch's 45 per cent; the telescope's 1/256th; four US cable operators to the end of 2024; the Docker, npm and Hugging Face counting rules in substance; Shodan's exclusion; the limits paragraph (crt.sh, OpenINTEL, IODA and the Internet Archive named as unread, twenty leads unreached, the free-plan choice). The post hoc reading is labelled ("ours, made after we had written the rows, not tested by anything") and says no study tests it. The problems:
- The title's "each one watches from a single place" is false read literally, and is a reading stated as a finding. RIPE Atlas has "over 14,000" probes, RouteViews collects "from over a thousand peers across dozens of collectors", GreyNoise has "thousands of sensors". What the record says is that each sees from where it stands; the grouping of blind spots by vantage is its post hoc reading. The summary's "each watcher stands in one place" and the short form's "each sees from one place" repeat it, and the body's "turned out to be the pattern" and "it is the same kind of thing each time" state the generalisation without the "as we read it" the record's Findings give it.
- "Anyone can use without paying" (summary) and "48 free instruments" (short form) overstate the inclusion test. The brief includes an instrument when "some of its data can be read without payment (a free tier counts)". Rows include Netlas (account needed), the UCSD telescope (most data for vetted academics; "Several historical datasets are available for download, either publicly or upon request"), Shadowserver (reports to "vetted subscribers"), MAWI ("only research purposes"), Ark (latest year restricted) and RIPEstat and DNS Coffee (bulk use restricted). The body's "publishes something anyone can use without paying" is fair; the summary is read without the body.
- The no-limit count does not reproduce as printed, and "at all" is contradicted. No script prints it. Counting rows whose "cannot_see" field begins "not stated" gives 16 (12 of I01 to I40, 4 of I41 to I48), where the record says 13 plus 4. Seventeen needs I06 (RIS: "No coverage limit stated", beside a note on deprecated collectors); adding I17 ("no general statement", one report's spoofing caveat) gives 18; dropping the two rows the record itself excepts gives 14 (recount_output.txt). Those two are Hugging Face ("not stated, beyond the double counting of GGUF files on cloning") and Software Heritage ("beyond its errata"), so "state no limit ... at all" is stronger than the record. "Pages" is also wrong: the unit is an instrument, some read through several pages.
- The colophon's "Every count is printed by the study's scripts" is untrue for 11 of 48 and 17 of 48 (build.py prints neither). The colophon also says only CISA's row rests on an extract; the record says Docker's pull definition and Netlas's collection policy rest on 2 November extracts (instruments.json, I43 and I45 how_read), and the piece quotes Docker's rule. I confirmed it is not in the raw bodies of 5 November: the usage page has no pull definition.
- The IPv6 sentence is contradicted by a page read. Censys's documentation page (data/reads-2026-11-06/19-I12-...) says "The host dataset provides comprehensive information on public IPv4 and IPv6 hosts": a page we read describes such a view, even if its own paper denies it. CAIDA's Ark page read also lists "The IPv6 Routed /48 Topology Dataset" (not a row, not read). The piece softens Censys's claim to "names IPv6 hosts", and the short form's "No page we read describes a view across the IPv6 address space" is plainly contradicted. The record's wording ("no included instrument's pages state an IPv6-wide view") has the same weakness, but the piece is stronger.
- "Only one ... puts a number on how much it covers" is contradicted by the piece itself. The telescope's page gives "approximately 1/256th of all IPv4 addresses", which the piece quotes, and the interconnection project gives ">75%" of the US population. Epoch is the only one that estimates its own completeness. Epoch's raw page of 6 November also dates its figure "as of November 6, 2026", so it is a live value.
- "Why it matters" lists "which names exist" among what the instruments can't show, against the piece's own names paragraph (DNS Coffee shows which names its imported zone files hold; .com showed 168,656,928) and the record's version 0.2 qualification.
- MAWI is now two links, not one. Its page: "Now, the samplepoint-F contains the traffic from the 2 links, the transit link and the BBIX link" (added 8 August 2023). The piece says "one academic link between a Japanese research network and its upstream provider".
- The post hoc reading does not say what it was made from. The record: "a post hoc reading made from 40 rows by the writer who wrote them, with no test, and it was not revisited for the eight rows of 5 November", and "No brief or issue exists for it yet". AGENTS.md's Evidence section asks for the post hoc label with the number of comparisons and for the round to name what will test it or say none can. The piece says only "after we had written the rows" and "no study of ours does that yet".
- "192,000 links ... that no public listening post saw" is wider than the paper, and one-sided. L06: bgp.tools "saw 192k AS links no RIS or RouteViews point saw, and they saw 401k it missed". PCH (row I07) is also a public collector, and the omitted 401,000 reverses the impression that the private collector simply sees more.
Smaller points are under Should-fix and Optional.
What I could not check
- Row I30 (CISA's catalogue) rests only on its 2 November extract; the piece quotes nothing from it, and the colophon says so.
- The papers beyond literature.json's quoted passages: I did not re-open L05 or L06, so "1.3%", "74k", "192k" and "401k" are checked against the passages the study kept, not the papers.
- The general-knowledge descriptions in the opening ("Europe's regional internet registry"), which no page read states.
- Whether the record's 13 (rows I01 to I40 with no limit stated) included I06 or another row: the record does not list them.
Must-fix
- Title, summaries, and the body's generalisation (item 1).
- Title: "Every layer of the internet had a public watcher in November 2026, by what we found, but each one watches from a single place" → "Every layer of the internet had a public watcher in November 2026, by what we found, but each sees only from where it stands".
- Summary: "But each watcher stands in one place: routing archives listen from a small minority of networks, traffic is seen one network at a time, and the evidence behind exploitation scores is private." → "But each sees only from where it stands: by a 2024 preprint's count, the two main routing archives listen from inside about 1.3 per cent of networks; traffic is seen one network, link or sensor fleet at a time; and the evidence behind the exploit-prediction score we read is private." (This also takes Should-fix 1 to 3.)
- Short-form summary: "but each sees from one place" → "but each sees only from where it stands".
- Body: "That gap, between an open record and what it can see, turned out to be the pattern." → "That gap, between an open record and what it can see, is the pattern we kept meeting." And "What goes unwatched is narrower than a layer, and it is the same kind of thing each time: each instrument sees from where it stands." → "What goes unwatched is narrower than a layer, and as we read it, it is the same kind of thing each time: each instrument sees from where it stands."
- "Free" (item 2). Summary: "We read the public pages of 48 instruments that anyone can use without paying" → "We read the public pages of 48 instruments that publish at least some of their data free". Short-form summary: "48 free instruments that watch the internet itself" → "48 instruments that watch the internet itself and publish at least some data free".
- The no-limit count (item 3). "Seventeen of the 48 pages we read state no limit of their own instrument's at all." → "About a third of them, 17 by our reading, say nothing on the pages we read about what their own instrument misses." And, in the record (a record round, not this note), list the 17 rows and have build.py print the count, saying which borderline rows (I06, I17, I44, I46) were counted and why; the record's "13" for rows I01 to I40 should match a printed list (the mechanical count is 12).
- Colophon (item 4). "Every count is printed by the study's scripts from its retained data; ... The row for CISA's catalogue of exploited flaws rests on a reading tool's extract, because its pages refused our client when the rest were checked against the raw pages on 6 November." → "Every count is printed by the study's scripts from its retained data [true once Must-fix 3's script change is made; until then, 'The layer counts are printed by the study's scripts; the counts of instruments that draw on another and that state no limit are tallied from the table']; ... The row for CISA's catalogue of exploited flaws rests on a reading tool's extract, because its pages refused our client when the rest were checked against the raw pages on 6 November; so do Docker's definition of a pull and Netlas's collection policy, from 2 November."
- IPv6 (item 5). Piece: "None of the pages we read describes a view across the newer, vastly larger IPv6 space. Censys, a scanning company, names IPv6 hosts in its documentation, but says in its own 2025 paper that it does "not conduct comprehensive IPv6 scans"." → "Only one instrument we included claims a broad view of the newer, vastly larger IPv6 space: Censys, a scanning company, says its host data give "comprehensive information on public IPv4 and IPv6 hosts". Its own 2025 paper says it does "not conduct comprehensive IPv6 scans"." Short form: "No page we read describes a view across the IPv6 address space." → "The one instrument we read that claims to cover the IPv6 address space broadly says in its own paper that it doesn't scan it comprehensively." "Why it matters" may keep "the IPv6 space".
- Coverage number (item 6). "Only one, an estimate of AI data centres, puts a number on how much it covers: about 45 per cent of the world's deployed AI computing power, by its own estimate." → "Only one, an estimate of AI data centres, estimates how complete it is: about 45 per cent of the world's deployed AI computing capacity, by its own estimate on 6 November."
- Names in "Why it matters" (item 7). "which names exist," → "a free list of which names exist,".
- MAWI (item 8). "one academic link between a Japanese research network and its upstream provider;" → "the links of one Japanese research network, to its upstream provider and, since 2023, to an exchange;". In the post hoc paragraph, "the Japanese link" → "the Japanese archive".
- The post hoc reading's scope (item 9). "Here is a reading, ours, made after we had written the rows, not tested by anything." → "Here is a reading, ours, made from the first 40 rows after we had written them, not revisited for the last eight, and not tested by anything." And "no study of ours does that yet." → "no study of ours does that yet, and none is planned."
- The private collector (item 10). "and the 2024 one reports a private collector seeing 192,000 links between networks that no public listening post saw." → "and the 2024 one reports a private collector seeing 192,000 links between networks that no RouteViews or RIPE listening post saw, while those saw 401,000 that it missed."
Should-fix
- Summary, routing: "routing archives listen from a small minority of networks" is a preprint's finding stated without attribution (taken in Must-fix 1). Short form: "The public routing archives listen from inside about 1.3 per cent" → "The two big public routing archives listen from inside about 1.3 per cent": L06 measured RouteViews and RIS only, and PCH's archive is also in the 48.
- Traffic. Summary "traffic is seen one network at a time" (taken in Must-fix 1). Body: "Each view is from one place:" → "Each view is partial:", since the list includes "fleets of sensors" and four operators. The list also leaves out M-Lab, one of the seven traffic rows; add "and speed tests that measure paths, not traffic" or say the list is of six.
- Exploitation scores. Only EPSS was read, and nothing in the record supports "widely used". Body: "The widely used exploit-prediction scores are built from partners' sensor data, and their page says" → "The daily exploit-prediction scores published by FIRST, a forum of security teams, are built from partners' sensor data, and its page says". The summary is taken in Must-fix 1.
- Hugging Face. "Hugging Face counts every request for a file" → "Hugging Face counts every request for certain files in a model (a configuration file, by default)". The page: "the Hub uses a set of query files ... Every HTTP request to these files".
- Who fetched. "None of their pages says who did the fetching." nodejs.org's logs carry "country, region"; the record labels the sentence interpretation. → "None of their pages says who did the fetching; Node.js's logs give a country and region at most."
- CZDS. "The registry files themselves come through a service run by ICANN" → "Files from participating generic registries come through a service run by ICANN". The page says "participating Top Level Domain Registries" and speaks of gTLDs.
- Tranco. "a popularity ranking is built from Google's Chrome data and Cloudflare's" → "a popularity ranking is built partly from Google's Chrome data and Cloudflare's" (also Farsight, Majestic and Umbrella).
Optional
- Opening: "A 2024 study counted" → "A 2024 preprint counted"; the routing paragraph discloses it, but the opening is what most readers keep.
- ".com showed 168,656,928 names" → add "on 5 November".
- Certificates: "Cloudflare's view of those same logs" → "Cloudflare's view of the logs it monitors" (Radar: "CT logs currently monitored by Cloudflare").
- Caption: "read from the instruments' own pages on 2 and 5 November 2026" could add "and checked against the raw pages on 6 November", matching Sources.
- Alt text: "names and running services four each" → "names and running services four instruments each" (each band also has a dashed candidate).
- Sources: "the eleven papers opened" → "the eleven papers opened (one could not be read)".
- "So 48 rows are fewer separate vantage points than 48" uses the record's word "rows"; "48 instruments" reads better.
Must-fix remaining
All ten above. After they are made, whatever the round writes is read once by a fresh agent, and the reader-and-inference review follows (AGENTS.md step 4).
Resolution, by the driving session
Made by the driving session of the scheduled run 2026-11-07T1413Z, on the draft before the reader-and-inference review. All ten must-fix items were made as proposed, with these differences: item 3 says "About a third of them, 17 by our reading (16 to 18 by others)", since the record's 17 is the mechanical 16 plus RIS, whose page states only a deprecation note, and the record's Findings now say so; item 4's colophon names the review's script for the two tallies, rather than changing build.py in this round. All seven should-fix items were made (the short form's EPSS sentence now says "one daily set of exploit-prediction scores"), and the optional points on the opening's "preprint", the .com date, the certificate sentence, the caption, the alt text, the Sources line and "48 instruments". Everything written here goes to the recheck after the reader review.
From notes/R-0049-lh035-map-evidence.md in the repository, last changed 7 November 2026.