Table of Contents
Provenance: privacy:cookie_syncing
Working notes behind cookie_syncing — every query with its population and denominator, the scripts and their unedited output, the hand labels and their residue, the quotes checked against the source papers, the external sources and how each was verified, what could not be established, and the judgement calls. Corpus-level caveats that apply to every page on this site are on corpus and are not restated here.
This page carries no ~~DISCUSSION~~: comments belong on the content page, which is the convention the earlier provenance pages on this site set.
1. What this page is backing
| Item | Value |
|---|---|
| Content page | cookie_syncing — new page, created 2026-08-26 |
| Corpus report script | scripts/report_cookie_syncing.mjs — three passes: full-text probe, hand curation, structured extraction over the curated set |
| Exploratory probe | scripts/cookiesync_fulltext_probe.mjs — the wider sweep the population was chosen from, kept because the choice of regex width is the page's largest single source of error |
| Quote verification | scripts/cookie_syncing_quotecheck.mjs — 80 literals against two renderings of each source paper |
| Stale-number guard | scripts/cookie_syncing_number_guard.mjs — page-specific, because the shared check_page_numbers.mjs has a site-wide ALLOW map and adding forty per-paper figures to it would weaken every other page's check |
| Bibliography additions | scripts/bib_additions_cookie_syncing.bib — 8 entries, key-scanned and DOI-scanned against a fresh export of literature:bibliography before appending |
| Data | data/extract/run1/extractions.jsonl — 5,859 papers with a structured record; data/fulltext/*/*/*/paper.cols.txt — 5,869 papers with readable full text; 7 venues, 2010–2026 |
| Written | 2026-08-26, against the corpus as extended on 2026-08-11 (commit 8a6b843) |
| Model | Claude Opus 5, single session; four review sub-agents (three sonnet, one fable), logged in §9 |
Creating, not extending. sitemap.mjs and a live pages listing over the JSON-RPC API were run first; there is no page in any namespace about cookie or ID syncing. A sibling sweep of fourteen plausible neighbours, grepping each page's raw export for cookie[ -]*(sync|match), id[ -]*sync and uid smug, found the topic on exactly one:
| Page | Matches | What it already says | Decision |
|---|---|---|---|
programming:stateful_stateless | 5 | Cookie syncing used as the worked example of a phenomenon that needs state, with the Zeber et al. counter-mechanism (a fresh profile over-triggers first-contact syncing) and an open question about the seed-profile artefact | Left alone and linked twice. The new page defers the whole stateful/stateless argument to it and only states the consequence for syncing |
privacy:cookies | 0 | Cookie purpose classification (Cookiepedia, CookieBlock, the label databases) | Different question: what a cookie is for, not what happens to its value. Linked |
privacy:requests | 0 | Filter lists, ML request classifiers, and a full section on link decoration incl. PURL | The nearest neighbour. The new page defers all link-decoration tooling to it rather than restating |
privacy:server_side_tracking | 0 | Where the exchange goes when it leaves the browser | Linked as the successor case |
privacy:fingerprinting, privacy:javascript, privacy:consent, privacy:darkpatterns, programming:crawler, programming:traffic_files, programming:interaction, design:website_selection, design:crawling_location, literature:corpus | 0 | — | Nothing to broaden |
Two live pages were edited to make the new one reachable, and the sweep above was run before those edits: start gained a line in the Privacy section of the outline, and privacy:requests gained a Related-Pages line. Nothing else on either page was touched. Anyone re-running the sibling sweep today will therefore see one match on privacy:requests that the table records as zero.
So this is a new page, not a broadening of a neighbour. The alternative considered and rejected was widening privacy:cookies from “Classifying Cookies” to “Cookies”: rejected because that page's whole apparatus (purpose taxonomies, label databases, CookieBlock) is orthogonal to identifier exchange, and because syncing's method literature overlaps privacy:requests far more than privacy:cookies. Recorded in §8.
2. Populations and denominators
The extraction schema has no field for cookie syncing. detection[].phenomenon is free text and names what a paper headlines, so a paper that measures syncing as one of ten mechanisms may carry no matching tuple. That forces a full-text population.
| Tag | Definition | N |
|---|---|---|
| FT-all | papers with a readable paper.cols.txt — the denominator for every pass-A figure | 5,869 |
| X-all | papers with a structured extraction record | 5,859 |
| FT-1 | FT-all where the syncing regex matches ≥1 time | 106 |
| FT-5 | FT-all where it matches ≥5 times | 31 |
| CAND | FT-5 ∪ (papers with a detection/classification tuple matching the syncing regex) ∪ 4 added by hand | 44 |
| MEAS | CAND hand-labelled “measures identifier sharing between distinct parties” | 30 |
| MEAS ∧ crawled | of MEAS, crawlConfig !== null — the denominator for every crawl-configuration figure | 25 |
| MEAS ∧ web-request | of MEAS, ≥1 classification tuple with target = web-request | 20 |
| CAND labelled “cites only” | mentions it, does not measure it | 5 |
| CAND labelled “not-syncing” | the phrase means something else in that paper | 9 |
| CAND unlabelled residue | 0 |
The 10-paper gap between FT-all (5,869) and X-all (5,859) is pre-existing: ten papers have readable text but no extraction record. Pass A uses 5,869 and passes B/C use the extraction, so no figure mixes the two.
2.1 Probe widths, and why the number depends on them
Four wordings were counted separately rather than as one regex, because the choice of width decides the claim. Papers, not tuples; denominator FT-all = 5,869.
| Wording | Papers |
|---|---|
| cookie sync / synchronisation | 86 |
| cookie matching | 36 |
| ID / UID syncing | 10 |
| pixel / tag syncing | 2 |
| union, ≥1 occurrence | 106 |
| union, ≥5 occurrences | 31 |
The regexes themselves, verbatim from report_cookie_syncing.mjs (a table cell cannot hold an unescaped |, so they are in a code block):
const PATTERNS = { 'cookie sync / synchronisation': /cookie[\s-]*(?:sync|synchroni[sz])/i, 'cookie matching': /cookie[\s-]*match/i, 'ID / UID syncing': /\b(?:id|identifier|uid|user[\s-]?id)[\s-]*(?:sync|synchroni[sz])/i, 'pixel / tag syncing': /\b(?:pixel|tag|beacon)[\s-]*(?:sync|synchroni[sz])/i, };
The exploratory probe (cookiesync_fulltext_probe.mjs, §4.3) is slightly wider — it drops beacon and adds a bare tag alternative — and it also counts three adjacent phenomena that are not on the content page: header bidding (24 papers), real-time bidding or RTB (64), and cookie ghosting/respawning (22). They are excluded because counting them as syncing would fill the population with papers that never look at an identifier crossing a domain boundary. The per-paper occurrence counts quoted in §2.2 come from that exploratory probe, so they can differ by one or two from the report script's; the published population counts all come from the report script.
Text normalisation before matching: end-of-line hyphenation joined (-\n is replaced by nothing), then all whitespace collapsed to single spaces. Without this, cookie syn- + newline + chronization, and any phrase broken across a line, go undetected. This is not hypothetical — it is why a plain grep -rl over the corpus returns fewer papers than the script does.
2.2 The threshold is a reading filter, not a definition
The ≥5-occurrence threshold exists so that 106 papers did not all have to be read; it is not a definition of “measures syncing”, and it fails badly at the low end. Four papers below the threshold were added to CAND by hand:
| Paper | Occurrences | Why added |
|---|---|---|
| Calzavara et al., PoPETs 2026 — From Syntactic Matching to Taint Tracking and Back | 2 | The most methodologically central paper on the page. It is about identifier-in-request detection and barely uses the phrase “cookie syncing” |
| Chen et al., TheWebConf 2021 — Cookie Swap Party | 3 | Contributes an identifier heuristic that the 2026 systematisation tabulates |
| Nikkhah Bahrami et al., IMC 2025 — CookieGuard | 3 | Same; the most recent heuristic in the lineage table |
| Dao et al., PoPETs 2026 — Clicking into Exposure (gclid) | 1 | Added during review; the boundary had been drawn in two different places — see §8 |
There is no way to know how many others the threshold missed. This is stated on the content page as a limitation, and the honest reading of “106 papers mention it” is “at least 106”.
2.3 The nine "not-syncing" papers, named
These are in CAND, matched the regex or produced a matching tuple, and were excluded by hand. Naming them is the point: without the list, the exclusion is unfalsifiable.
| Paper | What the phrase means there |
|---|---|
USENIX/2022/rendering-contention-channel-made-practical-in-web-browsers | “cross-browser cookie synchronization” — a covert channel that transmits a cookie between two browsers on the same machine via rendering contention. Not inter-party ID sharing |
USENIX/2024/web-platform-threats-automated-detection-of-web-security-issues-with-wpt | cookie-match(path, domain, secure, ctx-location) — a predicate in a formal model of cookie scoping |
CCS/2022/do-opt-outs-really-opt-me-out | “opt-out cookie matching patterns” — matching cookie names against an opt-out registry |
WWW/2022/measuring-the-privacy-vs-compatibility-trade-off-in-preventing-third-party-state | Explicitly redefines the term: “By cookie syncing we refer not to cross-vendor syncing but to the possibility of cross-site syncing enabled by browser implementation flaws” |
CCS/2016/error-handling-of-in-vehicle-networks-makes-them-vulnerable | CAN-bus ID matching. Zero full-text occurrences of any syncing wording; it is in CAND only because of an extraction tuple |
PETS/2018/won-t-somebody-think-of-the-children-examining-coppa-compliance-at-scale | Extraction tuple matched on identifier sharing in mobile apps; zero full-text occurrences |
USENIX/2023/log-it-s-big-it-s-heavy-it-s-filled-with-personal-data-measuring-the-logging-of | Same — zero full-text occurrences |
WWW/2018/betrayed-by-your-dashboard-discovering-malicious-campaigns-via-web-analytics | Same — zero full-text occurrences |
PETS/2024/client-side-and-server-side-tracking-on-meta-effectiveness-and-accuracy | Same. The tuple names ID sharing with Meta, which is server-side; that is server_side_tracking's subject |
Five of the nine have zero full-text occurrences of any syncing wording and are in CAND purely because a detection or classification tuple used the words “identifier sharing”. Those are strong exclusions. The other four rest on reading the passage.
2.3.1 Labels written for papers outside CAND
The report prints these too, because otherwise the label counts do not add up to the number of rows in the map and nobody would know why. Three exist:
| Paper | Label | Why it is not in CAND |
|---|---|---|
NDSS/2026/cross-boundary-mobile-tracking… | cites | 2 occurrences, no matching tuple |
USENIX/2019/a-billion-open-interfaces-for-eve-and-mallory… | not-syncing | 0 occurrences; its extraction tuple matches the exploratory probe's wider regex but not the report script's |
IEEE-SP/2019/tracking-the-trackers-analyzing-the-global-tracking-landscape-with-ghostrack | not-syncing | Not in the corpus at all — a label written from memory during an early pass, for a paper that turned out not to be in these seven venue-years. Left in the map deliberately, with the diagnostic that exposes it, as a record of the mistake |
2.4 The detection-family labels
Each of the 30 MEAS papers carries a hand label naming the technique that does the identifier-sharing work — not the paper's overall contribution. The labels are in scripts/report_cookie_syncing.mjs as a literal map, one line per paper, so a disagreement can be pointed at a line.
| Label | Meaning | Papers |
|---|---|---|
syntactic | match an ID-looking storage value against request URL / path / referrer / body | 15 |
chain | reason over the redirect, inclusion or request chain | 4 |
ad-seman | infer sharing from ad semantics (retargeting, bids), not from the wire | 3 |
graph-ml | graph representation of the page load plus a learned classifier | 3 |
passive | the syntactic idea applied to real users' traffic logs | 3 |
taint | JavaScript taint tracking, storage source to network sink | 1 |
secondary | reuses another paper's syncing labels rather than detecting it | 1 |
The coarseness is real. PURL builds a graph and does syntactic value matching; Khaleesi does chain analysis and trains a random forest. Each paper was assigned the family that does the identifier work. The content page says to read the table as a ranking, not a partition.
3. Running it
cd /workspace/publications_dataset # read-only mount of pdf_fetcher node /workspace/artifacts/wiki/scripts/report_cookie_syncing.mjs node /workspace/artifacts/wiki/scripts/cookie_syncing_quotecheck.mjs node /workspace/artifacts/wiki/scripts/cookiesync_fulltext_probe.mjs # the wider exploratory sweep node /workspace/artifacts/wiki/scripts/cookie_syncing_number_guard.mjs pages/draft/privacy_cookie_syncing.txt
scripts/lib.mjs locates the data root, so the scripts run from either working directory. The full-text pass reads ~5,869 files and takes about a minute; nothing is cached.
4. Unedited output
4.1 Corpus report
- report_cookie_syncing-output.txt
=== PASS A — corpus reach === papers with a readable paper.cols.txt: 5869 <-- denominator for pass A papers mentioning any syncing wording at least once: 106 (1.8%) papers mentioning it 5+ times: 31 (0.5%) === PASS A — papers matching each wording (denominator: 5869) === 86 1.5% cookie sync / synchronisation 36 0.6% cookie matching 10 0.2% ID / UID syncing 2 0.0% pixel / tag syncing === PASS A — by year (2025 thin at the edges, 2026 provisional: CCS/IMC 2026 not held) === year papers >=1 mention >=5 mentions 2010 118 0 0 2011 116 0 0 2012 151 2 0 2013 125 0 0 2014 165 1 1 2015 190 2 0 2016 182 5 3 2017 232 6 2 2018 254 5 1 2019 402 9 3 2020 402 9 4 2021 380 10 3 2022 546 17 8 2023 720 14 1 2024 701 10 3 2025 770 13 2 2026 415 3 0 === PASS A — by venue (denominator: that venue's papers with full text) === PETS 510 papers 28 >=1 (5.5%) 9 >=5 (1.8%) USENIX 1410 papers 15 >=1 (1.1%) 6 >=5 (0.4%) WWW 843 papers 20 >=1 (2.4%) 6 >=5 (0.7%) CCS 989 papers 8 >=1 (0.8%) 4 >=5 (0.4%) IMC 637 papers 18 >=1 (2.8%) 4 >=5 (0.6%) IEEE-SP 779 papers 6 >=1 (0.8%) 2 >=5 (0.3%) NDSS 701 papers 11 >=1 (1.6%) 0 >=5 (0.0%) === PASS B — candidate set and hand labels === candidates (>=5 mentions OR a syncing tuple, plus 4 added by hand): 44 labelled "measures identifier sharing": 30 labelled "cites only": 5 labelled "phrase means something else": 9 UNLABELLED RESIDUE: 0 labels written for papers NOT in the candidate set: 3 -- NDSS/2026/cross-boundary-mobile-tracking-exploring-java-to-javascript-information-diffusion-in-webviews (in corpus, below threshold and no matching tuple) -- USENIX/2019/a-billion-open-interfaces-for-eve-and-mallory-mitm-dos-and-tracking-attacks-on-i (in corpus, below threshold and no matching tuple) -- IEEE-SP/2019/tracking-the-trackers-analyzing-the-global-tracking-landscape-with-ghostrack (NOT IN CORPUS) === PASS B — the 30 papers that measure identifier sharing, by detection family === 15 50.0% syntactic 4 13.3% chain 3 10.0% ad-seman 3 10.0% graph-ml 3 10.0% passive 1 3.3% secondary 1 3.3% taint === PASS B — the same set, by year and family === 2014 CCS syntactic 48 mentions the-web-never-forgets-persistent-tracking-mechanisms-in-the-wild 2016 CCS syntactic 17 mentions online-tracking-a-1-million-site-measurement-and-analysis 2016 USENIX ad-seman 75 mentions tracing-information-flows-between-ad-exchanges-using-retargeted-ads 2017 IMC passive 7 mentions if-you-are-not-paying-for-it-you-are-the-product-how-much-do-advertisers-pay-to 2017 PETS syntactic 12 mentions cross-device-tracking-measurement-and-disclosures 2018 WWW passive 18 mentions the-cost-of-digital-advertisement-comparing-user-and-advertiser-views 2019 IMC syntactic 10 mentions tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem 2019 WWW passive 32 mentions cookie-synchronization-everything-you-always-wanted-to-know-but-were-afraid-to-a 2020 PETS ad-seman 27 mentions inferring-tracker-advertiser-relationships-in-the-online-advertising-ecosystem-u 2020 PETS syntactic 50 mentions missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix 2020 WWW syntactic 14 mentions stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa 2021 IEEE-SP secondary 11 mentions fingerprinting-the-fingerprinters-learning-to-detect-browser-fingerprinting-beha 2021 PETS syntactic 34 mentions a-calculus-of-tracking-theory-and-practice 2021 WWW syntactic 3 mentions cookie-swap-party-abusing-first-party-cookies-for-web-tracking 2021 WWW syntactic 39 mentions user-tracking-in-the-post-cookie-era-how-websites-bypass-gdpr-consent-to-track-u 2022 CCS ad-seman 6 mentions cart-ology-intercepting-targeted-advertising-via-ad-network-identity-entanglemen 2022 IEEE-SP chain 5 mentions journey-to-the-center-of-the-cookie-ecosystem-unraveling-actors-roles-and-relati 2022 IMC syntactic 9 mentions measuring-uid-smuggling-in-the-wild 2022 PETS chain 21 mentions atom-ad-network-tomography 2022 USENIX chain 39 mentions khaleesi-breaker-of-advertising-and-tracking-request-chains 2022 USENIX graph-ml 5 mentions webgraph-capturing-advertising-and-tracking-information-flows-for-robust-blockin 2023 CCS graph-ml 5 mentions cookiegraph-understanding-and-detecting-first-party-tracking-cookies 2023 IMC chain 3 mentions tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem 2024 PETS syntactic 109 mentions opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy 2024 USENIX graph-ml 6 mentions purl-safe-and-effective-sanitization-of-link-decoration 2025 IMC syntactic 3 mentions cookieguard-characterizing-and-isolating-the-first-party-cookie-jar 2025 PETS syntactic 6 mentions intractable-cookie-crumbs-unveiling-the-nexus-of-stateful-banner-interaction-and 2025 PETS syntactic 34 mentions tracking-without-borders-studying-the-role-of-webviews-in-bridging-mobile-and-we 2026 PETS syntactic 1 mentions clicking-into-exposure-uncovering-privacy-risks-of-google-click-identifier-in-yo 2026 PETS taint 2 mentions from-syntactic-matching-to-taint-tracking-and-back-a-comparative-study-of-web-tr === PASS B — first appearance of each detection family === syntactic first 2014, most recent 2026 ad-seman first 2016, most recent 2022 passive first 2017, most recent 2019 secondary first 2021, most recent 2021 chain first 2022, most recent 2023 graph-ml first 2022, most recent 2024 taint first 2026, most recent 2026 === PASS C — extraction fields for the 30 measuring papers === of which ran an automated crawl (crawlConfig fired): 25 crawlConfig.statefulness (denominator: 25 measuring papers that crawled) 10 40.0% stateful 6 24.0% both 6 24.0% not-stated <-- sentinel 3 12.0% stateless crawlConfig.consentAction (denominator: 25 measuring papers that crawled) 12 48.0% not-stated <-- sentinel 9 36.0% no-interaction 4 16.0% accept-and-reject crawlConfig.interactionDepth (denominator: 25 measuring papers that crawled) 11 44.0% landing-page-only 7 28.0% landing-plus-subpages 4 16.0% single-target-page 2 8.0% not-stated <-- sentinel 1 4.0% deep-crawl crawlConfig.headless (denominator: 25 measuring papers that crawled) 20 80.0% not-stated <-- sentinel 3 12.0% headless 2 8.0% headful temporal.mode (denominator: 30 measuring papers) 25 83.3% live-crawl 4 13.3% existing-dataset 3 10.0% passive-collection 2 6.7% active-probing artifacts.availability (denominator: 30 measuring papers) 13 43.3% public 10 33.3% none-mentioned <-- sentinel, not an answer 5 16.7% promised-not-yet-available === PASS C — vantage locations, folded (geo.mjs); residue printed === measuring papers stating at least one vantage location: 19 of 30 13 United States 4 Europe 3 Spain 3 India 2 Germany 2 Brazil 2 Australia 1 Singapore 1 Russia 1 United Kingdom 1 France 1 Japan unmapped residue (2): !! IMC/2017/if-you-are-not-paying-for-it-you-are-the-product-how-much-do-advertisers-pay-to: same country !! WWW/2019/cookie-synchronization-everything-you-always-wanted-to-know-but-were-afraid-to-a: same country; country not-stated === PASS C — classification tuples targeting web-request, within the measuring set === CCS/2016/online-tracking-a-1-million-site-measurement-and-analysis method=blocklist resource=EasyList groundTruth=null validation=none-reported method=blocklist resource=EasyPrivacy groundTruth=null validation=none-reported method=blocklist resource=Disconnect groundTruth=null validation=none-reported USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads method=blocklist resource=EasyList groundTruth=EasyList filter rules validation=not-applicable IMC/2017/if-you-are-not-paying-for-it-you-are-the-product-how-much-do-advertisers-pay-to method=blocklist resource=Disconnect groundTruth=null validation=none-reported PETS/2017/cross-device-tracking-measurement-and-disclosures method=heuristic-rules resource=hostname string matching (custom) groundTruth=null validation=manual-validation WWW/2018/the-cost-of-digital-advertisement-comparing-user-and-advertiser-views method=blocklist resource=Disconnect blacklist groundTruth=null validation=none-reported method=heuristic-rules resource=custom RTB price pattern matching groundTruth=public keyword lists from past studies and RTB documentation validation=none-reported IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem method=blocklist resource=EasyList and EasyPrivacy groundTruth=EasyList and EasyPrivacy rules validation=none-reported PETS/2020/inferring-tracker-advertiser-relationships-in-the-online-advertising-ecosystem-u method=blocklist resource=EasyList groundTruth=null validation=not-applicable method=blocklist resource=EasyPrivacy groundTruth=null validation=not-applicable PETS/2020/missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix method=heuristic-rules resource=BehaviorTrack groundTruth=invisible-pixels dataset and two simultaneous crawls validation=none-reported method=blocklist resource=EasyList and EasyPrivacy groundTruth=null validation=comparison-to-other-method PETS/2021/a-calculus-of-tracking-theory-and-practice method=blocklist resource=Ghostery groundTruth=null validation=none-reported method=blocklist resource=Disconnect groundTruth=null validation=none-reported method=blocklist resource=Adblock Plus groundTruth=null validation=none-reported method=blocklist resource=EasyList groundTruth=null validation=none-reported method=blocklist resource=EasyPrivacy groundTruth=null validation=none-reported method=blocklist resource=Privacy Badger groundTruth=null validation=none-reported WWW/2021/cookie-swap-party-abusing-first-party-cookies-for-web-tracking method=blocklist resource=EasyList/EasyPrivacy groundTruth=null validation=not-applicable WWW/2021/user-tracking-in-the-post-cookie-era-how-websites-bypass-gdpr-consent-to-track-u method=heuristic-rules resource=custom ID-matching rules groundTruth=manual inspection of cookie values from over 2.5K websites validation=manual-validation CCS/2022/cart-ology-intercepting-targeted-advertising-via-ad-network-identity-entanglemen method=regex-or-signature resource=Criteo and Yahoo Analytics API URL matching groundTruth=null validation=none-reported method=regex-or-signature resource=Criteo and Yahoo Analytics API identification groundTruth=null validation=none-reported PETS/2022/atom-ad-network-tomography method=blocklist resource=EasyPrivacy groundTruth=EasyPrivacy tracker list validation=none-reported method=blocklist resource=EasyList groundTruth=EasyList filters validation=manual-validation USENIX/2022/khaleesi-breaker-of-advertising-and-tracking-request-chains method=blocklist resource=EasyList groundTruth=EasyList and EasyPrivacy filter-list matches validation=manual-validation method=blocklist resource=EasyPrivacy groundTruth=EasyList and EasyPrivacy filter-list matches validation=manual-validation method=supervised-ml resource=random forest (custom) groundTruth=EasyList and EasyPrivacy filter-list labels validation=cross-validation USENIX/2022/webgraph-capturing-advertising-and-tracking-information-flows-for-robust-blockin method=blocklist resource=filter lists used by AdGraph, including EasyList and EasyPrivacy groundTruth=filter-list membership; ATS if present in one or more filter lists validation=comparison-to-other-method method=supervised-ml resource=decision tree classifier (custom) groundTruth=filter-list labels validation=cross-validation CCS/2023/cookiegraph-understanding-and-detecting-first-party-tracking-cookies method=blocklist resource=EasyList and EasyPrivacy groundTruth=EasyList and EasyPrivacy URL rules validation=not-applicable IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem method=blocklist resource=filter lists groundTruth=null validation=manual-validation PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy method=heuristic-rules resource=custom prebid.js probe groundTruth=null validation=manual-validation USENIX/2024/purl-safe-and-effective-sanitization-of-link-decoration method=blocklist resource=EasyList and EasyPrivacy groundTruth=EasyList and EasyPrivacy request-matching rules validation=not-applicable PETS/2026/from-syntactic-matching-to-taint-tracking-and-back-a-comparative-study-of-web-tr method=heuristic-rules resource=syntactic matching algorithm (custom) groundTruth=null validation=manual-validation method=dynamic-analysis resource=Foxhound groundTruth=null validation=manual-validation measuring papers with a web-request classification tuple: 20 of 30 ... of which report a non-sentinel validation: 9 PETS/2017/cross-device-tracking-measurement-and-disclosures PETS/2020/missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix WWW/2021/user-tracking-in-the-post-cookie-era-how-websites-bypass-gdpr-consent-to-track-u PETS/2022/atom-ad-network-tomography USENIX/2022/khaleesi-breaker-of-advertising-and-tracking-request-chains USENIX/2022/webgraph-capturing-advertising-and-tracking-information-flows-for-robust-blockin IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy PETS/2026/from-syntactic-matching-to-taint-tracking-and-back-a-comparative-study-of-web-tr ... naming EasyList and/or EasyPrivacy: 12 of 20 ... naming Disconnect: 4 of 20 ... with any blocklist-method tuple: 15 of 20 resources named in web-request tuples (paper-counted, of 20): 6 EasyList 5 EasyPrivacy 4 EasyList and EasyPrivacy 3 Disconnect 1 hostname string matching (custom) 1 Disconnect blacklist 1 custom RTB price pattern matching 1 BehaviorTrack 1 Ghostery 1 Adblock Plus 1 Privacy Badger 1 EasyList/EasyPrivacy 1 custom ID-matching rules 1 Criteo and Yahoo Analytics API URL matching 1 Criteo and Yahoo Analytics API identification 1 random forest (custom) 1 filter lists used by AdGraph, including EasyList and EasyPrivacy 1 decision tree classifier (custom) 1 filter lists 1 custom prebid.js probe 1 syntactic matching algorithm (custom) 1 Foxhound (corpus-wide, 262 of the 4,439 papers that classified anything target web-request) === PASS C — measured results: detection[].prevalence on syncing-related tuples === Quoted with the paper that made them. The denominator is NOT in this field: it has to be read out of the paper. See the page for the ones that carry one. -- CCS/2014/the-web-never-forgets-persistent-tracking-mechanisms-in-the-wild [cookie synchronization] IDs and parties involved in synchronization => Disabling third-party cookies reduced synced IDs and parties by nearly a factor of two [respawned-ID cookie syncing] share of browsing history linkable across clearing => At least 11% of a user's history could be tracked over time -- CCS/2016/online-tracking-a-1-million-site-measurement-and-analysis [cookie syncing] share of top third parties syncing => 45 of the top 50 and 85 of the top 100 third parties synced cookies with at least one other party. -- USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads [Cookie matching] share of publisher-side chains => forward matching 69%, backward matching 55% before clustering [Heuristic cookie-matching detection failures] fraction of matching partners missed => 31% of cookie-matching partners were missed; 4.1% of chains were completely missed -- PETS/2017/cross-device-tracking-measurement-and-disclosures [Cookie syncing] domains and recipient domains => 106 domains transmitted cookie IDs to 210 different domains -- WWW/2018/the-cost-of-digital-advertisement-comparing-user-and-advertiser-views [Cookie Synchronization] share of users exposed and synchronizations per request => 97% of regular users were exposed at least once -- IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem [cookie synchronization] share of pornographic websites => 2,867 websites, covering 58% of the top-100 popular sites -- WWW/2019/cookie-synchronization-everything-you-always-wanted-to-know-but-were-afraid-to-a [Cookie synchronization] share of regular users exposed => 97% of regular web users were exposed to CSync [Cookie synchronization] CSync requests => 263,635 synchronization events involving 22,329 unique synced userIDs -- PETS/2020/inferring-tracker-advertiser-relationships-in-the-online-advertising-ecosystem-u [tracker–advertiser relationships] classification accuracy => 75–83% accuracy; 15 relationships inferred, including 11 not detected by cookie syncing [client-side cookie syncing] validated inferred relationships => 4 of 15 inferred relationships detected by client-side cookie syncing -- PETS/2020/missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix [first-to-third-party cookie syncing] share of visited domains => 67.96% of visited domains -- WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa [cookie synchronization] cookie synchronizations per website => right-leaning websites facilitated up to 50% more synchronizations -- PETS/2021/a-calculus-of-tracking-theory-and-practice [tracking relations] number of derived predicates => Top 50 domains contacted 190 different websites with more than 6k connections. [cookie syncing] number of Cookie_sync predicates => 8 Cookie_sync predicates for the Top 50 domains. -- WWW/2021/user-tracking-in-the-post-cookie-era-how-websites-bypass-gdpr-consent-to-track-u [third-party ID synchronization] average unique synchronizations per website => 3.51 synchronizations before consent and 3.91 after Reject All -- PETS/2022/atom-ad-network-tomography [validation of inferred sharing relationships] validated relationships => 9 of 11 inferred relationships were validated. [cookie syncing] advertisers engaging in cookie syncing => 7 advertisers engaged in cookie syncing; 4 synced with an Alphabet-owned tracker. -- USENIX/2022/khaleesi-breaker-of-advertising-and-tracking-request-chains [cookie syncing] share of request chains and domains => More than half of request chains in most configurations participated in cookie syncing. -- IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem [Cookie syncing] number of advertisers and third parties => 41 advertisers synced cookies with Amazon and 247 other third parties -- PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy [Client-side cookie syncing] cookie syncing events => Cookie syncing persisted after opt-out across CMPs and jurisdictions. [Pre-opt-out tracking] bids and cookie syncing events => Advertisers continued using data and syncing cookies after pre-opt-out. -- PETS/2025/intractable-cookie-crumbs-unveiling-the-nexus-of-stateful-banner-interaction-and [cookie synchronization] share synchronized at least once => 76 of 2,545 unique intractable cookies, or 3% -- PETS/2025/tracking-without-borders-studying-the-role-of-webviews-in-bridging-mobile-and-we [Cookie synchronization and ID bridging] origin and destination SLDs => Cookie synchronization involved 1,190 SLDs, with 44% associated with ATSes === PASS C — artifact links released by the measuring papers === CCS/2016/online-tracking-a-1-million-site-measurement-and-analysis https://github.com/citp/OpenWPM USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads http://personalization.ccs.neu.edu/ WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa http://tiny.cc/partisan-tracking http://tiny.cc/partisan-tracking IMC/2022/measuring-uid-smuggling-in-the-wild https://github.com/ucsdsysnet/crumbcruncher PETS/2022/atom-ad-network-tomography https://vitalstatistix.cs.uiowa.edu:2443/maaz/atom-archive USENIX/2022/khaleesi-breaker-of-advertising-and-tracking-request-chains https://uiowa-irl.github.io/Khaleesi/ https://uiowa-irl.github.io/Khaleesi/ CCS/2023/cookiegraph-understanding-and-detecting-first-party-tracking-cookies https://github.com/cookiegraph/CookieGraph https://github.com/cookiegraph/CookieGraph IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem https://privsec-research.github.io/alexaechos https://privsec-research.github.io/alexaechos USENIX/2024/purl-safe-and-effective-sanitization-of-link-decoration https://github.com/purl-sanitizer/purl https://raw.githubusercontent.com/purl-sanitizer/purl/main/data/breakage-analysis-sites.md IMC/2025/cookieguard-characterizing-and-isolating-the-first-party-cookie-jar https://github.com/pooneh-nb/cookieGuard PETS/2025/intractable-cookie-crumbs-unveiling-the-nexus-of-stateful-banner-interaction-and bannerclick.github.io PETS/2025/tracking-without-borders-studying-the-role-of-webviews-in-bridging-mobile-and-we https://github.com/WebViews-2025/Artifacts https://github.com/WebViews-2025/Artifacts PETS/2026/clicking-into-exposure-uncovering-privacy-risks-of-google-click-identifier-in-yo https://doi.org/10.17617/3.H5T0W4 PETS/2026/from-syntactic-matching-to-taint-tracking-and-back-a-comparative-study-of-web-tr http://purl.org/tracking-detection-paper http://purl.org/tracking-detection-paper
4.2 Quote check
Every figure and every quoted phrase the content page takes from a corpus paper is pinned by a literal here and checked against both renderings of that paper — paper.cols.txt (column order repaired; the one the extraction read) and paper.norm.txt. They fail on different sentences, so a literal found in either is verified and the report says which.
The coverage claim in the previous sentence was false when it was first written and is the review's best catch. The check then held 61 literals and the content page carried at least fourteen more paper-derived figures and quotes that were not among them — Vallina's 2,867 and 58%, the WebViews 44%, Rasaii's 76, Bashir's “90 personas”, Calzavara's 4%–7% and its “no consensus” sentence, Khaleesi's “more than half of the request chains”, Englehardt's “is essential” and “includes both events where it is a referer and where it is a receiver”, Acar's “by nearly a factor of two”. The reviewer verified all of them by hand and every one was correct, so nothing on the page changed — but a provenance page whose headline coverage claim is checkable and false is worse than one that claims less. They are all pinned now, which is why the count is 80 and not 61. 80 literals, 0 not found.
A dozen literals failed across successive runs as the check was extended, and every one of them was an error in the check or in my paraphrase, never in the paper. Three kinds:
- Paraphrase presented as quotation — “97% of regular web users” for the paper's “97% of the regular web users”; “supporting measurement instances in a 'headless' container” for “We support launching measurement instances in a 'headless' container”; “2.7% of navigation paths” for “2.7% of the navigation paths we studied”. The content page was changed to the papers' wording in each case. This is the failure the check exists to catch: a near-quote reads exactly like a quote.
- ASCII where the PDF has Unicode —
8 ⇐ length(parameter-value) ⇐ 100for8 ≤ length(parameter-value) ≤ 100. - Phrases the two-column rendering interleaves. Both
.colsand.normsplice the neighbouring column into the middle of a sentence, so a long quote is not contiguous in either. Two on this page are affected: the Zeber et al. sentence about stateless crawlers being “a clear target for cookie syncing”, and the OpenWPM “headless container” sentence, which in both renderings reads…in a “headthe LevelDBAggregator for de-duplication. less” container, by using the pyvirtualdisplay library to inJavascript Access…. The quotes are accurate when read across the interleave, but they cannot be machine-verified end to end, so the check pins the longest contiguous fragment of each and the content page quotes only short fragments around a paraphrase. Anyone re-checking these two bygrepwill get a false FAIL.
- cookie_syncing_quotecheck-output.txt
-- 2014/CCS/the-web-never-forgets-persistent-tracking-mechanisms-in-the-wild OK [cols|norm] at least 11% OK [cols|norm] respawning OK [cols|norm] by nearly a factor of two -- 2016/CCS/online-tracking-a-1-million-site-measurement-and-analysis OK [cols|----] 45 of the top 50, 85 of the top 100, 157 of the top 200, and 460 of the top 1,000 OK [cols|norm] 8 ≤ length(parameter-value) ≤ 100 OK [cols|norm] expiration date over 90 days in the future OK [cols|norm] ratcliff-obershelp OK [cols|norm] 108 different cookies with 118 OK [cols|----] 76% of all third-party domains present on more than 5 of the top 100,000 sites OK [cols|----] visits the top 10,000 sites in a serial fashion OK [cols|norm] it is essential OK [cols|----] includes both events where it is a referer and where it is a receiver OK [cols|norm] by using the pyvirtualdisplay library -- 2016/USENIX/tracing-information-flows-between-ad-exchanges-using-retargeted-ads OK [cols|norm] for 31% of our cookie matching partners OK [cols|norm] We train 90 personas OK [cols|----] 4.1% cookie matching chains that would be completely missed OK [cols|norm] 35,448 -- 2019/WWW/cookie-synchronization-everything-you-always-wanted-to-know-but-were-afraid-to-a OK [cols|norm] 97% of the regular web users are exposed to csync OK [cols|norm] 3.5 different domains OK [cols|norm] factor of 6.75 OK [cols|norm] synchronization per 68 http requests OK [cols|----] 850 real mobile users OK [cols|norm] specific length (> 10 characters) -- 2020/PETS/missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix OK [cols|norm] 67.96% of websites OK [cols|norm] stateful crawl of alexa OK [cols|norm] top 10, 000 domains -- 2021/WWW/user-tracking-in-the-post-cookie-era-how-websites-bypass-gdpr-consent-to-track-u OK [cols|norm] 3.51 OK [cols|norm] 3.91 OK [cols|norm] 4.86 OK [cols|norm] 24.03 OK [cols|norm] 26.20 OK [cols|norm] 29.61 OK [cols|norm] 27,180 -- 2022/USENIX/khaleesi-breaker-of-advertising-and-tracking-request-chains OK [cols|norm] cookie syncing OK [cols|norm] bounce tracking OK [cols|norm] more than half of the request chains -- 2022/IMC/measuring-uid-smuggling-in-the-wild OK [cols|norm] 8.11% OK [cols|norm] 10,814 OK [cols|norm] four crawlers OK [cols|----] greater than or equal to eight characters OK [cols|norm] 2.7% of the navigation paths we studied OK [cols|norm] 8.11% of the unique URL paths OK [cols|norm] Dedicated Smugglers 27 -- 2022/IEEE-SP/journey-to-the-center-of-the-cookie-ecosystem-unraveling-actors-roles-and-relati OK [cols|norm] 138m cookie creation events OK [cols|norm] 6.2m web pages OK [cols|norm] cookie ghostwriting -- 2023/IMC/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem OK [cols|norm] 41 advertisers OK [cols|norm] 247 -- 2024/USENIX/purl-safe-and-effective-sanitization-of-link-decoration OK [cols|norm] 73.02% OK [cols|norm] 10.75 -- 2025/PETS/intractable-cookie-crumbs-unveiling-the-nexus-of-stateful-banner-interaction-and OK [cols|norm] 2,545 OK [cols|norm] 76 OK [cols|norm] we define intractable OK [cols|norm] accepts the banner -- 2025/PETS/tracking-without-borders-studying-the-role-of-webviews-in-bridging-mobile-and-we OK [cols|norm] 1,190 OK [cols|norm] 44% -- 2019/IMC/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem OK [cols|norm] 2,867 OK [cols|norm] 58% -- 2023/WWW/the-hitchhikers-guide-to-facebook-web-tracking-with-invisible-pixels-and-click-i OK [cols|norm] 6.2 third -- 2021/PETS/the-cname-of-the-game-large-scale-analysis-of-dns-based-tracking-evasion OK [cols|norm] 1,899 OK [cols|norm] 1,295 -- 2021/IEEE-SP/fingerprinting-the-fingerprinters-learning-to-detect-browser-fingerprinting-beha OK [cols|----] 17.28% of the fingerprinting vendors participate in cookie syncing -- 2020/WWW/the-representativeness-of-automated-web-crawls-as-a-surrogate-for-human-browsing OK [cols|norm] cookie syncing is not necessary for users who have already had -- 2026/PETS/clicking-into-exposure-uncovering-privacy-risks-of-google-click-identifier-in-yo OK [cols|norm] 568 OK [cols|norm] 133 OK [cols|norm] 64 (out of 76) advertisers persist OK [cols|----] 41 out of 74) stored the gclid as a first-party cookie OK [cols|norm] leaked to 133 third-party domains -- 2026/PETS/from-syntactic-matching-to-taint-tracking-and-back-a-comparative-study-of-web-tr OK [cols|norm] 40,605 tracking requests OK [cols|norm] 33,584 tracking requests exposed by syntactic matching OK [cols|norm] 17,496 tracking requests (43%) OK [cols|norm] 7,021 requests identified by taint tracking alone OK [cols|norm] 16%-19% OK [cols|norm] 27%-30% when considering only those requests OK [cols|----] -24% reduction in the number of tracking requests OK [cols|norm] -36% reduction in the number of distinct trackers OK [cols|norm] tranco top 10k OK [cols|norm] zxcvbn OK [cols|norm] there is no consensus on the most effective heuristic OK [cols|norm] is then 4%-7% 80 literals verified, 0 not found.
4.3 The exploratory probe, kept
- cookiesync_fulltext_probe.mjs
// Full-text probe for cookie/ID syncing across the 7-venue corpus. // // Why full text and not only the extraction: `detection.phenomenon` is free // text and names the phenomenon the paper *headlines*. A paper that measures // syncing as one of ten tracking mechanisms may never surface the word in a // tuple. So: stream every paper.cols.txt, collapse whitespace (a PDF line // break inside "cookie syn-\nchronization" otherwise hides the match), and // count PAPERS per pattern. // // node scripts/cookiesync_fulltext_probe.mjs [--json out.json] import fs from 'node:fs'; import path from 'node:path'; import { dataRoot } from './lib.mjs'; const ROOT = path.join(dataRoot(), 'fulltext'); // Width matters: a narrow regex returns a confident wrong number. Each pattern // is reported separately so the page can say which wording it is counting. const PATTERNS = { 'cookie sync (any form)': /cookie[\s-]*(?:sync|synchroni[sz])/i, 'cookie matching': /cookie[\s-]*match/i, 'ID sync': /\b(?:id|identifier|uid|user[\s-]?id)[\s-]*(?:sync|synchroni[sz])/i, 'ad/RTB sync': /\b(?:rtb|bid|exchange|advertis\w+)[\s-]*(?:sync|synchroni[sz])/i, 'pixel/tag sync': /\b(?:pixel|tag|beacon)[\s-]*(?:sync|synchroni[sz])/i, 'cookie ghosting/respawn': /cookie[\s-]*(?:ghost|respawn|resurrect)/i, 'header bidding': /header[\s-]*bidding/i, 'real-time bidding': /real[\s-]*time[\s-]*bidding|\bRTB\b/, }; const ANY_SYNC = /(?:cookie|\b(?:id|identifier|uid|user[\s-]?id)|pixel|tag)[\s-]*(?:sync|synchroni[sz])|cookie[\s-]*match/i; // A paper that only says the word once, in related work, is not a paper that // measured it. Count occurrences too so the page can threshold. const ANY_G = new RegExp(ANY_SYNC.source, 'gi'); const files = []; for (const year of fs.readdirSync(ROOT).sort()) { const yd = path.join(ROOT, year); if (!fs.statSync(yd).isDirectory()) continue; for (const venue of fs.readdirSync(yd).sort()) { const vd = path.join(yd, venue); if (!fs.statSync(vd).isDirectory()) continue; for (const slug of fs.readdirSync(vd).sort()) { const f = path.join(vd, slug, 'paper.cols.txt'); if (fs.existsSync(f)) files.push({ year: +year, venue, slug, f }); } } } const counts = Object.fromEntries(Object.keys(PATTERNS).map((k) => [k, 0])); const perYear = new Map(); const rows = []; for (const it of files) { // Hyphenation at a line break: "syn-\nchronization" -> "synchronization". const raw = fs.readFileSync(it.f, 'utf8'); const text = raw.replace(/-\n/g, '').replace(/\s+/g, ' '); const occ = (text.match(ANY_G) || []).length; const hitNames = []; for (const [name, re] of Object.entries(PATTERNS)) { if (re.test(text)) { counts[name]++; hitNames.push(name); } } if (occ > 0) { rows.push({ ...it, occ, patterns: hitNames.filter((n) => !/bidding/.test(n)) }); const y = perYear.get(it.year) || { any: 0, ge5: 0, ge20: 0, total: 0 }; y.any++; if (occ >= 5) y.ge5++; if (occ >= 20) y.ge20++; perYear.set(it.year, y); } const y = perYear.get(it.year) || { any: 0, ge5: 0, ge20: 0, total: 0 }; y.total++; perYear.set(it.year, y); } console.log(`papers with a paper.cols.txt: ${files.length}`); console.log('\n== Papers matching each wording (denominator: all %d papers with full text) =='.replace('%d', files.length)); for (const [name, n] of Object.entries(counts).sort((a, b) => b[1] - a[1])) console.log(` ${String(n).padStart(4)} ${((100 * n) / files.length).toFixed(1)}% ${name}`); console.log('\n== Any syncing wording, by year (2026 provisional; 2025 thin) =='); console.log(' year papers >=1 occ >=5 occ >=20 occ'); for (const y of [...perYear.keys()].sort((a, b) => a - b)) { const v = perYear.get(y); console.log( ` ${y} ${String(v.total).padStart(6)} ${String(v.any).padStart(7)} ${String(v.ge5).padStart(7)} ${String(v.ge20).padStart(8)}` ); } rows.sort((a, b) => b.occ - a.occ); console.log('\n== Top 40 papers by occurrence count of syncing wording =='); for (const r of rows.slice(0, 40)) console.log(` ${String(r.occ).padStart(4)} ${r.year} ${r.venue.padEnd(8)} ${r.slug}`); const argJson = process.argv.indexOf('--json'); if (argJson > -1) fs.writeFileSync(process.argv[argJson + 1], JSON.stringify(rows, null, 1));
4.4 Quotes spot-checked in the extraction, and what the check cannot do
Separately from the literal check in §4.2, the crawlConfig evidence quotes behind the crawl-configuration table were read by hand for five of the 25 crawling papers. The finding is a limitation, not a confirmation.
| Paper | Field values published | What the single crawlConfig.evidence.quote actually supports |
|---|---|---|
CCS/2016/online-tracking… | statefulness=both, headless=headless, consentAction=no-interaction, interactionDepth=landing-page-only | “the browser will visit the homepage … The browser does not interact with the site or visit any other pages.” — supports interactionDepth and consentAction. Says nothing about statefulness or headlessness |
PETS/2020/missed-by-filter-lists… | stateful, landing-plus-subpages | “we visited the home page and the first 10 links from the same domain” — supports interactionDepth only |
WWW/2021/user-tracking-in-the-post-cookie-era… | stateless, accept-and-reject | “we crawl the given website 3 times (one for each of the different consent actions)” — supports consentAction only |
IMC/2022/measuring-uid-smuggling… | stateful, deep-crawl, headful | “CrumbCruncher retains browser state … for the duration of each walk” — supports statefulness, the only one of the five that does |
PETS/2026/from-syntactic-matching… | stateful, landing-page-only | “The crawler navigates the website landing page again…” — supports interactionDepth only |
So: an object-valued family with one shared quote cannot be quote-checked field by field. Four of the five quotes do not touch the field the page leans on hardest. This is stated on the content page in a box beside the table rather than buried here.
One value was traced further because it looked wrong. CCS/2016 is recorded headless=headless; OpenWPM in 2016 drove Firefox under Xvfb, which is a headful browser on a virtual framebuffer. The paper's own words are “supporting measurement instances in a 'headless' container, by using the pyvirtualdisplay library to interface with Xvfb” — the scare quotes are the authors'. The extraction is faithful to the paper's wording and the paper's wording is loose. The content page says so, because the difference is detectable by anti-bot logic and therefore matters to a measurement.
4.5 The stale-number guard
Every run of digits on the content page is checked against four sources, and the check fails if any figure matches none of them:
- the corpus report output — every corpus figure must be printed there;
- the quote-check literals — every figure quoted from a paper must be pinned by a literal that was verified against that paper's own text;
- an
EXTERNALmap, each entry carrying the URL it came from; - a
DERIVEDmap, for the two figures this page computed itself from two verified ones (17,496 / 33,584 = 52%and850 / 10,814 = 7.86%), spelled out so a reader can redo the division rather than trust it.
The shared check_page_numbers.mjs passes over the Use in Publications window. Over the whole page it reports 48 unaccounted figures, all of them per-paper or per-vendor — which is what the page-specific guard exists to resolve rather than to suppress. It failed the windowed check once during the second review round, on a bare 24 where the report prints 24.0%; the figure was right and the prose formatting was not, and the prose now matches the table. Current state:
$ node scripts/cookie_syncing_number_guard.mjs pages/draft/privacy_cookie_syncing.txt figures checked: 171 OK — every figure traces to the report, to a verified quote literal, to a named external source, or to arithmetic on two verified figures.
The guard let two stale figures through, and the re-review caught them. After the 29→30 correction the page still said “the 83%” for a value that had become 80.0%, and “the seven rows sum to 29” for a column that summed to 30. Both passed, and the reason is worth stating precisely because it bounds what either guard is worth:
83appears in the report twice, both times as something else —83.3%as atemporal.modeshare, and75–83% accuracyas a classifier's accuracy range in one of the papers. The shared guard's word-boundary matching does not help:83really is there, as a whole token, in75–83%.29appears in the report in a dozen places.
A guard that asks “does this digit-string appear anywhere in the report” cannot ask “does it appear as this quantity.” That is not an implementation defect to fix; it is the ceiling of the technique, and it is the same ceiling the shared script's own comments describe. The only defence found is to re-read the prose by hand after any denominator change. Both stale figures were in prose, not in a table, which is where to look first.
Running it during the first review caught nine figures with no pinned source, six of which were per-paper figures the quote check had never been told about; the generic reviewer then found fourteen more of the same kind that the guard could not see because they are quotes rather than digits. All are pinned now, which is what took the quote check from 42 literals at first draft to 80.
5. Figures on the content page, and where each comes from
| Figure on the page | Source | Its denominator |
|---|---|---|
| 106 / 31 / 86 / 36 / 10 / 2 papers; per-year and per-venue tables | report_cookie_syncing.mjs PASS A | FT-all = 5,869 |
| 30 measuring papers, family split, first/last year per family | PASS B | CAND = 44 |
| statefulness 10 / 6 / 3 / 6, consentAction 9 / 4 / 12, interactionDepth 11 / 7 / 4 / 1 / 2, headless 3 / 2 / 20 | PASS C | MEAS ∧ crawled = 25 |
| artifacts 13 public / 10 none-mentioned | PASS C | MEAS = 30 |
| 19 papers state a vantage location; United States 13 | PASS C, folded through geo.mjs | MEAS = 30 |
| 20 with a web-request tuple; 15 blocklist; 12 EasyList/EasyPrivacy; 4 Disconnect; 9 with non-sentinel validation | PASS C | MEAS = 30, then MEAS ∧ web-request = 20 |
262 of 4,439 papers corpus-wide target web-request | data/extract/OVERVIEW.md | papers that classified anything = 4,439 |
| 98% / 93% / 97% field stability | OVERVIEW.md stability table | 100 papers, two independent extraction runs, measured on the previous corpus |
| Every per-paper prevalence (45 of top 50, 67.96%, 97%, 3.51/3.91, 8.11%, 73.02%, 16%–19%, …) | the paper itself, via the quote check | the paper's own, stated in the table on the content page |
Numbers deliberately not published. The report prints temporal.mode for MEAS (25 live-crawl, 4 existing-dataset, 3 passive-collection, 2 active-probing). It is on the report but not on the page: temporal.mode is a 69%-agreement field and the interesting contrast (crawl versus passive logs) is already carried by the family table, where it rests on hand labels rather than on a 69% field.
6. Folding
Only one field on this page needed folding: vantage.locations, through the shared scripts/geo.mjs. Denominator MEAS = 30; 19 papers state at least one non-sentinel location.
- Folded result: United States 13, Europe 4, Spain 3, India 3, Germany 2, Brazil 2, Australia 2, and one each for Singapore, Russia, United Kingdom, France, Japan.
- Unmapped residue, printed in full (2 strings, both from the same construction):
IMC/2017/if-you-are-not-paying-for-it…:same countryWWW/2019/cookie-synchronization…:same country; country not-stated
Both are the extraction faithfully recording that the paper says the vantage was in the same country as the users but does not name it. Neither is a geography and neither was silently dropped.
The other counted fields (statefulness, consentAction, interactionDepth, headless, classification.target, classification.method) are enums, not free text, and are published unfolded. classification.resourceName is free text and is reported as a paper-counted ranking with the raw strings printed in the report output, not as a percentage — the folding there is one manual step, grouping any string matching /easy/i as EasyList/EasyPrivacy (12 papers) and /disconnect/i as Disconnect (4). The unfolded list is in §4.1.
A bug found and fixed during this run. The first version of the enumField helper counted tuples, not papers: a paper with three live-crawl temporal tuples was counted three times, which produced “29 of 29 papers (100%) live-crawl” from a set of 29 papers of which only 24 crawled at all — those were the counts before the boundary correction in §8 took MEAS to 30 and 25. Fixed to count distinct values per paper before the first figure reached the page. Noted here because it is exactly the failure mode OVERVIEW.md warns about and it still happened.
7. External sources, and how each was verified
Every row was fetched on 2026-08-26. Vendor and browser-vendor documentation only; no secondary summaries were used for any load-bearing claim.
| Claim on the page | Primary source | Verification |
|---|---|---|
| Chrome keeps third-party-cookie choice; no standalone prompt | privacysandbox.google.com/blog/privacy-sandbox-next-steps, 2025-04-22 | Fetched; quoted verbatim. Same source and quote already used on privacy:server_side_tracking, so the two pages agree |
| Ten Privacy Sandbox technologies retired, named | privacysandbox.google.com/blog/update-on-plans-for-privacy-sandbox-technologies, 2025-10-17 | Fetched; the list of ten and the third-party-cookie sentence quoted verbatim from the post |
Prebid.js user-sync defaults: syncDelay 3000 ms, syncsPerBidder 5, image on, iframe off | docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html | Fetched; each value quoted from the reference table |
Google Cookie Matching: google_gid, google_cver, 1×1 pixel, match tables | developers.google.com/authorized-buyers/rtb/cookie-guide | Fetched; the vendor's own wording quoted. The page also states “Cookie Match Assist feature will be deprecated starting on October 28th, 2025”, which is reported as the vendor's claim, not as an independent fact |
| Safari ITP blocks all third-party cookies; bounce-tracking classification; 24-hour cap on JS cookies after link decoration | webkit.org/tracking-prevention/ | Fetched; three sentences quoted verbatim |
| Firefox partitions cookies for all users since Firefox 103 | developer.mozilla.org/en-US/docs/Web/Privacy/Guides/State_Partitioning | Fetched; version and scope quoted verbatim |
| UID2 self-description | unifiedid.com/docs/intro | Fetched; single quoted phrase. Deliberately minimal — see rejections below |
| Protected Audience removal targeted at Chrome 153, status “Proposed”; six APIs still at “Intent to deprecate and remove filed” | chromestatus.com/api/v0/features/6552486106234880 and privacysandbox.google.com/overview/status | Fetched the Chrome Platform Status API (the HTML page renders client-side and returns an empty shell to a fetcher). Added during review after a reviewer reported that removal had already shipped in Chrome 152 on 2026-08-25 — see §9, finding rejected |
| Chrome bounce-tracking mitigations: 45-day interaction window, storage deleted, conditional on the user blocking third-party cookies | privacysandbox.google.com/protections/bounce-tracking-mitigations | Fetched; the 45-day rule and the third-party-cookie condition quoted from the page |
Artifact repository states: openwpm/OpenWPM pushed 2026-08-25; shaoormunir/purl pushed 2024-08-22; eleumasc/Web-Tracking-Detection pushed 2026-08-03; ucsdsysnet/crumbcruncher 2022-09-15; cookiegraph/CookieGraph 2023-09-02; pooneh-nb/cookieGuard 2025-10-01; none archived | GitHub REST API, api.github.com/repos/OWNER/REPO | Fetched per repository. Two of the URLs printed in the papers (citp/OpenWPM, purl-sanitizer/purl) now 301-redirect; the page gives the current URLs and says the old ones redirect |
7.1 Sources rejected
| Source | Why rejected |
|---|---|
| Seven vendor-blog posts returned by a search for the Privacy Sandbox shutdown (Secure Privacy, Usercentrics, Segwise, Jentis, Nyfty Labs, Consenteo, Leapbuzz) | All secondary; several assert Chrome milestone numbers (Chrome 144 / Chrome 150) for the phaseout that Google's own post does not state — it says only “We will follow Chrome and Android processes for phasing out these technologies”. Those milestone numbers are therefore not on the page. This is precisely the SEO-listicle failure mode the workflow warns about, and it produced a concrete, checkable falsehood |
support.mozilla.org ETP article | Fetch returned an error page, not content. Replaced with MDN's State Partitioning guide, which states the version explicitly |
| Any claim about UID2's operator, adoption or market share | The primary doc does not state an operator unambiguously and I found no primary source for adoption. The page therefore says only what the doc says and adds “No paper in this corpus measures their deployment”, which is a checkable statement about the corpus rather than about the market |
| DuckDuckGo Tracker Radar (fetched, license and content confirmed) | Verified but cut from the page: entity mapping is a topic in its own right and the page would have started duplicating privacy:requests. The page states the requirement (“say which entity list at which version”) without recommending one |
8. Judgement calls
- New page rather than broadening
privacy:cookies. See §1. The deciding argument: syncing's method literature (identifier heuristics, request chains, filter lists, graph ML) overlapsprivacy:requestsfar more than the cookie-purpose literature onprivacy:cookies. A reasonable person could instead have retitledprivacy:cookiesto “Cookies” and made this a section of it. - Which methods were called superseded. Five: fixed length windows as the identifier test, long-expiry as a necessary condition, two synchronised profiles, plaintext-only matching, and the “post-cookie era” framing. Each rests on a named, dated source that supersedes it, not on my reading of the trend: the length and randomness change on [1Calzavara, Stefano; Casarin, Samuele; Squarcina, Marco; Maffei, Matteo (2026): "From Syntactic Matching to Taint Tracking and Back: A Comparative Study of Web Tracking Detection Techniques", in: Proceedings on Privacy Enhancing Technologies. (Link)]'s own comparison table plus its hand-verified false-positive analysis; the expiry and two-profile changes on [2Randall, Audrey; Snyder, Peter; Ukani, Alisha; Snoeren, Alex C.; Voelker, Geoffrey M.; Savage, Stefan; Schulman, Aaron (2022): "Measuring UID smuggling in the wild", in: Proceedings of the ACM Internet Measurement Conference. (DOI)]'s stated reasons for dropping them; the plaintext point on [3Bashir, Muhammad Ahmad; Arshad, Sajjad; Robertson, William; Wilson, Christo (2016): "Tracing information flows between ad exchanges using retargeted ads", in: 25th USENIX Security Symposium (USENIX Security 16), pp. 481-496. (Link)] and [4Papadopoulos, Panagiotis; Kourtellis, Nicolas; Markatos, Evangelos P. (2019): "Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask", in: Proceedings of the ACM Web Conference. (DOI)]; the framing on Google's two announcements. No method was dated as superseded on corpus counts alone. That matters because the corpus counts would have supported a different and wrong story — the family table shows
syntacticas the largest family by a factor of three, running from 2014 to the most recent year in the corpus, which reads as “the state of the art” if you do not read the 2026 paper that measures its error rate. - The 2025–2026 slice is thin, and the page says so in the table itself rather than in a footnote. Three papers in 2026 mention syncing at all and none mention it five times, so no “current practice” claim on the page rests on a 2026 count. The one 2026 paper that carries weight ([1Calzavara, Stefano; Casarin, Samuele; Squarcina, Marco; Maffei, Matteo (2026): "From Syntactic Matching to Taint Tracking and Back: A Comparative Study of Web Tracking Detection Techniques", in: Proceedings on Privacy Enhancing Technologies. (Link)]) carries it on its content, not on its being recent.
- “PoPETs is where this literature lives” is a claim about ≥5-mention papers, where PoPETs has 9 of the 31. At the ≥1 level PoPETs still leads (28 of 106). It is stated as a venue signal, not as a quality judgement.
- Per-paper prevalence figures are quoted with their own denominators and never aggregated. The temptation was a single “syncing prevalence over time” chart. It would have been fabricated: the units are sites, users, chains, cookies, domain pairs and third parties, over populations from 50 to 850,000. The page instead opens the section with a unit table and says explicitly that none of the numbers can be averaged or plotted against each other.
detection[].prevalencewas used only as a pointer. Every figure it surfaced was re-read in the paper's own text before publication, because the field records the metric but not the denominator, and the denominator is where these numbers go wrong. Two examples of what that caught: [5Papadogiannakis, Emmanouil; Papadopoulos, Panagiotis; Kourtellis, Nicolas; Markatos, Evangelos P. (2021): "User Tracking in the Post-cookie Era: How Websites Bypass GDPR Consent to Track Users", in: Proceedings of the ACM Web Conference. (DOI)]'s 24.03% is of 27,180 sites with a CMP and no error in all three consent runs, not of the 850K Tranco list crawled or the 628,213 parsed; [4Papadopoulos, Panagiotis; Kourtellis, Nicolas; Markatos, Evangelos P. (2019): "Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask", in: Proceedings of the ACM Web Conference. (DOI)]'s 97% is of 850 real mobile users, not of any site population. Neither denominator is in the extraction.- Where the boundary of “measures identifier sharing” sits, and a correction made because it was inconsistent. The set was first drawn to exclude link-decoration papers on the grounds that link decoration is the successor phenomenon and belongs to
privacy:requests. But [6Munir, Shaoor; Lee, Patrick; Iqbal, Umar; Shafiq, Zubair; Siby, Sandra (2024): "PURL: Safe and Effective Sanitization of Link Decoration", in: 33rd USENIX Security Symposium (USENIX Security 24), pp. 4103-4120. USENIX Association, Philadelphia, PA. (Link)] (PURL) was in the set and [7Dao, Ha; Shinde, Abhishek; Athar, Sana; Gosain, Devashish (2026): "Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads", Proceedings on Privacy Enhancing Technologies 2026(2):92-107. (DOI)] (gclid in YouTube ads) was not, which is the same object — an identifier reaching a party that did not set it — judged two different ways. On re-reading the gclid paper's extraction (cross-party gclid leakage … 133 distinct third-party domains received gclid values) the exclusion was not defensible. MEAS went from 29 to 30 and every derived figure on the content page was re-computed, not patched: the family split, the crawl-configuration table and its denominator, the artifact and vantage counts, and the sentences that quote them. Both stale-number guards were re-run afterwards. The alternative — dropping PURL to keep the set at 28 — would have been consistent too, and would have lost the page its best link-decoration citation. - The Bashir et al. 31% figure is presented as a 2016 measurement, not as a current one. It is widely cited as if it were current; the content page says so and lists repeating it as the highest-value open question.
9. Review
Four reviewers, all told the same thing: that my context may not be exhaustive, and all handed the page text, both scripts and their unedited output, and these notes. The three focused ones ran in parallel; the generic one ran after their findings were acted on. All four were then re-run against the corrected pages.
Rows 1–15 predate the boundary correction in §8, so every count in them refers to the 29-paper set. They are left as the reviewers wrote them.
| # | Reviewer | Finding | Verdict |
|---|---|---|---|
| 1 | figures-vs-script (sonnet) | (All counts in this row are as they stood at review time, before the §8 boundary correction took MEAS to 30.) The Methods table said “29 papers … fall into six families” but its Papers column summed to 28. The script assigns 29 papers to seven families; the missing one is secondary — [8Iqbal, Umar; Englehardt, Steven; Shafiq, Zubair (2021): "Fingerprinting the Fingerprinters: Learning to Detect Browser Fingerprinting Behaviors", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)], which reuses [9Fouad, Imane; Bielova, Nataliia; Legout, Arnaud; Sarafijanovic-Djukic, Natasa (2020): "Missed by Filter Lists: Detecting Unknown Third-Party Trackers with Invisible Pixels", in: Proceedings on Privacy Enhancing Technologies, pp. 499-518. (DOI)]'s syncing list rather than detecting anything. The “Use in Publications” table further down already had all seven and summed to 29, so the page contradicted itself | Accepted. A seventh row was added and the sentence rewritten as “28 field their own detector, in six families; the 29th reuses another paper's labels”. The row also carries the paper's own result (17.28% of fingerprinting vendors sync), which the page did not have before |
| 2 | figures-vs-script | The provenance page documented one inert label-map entry; there are more, and for a different reason (below-threshold, not absent-from-corpus) | Accepted, and already in hand. A diagnostic was added to the report script that prints every label written for a paper outside CAND, and §2.3.1 lists all four with the reason for each. The script now makes this self-checking rather than a claim in prose |
| 3 | figures-vs-script | Re-ran the script: byte-identical to the committed output. Per-year and per-venue tables, 29/24/20, 15/12/4, 9-of-20, 18-and-12 vantage, 262-of-4,439, 98/93/97 stability, zero residue — all confirmed | No action |
| 4 | external-currency (sonnet) | Chrome's engineering channel publishes milestone numbers that Google's blog does not, and the reviewer reported that removal shipped in Chrome 152 on 2026-08-25 | Partly accepted, core claim rejected. The milestone point is right and is now on the page. The “already shipped” claim is not supported by the primary sources: chromestatus.com/api/v0/features/6552486106234880 gives removal milestone 153 with status “Proposed”, and privacysandbox.google.com/overview/status still lists Protected Audience, Topics, Attribution Reporting, Private Aggregation, Shared Storage and Related Website Sets as “Intent to deprecate and remove filed” (both fetched 2026-08-26). The reviewer's supporting citation was a trade-press article. The page says milestone 153, status Proposed, and calls the retirement a live process |
| 5 | external-currency | github.com/citp/OpenWPM 301-redirects to openwpm/OpenWPM (pushed 2026-08-25); github.com/purl-sanitizer/purl 301-redirects to shaoormunir/purl and the purl-sanitizer org is gone (last push 2024-08-22); purl.org/tracking-detection-paper resolves to github.com/eleumasc/Web-Tracking-Detection | Accepted. All three verified independently through the GitHub API and a curl -L. The artifact table now gives the current URLs, the last-push dates, and a note that the URLs printed in the papers redirect |
| 6 | external-currency | Prebid.js defaults, the Authorized Buyers guide, WebKit's three sentences, MDN's Firefox 103 line, the UID2 self-description and both Google posts all verify verbatim; the six other artifact repositories all resolve and none are archived | No action beyond recording the push dates in §7 |
| 7 | citations-and-quotes (sonnet) | The Englehardt et al. 2015 row of the heuristic table dropped a third clause — the cell is two printed lines, “Same across related visits. Same length across unrelated visits.” and “Unique across unrelated visits.” | Accepted. Re-derived independently from the PDF's word coordinates with PyMuPDF: the Additional-Checks cell for that row spans y=167 and y=177, straddling the row baseline at y=172. The text layer of both .cols and .norm makes this ambiguous, which is why the error survived the first pass. Row corrected |
| 8 | citations-and-quotes | The Calzavara “Our work” row was transcribed as tokenised = yes; the Parse column is blank for that row in the PDF | Accepted. Confirmed at the same word coordinates: the tick glyph sits at x≈218 and there is none on the “Our work” line. Changed to no, with a footnote that the paper's §3.3 nonetheless describes slicing, so the blank reads like an omission in the source table |
| 9 | citations-and-quotes | “27% for requests that only syntactic matching finds” is a point value where the paper gives 27%–30% | Accepted, and the range added to the quote check |
| 10 | citations-and-quotes | “misses 43% of what syntactic matching finds” uses the wrong denominator: 17,496 is 43% of the 40,605-request union, and 52% of syntactic matching's own 33,584 | Accepted. This is the most consequential finding of the review — a wrong-denominator error on a page whose first rule is to name the denominator. Both occurrences now give the union figure and the syntactic-only figure |
| 11 | citations-and-quotes | The intractable cookie denominator was described backwards: it is a cookie set where the banner was accepted, then sent by a different site before that site's banner was touched — not a cookie that survived a reject-all | Accepted. Verified against the paper's own definition and the definition is now quoted in the unit table and pinned in the quote check |
| 12 | citations-and-quotes | The 2025-10-17 Privacy Sandbox list kept one “(including …)” sub-clause and dropped the parallel one, so the “ten” framing was inconsistent | Accepted. The body now names three of the ten and the footnote carries Google's sentence verbatim |
| 13 | citations-and-quotes | Sánchez-Rola et al. Journey is dated 2022 in the table but 2021 in the bibliography and in the paper's own header | Accepted with a footnote rather than a change. The paper appeared at the 43rd IEEE S&P in May 2022 and the corpus files it under 2022; the PDF banner and the Xplore record say 2021. The table keeps 2022 and a footnote explains why the reference list shows a different year. The bibliography entry was not edited — other pages cite that key |
| 14 | citations-and-quotes | Calzavara's table says Papadopoulos used ≥ 10 where the original says > 10 | Accepted as a footnote. The discrepancy is the source table's, not this page's, and saying so is more useful than silently picking one |
| 15 | citations-and-quotes | All 27 citekeys resolve; no duplicate or colliding keys among anything this page cites; both scripts reproduce their committed output; every external footnote is a primary source | No action |
| 16 | generic (fable) | See §9.1 |
Two further defects were found by re-reading rather than by a reviewer, and are recorded because they are the same class:
- The paraphrase-as-quote problem, twice. “supporting measurement instances in a 'headless' container” and “2.7% of navigation paths” were both written as quotations and are both a word or two away from what the papers say. Caught by extending the quote check after the fact; see §4.2.
- A tuple-counting bug in my own helper, which briefly produced “100% live-crawl” from a 29-paper set. See §6.
9.1 Generic review
| # | Finding | Verdict |
|---|---|---|
| 16.1 | The intro box said syntactic matching “misses about 17% of the tracking requests that taint tracking sees”. 17% is the share of the two methods' union; of what taint tracking sees on its own it is about 30%. The page stated it correctly 80 lines later, so it contradicted itself | Accepted, and the most important finding of the whole review. It is a wrong-denominator error in the box whose own subject is denominators, and it is the mirror image of finding 10 above. Both sentences now give the union figure and the per-method figure |
| 16.2 | §4.2 of this page claimed “every literal figure the content page takes from a corpus paper” was checked, and named a count. At least fourteen paper-derived figures and quotes were not in the check | Accepted. All fourteen are pinned; the count went 61 → 80. The reviewer had verified every one by hand and all were correct, so no figure on the content page changed — but the claim was false and is the kind of overstatement this page exists not to make. §4.2 now says so explicitly |
| 16.3 | The syntactic-matching status cell put “16%–19% false positives, ~17% false negatives” side by side as if they shared a denominator | Accepted. Split, with the denominators named |
| 16.4 | “31% of the ad-exchange pairs” — the paper says partners, and observes that a pair can be detectable in one direction and not the other, which is exactly the distinction the page lectures about two sections later | Accepted, with the paper's own observation added as the reason the distinction matters |
| 16.5 | Three negatives were phrased as claims about the world where the evidence is a claim about seven venues: “nobody has repeated the ad-semantics check”, “the only published external ground truth”, “nobody has measured how large that inflation is” | Accepted, all three scoped |
| 16.6 | The methods-table box claimed the statuses “were checked against material outside the corpus as well”, which §7 substantiates for the superseded list and the browser landscape but not for the current labels | Accepted. The box now says which judgements rest on a named external source and which rest on argument about a provisional corpus |
| 16.7 | The by-year table invited a prevalence reading; this page says plainly that mention counts measure attention, and the content page did not | Accepted. The disclaimer moved onto the content page, next to the table, and the “2022 is the peak year” sentence now says peak of attention and calls the coincidence a coincidence |
| 16.8 | The sibling sweep in §1 records privacy:requests at zero matches, but that page now links here | Accepted. §1 records that start and privacy:requests were edited after the sweep, and that a re-run will differ |
| 16.9 | Minor: CONRAD never glossed; “six percentage points” is 5.6; the Khaleesi denominator cell is vaguer than every other row | All three accepted |
| 16.10 | Re-ran the quote check independently (byte-identical), verified about twelve unpinned figures by hand, reconciled every internal sum, checked all five cross-page anchors against live headings, and found the overlap with neighbouring pages correctly deferred | No action |
One thing this reviewer could not see. It reviewed the drafts as they stood before the boundary correction in §8, so its counts refer to a 29-paper set. Nothing in its findings depends on that count.
9.2 Second round
All four reviewers were re-run against the corrected pages. Three returned findings.
| # | Reviewer | Finding | Verdict |
|---|---|---|---|
| 17 | generic (fable) | The 29→30 correction left seven stale counts across both pages, in exactly the place §8 claims it did not: “sum to 29” for a column summing to 30, “the 83%” for a row now reading 80.0%, “three papers added by hand” where the script says four, “29 MEAS papers”, “Three were recovered by hand”, “2014→2025 with 14 papers” in a sentence whose own argument the correction had inverted, and “7 entries” against §11's eight | All seven accepted and fixed. This is the finding that matters most in the round, because it is the failure the previous round's fix was supposed to prevent. Two of the seven had passed the stale-number guard; §4.5 now records why and what the guard cannot do |
| 18 | generic | The intro claimed a stateless crawl or a cookie-blocking browser “will measure approximately zero” — contradicted by the page's own unit table, where a stateless crawl [5Papadogiannakis, Emmanouil; Papadopoulos, Panagiotis; Kourtellis, Nicolas; Markatos, Evangelos P. (2021): "User Tracking in the Post-cookie Era: How Websites Bypass GDPR Consent to Track Users", in: Proceedings of the ACM Web Conference. (DOI)] finds syncing on 24–29% of sites, and by [10Acar, Gunes; Eubank, Christian; Englehardt, Steven; Juarez, Marc; Narayanan, Arvind; Díaz, Claudia (2014): "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)]'s factor-of-two drop rather than a drop to zero | Accepted. Rewritten to say what is actually true: a Safari- or Firefox-default browser measures near-zero by construction; a stateless crawl measures first-contact syncing and misses the accumulated graph. More useful to the reader as well as more accurate |
| 19 | generic | The content page argued against adding late-found papers while the provenance page recorded one paper being added late, and never explained the difference | Accepted. The rule — a boundary inconsistency gets corrected, a late discovery gets named but not counted — was stated in §8 only; a clause now states it on the content page too |
| 20 | generic | The bibliography accounting did not reconcile: the .bib file, §1's count and §11's list disagreed, and three cited keys appeared to have reached the live bibliography by an unrecorded route | Half accepted. The count and the file were wrong and are fixed. The unrecorded-route claim is rejected: calzavara2026_syntactic, bahrami2025_cookieguard, dao2026_gclid and dimova2021cname were all present in the export taken before this run's first append, verified by grep against that export. The reviewer's evidence was a copy of the bibliography on disk dated 2026-08-19 — the exact trap of checking a local copy instead of a fresh ?do=export_raw. §11 now names them so the next reader does not re-raise it |
| 21 | generic | The review log's time base was stated in one row rather than in the preamble, so row 3's “all confirmed” reads as current | Accepted, moved to the §9 preamble |
| 22 | generic | The artifact table lists 8 rows against a claim of 13 public artifacts, with no inclusion rule, and omits the gclid paper's dataset | Accepted. The dataset row is added and the gap is explained |
| 23 | generic | The Chrome-roadmap passage drifts toward a news ticker and could be halved | Rejected. Every clause is sourced to a primary page, the milestone is the one fact a reader cannot get from Google's blog, and the passage exists because the previous round's reviewer asserted a removal date that turned out to be wrong. Length is the cost of not repeating that |
| 24 | citations-and-quotes (sonnet) | §1 says 7 bibliography entries, §11 says eight | Accepted, same fix as 20. This reviewer reached the opposite and correct conclusion about the pre-existing keys, having checked the live export |
| 25 | citations-and-quotes | Independently verified the gclid figures and both of its denominators, the bekos2023_hitchhiker and dimova2021cname figures, the union/per-method arithmetic, Bashir's “partners” wording and the direction parenthetical, and re-ran all three scripts byte-identically. Confirms §4.2's coverage claim is now true | No action |
| 26 | figures-vs-script (sonnet) | Independently found the same stale counts as row 17, plus two the generic reviewer did not: the whole-page count in §4.5 had drifted from 42 to 48, and the shared check_page_numbers.mjs had started failing over the Use in Publications window on a bare 24 where the report prints 24.0% — while §4.5 still narrated it as passing | Accepted. The prose percentages now match the table's own formatting, both guards pass, and §4.5 records the failure rather than the claim |
| 27 | figures-vs-script | Explained precisely why the stale 83% survived both guards: 83 occurs in the report as 83.3% and as 75–83% accuracy, so even word-boundary matching finds it. Neither guard can distinguish “this digit-string exists” from “this quantity exists” | Accepted and recorded in §4.5, in the reviewer's own terms. This is the most useful thing either round produced about the tooling, as opposed to about the page |
| 28 | figures-vs-script | Confirmed both scripts byte-identical to their committed output, every 30/25-denominator table correct, the dead-label diagnostic self-consistent at 3, and every DERIVED entry arithmetically correct | No action |
10. What could not be established
- How many syncing papers the regex missed. There is no ground-truth list of papers that measure identifier sharing. Four were added by hand — three for under-recall, one to correct the boundary — and the true recall of the population is unknown, which is why the page says “at least 106”.
- Whether syncing prevalence has risen or fallen. No two papers in the corpus measure the same unit over the same population, so no trend can be computed from them, and the per-year mention counts measure attention, not prevalence. Listed as the second open question.
- The size of the seed-profile self-sync artefact predicted by [11Englehardt, Steven; Narayanan, Arvind (2016): "Online Tracking: A 1-million-site Measurement and Analysis", in: Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security, pp. 1388–1401. Association for Computing Machinery, New York, NY, USA. (DOI) (Link)] in 2016. Still unmeasured; also open on
programming:stateful_stateless. - Deployment of deterministic-ID frameworks. No corpus paper measures UID2, EUID or their competitors, and I found no primary measurement outside the corpus that I could verify. The page states the gap and does not guess at it.
- Two papers that meet the boundary and are not in the set. [12Bekos, Paschalis; Papadopoulos, Panagiotis; Markatos, Evangelos P.; Kourtellis, Nicolas (2023): "The Hitchhiker's Guide to Facebook Web Tracking with Invisible Pixels and Click IDs", in: Proceedings of the ACM Web Conference. (DOI)] (TheWebConf 2023) measures a median website passing identifiers to 6.2 third parties; [13Dimova, Yana; Acar, Gunes; Olejnik, Lukasz; Joosen, Wouter; Van Goethem, Tom (2021): "The CNAME of the game: Large-scale analysis of DNS-based tracking evasion", Proceedings on Privacy Enhancing Technologies 2021:394–412. (DOI) (Link)] (PoPETs 2021) finds 1,899 cookie leaks in request URLs on 1,295 distinct sites. Both were found by a late sweep for detection tuples using identifier-flow language without the word “sync”, after the set had been fixed and every figure derived from it. They are named on the content page rather than added, because adding papers as one stumbles on them is how a hand-curated set stops being reproducible — and because two papers change no table's shape. The same sweep is the reason to believe the recall problem is real rather than hypothetical: it found two in one pass and was not exhaustive.
- Whether the nine “not-syncing” exclusions would survive another reader. Four of them (in-vehicle networks, COPPA, Apple logging, analytics dashboards) plus the Meta server-side paper are extraction-only matches with no full-text occurrence of any syncing wording, which is a strong exclusion. The other four rest on reading the passage — and one of those, the privacy-vs-compatibility paper, is arguable, because it does measure a cross-site identifier flow, just not a cross-vendor one.
- A pre-existing bibliography defect, not fixed.
literature:bibliographycontains two papers twice under different keys —fouad2022my/fouad2022_cookie(DOI10.56553/popets-2022-0063) andbottger2025_regional/boettger2025_regional(DOI10.56553/popets-2025-0063). Found by a DOI scan run before appending this page's entries. Not touched, because other pages may cite either key and deduplicating is a site-wide edit with its own review. Recorded here so the next run does not have to rediscover it.
11. Bibliography additions
Eight entries appended before the closing </bibtex>, after scanning the fresh export for both key collisions and DOI collisions:
| Key | Paper | Source of the metadata |
|---|---|---|
papadopoulos2019_csync | Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask, TheWebConf 2019 | bibgen.mjs, OpenAlex-by-DOI |
randall2022_uidsmuggling | Measuring UID smuggling in the wild, IMC 2022 | bibgen.mjs, OpenAlex-by-DOI |
papadopoulos2018_cost | The Cost of Digital Advertisement, TheWebConf 2018 | bibgen.mjs, OpenAlex-by-DOI |
vallina2019_porn | Tales from the Porn, IMC 2019 | bibgen.mjs, OpenAlex-by-DOI |
ditizio2021_calculus | A Calculus of Tracking, PoPETs 2021 | bibgen.mjs + authors fetched from the PoPETs landing page (PETS records carry no authors in the index) and cross-checked against Crossref |
cook2020_headerbidding | Inferring Tracker-Advertiser Relationships …, PoPETs 2020 | Same |
oh2022_cartology | Cart-ology, CCS 2022 | bibgen.mjs, OpenAlex-by-DOI |
bekos2023_hitchhiker | The Hitchhiker's Guide to Facebook Web Tracking, TheWebConf 2023 | bibgen.mjs, OpenAlex-by-DOI. Added during review, for the near-miss named in §10 |
Two entries were generated and then discarded as duplicates of papers already present under other keys: Roesner et al. 2012 (already roesner2012_detecting) and Sánchez-Rola et al. 2019 (already sanchezrola2019can, DOI 10.1145/3321705.3329806). The page cites the existing keys.
The other 24 keys the two pages cite were already in the bibliography and were not touched. Four of them are worth naming because a reviewer flagged them as possibly added without a record: calzavara2026_syntactic, bahrami2025_cookieguard, dao2026_gclid and dimova2021cname were all present in the export taken before this run's first append, and the reviewer's contrary evidence turned out to be a local copy of the bibliography from 2026-08-19. Check against a fresh ?do=export_raw, never against a copy on disk.
12. Cross-links
- Content page: cookie_syncing
- Corpus-level provenance: corpus
- Shared bibliography: bibliography
References
- [1]
- Calzavara, Stefano; Casarin, Samuele; Squarcina, Marco; Maffei, Matteo (2026): "From Syntactic Matching to Taint Tracking and Back: A Comparative Study of Web Tracking Detection Techniques", in: Proceedings on Privacy Enhancing Technologies. (Link)
- [2]
- Randall, Audrey; Snyder, Peter; Ukani, Alisha; Snoeren, Alex C.; Voelker, Geoffrey M.; Savage, Stefan; Schulman, Aaron (2022): "Measuring UID smuggling in the wild", in: Proceedings of the ACM Internet Measurement Conference. (DOI)
- [3]
- Bashir, Muhammad Ahmad; Arshad, Sajjad; Robertson, William; Wilson, Christo (2016): "Tracing information flows between ad exchanges using retargeted ads", in: 25th USENIX Security Symposium (USENIX Security 16), pp. 481-496. (Link)
- [4]
- Papadopoulos, Panagiotis; Kourtellis, Nicolas; Markatos, Evangelos P. (2019): "Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask", in: Proceedings of the ACM Web Conference. (DOI)
- [5]
- Papadogiannakis, Emmanouil; Papadopoulos, Panagiotis; Kourtellis, Nicolas; Markatos, Evangelos P. (2021): "User Tracking in the Post-cookie Era: How Websites Bypass GDPR Consent to Track Users", in: Proceedings of the ACM Web Conference. (DOI)
- [6]
- Munir, Shaoor; Lee, Patrick; Iqbal, Umar; Shafiq, Zubair; Siby, Sandra (2024): "PURL: Safe and Effective Sanitization of Link Decoration", in: 33rd USENIX Security Symposium (USENIX Security 24), pp. 4103-4120. USENIX Association, Philadelphia, PA. (Link)
- [7]
- Dao, Ha; Shinde, Abhishek; Athar, Sana; Gosain, Devashish (2026): "Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads", Proceedings on Privacy Enhancing Technologies 2026(2):92-107. (DOI)
- [8]
- Iqbal, Umar; Englehardt, Steven; Shafiq, Zubair (2021): "Fingerprinting the Fingerprinters: Learning to Detect Browser Fingerprinting Behaviors", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)
- [9]
- Fouad, Imane; Bielova, Nataliia; Legout, Arnaud; Sarafijanovic-Djukic, Natasa (2020): "Missed by Filter Lists: Detecting Unknown Third-Party Trackers with Invisible Pixels", in: Proceedings on Privacy Enhancing Technologies, pp. 499-518. (DOI)
- [10]
- Acar, Gunes; Eubank, Christian; Englehardt, Steven; Juarez, Marc; Narayanan, Arvind; Díaz, Claudia (2014): "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)
- [11]
- Englehardt, Steven; Narayanan, Arvind (2016): "Online Tracking: A 1-million-site Measurement and Analysis", in: Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security, pp. 1388–1401. Association for Computing Machinery, New York, NY, USA. (DOI) (Link)
- [12]
- Bekos, Paschalis; Papadopoulos, Panagiotis; Markatos, Evangelos P.; Kourtellis, Nicolas (2023): "The Hitchhiker's Guide to Facebook Web Tracking with Invisible Pixels and Click IDs", in: Proceedings of the ACM Web Conference. (DOI)
- [13]
- Dimova, Yana; Acar, Gunes; Olejnik, Lukasz; Joosen, Wouter; Van Goethem, Tom (2021): "The CNAME of the game: Large-scale analysis of DNS-based tracking evasion", Proceedings on Privacy Enhancing Technologies 2021:394–412. (DOI) (Link)
