Table of Contents
Provenance: design:crawling_location
Working notes behind crawling_location — every query, its population and its denominator, the report script and its unedited output, the folds and their residue, the quotes that were checked, and what could not be established. Corpus-level caveats that apply to every page on this site are on corpus and are not restated here.
Partly reconstructed. The content page was written on 2026-08-05, before this site had a provenance convention. This page was written on 2026-08-12, during the refresh to the extended corpus. Sections marked recorded were produced by the 2026-08-12 run and are contemporaneous. Sections marked reconstructed were rebuilt afterwards from the report script, its output and the page text; where the original run's working is not recoverable, that is said rather than guessed.
1. What this page is backing
| Item | Value |
|---|---|
| Content page | crawling_location |
| Report script | scripts/report_crawling_location.mjs |
| Folds it depends on | scripts/geo.mjs (locations), scripts/vantage_fold.mjs (provider families) |
| Data | data/extract/run1/extractions.jsonl, 5,859 papers, 7 venues, 2010–2026 |
| Refreshed | 2026-08-12 |
| Previous figures | 2026-08-05 run, against the 4,322-paper corpus. Every figure in the “Use in Publications” section was re-derived; none was carried over. |
2. Populations and denominators
Recorded. Every figure on the page comes from one of these populations. “All 5,859 papers” is never a denominator on this page.
| Tag | Definition (as lib.mjs implements it) | N |
|---|---|---|
crawled | crawlConfig !== null OR studyTypes contains automated-web-crawl | 1,120 |
crawled ∧ states a place | at least one vantage[].locations entry that is not a sentinel and normalises to a place | 296 |
crawled ∧ states an infrastructure | at least one vantage[].infrastructure that is not a sentinel | 445 |
crawled ∧ names a platform | at least one vantage[].serviceName that is not a sentinel | 186 |
crawled ∧ folds to a provider family | of those 186, the ones whose name matches a family in vantage_fold.mjs | 165 |
crawled ∧ assessed an EU law | legal[].law matches /GDPR|EPRIVACY|DIRECTIVE 95|DSA|DMA/i | 93 |
crawled ∧ assessed a US law | legal[].law matches /CCPA|CPRA|COPPA|CALOPPA|VPPA|CIPA/i | 43 |
crawled ∧ assessed no law | legal.length === 0 | 989 |
crawled ∧ states a consent action | crawlConfig.consentAction is not a sentinel | 349 |
Sentinels (not-stated, none-mentioned, not-applicable, unclear, unknown) are counted as silence, never as a value. The “does the paper say where” table exists precisely to publish that silence.
3. Running it
cd /workspace/artifacts/wiki node scripts/geo.mjs # self-test the location fold node scripts/vantage_fold.mjs # self-test the provider fold, prints residue node scripts/report_crawling_location.mjs # every figure on the page node scripts/report_crawling_location.mjs --wiki # the same, as DokuWiki tables node scripts/check_page_numbers.mjs \ pages/design_crawling_location.txt out/new/report_crawling_location.txt \ '===== Use in Publications =====' '===== Choosing a Vantage Point ====='
The last command is the staleness guard: it asserts that every number in the page's corpus section appears somewhere in the report. On 2026-08-12 it returned three unaccounted figures, all legitimate and none from the corpus — 100 (the “shares exceed 100%” sentence), 19.1 (the crawled share of the corpus, from data/extract/OVERVIEW.md rather than from this report) and 2019 (a date inside a quoted sentence).
4. What the refresh changed
Recorded. Old = 4,322-paper corpus (page as published 2026-08-05). New = 5,859-paper corpus.
| Figure | Old | New |
|---|---|---|
| Papers with full text | 4,322 | 5,859 |
crawled | 859 | 1,120 |
| No vantage point recorded | 21 (2.4%) | 31 (2.8%) |
| Recorded, location not stated | 609 (70.9%) | 793 (70.8%) |
| States at least one place | 229 (26.7%) | 296 (26.4%) |
| Single vantage point | 137 (59.8%) | 174 (58.8%) |
| Multi-vantage, of those stating | 40.2% | 41.2% |
| Multi-vantage, of all crawling papers | 10.7% | 10.9% |
| United States | 139 (60.7%) | 182 (61.5%) |
| Germany | 41 (17.9%) | 60 (20.3%) |
| US or North America | 148 (64.6%) | 193 (65.2%) |
| EU/EEA | 88 (38.4%) | 124 (41.9%) |
| Both US and EU/EEA | 54 | 74 |
| Distinct places after folding | 64 | 91 |
| States an infrastructure | 344 (40.0%) | 445 (39.7%) |
| Papers naming a platform | 149 (hand-folded) | 165 (script-folded) |
| Amazon AWS / EC2 | 52 (34.9%) | 68 (41.2%) |
| Crawling papers assessing an EU law | 62 | 93 |
| …of those, EU/EEA vantage | 29 of 34 (85.3%) | 45 of 52 (86.5%) |
| …assessed an EU law from outside the EEA | 5 | 7 |
| States a consent action | 270 | 349 |
| …of those, EU/EEA vantage | 48 (17.8%) | 68 (19.5%) |
| …of those, no location at all | 166 | 210 |
Moved by more than a rounding step:
- EU/EEA share of location-stating papers, 38.4% → 41.9%, and the last time-bucket. The old page said the EU/EEA vantage share “more than doubles” (20.0% → 48.3% over four buckets). With 2025–2026 added it triples (19.0% → 59.6%). The page sentence was changed to match; this is a genuine strengthening of the page's central trend, not a rounding move.
- Distinct places, 64 → 91. Partly corpus growth, partly a fold change (§5).
- Amazon's share of platform-naming papers, 34.9% → 41.2%. This is a fold change more than a corpus change — see §5.2. The old table's 149 denominator came from a hand-fold that is not recoverable, so old and new are not strictly comparable and the page no longer implies they are.
- US-law papers, “state a place” 48.3% → 55.8% and US vantage 44.8% → 51.2%, on N growing 29 → 43. Small N; treat as a ranking, not a measurement.
Not changed: the page's prose, structure, method selection, the “Choosing a Vantage Point” and “Verify the Vantage Point” sections, and every citation. This was a mechanical re-derivation.
5. Folds
5.1 Locations — scripts/geo.mjs
Recorded (this run's changes); reconstructed (the original design). vantage[].locations is free text: “Frankfurt, Germany”, “US-East”, “61 countries across all world regions”, “a US-based university network”. geo.mjs maps each string to a country, a region, multi-country, or unmapped. Country aliases, US state abbreviations, city→country and region tables are explicit lists in the file.
Changed on 2026-08-12, because the extended corpus introduced four country names the alias table did not have:
rwanda: 'Rwanda', liechtenstein: 'Liechtenstein', maldives: 'Maldives', ksa: 'Saudi Arabia',
Liechtenstein was also added to EEA_COUNTRIES (it is an EEA member; the set already had Norway and Iceland). This moved 4 strings out of the residue and is why “distinct places” is 91 rather than 88.
Unmapped residue, in full — 15 distinct strings across 13 papers, 5 of which are left with no place at all:
1x single location; country not-stated 1x all operating systems and geographic regions 1x university network 1x different provinces 1x vantage country 1x overseas campus 1x more than 13 regions worldwide 1x 234 desktop country codes 1x 232 mobile country codes 1x non-adequate destination countries 1x City A 1x City B 1x different continents 1x several continents 1x various geographic regions
None of these is mappable to a place: they are either a refusal to name one (“vantage country”, “City A”), a count of codes rather than a location, or a category (“non-adequate destination countries”) that names a legal status. They are excluded from the “where from” table and left in the “states at least one place” denominator only when the same paper also gave a real place.
5.2 Provider families — scripts/vantage_fold.mjs
Recorded. This fold is new on 2026-08-12. The “Provider family” table on the content page was hand-folded in the original run and had no script behind it, so it could not be re-derived when the corpus grew. That is the finding: a table with no fold script is a table that goes stale silently. The fold is now an ordered list of explicit regexes, and a string may match several families — “Amazon EC2 and Aliyun” and “Google Cloud and Cloudflare” each name two platforms and count in both — so the shares sum past 100%.
The old 149-paper denominator cannot be reproduced and the two tables are not strictly comparable. The new denominator, 165, is “papers naming a platform that matches a family”; 186 papers name a platform at all.
Residue, in full — 23 distinct strings, one paper each:
ActiveDNS, Apple WPS, BitTorrent DHT, CertStream, Ciao, CodeGuard, DataForSEO, DataStreamer.io, Etherscan, Facebook, Falcon sandbox, Google Assistant, Google Translate, Kubernetes cluster, Netograph, Nexus 5, public looking glasses, Safe Browsing, ScaleSERP, Twitter, VirusTotal, Wandoujia, YouTube
This residue is not a folding failure. vantage.serviceName catches services a paper queried (VirusTotal, Safe Browsing, Etherscan) as readily as platforms it measured from, and the extraction does not separate the two. Anyone reusing this field should expect roughly one in eight named “services” to be of the first kind.
One judgement call worth flagging: “University network” and “Other research testbed” are in the family table but were not in the old one. They are 10 and 9 papers of free-text names (“CISPA servers on Saarland University premises”, “MONROE”, “XSEDE TACC Jetstream”). Leaving them in the residue would have overstated how much of the residue is non-platform noise.
6. Quotes spot-checked
Recorded, 2026-08-12. Six vantage tuples from the newly added 2025 slice — the part of the corpus no earlier run had seen — checked against data/fulltext/<year>/<venue>/<slug>/paper.cols.txt with whitespace normalised (tr -s '[:space:]' ' ' | grep -iF).
| Paper | Extracted location | Quote found? |
|---|---|---|
2025/CCS/byte-by-byte-unmasking-browser-fingerprinting… | United States | yes, exact |
2025/CCS/local-frames-exploiting-inherited-origins… | Amazon's us-west-2 region | yes, exact |
2025/IMC/canvassing-the-fingerprinters… | La Jolla, California, USA | yes, exact |
2025/IMC/cookieguard-characterizing-and-isolating… | California, USA | yes, exact |
2025/CCS/in-the-dom-we-trust… | EU | substance yes, string no |
2025/CCS/piixel-leaks-passive-identification… | United States (AWS us-east-1) | substance yes, string no |
The two partial matches are both artefacts of the column repair, not extraction errors. In in-the-dom-we-trust the running header (3048 CCS '25, October 13-17, 2025, Taipei, Taiwan Jan Drescher et al.) is spliced between “from an EU vantage” and “point”. In piixel-leaks two columns interleave mid-sentence: “hosted in the us-east-1 [other column] region”. Both papers do say what the extraction says they say. This is the general shape of the 0.9% “unlocatable quote” figure in the dataset README — it is mostly layout, not hallucination — but note that figure was measured on the old run and has not been re-measured.
Not recoverable: which quotes, if any, the 2026-08-05 run spot-checked. No record of it survives.
7. External sources
Reconstructed. The content page's non-corpus claims and where they come from:
- Jueckstock et al. (realism of residential vs datacenter vantage), Khattak et al. (differential treatment of Tor), and the other cited papers are in bibliography and were verified by the original run. Not re-verified on 2026-08-12; nothing in the refresh touched them.
- The footnote asserting that bot-management vendors score datacenter address space as low-trust carries no citation on purpose — it is a
1)footnote saying so, and it flags in Open Questions that no peer-reviewed cross-vendor measurement of the effect was found. That remains true: nothing in the 2025–2026 slice closes it. It is the page's clearest open question. - The “PlanetLab (discontinued)” label is from PlanetLab's own 2020 shutdown announcement, checked by the original run.
Rejected sources: not recorded for the original run.
8. What could not be established
- Whether the EU/EEA trend is a real acceleration or a 2026 artefact. The 59.6% in the last bucket rests on 198 crawling papers from two venue-years that are known to be incomplete. It is consistent with 2022–2024 and it is not a discontinuity, but a reader should not quote 59.6% as a 2026 measurement. The page says so in the table header and in the paragraph under it.
- Whether “states a place” is improving at all. 20.6% → 28.8% across sixteen years, and the buckets are not monotone in the underlying years. This is the weakest claim on the page and is written as “improving, slowly” rather than quantified as a rate.
- The old 149-paper provider denominator. Gone; see §5.2.
- Why
vantagenever fires for 31 crawling papers. These are papers whose study type says they crawled but which produced novantagetuple at all. Whether that is extraction failure or genuine silence in the paper has not been checked; 31 of 1,120 is 2.8% and it does not move any figure on the page.
10. Review pass, 2026-08-12
Recorded. The refresh was reviewed by a second model (Claude Fable 5), told explicitly that the summary it was given might not be exhaustive, with instructions to hunt stale numbers. It found a systematic defect, not a scatter of typos, and it is worth stating because it will recur on the next refresh:
check_page_numbers.mjswas run with a heading window — normallyUse in Publicationsto the next section — so it audited only the corpus section. Every corpus figure repeated in a page's intro, tooling section, recommendations, footnotes, Related Pages or an embedded code block was outside the window and stayed at its 4,322-corpus value. Across the six pages 29 such figures survived the first pass.- The matcher was substring, not word-boundary, so
report.includes('59')was satisfied by11.59 bits. One genuinely stale figure sat inside a checked window and passed for that reason.
Both are fixed in scripts/check_page_numbers.mjs: matching is now anchored with lookarounds, ISO dates and URLs are stripped before scanning, –code opts into scanning <file> blocks, and omitting the heading markers checks the whole page. Run it windowed and whole-page. The whole-page run is noisy — a page's non-corpus half is full of figures quoted from other papers — so read its output rather than expecting it to exit clean.
Fixed on this page's content page as a result: the lead paragraph's headline 70.9% → 70.8%, reworded to say what it measures (“record a vantage point and never say where it was” — the old wording implied it included the 31 papers with no vantage record at all, which would be 73.6%); and PlanetLab 7 → 8 papers in Research measurement platforms, which contradicted the page's own provider table.
11. Run log
| Date | 2026-08-12 |
| Corpus at the time | data/extract/run1, 5,859 papers, 2010–2026, IEEE S&P complete at 780/780 |
| Model | Claude Opus 5, no sub-agents used for this page |
| Scope | Mechanical re-derivation. Prose, structure and method selection were not revisited. |
| Script changes | geo.mjs (+4 country aliases, +Liechtenstein in EEA), vantage_fold.mjs (new), report_crawling_location.mjs (hardcoded 859 and 2010–2024 replaced with computed values; 2025–2026 bucket added; provider-family section added) |
| Caveats deleted | “IEEE S&P is only 43% retrieved (paywall)” — no longer true, 780 of 780 selected papers are now retrieved. “2010–2024” everywhere. |
| Mistakes caught in review | The first version of vantage_fold.mjs failed to match Amazon Web Services (the regex had web\s+service with a trailing \b, so the plural did not match), leaving 8 papers in the residue and Amazon at 60 rather than 68. Caught by reading the residue list, which is why the residue is printed. |
| Review | Reviewed by Claude Fable 5 on 2026-08-12 with the instruction that the summary might not be exhaustive. It found the windowed-guard defect in §10 and 2 stale figures on this page. All fixes were applied and re-saved the same day. |
