User Tools

Site Tools


provenance:privacy:browser_protection

Provenance: privacy:browser_protection

Working log behind Measuring with Browser Tracking Protections On. Corpus-wide caveats: corpus. No bibliography keys beyond the four this sitting appended to the shared bibliography (§8). No ~~DISCUSSION~~: comments belong on the content page, following the convention set by the earlier provenance: pages.

Run: 2026-09-01. Item privacy:browser_protection (new). Creating, not extending: no page with this id existed, and neither privacy:browser_extensions nor any other page covered browser-shipped protections as a treatment. contributing uses “Browser protection” as its worked example of a page that does not exist yet; it now does.

1. What this page is backing, and what it is not

The item asked for Firefox ETP, Safari ITP, Brave Shields and Edge Tracking Prevention as a treatment — paired crawls with the protection on versus off. The page keeps that scope and pushes three neighbours away explicitly:

Boundary Where it goes instead
the filter list as an instrument, and its ground-truth circularity filter_lists
what you do with the requests once collected requests, fingerprinting
privacy of extensions (what an extension leaks) not written; distinct topic, not created here
extension-side blockers as arms (uBlock, AdGuard, MV3) covered on the page only as an adjacent verdict class, pointing at filter_lists

Overlap check. privacy_sandbox carries the Chrome half of “the browser is a variable”; this page cross-links to it rather than restating it. browser_storage owns partitioning as a storage question; this page owns it as an arm. stateful_stateless owns statefulness; this page names it as a thing to hold constant. No figure is duplicated across those pages.

2. Populations and denominators

Every figure on the content page comes from one of these. Nothing is a share of “all 5,859 papers”.

# Query Population N Result
Q1 corpus size, structured extraction 5,859 papers, 7 venues, 2010–2026
Q2 corpus size, rendered full text (paper.cols.txt) 5,869
Q3 ran a crawl: crawlConfig != null OR studyTypes has automated-web-crawl all 5,859 1,120
Q4 Q3 AND platforms has web crawled 1,120 857
Q5 names >=1 of six browser-shipped protections (full-text sweep) full text 5,869 121 (2.1%)
Q6 per-mechanism paper counts full text 5,869 Brave Shields 78, Safari ITP 41, Firefox ETP 27, Total Cookie Protection 17, bounce-tracking 12, Chrome Tracking Protection 1, Edge Tracking Prevention 0
Q7 per-year counts of Q5 full text per year table on the page; 2010–2016 all zero
Q8 crawled AND Q5 crawled 1,120 84 (7.5%)
Q9 web-crawled AND Q5 webCrawled 857 84 (9.8%)
Q10 web crawls 2019–2022 naming a protection webCrawled 2019–2022 266 43 (16.2%)
Q11 web crawls 2023–2026 naming a protection webCrawled 2023–2026 332 37 (11.1%)
Q12 web crawls 2024–2026 naming a protection webCrawled 2024–2026 235 24 (10.2%)
Q13 states >=1 browser in crawlConfig.browsers crawled 1,120 529 (47.2%)
Q14 folded browser families, paper-counted stating a browser 529 table on the page; Chrome 217, Firefox 154, Chromium 101, Tor Browser 37, Edge 15, Safari 11, Brave 10, DuckDuckGo 2, Firefox Focus 1
Q15 >=2 distinct real browser families stating a browser 529 80 (15.1%); also 7.1% of all 1,120 crawling
Q16 >=3 distinct real browser families stating a browser 529 25 (4.7%)
Q17 any used/produced tool of category browser all 5,859 747 papers
Q18 of Q17, >=1 such tool carries a version string Q17 747 276 (36.9%)
Q19 Q18 restricted to the crawling population crawled ∩ Q17 465 170 (36.6%)
Q20 hand audit of the Q8 candidate pool Q8 84 15 in, 3 in-baseline, 1 in-instrument, 2 spoof, 1 control-only, 4 adjacent, 58 out-background
Q21 distinct papers naming Chrome or Chromium stating a browser 529 304 (57.5%)
Q22 distinct papers naming a privacy-branded browser (Tor Browser, Brave, DuckDuckGo, Firefox Focus, LibreWolf/Mullvad) stating a browser 529 46 (8.7%), of which Tor Browser 37
Q23 Q21 and not Q22 stating a browser 529 291 (55.0%)
Q24 papers citing Microsoft's Edge tracking-prevention documentation (scripts/bp_edge_cite.mjs) full text 5,869 5
Q25 papers naming Storage.runBounceTrackingMitigations or Storage.getRelatedWebsiteSets (scripts/bp_cdp_sweep.mjs) full text 5,869 0
Q26 of the 26 audited papers, how many use an LLM as a method (scripts/bp_llm_headless.mjs) audited 26 0 (2 match the regex, both acknowledgements thanking ChatGPT for copy-editing)
Q27 of the 26, how many vary headless versus headful as an arm (same script) audited 26 0 (3 match, all choosing headful deliberately and saying why)

Q8 and Q9 share their numerator, and the report asserts it. All 84 papers in the Q8 candidate pool also carry platforms containing web, so 7.5%-of-1,120 and 9.8%-of-857 are the same 84 papers against two legitimate denominators. That looks like a copy-paste error and is not one, so bp_report.mjs computes the set difference and prints it; it is empty.

Distinct-paper roll-ups, added after a self-check. A first draft said “60.1% of the stating papers drove Chrome or Chromium”, computed as (217 + 101) / 529 from the family table. That is a sum of multi-valued rows and double-counts any paper naming both Chrome and Chromium. The report now computes the roll-ups directly and the page carries those instead: Chrome or Chromium, 304 of 529 (57.5%); a privacy-branded browser (Tor Browser, Brave, DuckDuckGo, Firefox Focus, LibreWolf/Mullvad), 46 of 529 (8.7%); Chrome or Chromium and no privacy-branded browser, 291 (55.0%). Firefox, Safari and Edge are deliberately outside “privacy-branded”: they are mainstream browsers that acquired a default protection on a datable year (2019, 2017, 2019), and folding them in would make a sixteen-year count read as if the protection had always been there. A first draft of the same sentence also said “the entire protective-browser column is 60 papers”, which was an unlabelled partial sum (Tor 37 + Safari 11 + Brave 10 + DuckDuckGo 2) that silently omitted Edge and Firefox. Both were wrong before publication of the final revision; recorded because a summed multi-valued column is the easiest error on this page to make and the hardest to see.

2.1 The full-text sweep, and why it is case-sensitive

The mechanism regexes are in scripts/bp_report.mjs. Two rules, both learned the hard way elsewhere on this wiki:

  • Whitespace is collapsed before matching. A PDF line break inside “Enhanced Tracking\nProtection” silently undercounts otherwise.
  • Acronyms with ordinary-English homographs are matched case-sensitively. /\bETP\b/ and /\bITP\b/ are case-sensitive; the descriptive phrases (tracking protection, content blocking) are not. A case-insensitive /\bitp\b/i picks up nothing extra here, but the general failure mode — a hyphen satisfying \b — is why the rule is applied.

The regexes, exactly as run:

Firefox ETP                  /Enhanced\s+Tracking\s+Protection|\bETP\b/
Firefox Total Cookie Prot.   /Total\s+Cookie\s+Protection|\bdFPI\b|dynamic\s+first[-\s]party\s+isolation/
Safari ITP                   /Intelligent\s+Tracking\s+Prevention|\bITP\b/
Brave Shields                /Brave(?:['’]s)?\s+(?:Shields|shields|browser|Browser|ad[-\s]?block)|\bShields\s*(?:up|down|enabled|disabled)\b/
Edge Tracking Prevention     /(?:Microsoft\s+)?Edge(?:['’]s)?\s+[Tt]racking\s+[Pp]revention|tracking\s+prevention\s+(?:feature\s+)?(?:in|of)\s+(?:Microsoft\s+)?Edge/
Chrome Tracking Protection   /Chrome(?:['’]s)?\s+Tracking\s+Protection|Tracking\s+Protection\s+in\s+Chrome/
bounce-tracking mitigation   /bounce[-\s]tracking(?:\s+(?:protection|mitigation))?/i

2.2 The Edge zero is not a probe artefact

“Nobody has measured Edge” is the strongest negative claim on the page, and a narrow regex must never be the source of a “nobody”. So it was widened twice.

  1. The first widening, scripts/bp_edge_check.mjs, allowed up to 120 characters between “Edge” and a protection word, in either order, case-insensitively. It matched 176 papers and was almost entirely noise: graph edges, basic blocks, “knowl-edge” hyphenated across a line. Unusable, and recorded here because it is exactly the widening a reader would ask for.
  2. The second, scripts/bp_edge_check2.mjs, searched the corpus case-sensitively for the exact product name Tracking Prevention, excluding occurrences preceded by Intelligent, and printed every window. It found 18 papers, 20 occurrences. All 20 were read. Seventeen are reference-list entries pointing at WebKit's tracking-prevention policy page or Microsoft's Edge documentation. Three are body occurrences, and none of the three is about Edge: XSinator (CCS 2021), which calls Firefox's ETP “Enhanced Tracking Prevention” while noting that Edge's mechanism relies on blocklists; PURL (USENIX Security 2024), which makes the same slip about Firefox's ETP Strict; and a 2020 CCS survey whose Table 3 uses “Tracking Prevention” as a coding-category label.
  3. A third sweep, scripts/bp_edge_cite.mjs, counts papers citing Microsoft's own Edge tracking-prevention documentation — the learn.microsoft.com page, the 2019 msedgedev announcement, or a reference titled “Tracking Prevention in Microsoft Edge”. 5 papers, all citing it in passing while measuring something else.

Corrected in review — see §15.2. The paragraph above originally read “Sixteen are reference-list entries” and named Double-Edged Shield (USENIX 2025) as one of two substantive body mentions. Double-Edged Shield is not among the 18 at all: its Edge sentence is nowhere near the literal string “Tracking Prevention”, and it only ever surfaced in the first, rejected 176-paper widening that this same section calls unusable. Sixteen plus two also does not make twenty. The headline zero was never in doubt; the evidence behind it was wrong, and it was wrong in the specific way of citing data the log itself had discarded.

So the claim on the page is stated as named as a mechanism by zero papers, backed by cited by five and measured by none, not as a bare regex zero.

3. The hand audit: inclusion rule and all 84 candidates

The rule was written before the table, and is reproduced verbatim on the content page. The candidate pool is Q8 (84 papers). scripts/bp_audit_sheet.mjs printed every candidate's protection mentions as ±320-character windows into out_bp_audit_sheet.md (134 KB); all 84 were read at window level. The 26 that were not obviously background were then read in their methodology and evaluation sections; those 26 verdicts are in scripts/bp_audit.json and printed in §5 below. The remaining 58 are listed in §5 by title.

A triage aid that must not be mistaken for the rule. scripts/bp_audit_assist.mjs ordered the 84 by whether a protection mention sits within 400 characters of first-person methodology language. Only 19 of 84 scored above zero — and the zero bucket contains OmniCrawl, Who Left Open the Cookie Jar, Navigating Murky Waters, Bridges to Self and Browsing without Third-Party Cookies, all of which are in. The assist is a reading order. Using it as a filter would have thrown away a third of the result set, and it is recorded here so nobody later mistakes its output for a finding.

3.1 Dating the designs, and two probed absences

The page's “Which of these designs is current” table buckets the 26 audited papers by period: 7 from 2017–2021, 8 from 2022–2023, 11 from 2024–2026. The status column is a judgement (§12), not a count; the dates are not.

Two claims in that section are of the “nobody does X” kind, which must never come from recall or from a single narrow regex. Both are probes over all 26 audited papers, both print their hits, and both are committed as scripts/bp_llm_headless.mjs with the output in scripts/bp_llm_headless-output.txt:

  • No LLM as a method. Case-sensitive /\b(?:LLM|large language model|GPT-?\d|ChatGPT|Llama|Gemini)\b/. prompt and BERT are deliberately excluded: the first fires on ordinary prose, the second on pre-LLM classifiers, and including either would have produced a false positive rather than a false negative — the safer error in the other direction. 2 of 26 match, both acknowledgements sections thanking ChatGPT for copy-editing. Both are printed in the output.
  • No headless-versus-headful arm. /headful|non-headless|headed mode|headless\s+(?:and|vs\.?|versus)\s+head/i. 3 of 26 match, and reading all three shows each chose headful and said why (bot detection); none varies it. The page says exactly that rather than the bare zero, and quotes all three.

A wider first pass over the same 26 used /\b(?:LLM|...|BERT|prompt(?:ing|ed)?)\b/i and matched 11 papers, all of them on BERT or on the ordinary word “prompt”. That number is in this log rather than on the page because it measures the regex, not the literature.

4. Running it

cd /workspace/artifacts/wiki
node scripts/bp_report.mjs      > scripts/bp_report-output.txt      # every figure, with denominators
node scripts/bp_quotecheck.mjs  > scripts/bp_quotecheck-output.txt  # every paper quote vs paper.cols.txt
PLAYWRIGHT_BROWSERS_PATH=/workspace/.playwright \
  node sandbox/bp_arms_probe.mjs > scripts/bp_arms_probe-output.txt # the Chromium arm probe
node scripts/bp_edge_check2.mjs                                     # the Edge zero, printed in full
node scripts/bp_audit_sheet.mjs                                     # rebuild the 84-candidate worksheet
node scripts/bp_llm_headless.mjs > scripts/bp_llm_headless-output.txt  # the two probed absences
node scripts/bp_edge_cite.mjs                                       # papers citing Microsoft's Edge docs
node scripts/bp_cdp_sweep.mjs                                       # papers naming the two CDP commands
node scripts/check_wrap.mjs pages/privacy_browser_protection.txt

bp_report.mjs reads /workspace/publications_dataset/data directly. browser_fold.mjs is imported by the report; bp_audit.json holds the hand verdicts and is the only non-derived input.

5. Unedited report output

bp_report-output.txt
corpus (extraction): 5859 papers, 7 venues, 2010-2026
population 'crawled'      (crawlConfig != null OR studyTypes has automated-web-crawl): 1120
population 'webCrawled'   (crawled AND platforms has web):                             857
 
===== 1. Full-text sweep: who names a browser-shipped protection =====
papers with rendered full text: 5869
 
  mechanism                              papers   share of 5869
  Firefox ETP                               27   0.5%
  Firefox Total Cookie Protection           17   0.3%
  Safari ITP                                41   0.7%
  Brave Shields                             78   1.3%
  Edge Tracking Prevention                   0   0.0%
  Chrome Tracking Protection                 1   0.0%
  bounce-tracking mitigation                12   0.2%
  Tor Browser                              129   2.2%
  DuckDuckGo browser                         4   0.1%
  Firefox Focus                             10   0.2%
  private browsing / Incognito             197   3.4%
  the phrase "tracking protection"         108   1.8%
  the phrase "tracking prevention"          63   1.1%
  the phrase "content blocking"             57   1.0%
 
  extension-side blocker (kept separate)
  uBlock Origin                             75   1.3%
  Ghostery                                 110   1.9%
  Privacy Badger                            63   1.1%
  Adblock Plus                             124   2.1%
  AdGuard                                   71   1.2%
  NoScript                                  40   0.7%
 
  ANY of the six named browser-shipped protections: 121   2.1%
 
===== 1b. By year (2026 and 2025 are provisional venue-years) =====
  year   full text   any named protection   Brave Shields   Safari ITP   Firefox ETP
  2010         118                      0               0            0             0
  2011         116                      0               0            0             0
  2012         151                      0               0            0             0
  2013         125                      0               0            0             0
  2014         165                      0               0            0             0
  2015         190                      0               0            0             0
  2016         182                      0               0            0             0
  2017         232                      1               1            1             0
  2018         254                      6               4            2             0
  2019         402                      7               4            3             0
  2020         402                     16               9            8             3
  2021         380                     17              11            8             4
  2022         546                     21              15            7             7
  2023         720                     17              11            6             3
  2024         701                     14               9            2             4
  2025         770                     16               8            3             4
  2026         415                      6               6            1             2
 
===== 2. Which browser did the crawl drive? (population: crawled, N=1120) =====
  states at least one browser: 529   47.2% of 1120
  states NO browser:           591   52.8% of 1120
 
  folded family                                    papers   share of 529 stating
  Chrome                                             217   41.0%
  Firefox                                            154   29.1%
  Chromium                                           101   19.1%
  automation library named instead of a browser       45   8.5%
  Tor Browser                                         37   7.0%
  headless engine (PhantomJS / HtmlUnit / WebKit port)    29   5.5%
  Internet Explorer                                   16   3.0%
  Edge                                                15   2.8%
  Safari                                              11   2.1%
  Opera                                               10   1.9%
  Brave                                               10   1.9%
  HTTP client, not a browser                           2   0.4%
  DuckDuckGo                                           2   0.4%
  Yandex                                               2   0.4%
  Whale                                                2   0.4%
  CocCoc                                               2   0.4%
  WebView                                              2   0.4%
  Firefox Focus                                        1   0.2%
 
  UNMAPPED RESIDUE of the browser fold (42 distinct strings, printed in full):
      4  headless browser
      2  browser instances
      1  real Web browser
      1  custom lightweight web browser
      1  graphical web browser
      1  regular browser
      1  mobile web browser
      1  scriptable browser instances
      1  Android browser
      1  Android phone
      1  non-headless web browser
      1  Android smartphone
      1  Nexus tablet
      1  Apple iPhone6
      1  iPad2
      1  WhatsApp Web client
      1  Telegram Web client
      1  PageGraph-instrumented browser
      1  default browser
      1  Spartacus browser
      1  automated web browser library
      1  Ghostery
      1  mobile-emulated browser
      1  Vivaldi
      1  Samsung
      1  Dolphin
      1  Mint
      1  Kiwi
      1  QQ
      1  UC International
      1  headless Python crawler
      1  Tor
      1  WeChat Windows client
      1  UC
      1  360
      1  QQ browser
      1  Instabridge
      1  Xunlei
      1  local browser
      1  default Android browser
      1  Foxhound
      1  basic HTTP fetcher
 
  papers naming >= 2 distinct real browser families: 80   15.1% of 529 stating,   7.1% of 1120 crawling
 
  DISTINCT PAPERS (not a sum of family rows):
    name Chrome or Chromium:                       304   57.5% of 529 stating
    name a privacy-branded browser                 46   8.7% of 529 stating
      (Tor Browser, Brave, DuckDuckGo, Firefox Focus, LibreWolf/Mullvad)
    Chrome/Chromium and no privacy-branded browser 291   55.0% of 529 stating
    name Brave, DuckDuckGo, Firefox Focus or LibreWolf (i.e. not Tor): 10
      2020 IMC      Hiding in Plain Site: Detecting JavaScript Obfuscation through Concealed Browser API Usage.
          Chromium, Brave
      2020 NDSS     Deceptive Previews: A Study of the Link Preview Trustworthiness in Social Platforms
          Firefox, Chrome, Brave
      2021 PETS     Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting
          Chrome, Brave
      2022 PETS     How Can and Would People Protect From Online Tracking?
          Chrome, Firefox, Brave
      2022 PETS     OmniCrawl: Comprehensive Measurement of Web Tracking With Real Desktop and Mobile Browsers
          Chrome, Firefox, Brave, Tor Browser, Firefox Focus, DuckDuckGo
      2022 WWW      Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking.
          Chromium, Brave
      2023 IMC      Not only E.T. Phones Home: Analysing the Native User Tracking of Mobile Browsers.
          Chrome, Edge, Opera, Yandex, Brave, DuckDuckGo, Whale, CocCoc
      2023 NDSS     Navigating Murky Waters: Automated Browser Feature Testing for Uncovering Tracking Vectors
          Brave, Chrome, Edge, Firefox, Safari, Opera
      2025 CCS      Lock the Door But Keep the Window Open: Extracting App-Protected Accessibility Information from Browser-Rendered Websites.
          Chrome, Firefox, Brave, Edge
      2025 PETS     Beyond the Request: Harnessing HTTP Response Headers for Cross-Browser Web Tracker Detection in an Imbalanced Setting
          Chrome, Brave, Firefox
  papers naming >= 3 distinct real browser families: 25   4.7% of 529 stating
 
  the >=3-family papers (this is where a cross-browser design actually lives):
    2025 CCS — Lock the Door But Keep the Window Open: Extracting App-Protected Accessibility Information from Browser-Rendered Websites.
        Chrome, Firefox, Brave, Edge
    2014 IEEE-SP — Stealing Webpages Rendered on Your Browser by Exploiting GPU Vulnerabilities.
        Chromium, Firefox, headless engine (PhantomJS / HtmlUnit / WebKit port)
    2015 IEEE-SP — Ad Injection at Scale: Assessing Deceptive Advertisement Modifications.
        Chrome, Firefox, Internet Explorer
    2018 IEEE-SP — Surveylance: Automatically Detecting Online Survey Scams.
        Chrome, Firefox, Internet Explorer
    2019 IEEE-SP — PhishFarm: A Scalable Framework for Measuring the Effectiveness of Evasion Techniques against Browser Phishing Blacklists.
        Chrome, Safari, Firefox, Opera, Edge, Internet Explorer
    2023 IEEE-SP — The Leaky Web: Automated Discovery of Cross-Site Information Leaks in Browsers and the Web.
        Chromium, Firefox, headless engine (PhantomJS / HtmlUnit / WebKit port)
    2019 IMC — What You See is NOT What You Get: Discovering and Tracking Social Engineering Attack Campaigns.
        Chromium, Chrome, Internet Explorer, Edge
    2023 IMC — Not only E.T. Phones Home: Analysing the Native User Tracking of Mobile Browsers.
        Chrome, Edge, Opera, Yandex, Brave, DuckDuckGo, Whale, CocCoc
    2020 NDSS — Cross-Origin State Inference (COSI) Attacks: Leaking Web Site States through XS-Leaks
        Chrome, Firefox, Edge
    2020 NDSS — Deceptive Previews: A Study of the Link Preview Trustworthiness in Social Platforms
        Firefox, Chrome, Brave
    2023 NDSS — Navigating Murky Waters: Automated Browser Feature Testing for Uncovering Tracking Vectors
        Brave, Chrome, Edge, Firefox, Safari, Opera
    2025 NDSS — Cross-Origin Web Attacks via HTTP/2 Server Push and Signed HTTP Exchange
        Chrome, Safari, Edge, Firefox, Opera, Internet Explorer, Yandex, CocCoc, Whale
    2019 PETS — 4 Years of EU Cookie Law: Results and Lessons Learned
        Chrome, Internet Explorer, Firefox
    2022 PETS — How Can and Would People Protect From Online Tracking?
        Chrome, Firefox, Brave
    2022 PETS — OmniCrawl: Comprehensive Measurement of Web Tracking With Real Desktop and Mobile Browsers
        Chrome, Firefox, Brave, Tor Browser, Firefox Focus, DuckDuckGo
    2025 PETS — Beyond the Request: Harnessing HTTP Response Headers for Cross-Browser Web Tracker Detection in an Imbalanced Setting
        Chrome, Brave, Firefox
    2026 PETS — Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads
        Chrome, Firefox, Edge
    2020 USENIX — PhishTime: Continuous Longitudinal Measurement of the Effectiveness of Anti-phishing Blacklists
        Chrome, Safari, Firefox, Internet Explorer, Edge, Opera
    2021 USENIX — PhishPrint: Evading Phishing Detection Crawlers by Prior Profiling
        Chrome, Internet Explorer, Opera
    2022 USENIX — The Security Lottery: Measuring Client-Side Web Security Inconsistencies
        Chrome, Firefox, Edge, Opera, Safari
    2023 USENIX — A Study of Multi-Factor and Risk-Based Authentication Availability
        Chrome, Firefox, Safari
    2025 USENIX — DNS FLaRE: A Flush-Reload Attack on DNS Forwarders
        Chrome, Edge, Opera, Chromium, Firefox
    2013 WWW — Two years of short URLs internet measurement: security threats and countermeasures.
        Chrome, Firefox, Opera, automation library named instead of a browser
    2020 WWW — Apophanies or Epiphanies? How Crawlers Impact Our Understanding of the Web.
        Firefox, Chromium, Tor Browser, headless engine (PhantomJS / HtmlUnit / WebKit port)
    2023 WWW — Efficient and Low Overhead Website Fingerprinting Attacks and Defenses based on TCP/IP Traffic.
        Edge, Chrome, Firefox
 
===== 3. Did the paper pin a browser version? =====
  papers with >=1 used/produced tool of category "browser": 747
  of those, >=1 such tool carries a version string:         276   36.9%
  restricted to the crawled population:                     465 papers, 170 with a version   36.6%
 
===== 4. Crawling papers that name a browser-shipped protection =====
  crawled papers with full text:            1120
  crawled AND names a protection:           84   7.5% of 1120
  web-crawled AND names a protection:       84   9.8% of 857
  crawled AND names a protection but NOT platforms:web: 0  (so both rows share the numerator)
  web crawls 2019-2022: 266, naming a protection: 43   16.2%
  web crawls 2023-2026: 332, naming a protection: 37   11.1%
  web crawls 2024-2026: 235, naming a protection: 24   10.2%
 
===== 5. Hand-audited set: what the protection was actually doing in the paper =====
  candidate pool (crawled AND names a browser-shipped protection): 84
  every candidate's protection mentions were read as +/-320-char windows (scripts/bp_audit_sheet.mjs);
  the ones below were then read in their methodology/evaluation sections.
  audited rows: 26   rows outside the candidate pool: 0
     15  in
      4  adjacent
      3  in-baseline
      2  spoof
      1  in-instrument
      1  control-only
     58  out-background (protection named only in background, related work or the reference list)
 
  --- in ---
    2018 USENIX   Who Left Open the Cookie Jar? A Comprehensive Evaluation of Third-Party Cookie Policies
        arms: 7 browsers x their built-in third-party cookie policies, plus 31 ad-blocking and 15 anti-tracking extensions, driven through a test-case generator and an intercepting proxy
        why:  the policy is the thing varied
    2019 WWW      Evaluating Anti-Fingerprinting Privacy Enhancing Technologies
        arms: 15 anti-fingerprinting PETs incl. Brave and the Tor Browser Bundle, against unmodified Chrome and Firefox baselines
        why:  explicit no-PET baseline
    2020 PETS     In-Depth Evaluation of Redirect Tracking and Link Usage
        arms: OpenWPM Firefox under several browser settings, plus Ghostery, plus Safari ITP 2.3 driven by hand because Safari could not be automated
        why:  protection varied across settings
    2021 NDSS     Tales of Favicons and Caches: Persistent Tracking in Modern Browsers
        arms: Brave in strict mode against four anti-fingerprinting extensions and an unprotected baseline
        why:  protection evaluated against a control
    2021 PETS     Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting
        arms: the same website set crawled twice: Chrome without blocking, then Brave desktop 1.6.30, at the same time
        why:  clean two-arm design, same sites, overlapping window
    2022 WWW      Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking
        arms: 4 third-party storage policies (permissive / blocking / site-keyed / page-length) x 2 instances each = 8 stateful crawls in parallel over 3,419 page URLs spidered from the Tranco 1k
        why:  the flagship paired-crawl design in this corpus
    2022 PETS     OmniCrawl: Comprehensive Measurement of Web Tracking With Real Desktop and Mobile Browsers
        arms: 42 browser instances in parallel - Chrome and Firefox plus Brave, Tor, Firefox Focus, DuckDuckGo and Ghostery - on 4 desktops and 18 Android phones in two locations, over 20,000 Tranco sites
        why:  largest cross-browser arm set in the corpus
    2023 NDSS     Navigating Murky Waters: Automated Browser Feature Testing for Uncovering Tracking Vectors
        arms: 21 browser mechanisms read/written across 126 versions of 7 browsers (Brave, Chrome, Edge, Firefox, Safari, Opera, Tor) over a two-year period
        why:  browser version is the treatment
    2024 IMC      Browsing without Third-Party Cookies: What Do You See?
        arms: three Firefox profiles per domain - baseline, control, experimental - where only the experimental arm has third-party cookies disabled; 7,490 of the Tranco top 10,000 crawled successfully
        why:  has a same-condition control arm as well as the treatment
    2025 CCS      Local Frames: Exploiting Inherited Origins to Bypass Content Blockers
        arms: Brave (macOS 1.68.141, iOS 1.68, Android 1.68.137), the Safari Content Blocker API, DuckDuckGo, uBlock Origin Lite, AdBlock Plus and AdGuard, against a purpose-built test site
        why:  per-product, per-platform arms
    2025 IMC      FP-Inconsistent: Measurement and Analysis of Fingerprint Inconsistencies in Evasive Bot Traffic
        arms: Brave 1.69.160 and Tor 13.5.2, plus uBlock Origin 1.59.0 and AdBlock Plus 4.5.1 on Chrome 128, across macOS, Linux, iOS and Android
        why:  protections run to check they are not misread as bots
    2025 NDSS     Cascading Spy Sheets: Exploiting the Complexity of Modern CSS for Email and Browser Fingerprinting
        arms: Tor and Brave among 1,176 OS-browser combinations; Brave excluded from the font test because its randomisation would produce false positives
        why:  names the arm it had to drop, and why
    2025 PETS     Beyond the Request: Harnessing HTTP Response Headers for Cross-Browser Web Tracker Detection in an Imbalanced Setting
        arms: Chrome, Firefox and Brave data from the T.EX extension; models trained on Chrome and tested on all three, plus a Chrome set from a year later
        why:  cross-browser generalisation is the research question
    2026 PETS     Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads
        arms: Chrome, Firefox and Edge
        why:  per-browser tracking incidence is reported
    2026 USENIX   Bridges to Self: Silent Web-to-App Tracking on Mobile via Localhost
        arms: Brave, Firefox ETP in Standard and in Strict, and DuckDuckGo, each tested against the localhost bridge
        why:  the ETP Standard-vs-Strict split is the finding
 
  --- in-baseline ---
    2022 USENIX   Khaleesi: Breaker of Advertising and Tracking Request Chains
        arms: Safari's ITP is one of four comparison classifiers for the authors' own detector
        why:  the protection is a baseline, not an arm
    2023 USENIX   TRIDENT: Towards Detecting and Mitigating Web-based Social Engineering Attacks
        arms: Brave Shields set up locally and fed script/frame URL pairs, as the industry comparison against TRIDENT
        why:  Shields run as a library, not as a browser
    2023 CCS      CookieGraph: Understanding and Detecting First-Party Tracking Cookies
        arms: compares its own detector against ITP's cap on first-party cookie expiry as an existing countermeasure
        why:  policy compared analytically, not run
 
  --- in-instrument ---
    2025 USENIX   Websites' Global Privacy Control Compliance at Scale and over Time
        arms: Selenium + Firefox Nightly, with Firefox's own ETP used as the tracker classifier through its categorisation API
        why:  the protection is the measuring instrument
 
  --- spoof ---
    2021 PETS     The CNAME of the Game: Large-scale Analysis of DNS-based Tracking Evasion
        arms: the crawl was run twice, once with Chrome's User-Agent and once with Safari's, in headless Chrome both times
        why:  Safari was impersonated, not run - and it still found Criteo treating Safari differently
    2022 IMC      Measuring UID smuggling in the wild
        arms: Chrome, and Chrome with a spoofed Safari User-Agent
        why:  same design, same caveat
 
  --- control-only ---
    2024 USENIX   PURL: Safe and Effective Sanitization of Link Decoration
        arms: one arm: Firefox v102 with ETP explicitly turned off, stateless, 20K Tranco sample, March-April 2023
        why:  the exemplar of stating the protection state of a single-arm crawl
 
  --- adjacent ---
    2021 CCS      SugarCoat: Programmatically Generating Privacy-Preserving, Web-Compatible Resource Replacements for Content Blocking
        arms: 902 pages under three conditions, instrumented vs stock Chromium; output targets Brave's adblock-rust engine and uBlock Origin
        why:  blocking-tool arms rather than browser-shipped protection arms
    2023 PETS     Blocking JavaScript Without Breaking the Web: An Empirical Investigation
        arms: levels of JavaScript blocking in Chrome
        why:  the treatment is a blocking policy the authors imposed, not one a browser ships
    2025 USENIX   Double-Edged Shield: On the Fingerprintability of Customized Ad Blockers
        arms: user-customised ad-blocker configurations harvested from public forums; Brave Shields is tabulated but left out of the configuration analysis because its community-forum posts do not carry the detailed filter-list configurations
        why:  extension configuration is the treatment
    2026 PETS     Privacy vs. Profit: The Impact of Google's Manifest Version 3 (MV3) Update on Ad Blocker Effectiveness
        arms: MV3 vs MV2 instances of four ad blockers over a main sample of 924 ad-supported websites x five measurement runs, plus 191- and 185-site stratified samples, in Chrome and Firefox
        why:  extension platform, not browser protection - but it is the corpus's best-powered blocker experiment
 
  --- out-background: every candidate not audited above ---
    2017 IMC      The ad wars: retrospective measurement and analysis of anti-adblock filter lists.
    2018 CCS      The Web's Sixth Sense: A Study of Scripts Accessing Smartphone Sensors.
    2018 WWW      Hiding in the Crowd: an Analysis of the Effectiveness of Browser Fingerprinting at Large Scale.
    2019 CCS      AdVersarial: Perceptual Ad Blocking meets Adversarial Machine Learning.
    2019 CCS      Oh, the Places You've Been! User Reactions to Longitudinal Transparency About Third-Party Web Tracking and Inferencing.
    2020 IMC      Hiding in Plain Site: Detecting JavaScript Obfuscation through Concealed Browser API Usage.
    2020 IMC      Reading In-Between the Lines: An Analysis of Dissenter.
    2020 IMC      When Push Comes to Ads: Measuring the Rise of (Malicious) Push Advertising.
    2020 NDSS     Deceptive Previews: A Study of the Link Preview Trustworthiness in Social Platforms
    2020 NDSS     Melting Pot of Origins: Compromising the Intermediary Web Services that Rehost Websites
    2020 PETS     A Comparative Measurement Study of Web Tracking on Mobile and Desktop Environments
    2020 PETS     Inferring Tracker-Advertiser Relationships in the Online Advertising Ecosystem using Header Bidding
    2020 PETS     Missed by Filter Lists: Detecting Unknown Third-Party Trackers with Invisible Pixels
    2020 WWW      Beyond the Front Page: Measuring Third Party Dynamics in the Field.
    2020 WWW      Dirty Clicks: A Study of the Usability and Security Implications of Click-related Behaviors on the Web.
    2020 WWW      Stop tracking me Bro! Differential Tracking of User Demographics on Hyper-Partisan Websites.
    2020 WWW      The Representativeness of Automated Web Crawls as a Surrogate for Human Browsing.
    2020 IEEE-SP  AdGraph: A Graph-Based Approach to Ad and Tracker Blocking.
    2020 CCS      You've Changed: Detecting Malicious Browser Extensions through their Update Deltas.
    2021 IEEE-SP  Fingerprinting the Fingerprinters: Learning to Detect Browser Fingerprinting Behaviors.
    2021 IMC      TrackerSift: untangling mixed tracking and functional web resources.
    2021 NDSS     CV-Inspector: Towards Automating Detection of Adblock Circumvention
    2021 PETS     Privacy Preference Signals: Past, Present and Future
    2021 USENIX   PhishPrint: Evading Phishing Detection Crawlers by Prior Profiling
    2021 WWW      Cookie Swap Party: Abusing First-Party Cookies for Web Tracking.
    2021 WWW      User Tracking in the Post-cookie Era: How Websites Bypass GDPR Consent to Track Users.
    2022 IMC      Muzeel: assessing the impact of JavaScript dead code elimination on mobile web performance.
    2022 NDSS     HARPO: Learning to Subvert Online Behavioral Advertising
    2022 PETS     How Can and Would People Protect From Online Tracking?
    2022 PETS     How Not to Handle Keys: Timing Attacks on FIDO Authenticator Privacy
    2022 PETS     My Cookie is a phoenix: detection, measurement, and lawfulness of cookie respawning with browser fingerprinting
    2022 USENIX   Automating Cookie Consent and GDPR Violation Detection
    2022 USENIX   Leaky Forms: A Study of Email and Password Exfiltration Before Form Submission
    2022 USENIX   The Dangers of Human Touch: Fingerprinting Browser Extensions through User Actions
    2022 WWW      Investigating Advertisers' Domain-changing Behaviors and Their Impacts on Ad-blocker Filter Lists.
    2022 IEEE-SP  WTAGRAPH: Web Tracking and Advertising Detection using Graph Neural Networks.
    2023 CCS      iLeakage: Browser-based Timerless Speculative Execution Attacks on Apple Devices.
    2023 CCS      Read Between the Lines: Detecting Tracking JavaScript with Bytecode Classification.
    2023 PETS     A Utility-Preserving Obfuscation Approach for YouTube Recommendations
    2023 IMC      Reviving Dead Links on the Web with Fable.
    2023 USENIX   Defining "Broken": User Experiences and Remediation Tactics When Ad-Blocking or Tracking-Protection Tools Break a Website’s User Experience
    2023 USENIX   Rods with Laser Beams: Understanding Browser Fingerprinting on Phishing Pages
    2023 WWW      Who Funds Misinformation? A Systematic Analysis of the Ad-related Profit Routines of Fake News Sites.
    2023 IEEE-SP  Fashion Faux Pas: Implicit Stylistic Fingerprints for Bypassing Browsers' Anti-Fingerprinting Defenses.
    2023 IEEE-SP  The Leaky Web: Automated Discovery of Cross-Site Information Leaks in Browsers and the Web.
    2024 CCS      Blocking Tracking JavaScript at the Function Granularity.
    2024 PETS     The Devil is in the Details: Detection, Measurement and Lawfulness of Server-Side Tracking on the Web
    2024 PETS     Website Data Transparency in the Browser
    2024 NDSS     FP-Fed: Privacy-Preserving Federated Detection of Browser Fingerprinting
    2024 USENIX   FV8: A Forced Execution JavaScript Engine for Detecting Evasive Techniques
    2024 PETS     Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy?
    2024 WWW      AdFlush: A Real-World Deployable Machine Learning Solution for Effective Advertisement and Web Tracker Prevention.
    2024 WWW      The Double Edged Sword: Identifying Authentication Pages and their Fingerprinting Behavior.
    2025 IMC      $CookieGuard: $ Characterizing and Isolating the First-Party Cookie Jar.
    2025 PETS     Onion-Location Measurements and Fingerprinting
    2025 PETS     Intractable Cookie Crumbs: Unveiling the Nexus of Stateful Banner Interaction and Tracking Cookies
    2025 CCS      Exploiting the Shared Storage API.
    2026 NDSS     PhishLang: A Real-Time, Fully Client-Side Phishing Detection Framework Using MobileBERT

5.1 The two-absences probe, unedited

bp_llm_headless-output.txt
hand-audited papers: 26
 
--- LLM as a method ---
  2026 PETS Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads
      ...e the anonymous PoPETs Editor and Reviewers for their valuable feedback, which significantly improved the paper. The authors used generative AI-based tools Grammarly and ChatGPT-5 to revise the text, correct any typos, grammatical errors, and awkward phrasing. No content was generated related to technical results, data, code, or analysis. References [1] 2016...
  2026 PETS Privacy vs. Profit: The Impact of Google's Manifest Version 3 (MV3) Update on Ad Blocker Effectiveness
      ...rs who rely on ad blockers for a more private and ad-free browsing experience. 541 Proceedings on Privacy Enhancing Technologies 2026(1) Acknowledgments The authors used ChatGPT to revise the text throughout the paper to correct any typos, grammatical errors, and awkward phrasing. This project has received funding from the European Research Council (ERC) und...
  papers matched: 2
 
--- headless vs headful ---
  2022 WWW Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking
      ...across return visits. All crawls were performed in parallel and simultaneously from a single network vantage point. Each page visit was performed in a freshly launched, non-headless (i.e., rendering to the Xvfb headless display server) browser instance. Navigation was allowed to time out after 30 seconds. Assuming no navigation timeout, our crawlers waited...
      ...nable sampling of site content without exhausting our time and space budget, as PageGraph can generate large volumes of data per page. All our crawlers were stateful and non-headless, giving them a fair chance at evading the most trivial forms of bot detection. More sophisticated bot detection depending on "human" interactions with page content should treat...
  2025 USENIX Websites' Global Privacy Control Compliance at Scale and over Time
      ...second batch, which we had randomly was one of the main error sources we encountered.9 Our selected as well. To ensure that there were sufficient sites with crawler uses non-headless mode to appear more similar to a GPP Strings in the test set we randomly selected 40 sites from human user. Each site is allotted 35 seconds to load and 22 the 109 sites for whi...
  2022 IMC Measuring UID smuggling in the wild
      ...on all four crawlers: in fact, many in- Chrome extension, to record web requests. We use Puppeteer in stances occurred on only a single crawler. For example, we encoun- "headful" mode, using the monitor emulator XVFB [53], to reduce tered many cases where each crawler loaded the same originator the chance that CrumbCruncher will be identified as a bot. While...
  papers matched: 3

6. The browser fold, and its residue in full

scripts/browser_fold.mjs maps free-text crawlConfig.browsers strings to product families by an ordered regex list — the more specific product wins over its engine, so “Tor Browser” is not folded into Firefox and “Brave” is not folded into Chromium. The fold is deliberately product-level, not version-level: this page's question is which browser's protections were in the crawl, and “Firefox 52” and “Firefox Nightly” answer that the same way. Version reporting is counted separately, from the tools[].version field (Q18, Q19).

The rules, in order:

/tor\s*browser|tor\s*bundle|\btbb\b/i      -> Tor Browser
/brave/i                                    -> Brave
/duckduckgo|\bddg\b/i                       -> DuckDuckGo
/firefox\s*focus/i                          -> Firefox Focus
/librewolf|mullvad\s*browser/i              -> LibreWolf / Mullvad
/\bedge\b|edgehtml/i                        -> Edge
/\bopera\b|\bop2\b/i                        -> Opera
/yandex/i                                   -> Yandex
/\bwhale\b/i                                -> Whale
/coccoc/i                                   -> CocCoc
/\bsafari\b/i                               -> Safari
/internet\s*explorer|\bie\s*\d|\bie\b/i     -> Internet Explorer
/firefox|mozilla|gecko|\bnightly\b/i        -> Firefox
/chromium/i                                 -> Chromium
/chrome/i                                   -> Chrome
/webkit|slimerjs|phantomjs|htmlunit/i       -> headless engine (PhantomJS / HtmlUnit / WebKit port)
/webview/i                                  -> WebView
/selenium|puppeteer|playwright|webdriver|mechanize/i -> automation library named instead of a browser
/wget|curl|python\s*requests|http\s*client/i         -> HTTP client, not a browser

226 distinct strings in, 18 families out, 42 strings unmapped. The residue is printed by the report and reproduced in §5; it is dominated by “headless browser”, “regular browser”, device names (“Nexus tablet”, “Apple iPhone6”) and CJK-market browsers the fold has no family for (UC, QQ, 360, Xunlei, Kiwi, Dolphin, Vivaldi, Samsung). One residue entry is a category error in the source data — “Ghostery” appears in crawlConfig.browsers although Ghostery is an extension in every context except its own mobile browser; the fold leaves it in the residue rather than guessing.

The Internet Explorer rule reads \bie\s*\d|\bie\b rather than the \bie\b\s*\d*|\bie\b it started as, because the figures review (§15.2) pointed out that a word boundary cannot follow “IE” in the no-space form IE11. No string in the current 226 takes that form, so no published figure changed; the rule was fixed anyway and unit-checked against IE11, IE 11, IE, Internet Explorer 8, pie and tie. Re-running the report after the change produced a byte-identical output.

Two folding decisions a reasonable person would make differently:

  • “automation library named instead of a browser” (45 papers) is kept as a family rather than dropped. It is a finding — 8.5% of the papers that answered “which browser” answered with “Selenium” — and hiding it in the residue would make the browser shares look better than they are. It is excluded from the >=2- and >=3-family counts (Q15, Q16) along with “HTTP client, not a browser”, because neither is a browser.
  • Chrome and Chromium are separate families. Merging them would give a cleaner single “no default protection” row, but they are different builds with different default flag sets, which is precisely this page's subject. The distinct-paper roll-up in Q21 is how the page states the combined figure without summing the rows.

7. Quotes checked against the source

scripts/bp_quotecheck.mjs checks every verbatim quote the page takes from a corpus paper against data/fulltext/<year>/<venue>/<slug>/paper.cols.txt, whitespace collapsed on both sides and smart quotes normalised, nothing else. 45 of 45 spans pass. It started at 32 spans; the citations review (§15.3) found two quotes on the page that the checker did not cover at all, which is the failure mode a passing checker hides, and the coverage was extended rather than the finding waved through. Four more spans were added with the “which designs are current” section.

bp_quotecheck-output.txt
OK    2022 WWW     deployed two instances of each tested policy to verify behavioral consistency and provid
OK    2022 WWW     produced 3,419 total deduplicated page URLs to visit
OK    2022 PETS    use two identical Chrome instances to measure the
OK    2022 PETS    baseline variability between visits to the same website
OK    2022 PETS    We visit 20,000 websites with a total of 42 browser instances running in parallel across
OK    2021 PETS    from 91% to 76%
OK    2024 IMC     more than 90% of domains exhibit less than a 10% screenshot difference when cookies are 
OK    2024 IMC     we arrive at a final list of 7,490 successfully crawled domains
OK    2025 NDSS    would induce false positives in our evaluation
OK    2026 USENIX  Our measurements show that ETP blocks the Meta Pixel only in Strict mode
OK    2024 USENIX  We turn off all built-in tracking protections provided by Firefox (Enhanced Tracking Pro
OK    2025 USENIX  We identify trackers with Firefox's built-in Enhanced Tracking Protection [54], which id
OK    2021 PETS    performed the experiment twice: once with the Chrome User-Agent string, and once with Sa
OK    2021 PETS    would only resort to first-party tracking for Safari users
OK    2020 PETS    Ghostery could only block 11 out of 30 top redirect domain cookies, whereas Safari block
OK    2019 WWW     to be most effective, revealing under 3 bits of entropy
OK    2019 WWW     reveal over 11 bits of entropy and hence are marginally better than
OK    2019 WWW     not using any AFPET at all
OK    2019 WWW     The original fingerprints reveal 13.002 and 12.359 bits of entropy
OK    2026 PETS    no statistically significant reduction in ad-blocking or anti-tracking effectiveness for
OK    2026 PETS    a main sample of 924 websites across five separate measurement runs
OK    2026 PETS    does not strip URL parameters like gclid or fbclid
OK    2025 CCS     73.7% of the requests made by these local frames should be blocked by popular filter lis
OK    2025 CCS     We disclosed each of the 19 vulnerabilities we found to the relevant organization
OK    2018 USENIX  By applying the framework to 7 browsers, 31 ad blocking and 15 anti-tracking extensions
OK    2018 USENIX  We performed a crawl on the Alexa top 10,000, visiting 160,059 web pages
OK    2023 NDSS    a total of 126 versions of seven major browsers
OK    2023 NDSS    we test 21 browser mechanisms and uncover a slew of tracking vectors, including 13
OK    2021 NDSS    In our analysis, we use Brave's strict mode
OK    2021 PETS    strumented the Brave browser (desktop version 1.6.30)
OK    2021 PETS    to crawl these websites a second time
OK    2023 USENIX  we compared T RIDENT with two stateof-the-art tools: Brave Shields
OK    2022 PETS    We study privacy-focused browsers and find their pro
OK    2022 PETS    tections differ significantly and in general are less for
OK    2021 PETS    at the same time with crawling the
OK    2022 IMC     unless the user has loaded the site as a first party in the previous 45 days
OK    2025 USENIX  These posts do not include the detailed browser filter-list configurations
OK    2019 WWW     Brave Browser spoofs the User-Agent to appear like Chrome,
OK    2019 WWW     but modifies the Accept-Language header, language and
OK    2019 WWW     plugins differently than baseline Chrome
OK    2019 WWW     Brave users stand out from other Chrome users
OK    2026 PETS    No content was generated related to technical results, data, code, or analysis
OK    2022 WWW     non-headless (i.e., rendering to the Xvfb headless display server)
OK    2022 WWW     a fair chance at evading the most trivial forms of bot detection
OK    2025 USENIX  crawler uses non-headless mode to appear more similar to a
 
45 verbatim, 0 not found in the .cols rendering (of 45)

7.1 What the check caught, and what was changed

The first run had three FAILs, all of them two-column splices in the .cols rendering rather than misquotations of the paper. A fourth splice turned up later, in [1Datta, Amit; Lu, Jianan; Tschantz, Michael Carl (2019): "Evaluating Anti-Fingerprinting Privacy Enhancing Technologies", in: Proceedings of the ACM Web Conference. (DOI)]'s Brave sentence, only because the citations reviewer noticed that sentence was not in the checker at all; it is marked with [...] on the page and both halves are now checked. All three were on the page as continuous quoted sentences, which is a misquotation of the rendering even where it is faithful to the PDF. Fixed before publication:

Quote What .cols actually has Fix
OmniCrawl, “use two identical Chrome instances to measure the baseline variability between visits to the same website” ...to measure the added unsafe-inline to the CSP headers of only three. baseline variability between visits... — a sentence from the adjacent column spliced in quoted with an explicit [...] marker and a note pointing here
OmniCrawl, “protections differ significantly and in general are less for lower-ranked sites” broken as their pro / tections differ across a column boundary de-quoted; the page now paraphrases
TRIDENT, “set up its ad-blocking component locally” set up its ad-blocking component [49] locally — a reference marker inside the span de-quoted; the page now describes it

One further near-miss worth recording: we instrumented the Brave browser (desktop version 1.6.30) fails as written because the rendering hyphenates it as we in-strumented. The version number itself is correct and is stated, not quoted, on the page.

Caveat this check cannot clear. It verifies the page against the .cols rendering, not against the PDF. Column-reading-order repair is imperfect, and the corpus README reports that 57.9% of extraction quotes match their source exactly, 37% via an 8-word run, and 0.9% cannot be located at all. A quote that passes here is faithful to the text this project reads; if a figure is load-bearing for your own work, open the PDF.

8. Bibliography entries added

Four keys appended to bibliography before the closing tag, taking it from 724 to 728 entries. Checked first for key collisions (none) and for DOI collisions (10.2478/popets-2021-0078 absent), and after the append for duplicate keys across the whole file (none: 728 entries, 728 distinct keys).

Key Paper Metadata source
hoang2021_domain Hoang et al., Domain name encryption is not enough, PoPETs 2021 bibgen.mjs failed loudly: PETS index records carry no authors. Authors and pages read off the PoPETs landing page with curl and a browser User-Agent; DOI derived as 10.2478/popets-2021-0078 and matched against the landing page
trampert2025_cascading Trampert et al., Cascading Spy Sheets, NDSS 2025 bibgen.mjs, clean
yang2023_trident Yang, Allen, Landen, Perdisci, Lee, TRIDENT, USENIX Security 2023 bibgen.mjs emitted TODO-AUTHORS; authors read from the USENIX presentation page with curl (WebFetch gets 403 from usenix.org)
elhajjchehade2025_double El Hajj Chehade, Stock, Troncoso, Double-Edged Shield, USENIX Security 2025 as above. Key uses the full surname elhajjchehade rather than bibgen`s auto-derived el2025_double, which would have implied a surname of “El”

Cache purge required and performed. The first published render showed the four new keys as unresolved: 22 of 26 inline indices rendered and the reference list stopped short. ?purge=true on bibliography and then on the content page fixed it. Re-verified: 50 inline markers, 26 distinct indices 1–26, 26 reference entries, and the only remaining red link on the page is the one to this page.

9. Browser measurements: what was measured, and what was not

Claim on the page How it was established Status
The six-arm Chromium result (setCookieControls works, four other knobs do not) sandbox/bp_arms_probe.mjs, run 2026-09-01, Chromium 151.0.7922.34 + Playwright 1.62.1, local HTTPS origins, output in §10 measured, first-hand
--test-third-party-cookie-phaseout is a real switch; --block-third-party-cookies is not strings -a on the Chromium binary: the first appears twice, the second not at all measured, first-hand
Storage.setThirdPartyCookieBlocking does not exist; Network.setCookieControls does, and is experimental the browser's own /json/protocol descriptor, enumerated over --remote-debugging-port measured, first-hand
Playwright 1.62.1 sets browser.contentblocking.features.standard read from node_modules/playwright-core/lib/coreBundle.js; the whole 86-preference default object was dumped and filtered source-level
That pref is dead in Firefox 153.0 the string features.standard appears in neither browser/omni.ja nor omni.ja nor libxul.so. Firefox's own ContentBlockingPrefs.sys.mjs names only PREF_STRICT_DEF: “browser.contentblocking.features.strict” and comments that the standard category “is defined as expecting default values of the listed prefs” source-level
That build ships network.cookie.cookieBehavior = 5 browser/defaults/preferences/firefox.js inside browser/omni.ja source-level
5 is BEHAVIOR_PARTITION_FOREIGN the same build's applyCategoryPref mapping, case “cookieBehavior5” source-level
Firefox's bounce-tracking “off” is MODE_ENABLED_DRY_RUN ContentBlockingPrefs.sys.mjs, case “-btp”, with the source comment quoted on the page source-level
ETP Strict ships cookieBehavior5 — the same partitioning as Standard browser.contentblocking.features.strict in browser/defaults/preferences/firefox.js inside browser/omni.ja reads tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,qps,qpsPBM,fpp,fppPrivate,btp,lna source-level
Playwright's Firefox is 153.0; stable is 155.0 application.ini in the build (Version=153.0, BuildID=20260722045016) and product-details.mozilla.org measured / fetched

Firefox could not be launched in this container. Playwright's Firefox 153.0 dies at startup with RenderCompositorSWGL failed mapping default framebuffer, no dt, headless, headless with software-rendering prefs, and headful under a manually started Xvfb :99 (xvfb-run itself is unusable here: xauth is not installed). So no runtime pref value was read back, and the page says so in three places rather than implying a measurement. Brave, Edge, Safari, Tor Browser and DuckDuckGo were not available in this environment at all.

10. Unedited arm-probe output

bp_arms_probe-output.txt
browser: Chromium 151.0.7922.34
playwright: 1.62.1
 
ARM default (no extra flags), run 1
  third-party cookies in the jar:   ["tp_http","tp"]
  document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js"
  Cookie header the 3p then saw:    ["tp_http=set-from-header; tp=set-from-js"]
 
ARM default (no extra flags), run 2
  third-party cookies in the jar:   ["tp_http","tp"]
  document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js"
  Cookie header the 3p then saw:    ["tp_http=set-from-header; tp=set-from-js"]
 
ARM --test-third-party-cookie-phaseout
  third-party cookies in the jar:   ["tp_http","tp"]
  document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js"
  Cookie header the 3p then saw:    ["tp_http=set-from-header; tp=set-from-js"]
 
ARM --block-third-party-cookies (no such switch)
  third-party cookies in the jar:   ["tp_http","tp"]
  document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js"
  Cookie header the 3p then saw:    ["tp_http=set-from-header; tp=set-from-js"]
 
ARM --incognito
  third-party cookies in the jar:   ["tp_http","tp"]
  document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js"
  Cookie header the 3p then saw:    ["tp_http=set-from-header; tp=set-from-js"]
 
ARM CDP Network.setCookieControls(true)
  third-party cookies in the jar:   []
  document.cookie inside the frame: ""
  Cookie header the 3p then saw:    [null]
 
ARM CDP Storage.setThirdPartyCookieBlocking
  CDP error:                        cdpSession.send: Protocol error (Storage.setThirdPartyCookieBlocking): 'Storage.setThirdPartyCookieBlocking' wasn't found
  third-party cookies in the jar:   ["tp_http","tp"]
  document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js"
  Cookie header the 3p then saw:    ["tp_http=set-from-header; tp=set-from-js"]

The two default rows are the same condition run twice, and match exactly. That is what makes the setCookieControls row readable as an effect rather than as noise, and it is the same discipline the page recommends for a real paired crawl.

11. External sources, and how each was verified

All fetched 2026-09-01. Everything on the content page's browser table is quoted from a vendor primary source, never from recall.

Source How verified Used for
WebKit, "Tracking Prevention in WebKit" fetched; ITP behaviours quoted verbatim Safari row
WebKit blog, "Full Third-Party Cookie Blocking and More" fetched; date 2020-03-24, Safari 13.1 / iOS 13.4, sentence quoted verbatim Safari shipping date
Microsoft Learn, "Tracking prevention in Microsoft Edge" fetched with its front-matter; ms.date 2021-01-07, updated_at 2026-06-12. Levels, the Basic/Balanced/Strict enforcement matrix, the Disconnect lists, the site-engagement threshold of 4.1 and the CompatExceptions list all quoted verbatim Edge row and two of the three pitfalls
Mozilla blog, 2019-09-03 fetched; Firefox 69, sentence quoted verbatim ETP default-on date
Mozilla blog, 2022-06-14 fetched; page carries “updated August 28, 2024”; cookie-jar sentence quoted verbatim Total Cookie Protection date
product-details.mozilla.org/1.0/firefox_versions.json fetched; LATEST_FIREFOX_VERSION 155.0, LAST_RELEASE_DATE 2026-09-01, FIREFOX_ESR 140.15.0esr Firefox current version
Brave Help Center, Shields and the Shields-while-browsing article (support.brave.com migrated to support.brave.app — corrected in review, see §15.1) fetched through Playwright Chromium (both are behind a JS/CDN gate that curl and WebFetch do not clear); Standard-versus-Aggressive wording quoted Brave row
api.github.com/repos/brave/brave-browser/releases/latest JSON API, not releases.atom. Corrected in review — see §15.3. This row first read “stable v1.94.118, published 2026-09-01”, taken from the unfiltered releases list. That object carries prerelease: true. /releases/latest excludes prereleases and returns v1.94.117, published 2026-08-26T08:10:10Z, Chromium 152.0.7977.64; Brave's own release-notes page agrees (“Release Notes v1.94.117 (Aug 27, 2026)”) Brave version
aus1.torproject.org/torbrowser/update_3/release/downloads.json fetched; Tor Browser 15.0.21 Tor Browser version
DuckDuckGo, "Web Tracking Protections" fetched; the protection list quoted; the page carries no dates or versions and the row says so DuckDuckGo row
versionhistory.googleapis.com Chrome stable fetched; 152.0.7977.75, serving from 2026-09-01 context for “Playwright ships Chromium 151”
registry.npmjs.org for adblock-rs, adblock-rust, @ghostery/adblocker, @cliqz/adblocker fetched the “driving each browser” row on Brave's engine
api.github.com/repos/webfp/tor-browser-selenium + PyPI tbselenium fetched; 0.9.0 2024-10-23, last commit 2025-07-26, CI pinned to TB 14.5.5, repo not archived the Tor Browser row and an Open Question

11.1 Checked and rejected

  • support.mozilla.org ETP articles. The obvious source for the ETP row. WebFetch returns a JS-shell error page, and driving it with Playwright Chromium hits a CAPTCHA (“Enter the characters seen in the image below”). Rejected as unfetchable; the ETP row is built from the two Mozilla blog posts, which are datable, plus the shipped preference files of the build itself, which are better evidence than documentation anyway.
  • A web-search summary of Firefox Bounce Tracking Protection's default level. A search snippet asserted that BTP is Strict-only. That is consistent with the build's own category table, but a search summary is not a source. The page instead states what the build's ContentBlockingPrefs.sys.mjs shows — that btp appears in the strict rule set and that the “off” state is MODE_ENABLED_DRY_RUN — and makes no claim about the Standard default, which was not established.
  • firefox-source-docs.mozilla.org bounce-tracking page. Fetched; it names the pref and says “0 is fully disabled and 1 is fully enabled” but gives neither the default nor the ETP level. Kept as background, not cited for a figure.
  • The npm package adblock-rust (9.0.0, February 2021, no repository field). Not Brave's engine despite the name matching Brave's GitHub repository. Rejected, and named on the page as a trap, because the correct package is adblock-rs.
  • releases.atom for Brave versions. Not used: its element order pairs each version with the wrong date. The JSON API was used instead.
  • Any SEO listicle or “best privacy browsers 2026” page. None consulted; every browser-behaviour claim traces to a vendor page, a shipped binary or a paper.

12. Judgement calls

  1. Creating a page rather than broadening a neighbour. requests and fingerprinting both assume the default browser; folding “the browser is a treatment” into either would have buried it under a classification topic. filter_lists owns the list, not the browser that ships it. A reasonable person could have made this a section of crawler instead; that was rejected because the content is a study-design question, not an instrument-comparison question.
  2. Extension-side blockers are adjacent, not in. uBlock Origin, AdGuard, Privacy Badger and the MV3 work are the neighbouring literature and a reader will want them, so they are named with their figures — but counting them as browser-shipped protections would have doubled the “in” set with a different treatment. The verdict class makes the choice visible instead of silent.
  3. User-Agent spoofing gets its own verdict class rather than being excluded. Two corpus papers ran a “Safari” arm this way. Excluding them would hide a common and easily-misread design; including them as in would endorse it. spoof says both things.
  4. Tor Browser is counted in the browser fold but not treated as a tracking-protection arm. It is the most-named protective browser in the corpus (37 papers) and almost all of that is anonymity work. Treating those 37 as tracking-protection arms would have quadrupled the headline and been wrong.
  5. The page dates every protection and refuses to rank them. The corpus can say what the field did (Brave 78 papers, ITP 41, ETP 27). It cannot say which protection a 2026 student should use as a treatment, and the page does not pretend otherwise: the browser table is dated, the per-year table is given, and the recommendation is about design (duplicate arms, verified state, pinned versions) rather than about which vendor to pick.
  6. Chromium was measured and the others were not, and the page is lopsided because of it. A reasonable person would have found a way to run Brave or Firefox. This environment could not, and the page marks every unmeasured claim rather than levelling the tone.

13. What could not be established

  • Why --test-third-party-cookie-phaseout had no effect in Chromium 151 on the Playwright path, given that the switch exists in the binary. Not investigated beyond confirming the effect and the switch's existence. Candidate explanations not tested: it may gate a field-trial state rather than the cookie setting directly, or Playwright's default flag set may override it.
  • The runtime value of network.cookie.cookieBehavior in a Playwright-driven Firefox. Source-level evidence says 5; the browser would not launch. One line of work for anyone with a working Firefox, and listed as an Open Question.
  • Whether Firefox Bounce Tracking Protection is on in Standard. See §11.1.
  • Brave, Edge, Safari, Tor Browser and DuckDuckGo behaviour, first-hand. None available here.
  • The distance between a crawler profile and a real profile under Edge's site-engagement relaxation, Safari's interaction-based storage grants and Firefox's 45-day first-party exemption. The page raises it as an Open Question; nothing in the corpus measures it.
  • Whether the 58 out-background papers are all really background. They were read at window level, not in full. A paper that discusses a protection only in a section the window sampler did not reach would be misfiled. The window count per paper is in out_bp_candidates.json and the full worksheet is regenerable.

14. The run itself

  • Date: 2026-09-01. Corpus at the time: 5,859 extracted papers, 5,869 with rendered full text, 7 venues, 2010–2026.
  • Browser environment: Chromium 151.0.7922.34 and Firefox 153.0 as shipped with Playwright 1.62.1, Linux container, no GPU. Firefox does not start (§9).
  • Model: the page, the report scripts, the folds and the hand audit were produced by Claude (Opus 5) in one sitting. Four review passes were run as sub-agents; see §15.
  • Failure modes these checks do not catch, learned the hard way in this run. Recorded as failure modes rather than as a tally, because the point is which check to add next time: (a) three quotes published as continuous sentences that are column splices in the rendering (§7.1); (b) an initial browser_fold.mjs that exported a flat PROTECTS_BY_DEFAULT set — deleted before use, because “protects by default” is time-dependent (Firefox did not before 2019, Safari did not before 2017) and a flat set would have produced a confidently wrong count; © the first Edge widening that matched 176 papers of graph edges (§2.2); (d) scripts/prov_embed.py, which re-embeds the script outputs into this page, silently swallowed the whole quote-check block when an empty <file text …></file> placeholder let its non-greedy body pattern run on to the next block's closing tag. Caught by counting <file text openers after a rebuild, not by reading. The pattern now refuses to cross an opener, and the comment in the script says why.
  • No accidental exposure. Credentials live in .env, gitignored, and are never logged by scripts/dw.mjs. No content was sent to any external LLM provider.

15. Review log

Four review passes, all told explicitly that the author's context may not be exhaustive and all handed the page text, the report script, its unedited output and this log. The three focused passes ran in parallel; the generic pass ran after their findings were applied.

15.1 External currency (Sonnet)

Told to fetch, not recall, every dated or versioned claim. Verdict: the browser table, all seven version numbers, four of the five dates and both CDP claims verified correct against primary sources fetched on 2026-09-01.

Finding Action
Brave's help centre has migrated: the two cited support.brave.com article URLs now 301 to support.brave.app. Content unchanged accepted. Both citations repointed, with a note that the old paths still resolve and that both are CDN-gated against curl
The 2019-06-27 Edge Tracking Prevention preview date rested on prior knowledge: Microsoft's current documentation does not carry it accepted, and closed. The Microsoft Edge Team blog post of that date was fetched (blogs.windows.com/msedgedev/2019/06/27/…), and the row now cites it and quotes it, including “The default tracking prevention setting is Balanced” — which strengthens the Edge row rather than only dating it
Storage.runBounceTrackingMitigations and Storage.getRelatedWebsiteSets exist at devtools-protocol tip-of-tree and are topically adjacent but unmentioned accepted. Added to the bounce-tracking paragraph, with the point that unlike the Privacy Sandbox commands beside them these two survive at tip-of-tree, and that forcing the purge is what an arm wants
Several 2026 SEO pages claim Chrome now shows a third-party-cookie prompt, contradicting Google's own blog noted, no change. The reviewer rejected them as unreliable and confirmed Google's April 2025 position is still current. The page already cites the primary source through privacy_sandbox
safaridriver, msedgedriver and Appium not independently re-verified against a vendor changelog noted, no change. No contradicting evidence; the page does not attach a version or a date to any of the three, so there is no figure to go stale

15.2 Figures versus the script (Sonnet)

Re-ran bp_report.mjs, bp_arms_probe.mjs and bp_edge_check2.mjs and diffed against the committed outputs: byte-identical, no drift. Independently re-derived the 84/1,120 versus 84/857 identity (0 discrepancy either way), the 226 distinct browser strings and 42-string residue, the arms counts, the version-pinning figures and the audit verdict arithmetic (15+3+1+2+1+4+58 = 84). Confirmed the usedOrMentioned filter keeps only used/produced and that no query counts tuples.

Mutation-tested the published probe, which was the point of the pass: inverting enableThirdPartyCookieRestriction to false flips the working arm back to an unblocked control, and making the “third party” same-site as the first party flips the CDP-block arm from blocked to unblocked. The probe is sensitive, not vacuous.

Finding Action
The Edge evidence cited a paper from the rejected widening. The provenance page named Double-Edged Shield as one of two substantive body mentions in the 18-paper scan. It is not in those 18 at all: its Edge sentence is nowhere near the literal string “Tracking Prevention”, and it only surfaced in the 176-paper noisy widening this log itself calls unusable. The real 18 contain three body occurrences, not two — XSinator, PURL and a 2020 CCS survey's coding-category label — and none of the three is about Edge accepted, medium-high. The section was rebuilt. The page now says 17 of 20 occurrences are reference-list entries, names all three body occurrences and states that none concerns Edge, and adds a second, committed sweep (scripts/bp_edge_cite.mjs) counting the 5 papers that cite Microsoft's Edge tracking-prevention documentation. The headline zero was never in doubt; the evidence behind it now matches the data
ukani2025_local: “five products found vulnerable” undercounts. The paper also says “We apply our tests to six popular Web privacy and security tools—identifying at least one vulnerability in each for a total of 19” already fixed before this arrived, from the parallel citations pass, which found the same tension from the other side. The row now says five products whose bugs expose users, plus a sixth non-exposing bug in DuckDuckGo, 19 vulnerabilities disclosed to six parties, and that AdGuard's patch is partial. Both reviewers were right about different sentences in the same paper
datta2019_evaluating framing inverted. The page read “13 of the 15 PETs moved that from about 13 bits to about 11”, which sounds like an achieved reduction. The paper's own sentence is that all AFPETs but Brave and Tor BB “reveal over 11 bits of entropy and hence are marginally better than not using any AFPET at all” accepted, medium. Rewritten to the paper's framing, quoted, and turned into the page's point: a protection arm can move your metric hardly at all, and that is a finding
Latent bug in browser_fold.mjs: \bie\b cannot match the no-space form IE11. No string in the current 226 takes that form, so no published figure is affected accepted, low. Rule changed to \bie\s*\d alternation and unit-checked against IE11, IE 11, IE, Internet Explorer 8, pie and tie. Re-ran the report: no drift

15.3 Citations and quotes (Sonnet)

Verified all 26 citekeys resolve, no key collisions in the 728-entry bibliography, and checked the four new keys author-by-author against the papers and the venue landing pages. Independently re-read all 15 in rows plus the baseline, instrument, spoof and adjacent classifications against the paper text, and confirmed the rendered page: 50 inline markers, 26 distinct keys, 26 reference entries, one expected red link.

Finding Action
The Brave version was a prerelease. The page said stable 1.94.118 on 2026-09-01, taken from the unfiltered releases list. That release object carries prerelease: true; /releases/latest, which excludes prereleases, returns v1.94.117, published 2026-08-26 accepted, moderate — and independently re-confirmed twice before changing: the API's prerelease flag, and Brave's own release-notes page, which is headed “Release Notes v1.94.117 (Aug 27, 2026)”. Fixed, with the trap written into the footnote. The Chromium figure (152.0.7977.64) was right either way
“Firefox's Disconnect-based blocking has a 45-day first-party-visit exemption” had no source anywhere, on a page whose own stated standard is that every browser-behaviour claim traces to a vendor page, a binary or a paper accepted, moderate. It does have a source — [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)], “Firefox clears all storage from sites on the Disconnect tracking list after 24 hours, unless the user has loaded the site as a first party in the previous 45 days” — which was in the reading and not in the citation. Both occurrences now cite it, and the quote is in the checker
A reference marker silently dropped mid-quote. The [3Hausladen, Katherine; Wang, Oliver; Eng, Sophie; Wang, Jocelyn; Wijaya, Francisca; May, Matthew; Zimmeck, Sebastian (2025): "Websites' Global Privacy Control Compliance at Scale and over Time", in: Proceedings of the USENIX Security Symposium. (Link)] quote omitted the source's [54] with no [...], which is exactly the defect §7.1 caught for TRIDENT and fixed accepted, minor but embarrassing. The marker is restored inside the quote. The general lesson is now enforced by the checker rather than by care: see the next row
Two quotes on the page were not in the checker at all — [4Hoang, Nguyen Phong; Niaki, Arian Akhavan; Gill, Phillipa; Polychronakis, Michalis (2021): "Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting", Proceedings on Privacy Enhancing Technologies 2021(4):420-440. (DOI)]'s “at the same time” and [1Datta, Amit; Lu, Jianan; Tschantz, Michael Carl (2019): "Evaluating Anti-Fingerprinting Privacy Enhancing Technologies", in: Proceedings of the ACM Web Conference. (DOI)]'s Brave User-Agent sentence — so “32 verbatim, 0 not found” undercounted the page's real quote surface accepted. Both added, plus the Double-Edged Shield forum sentence and the datta2019 halves. The checker now covers 41 spans, all passing. Checking the datta2019 sentence exposed a fourth two-column splice, now marked with [...] on the page
elhajjchehade2025_double: wrong reason for excluding Brave. The page said Brave's forum “is not public”; the paper's Appendix B says the posts “do not include the detailed browser filter-list configurations” accepted, moderate. Reworded on the page and in bp_audit.json, and the paper's sentence added to the quote checker
“Announced for new installs on 2019-06-04” was not supported by the cited September post, which says only “June 2019” accepted, minor. The June post was in the reading; it is now cited by URL and quoted directly
Three DOI collisions elsewhere in the 728-entry bibliography (fouad2022my/fouad2022_cookie; two boettger2025_regional-type entries; ahmad2026_ipfp/ahmad2026_more): the same paper twice under two keys, which a key-collision check cannot see accepted as real, deferred, not touched. None of the six keys is cited by this page. Merging them means repointing every page that cites the losing key, and a half-merged bibliography breaks every page that cites a deleted key — so it is a sitting of its own. Filed as a work item on wiki-measuretheweb rather than done here
§15 of this log was an empty header while §14 promised four review passes accepted; you are reading the fix

15.4 What a narrow brief cannot catch

Three defects in this run fell between the focused reviewers' briefs. They are recorded as classes of blind spot, because each one implies a check that is missing rather than a reviewer who was careless.

  • Correct arithmetic on the wrong quantity. The 60.1% Chrome-or-Chromium share was a sum of multi-valued table rows; the figures reviewer re-derived it and confirmed the arithmetic, which was right. A number guard compares a page to a script; it cannot see that the script is computing something the sentence does not mean. Only the distinct-paper roll-up (Q21–Q23) closes it.
  • A claim with no fetchable source, no script output and no paper quote. The ETP Strict row (§15.5) sat in exactly the hole between the three briefs: the currency reviewer had nothing to fetch because SUMO is CAPTCHA-walled, the figures reviewer had no script that produced it, and the citations reviewer had no paper to check it against — so it was the only mechanism cell in the browser table with no citation, and it was wrong. The check that closes this is mechanical: grep the page for every factual cell and ask which of the three passes owns it; the ones nobody owns are the ones to re-derive.
  • A passing checker that does not cover the thing you want checked. bp_quotecheck.mjs reported 32 of 32 while two quotes on the page were absent from its list. Coverage was found by a reviewer reading the page against the checker, not by the checker. The lesson is the same one as for the probes: a green check is a statement about its inputs.

15.5 Generic pass (Fable)

No checklist; briefed to find what the three focused passes were not looking for, and given the target reader. It found the run's worst error, in the one place the other three structurally could not.

Finding Action
The ETP Strict row was factually wrong, and was the only mechanism cell in the browser table with no citation. It said Strict adds “blocking all cross-site cookies”, and the published Firefox snippet's comment said cookieBehavior 1 was “closest to ETP Strict”. The build the page reads for every other Firefox claim says otherwise: browser.contentblocking.features.strict is tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,qps,qpsPBM,fpp,fppPrivate,btp,lnaStrict's cookie behaviour is 5, identical to Standard accepted, and the most serious finding of the run. Verified independently from browser/omni.ja before changing anything. The row is rewritten from the strict string, the code comment is corrected (cookieBehavior 1 is a custom state no ETP preset ships), the strict string is now evidence in §9 (Q-row-equivalent), and a footnote records that Mozilla's user-facing wording describes what partitioning achieves rather than a different cookieBehavior. Blocked versus partitioned is precisely the distinction this page teaches, so getting it backwards was not a detail
This log's evidence sections still asserted three facts that §15 said had been corrected — the Edge narrative in §2.2, the Brave version in §11, the Brave support domain in §11. Someone checking a number lands on the section, not the review log accepted. All three corrected in place with a “corrected in review — see §15.x” marker, so the wrong version and the reason it was wrong both stay visible
An indented line rendered as literal preformatted text, [...] markup and all, because DokuWiki does not parse inline markup inside an indented block. Verified in the live DOM. (The reviewer notes privacy:privacy_sandbox has the same bug, so “match the sibling” was the wrong instinct) accepted. Replaced with a <code> block. The sibling's instance is left alone: not this page's to fix, and flagged here instead
OpenWPM — the field's dominant Firefox harness — was missing from the section whose thesis is “your library has already set the protection state” accepted. A row added saying plainly that it was not examined here and that a third pref-setting layer makes the read-back matter more, not less
No reusable-artifact section, unlike the sibling privacy:privacy_sandbox accepted, and it paid. Ten artefacts listed, every URL fetched: nine resolve, and [5Jueckstock, Jordan; Snyder, Peter; Sarker, Shaown; Kapravelos, Alexandros; Livshits, Benjamin (2022): "Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking", in: Proceedings of the ACM Web Conference. (DOI)]'s Chromium storage-policy patches 404 at the wspr-ncsu URL printed in the paper and live under the first author's account instead. The flagship paper's arm-building code was one dead link from being unfindable
The page preaches read-back but supplied a mechanism for only two of eight arms accepted. A new subsection gives the one recipe that generalises — a canary origin visited first in every arm — and says explicitly that nothing in the corpus does this, so it is a recommendation and not a measured practice
Three claims where confidence outran evidence: the lead's “a good number are not in the state their authors think”; a trend row comparing 2023–2026 with its own subset 2024–2026; “sixteen years” for a seventeen-venue-year corpus all three accepted. The lead now says what the evidence is (tool defaults plus one probe) and that nobody has checked published crawls; the subset row is deleted and the two remaining windows are disjoint; the count is corrected
“Four produced a control arm” flattens a real distinction — three failed silently, one threw a protocol error, and the silence is the hazard accepted. Both the box and the discussion now separate them
One zero with no committed probe: the CDP-command sweep accepted. scripts/bp_cdp_sweep.mjs was already written but had no Q-row and no cross-reference. Q25 added, and the page now points at it. Q24, Q26 and Q27 added for the other three sweeps at the same time
Edge appears five times, twice near-verbatim; and a fourth paragraph under “Three things in that table” is crawl tooling, not table fallout accepted. The Open Questions bullet is cut to a pointer, and the CDP bounce-tracking paragraph is moved into the driving section under its own heading
The driving table does not say which rows are hearsay — only Chromium was exercised, and the admission lived 200 lines away accepted. One sentence above the table
Two sections of this log are scorekeeping: §14's “mistakes caught before any reviewer saw it” and §15.4's “what the focused reviewers did not catch” accepted. Both reframed as failure modes with the check that would close each, which is the reusable part. The reviewer is right that credit allocation is not what a working log is for
“The page does answer its own question” recorded, and the three gaps it named between that and a usable Monday morning (artifacts, read-back, OpenWPM) are the three accepted above

15.6 What no reviewer caught

scripts/prov_embed.py, which re-embeds script output into this page, silently deleted §6 and §7 of this log during a rebuild: an empty <file text …></file> placeholder let its non-greedy body pattern run on to the next block's closing tag and swallow everything between. Caught by counting <file text openers and section headings after the rebuild, not by reading, and not by any review pass — all four had read the file before the damage. The pattern now refuses to cross an opener. The general form: a generator that edits a published page in place needs a structural check after every run, because the failure is a deletion and a deletion leaves nothing to notice.

References

[1]
Datta, Amit; Lu, Jianan; Tschantz, Michael Carl (2019): "Evaluating Anti-Fingerprinting Privacy Enhancing Technologies", in: Proceedings of the ACM Web Conference. (DOI)
[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]
Hausladen, Katherine; Wang, Oliver; Eng, Sophie; Wang, Jocelyn; Wijaya, Francisca; May, Matthew; Zimmeck, Sebastian (2025): "Websites' Global Privacy Control Compliance at Scale and over Time", in: Proceedings of the USENIX Security Symposium. (Link)
[4]
Hoang, Nguyen Phong; Niaki, Arian Akhavan; Gill, Phillipa; Polychronakis, Michalis (2021): "Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting", Proceedings on Privacy Enhancing Technologies 2021(4):420-440. (DOI)
[5]
Jueckstock, Jordan; Snyder, Peter; Sarker, Shaown; Kapravelos, Alexandros; Livshits, Benjamin (2022): "Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking", in: Proceedings of the ACM Web Conference. (DOI)
provenance/privacy/browser_protection.txt · Last modified: by karel.kubicek.claude

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