This is an old revision of the document!
Table of Contents
Provenance: privacy:data_subject_rights
Working notes behind data_subject_rights — every query, the scripts and their unedited output, the hand audit of all 471 candidates, the quote checks, the external sources including the ones that were rejected, and what could not be established. Corpus-level caveats (venue scope, selection funnel, the provisional 2025–2026 years, extraction stability) are on Corpus and are not repeated here.
Written 2026-09-16 against data/extract/run1 of the pdf_fetcher corpus: 5,859 extracted papers, 5,855 with full text on disk, seven venues, 2010–2026.
Comments belong on the content page. Per the convention set by the first of these pages, provenance pages carry no ~~DISCUSSION~~ block.
1. The scripts
| File | What it does | Fails loudly when |
|---|---|---|
scripts/dsr_probe.mjs | fifteen full-text probes over the 5,855 papers with full text; prints per-probe counts, the union, and a per-year table | a tight probe is not a subset of its loose pair |
scripts/dsr_verdicts_build.py | turns the hand audit into scripts/dsr_verdicts.json | any candidate has no verdict, two verdicts, or is both IN and OUT |
scripts/dsr_report.mjs | every figure on the page, each with its denominator | a request-sending paper is missing from the hand-keyed controllers asked table; the instrument categories do not sum to the population; a verdict names a paper that is not in the corpus |
scripts/dsr_ctxdump.mjs | prints, for every candidate, the sentence each core probe matched — the input to the audit | — |
scripts/dsr_quotecheck.py | checks every //"..."// span on the page against its source | a quote is not found, or the page carries a quoted span with no source listed |
2. The probes
There is no enum in the extraction schema for data-subject rights, so the candidate set is a full-text sweep. Fifteen probes, each with a tight pattern (what the count comes from) and a loose superset used only to prove the tight one is a narrowing of the same idea; the script throws if the tight set is not contained in the loose one. The guard fired twice while the probes were being written — portability and authorized_agent both had tight alternations their loose pattern did not cover — which is exactly what it is for.
Probes are split into core (a rights request or an opt-out signal is the thing being named) and context (the surrounding law or a predecessor signal, too noisy to drive a candidate set but useful for recall checks). The candidate set is the union of the core probes.
- dsr_probe-output.txt
corpus: 5859 extracted papers; 5855 with full text on disk (4 without) probe tier tight loose what dsar_phrase core 43 168 a request for a copy of one’s own data erasure core 107 1862 a request to have data erased gpc core 18 34 the Global Privacy Control signal do_not_sell core 56 242 the CCPA/CPRA "Do Not Sell" opt-out surface dnt context 69 119 the Do Not Track header (GPC’s predecessor) portability context 44 1156 a data-export / portability request ccpa_law context 240 262 the California statutes that create the opt-out right gdpr_article context 26 145 the GDPR data-subject-rights articles, named authorized_agent context 26 1709 the CCPA authorised-agent / verifiable-request machinery request_sent core 99 4508 the paper says a request was SENT — the instrument, not the topic account_deletion core 62 5223 account deletion as the user-facing form of the erasure right broker_optout core 32 1266 data-broker / people-search opt-out and removal services optout_tool core 156 423 an industry or site opt-out tool (NAI, DAA/AdChoices, an opt-out page) self_service core 117 4552 the in-product self-service surface people actually use (dashboard, export) usp_string core 26 515 the IAB US Privacy / Global Privacy Platform opt-out strings UNION, core probes only: 471 papers (8.0% of 5855 with full text) UNION, all probes: 623 papers (10.6%) context-only candidates (no core probe fired): 152 year candidates corpus papers share 2010 3 119 2.5% 2011 6 116 5.2% 2012 5 151 3.3% 2013 4 125 3.2% 2014 1 166 0.6% 2015 8 190 4.2% 2016 18 182 9.9% 2017 21 231 9.1% 2018 16 254 6.3% 2019 35 402 8.7% 2020 26 404 6.4% 2021 46 379 12.1% 2022 66 546 12.1% 2023 74 719 10.3% 2024 107 690 15.5% 2025 120 770 15.6% 2026 67 415 16.1%
Three probe defects worth recording, because each one produced a wrong number before it was caught:
\bGPC\bis a homonym. NVIDIA calls a GPU subunit a Graphics Processing Cluster, so a case-sensitive word-boundary match returned 27 papers of which four were GPU side-channel and TEE work. Requiring either the spelled-out Global Privacy Control orGPCwithin 120 characters of a privacy-signal word takes it to 18, all real.- The first “did this paper send requests?” probe matched 3 papers. It required sent/submitted/filed and a request noun in one clause. It missed every DSAR study in the corpus, including Access Denied!, Leave No Data Behind and Revisiting Identification Issues. Six alternations, each added after reading what the previous one missed, take it to 99. A narrow probe here is a recall claim, and the narrow one was false.
- Two probes were added after the first audit was finished.
optout_toolandself_servicewere written because Do Opt-Outs Really Opt Me Out? (CCS 2022) — a paper the page is partly about — fired no core probe at all: the industry opt-out tools it measures are never called “do not sell”. The two probes added 182 candidates and 10 population papers, taking the population from 41 to 51. That is a 20% under-count that survived a complete hand audit of 289 candidates, and there is no reason to think a third blind spot of the same kind does not exist.
3. The inclusion rule, and the audit of all 471 candidates
The rule is on the content page and is repeated here so the verdict file can be read against it: a paper is in if it reports an empirical result produced by, or about, a data-subject-rights request or a machine-readable opt-out signal, in one of five ways — R requests sent to real controllers, S an opt-out signal or setting measured across a population, M a rights mechanism's availability/correctness/usability measured across a population, D research data obtained through an access or export surface, O an observational study of requests other people sent.
Each of the 471 candidates was judged from the sentence its probes matched (printed by dsr_ctxdump.mjs) plus the title. For the 51 that went in, and for roughly 25 borderline cases, the paper's abstract and methodology section were also read. The other ~395 verdicts rest on one matched sentence plus the title — that is a screen, not a reading, and the content page's phrase “hand-auditing all 471” should be read that way. No verdict was defaulted — dsr_verdicts_build.py throws if any candidate is unassigned, precisely so that a canned reason cannot pass itself off as per-paper evidence.
| Verdict | N | Share of 471 |
|---|---|---|
| IN | 51 | 10.8% |
OUT — homonym: the probe matched an unrelated sense (an HTTP request, NVIDIA's GPC, “do not sell” of goods or domains, DNS/cache/stream deletion) | 129 | 27.4% |
OUT — background: names a right in motivation, related work or a reference list; the paper's object is something else | 108 | 22.9% |
OUT — research-ethics: the paper received or honoured requests about its own study, almost always an internet-scanning paper offering an “opt-out request” for its own probes | 53 | 11.3% |
OUT — attitudes: survey or interview on awareness or perception, no request exercised and no mechanism observed | 44 | 9.3% |
OUT — policy-text: measures what a policy or store declaration says about rights → Policies | 34 | 7.2% |
OUT — consent: consent banner or consent withdrawal → Consent | 11 | 2.3% |
OUT — unlearning: right to be forgotten as a machine-learning problem | 10 | 2.1% |
OUT — system: proposes or builds a rights mechanism, measures no deployment | 10 | 2.1% |
OUT — developer-side: studies the controller's implementation side, not the subject's request | 8 | 1.7% |
OUT — takedown: content removal, delisting, blocklist or abuse removal | 7 | 1.5% |
OUT — sok: systematisation; worth reading, measures nothing itself | 3 | 0.6% |
OUT — enforcement: regulator decisions and fines → Legal enforcement | 2 | 0.4% |
OUT — agent-benchmark: the object measured is an LLM agent's capability and a rights task is one item in a wider benchmark | 1 | 0.2% |
The complete verdict map. One row per candidate, with the probes that fired, so any rejection can be checked against the reason:
- dsr_verdicts.tsv
verdict category_or_reason year venue probes_fired title OUT homonym 2010 IMC request_sent Netalyzr: illuminating the edge network. OUT homonym 2010 IMC self_service What happened in my network: mining network events from router syslogs. OUT homonym 2010 USENIX self_service SEPIA: Privacy-Preserving Aggregation of Multi-Domain Network Events and Statistics OUT background 2011 IEEE-SP optout_tool RePriv: Re-imagining Content Personalization and In-browser Privacy. OUT homonym 2011 IMC request_sent,self_service Measurement and analysis of a large scale commercial mobile internet TV system. OUT homonym 2011 IMC self_service Over the top video: the gorilla in cellular networks. OUT homonym 2011 IMC self_service YouTube everywhere: impact of device and infrastructure synergies on user experience. OUT background 2012 CCS dnt,optout_tool Non-tracking web analytics. OUT sok 2012 IEEE-SP dnt,optout_tool Third-Party Web Tracking: Policy and Technology. OUT homonym 2012 USENIX do_not_sell PharmaLeaks: Understanding the Business of Online Pharmaceutical Affiliate Programs OUT homonym 2012 USENIX self_service Throttling Tor Bandwidth Parasites OUT background 2013 CCS optout_tool A footprint of third-party tracking on mobile web. OUT takedown 2013 WWW request_sent,account_deletion The role of web hosting providers in detecting compromised websites. IN S 2014 CCS dnt,optout_tool The Web Never Forgets: Persistent Tracking Mechanisms in the Wild. OUT research-ethics 2015 CCS optout_tool,self_service A Search Engine Backed by Internet-Wide Scanning. OUT homonym 2015 IMC do_not_sell From .academy to .zone: An Analysis of the New TLD Land Rush. OUT background 2015 IMC erasure Location, Location, Location: The Impact of Geolocation on Web Search Personalization. IN S 2015 PETS self_service Automated Experiments on Ad Privacy Settings OUT homonym 2015 USENIX request_sent Cookies Lack Integrity: Real-World Implications OUT background 2015 WWW dnt,optout_tool PriVaricator: Deceiving Fingerprinters with Little White Lies. OUT homonym 2016 CCS account_deletion POSTER: Mapping the Landscape of Large-Scale Vulnerability Notifications. OUT homonym 2016 IEEE-SP account_deletion The Cracked Cookie Jar: HTTP Cookie Hijacking and the Exposure of Private Information. OUT background 2016 IMC optout_tool "Recommended For You": A First Look at Content Recommendation Networks. OUT research-ethics 2016 IMC optout_tool Yarrp'ing the Internet: Randomized High-Speed Active Topology Discovery. OUT research-ethics 2016 IMC optout_tool Zone Poisoning: The How and Where of Non-Secure DNS Dynamic Updates. OUT attitudes 2016 PETS dsar_phrase,erasure,request_sent Access Denied! Contrasting Data Access in the United States and Ireland OUT background 2016 PETS optout_tool Are You Sure You Want to Contact Us? Quantifying the Leakage of PII via Website Contact Forms OUT attitudes 2016 PETS dnt,optout_tool (Do Not) Track Me Sometimes: Users’ Contextual Preferences for Web Tracking OUT homonym 2016 PETS usp_string Flying Eyes and Hidden Controllers: A Qualitative Study of People’s Privacy Perceptions of Civilian Drones in The US OUT policy-text 2016 PETS dsar_phrase Privacy Challenges in the Quantified Self Movement – An EU Perspective OUT background 2016 PETS optout_tool Privacy vs. Reward in Indoor Location-Based Services OUT background 2016 PETS account_deletion Tales from the Dark Side: Privacy Dark Strategies and Privacy Dark Patterns OUT homonym 2016 PETS self_service The Curious Case of the PDF Converter that Likes Mozart: Dissecting and Mitigating the Privacy Risk of Personal Cloud Apps IN O 2016 PETS erasure,authorized_agent,request_sent,broker_optout The Right to be Forgotten in the Media: A Data-Driven Study OUT research-ethics 2016 USENIX optout_tool You've Got Vulnerability: Exploring Effective Vulnerability Notifications OUT homonym 2017 CCS request_sent Quantifying the Pressure of Legal Risks on Third-party Vulnerability Research. OUT research-ethics 2017 IEEE-SP optout_tool Augur: Internet-Wide Detection of Connectivity Disruptions. OUT homonym 2017 IEEE-SP account_deletion Obstacles to the Adoption of Secure Communication Tools. OUT homonym 2017 IMC self_service Email typosquatting. OUT homonym 2017 IMC account_deletion Fifteen minutes of unwanted fame: detecting and characterizing doxing. OUT background 2017 IMC optout_tool If you are not paying for it, you are the product: how much do advertisers pay to reach you? OUT research-ethics 2017 IMC optout_tool Large-scale scanning of TCP's initial window. OUT research-ethics 2017 IMC optout_tool Target generation for internet-wide IPv6 scanning. OUT background 2017 IMC dnt,optout_tool The ad wars: retrospective measurement and analysis of anti-adblock filter lists. OUT homonym 2017 NDSS do_not_sell Are We There Yet? On RPKI’s Deployment and Security OUT homonym 2017 NDSS self_service Catching Worms, Trojan Horses and PUPs: Unsupervised Detection of Silent Delivery Campaigns OUT homonym 2017 NDSS self_service Dissecting Tor Bridges: a Security Evaluation of their Private and Public Infrastructures OUT homonym 2017 PETS usp_string Analyzing Remote Server Locations for Personal Data Transfers in Mobile Apps OUT background 2017 PETS dnt,broker_optout,optout_tool Cross-Device Tracking: Measurement and Disclosures OUT background 2017 PETS optout_tool On the Privacy and Security of the Ultrasound Ecosystem OUT homonym 2017 USENIX request_sent A Longitudinal, End-to-End View of the DNSSEC Ecosystem OUT background 2017 USENIX dnt,optout_tool A Privacy Analysis of Cross-device Tracking OUT homonym 2017 USENIX do_not_sell,request_sent Game of Registrars: An Empirical Analysis of Post-Expiration Domain Name Takeovers OUT homonym 2018 CCS self_service Medical Devices are at Risk: Information Security on Diagnostic Imaging System. OUT homonym 2018 CCS request_sent Rendered Insecure: GPU Side Channel Attacks are Practical. OUT background 2018 IMC optout_tool How Tracking Companies Circumvented Ad Blockers Using WebSockets. OUT research-ethics 2018 IMC optout_tool In the IP of the Beholder: Strategies for Active IPv6 Topology Discovery. OUT homonym 2018 IMC request_sent Where The Light Gets In: Analyzing Web Censorship Mechanisms in India. OUT homonym 2018 PETS self_service Feature Selection for Website Fingerprinting OUT homonym 2018 PETS usp_string Panoptispy: Characterizing Audio and Video Exfiltration from Android Applications OUT background 2018 PETS optout_tool Privacy-preserving Wi-Fi Analytics OUT background 2018 PETS optout_tool Turtles, Locks, and Bathrooms: Understanding Mental Models of Privacy Through Illustration OUT homonym 2018 USENIX request_sent Freezing the Web: A Study of ReDoS Vulnerabilities in JavaScript-based Web Servers OUT policy-text 2018 USENIX dnt,optout_tool Polisis: Automated Analysis and Presentation of Privacy Policies Using Deep Learning OUT policy-text 2018 WWW dnt,optout_tool An Automated Approach to Auditing Disclosure of Third-Party Data Collection in Website Privacy Policies. OUT background 2018 WWW optout_tool The Cost of Digital Advertisement: Comparing User and Advertiser Views. OUT background 2019 CCS optout_tool AdVersarial: Perceptual Ad Blocking meets Adversarial Machine Learning. IN O 2019 CCS erasure,broker_optout Five Years of the Right to be Forgotten. OUT attitudes 2019 CCS dnt,optout_tool,self_service Oh, the Places You've Been! User Reactions to Longitudinal Transparency About Third-Party Web Tracking and Inferencing. OUT consent 2019 CCS dnt,ccpa_law,request_sent,optout_tool (Un)informed Consent: Studying GDPR Consent Notices in the Field. OUT background 2019 IEEE-SP erasure Exploiting Unintended Feature Leakage in Collaborative Learning. OUT background 2019 IMC self_service A Longitudinal Analysis of the ads.txt Standard. OUT research-ethics 2019 IMC optout_tool An End-to-End, Large-Scale Measurement of DNS-over-Encryption: How Far Have We Come? OUT background 2019 NDSS self_service measuring-the-facebook-advertising-ecosystem IN D 2019 NDSS dnt,self_service quantity-vs-quality-evaluating-user-interest-profiles-using-ad-preference-managers OUT homonym 2019 NDSS self_service statistical-privacy-for-streaming-traffic OUT consent 2019 NDSS dnt,portability,optout_tool we-value-your-privacy-now-take-some-cookies-measuring-the-gdprs-impact-on-web-privacy OUT consent 2019 PETS optout_tool 4 Years of EU Cookie Law: Results and Lessons Learned OUT research-ethics 2019 PETS optout_tool Detecting TCP/IP Connections via IPID Hash Collisions OUT background 2019 PETS self_service Investigating sources of PII used in Facebook’s targeted advertising OUT system 2019 PETS erasure,request_sent Lethe: Conceal Content Deletion from Persistent Observers OUT homonym 2019 PETS self_service MAPS: Scaling Privacy Compliance Analysis to a Million Apps OUT background 2019 PETS erasure Privacy Attitudes of Smart Speaker Users OUT attitudes 2019 PETS optout_tool Skip, Skip, Skip, Accept!!!: A Study on the Usability of Smartphone Manufacturer Provided Default Features and User Privacy OUT background 2019 USENIX ccpa_law,optout_tool 50 Ways to Leak Your Data: An Exploration of Apps' Circumvention of the Android Permissions System OUT background 2019 USENIX optout_tool All Things Considered: An Analysis of IoT Devices on Home Networks OUT homonym 2019 USENIX request_sent Leaky Images: Targeted Privacy Attacks in the Web OUT homonym 2019 USENIX self_service Point Break: A Study of Bandwidth Denial-of-Service Attacks against Tor OUT policy-text 2019 USENIX do_not_sell,optout_tool PolicyLint: Investigating Internal Privacy Policy Contradictions on Google Play OUT homonym 2019 USENIX self_service Protecting accounts from credential stuffing with password breach alerting OUT research-ethics 2019 USENIX optout_tool The Betrayal At Cloud City: An Empirical Analysis Of Cloud-Based Mobile Backends OUT background 2019 WWW self_service Auditing Offline Data Brokers via Facebook's Advertising Platform. IN D 2019 WWW portability,self_service Detecting Low Self-Esteem in Youths from Web Search Data. OUT homonym 2019 WWW request_sent Google Dataset Search: Building a search engine for datasets in an open Web ecosystem. OUT takedown 2019 WWW erasure Who Watches the Watchmen: Exploring Complaints on the Web. OUT homonym 2020 CCS broker_optout The Boon and Bane of Cross-Signing: Shedding Light on a Common Practice in Public Key Infrastructures. OUT homonym 2020 CCS request_sent The Cookie Hunter: Automated Black-box Auditing for Web Authentication and Authorization Flaws. OUT homonym 2020 IMC self_service FlashRoute: Efficient Traceroute on a Massive Scale. OUT homonym 2020 IMC self_service Lumos5G: Mapping and Predicting Commercial mmWave 5G Throughput. OUT homonym 2020 IMC account_deletion Turning Up the Dial: the Evolution of a Cybercrime Market Through Set-up, Stable, and Covid-19 Eras. OUT homonym 2020 IMC request_sent When Push Comes to Ads: Measuring the Rise of (Malicious) Push Advertising. OUT policy-text 2020 PETS ccpa_law,account_deletion An Analysis of the Current State of the Consumer Credit Reporting System in China IN R 2020 PETS erasure CanaryTrap: Detecting Data Misuse by Third-Party Apps on Online Social Networks OUT policy-text 2020 PETS request_sent,optout_tool How private is your period?: A systematic analysis of menstrual app privacy policies OUT policy-text 2020 PETS dsar_phrase,portability,optout_tool The Privacy Policy Landscape After the GDPR OUT research-ethics 2020 USENIX optout_tool A Longitudinal and Comprehensive Study of the DANE Ecosystem in Email OUT policy-text 2020 USENIX do_not_sell,ccpa_law Actions Speak Louder than Words: Entity-Sensitive Privacy Policy and Data Flow Analysis with PoliCheck OUT system 2020 USENIX erasure,ccpa_law,account_deletion DELF: Safeguarding deletion correctness in Online Social Networks OUT homonym 2020 USENIX usp_string From Needs to Actions to Secure Apps? The Effect of Requirements and Developer Practices on App Security IN D 2020 USENIX dsar_phrase,ccpa_law,optout_tool,self_service What Twitter Knows: Characterizing Ad Targeting Practices, User Perceptions, and Ad Explanations Through Users' Own Twitter Data OUT policy-text 2020 WWW do_not_sell,ccpa_law,optout_tool Finding a Choice in a Haystack: Automatic Extraction of Opt-Out Statements from Privacy Policy Text. OUT homonym 2020 WWW broker_optout I've Got Your Packages: Harvesting Customers' Delivery Order Information using Package Tracking Number Enumeration Attacks. OUT homonym 2020 WWW ccpa_law,self_service Understanding the Performance Costs and Benefits of Privacy-focused Browser Extensions. OUT policy-text 2021 CCS do_not_sell Consistency Analysis of Data-Usage Purposes in Mobile Apps. OUT research-ethics 2021 CCS optout_tool The Effect of Google Search on Software Security: Unobtrusive Security Interventions via Content Re-ranking. OUT background 2021 IEEE-SP optout_tool Detecting Filter List Evasion with Event-Loop-Turn Granularity JavaScript Signatures. OUT research-ethics 2021 IMC optout_tool Follow the scent: defeating IPv6 prefix rotation privacy. OUT homonym 2021 IMC erasure Risky BIZness: risks derived from registrar name management. OUT research-ethics 2021 IMC optout_tool Third time's not a charm: exploiting SNMPv3 for router fingerprinting. OUT takedown 2021 IMC broker_optout Throttling Twitter: an emerging censorship technique in Russia. OUT homonym 2021 IMC broker_optout Tracing your roots: exploring the TLS trust anchor ecosystem. OUT background 2021 NDSS self_service Awakening the Web’s Sleeper Agents: Misusing Service Workers for Privacy Leakage OUT system 2021 NDSS erasure Deceptive Deletions for Protecting Withdrawn Posts on Social Media Platforms OUT background 2021 NDSS ccpa_law,optout_tool From WHOIS to WHOWAS: A Large-Scale Measurement Study of Domain Registration Privacy under the GDPR OUT system 2021 NDSS erasure,do_not_sell,dnt,portability,ccpa_law,authorized_agent PrivacyFlash Pro: Automating Privacy Policy Generation for Mobile Apps OUT background 2021 NDSS usp_string Understanding Worldwide Private Information Collection on Android OUT policy-text 2021 PETS optout_tool Automated Extraction and Presentation of Data Practices in Privacy Policies IN R 2021 PETS dsar_phrase,erasure,portability,ccpa_law,self_service Data Portability between Online Services: An Empirical Analysis on the Effectiveness of GDPR Art. 20 OUT attitudes 2021 PETS dsar_phrase,erasure,do_not_sell,dnt,ccpa_law Defining Privacy: How Users Interpret Technical Terms in Privacy Policies OUT attitudes 2021 PETS ccpa_law,optout_tool “Did you know this camera tracks your mood?”: Understanding Privacy Expectations and Preferences in the Age of Video Analytics OUT attitudes 2021 PETS request_sent Exploring mental models of the right to informational self-determination of office workers in Germany OUT attitudes 2021 PETS dnt,ccpa_law,optout_tool,self_service Managing Potentially Intrusive Practices in the Browser: A User-Centered Perspective OUT background 2021 PETS self_service ML-CB: Machine Learning Canvas Block IN S 2021 PETS gpc,do_not_sell,dnt,ccpa_law,optout_tool Privacy Preference Signals: Past, Present and Future OUT background 2021 PETS erasure,ccpa_law The Audio Auditor: User-Level Membership Inference in Internet of Things Voice Services OUT attitudes 2021 USENIX dsar_phrase,optout_tool,self_service Are Privacy Dashboards Good for End Users? Evaluating User Perceptions and Reactions to Google's My Activity OUT homonym 2021 USENIX erasure Collective Information Security in Large-Scale Urban Protests: the Case of Hong Kong OUT research-ethics 2021 USENIX optout_tool How Great is the Great Firewall? Measuring China's DNS Censorship OUT attitudes 2021 USENIX account_deletion "Now I'm a bit angry:" Individuals' Awareness, Perception, and Responses to Data Breaches that Affected Them OUT system 2021 USENIX ccpa_law,optout_tool PriSEC: A Privacy Settings Enforcement Controller OUT consent 2021 USENIX ccpa_law,request_sent,optout_tool Share First, Ask Later (or Never?) Studying Violations of GDPR's Explicit Consent in Android Apps IN D 2021 USENIX self_service SocialHEISTing: Understanding Stolen Facebook Accounts OUT research-ethics 2021 USENIX broker_optout Weaponizing Middleboxes for TCP Reflected Amplification OUT homonym 2021 WWW account_deletion An Investigation of Identity-Account Inconsistency in Single Sign-On. OUT attitudes 2021 WWW optout_tool From Personal Data to Digital Legacy: Exploring Conflicts in the Sharing, Security and Privacy of Post-mortem Data. OUT policy-text 2021 WWW portability,ccpa_law,request_sent,optout_tool Have You been Properly Notified? Automatic Compliance Analysis of Privacy Policy Text with GDPR Article 13. OUT policy-text 2021 WWW ccpa_law,optout_tool Privacy Policies over Time: Curation and Analysis of a Million-Document Dataset. OUT background 2022 CCS erasure,ccpa_law,request_sent Collect Responsibly But Deliver Arbitrarily?: A Study on Cross-User Privacy Leakage in Mobile Apps. IN S 2022 CCS dnt,optout_tool Do Opt-Outs Really Opt Me Out? OUT unlearning 2022 CCS erasure Feature Inference Attack on Shapley Values. OUT consent 2022 CCS ccpa_law,request_sent,optout_tool Freely Given Consent?: Studying Consent Notice of Third-Party Tracking and Its Violations of GDPR in Android Apps. OUT homonym 2022 CCS self_service TickTock: Detecting Microphone Status in Laptops Leveraging Electromagnetic Leakage of Clock Signals. OUT homonym 2022 IEEE-SP self_service DEEPCASE: Semi-Supervised Contextual Analysis of Security Events. IN R 2022 IEEE-SP dsar_phrase,account_deletion Scraping Sticky Leftovers: App User Information Left on Servers After Account Deletion. OUT background 2022 IEEE-SP erasure Towards Automated Auditing for Account and Session Management Flaws in Single Sign-On Deployments. OUT homonym 2022 IEEE-SP account_deletion TrollMagnifier: Detecting State-Sponsored Troll Accounts on Reddit. OUT homonym 2022 IMC self_service Are we ready for metaverse?: a measurement study of social virtual reality platforms. OUT homonym 2022 IMC self_service Causal impact of Android go on mobile web performance. OUT research-ethics 2022 IMC optout_tool Deep dive into the IoT backend ecosystem. OUT homonym 2022 IMC optout_tool HTML violations and where to find them: a longitudinal analysis of specification violations in HTML. OUT homonym 2022 IMC request_sent PhishInPatterns: measuring elicited user interactions at scale on phishing websites. OUT homonym 2022 IMC request_sent Toppling top lists: evaluating the accuracy of popular website lists. OUT research-ethics 2022 IMC optout_tool Towards a tectonic traffic shift?: investigating Apple's new relay network. OUT takedown 2022 IMC broker_optout TSPU: Russia's decentralized censorship system. OUT homonym 2022 NDSS self_service A Lightweight IoT Cryptojacking Detection Mechanism in Heterogeneous Smart Home Networks OUT background 2022 NDSS erasure,ccpa_law,self_service HARPO: Learning to Subvert Online Behavioral Advertising OUT unlearning 2022 PETS erasure,ccpa_law,request_sent Athena: Probabilistic Verification of Machine Unlearning OUT background 2022 PETS ccpa_law,optout_tool ATOM: Ad-network Tomography OUT developer-side 2022 PETS gpc,do_not_sell,ccpa_law,optout_tool Charting App Developers’ Journey Through Privacy Regulation Features in Ad Networks OUT homonym 2022 PETS request_sent Collection, usage and privacy of mobility data in the enterprise and public administrations OUT developer-side 2022 PETS do_not_sell,ccpa_law,optout_tool Developers Say the Darnedest Things: Privacy Compliance Processes Followed by Developers of Child-Directed Apps OUT attitudes 2022 PETS request_sent,self_service Employees’ privacy perceptions: exploring the dimensionality and antecedents of personal data sensitivity and willingness to disclose OUT attitudes 2022 PETS dnt,ccpa_law,optout_tool,self_service How Can and Would People Protect From Online Tracking? OUT background 2022 PETS dsar_phrase,erasure,portability,gdpr_article,optout_tool Investigating GDPR Fines in the Light of Data Flows IN M 2022 PETS erasure,ccpa_law,broker_optout,optout_tool “It Feels Like Whack-a-mole”: User Experiences of Data Removal from People Search Websites OUT background 2022 PETS dsar_phrase Keeping Privacy Labels Honest IN R 2022 PETS dsar_phrase,erasure,portability,gdpr_article,request_sent,account_deletion,broker_optout,optout_tool,self_service Leave No Data Behind – Empirical Insights into Data Erasure from Online Services OUT attitudes 2022 PETS self_service On the Challenges of Developing a Concise Questionnaire to Identify Privacy Personas OUT background 2022 PETS dsar_phrase,ccpa_law Personal information inference from voice recordings: User awareness and privacy concerns IN R 2022 PETS dsar_phrase,erasure,ccpa_law,gdpr_article,request_sent Revisiting Identification Issues in GDPR ‘Right Of Access’ Policies: A Technical and Longitudinal Analysis IN M 2022 PETS erasure,do_not_sell,ccpa_law,request_sent,optout_tool,usp_string Setting the Bar Low: Are Websites Complying With the Minimum Requirements of the CCPA? OUT policy-text 2022 PETS dsar_phrase “We may share the number of diaper changes”: A Privacy and Security Analysis of Mobile Child Care Applications OUT background 2022 PETS ccpa_law,optout_tool Who Knows I Like Jelly Beans? An Investigation Into Search Privacy OUT takedown 2022 USENIX ccpa_law,broker_optout A Large-scale Investigation into Geodifferences in Mobile Apps OUT attitudes 2022 USENIX do_not_sell,ccpa_law Caring about Sharing: User Perceptions of Multiparty Data Sharing OUT policy-text 2022 USENIX erasure,do_not_sell,ccpa_law Electronic Monitoring Smartphone Apps: An Analysis of Risks from Technical, Human-Centered, and Legal Perspectives OUT attitudes 2022 USENIX erasure,gdpr_article Empirical Understanding of Deletion Privacy: Experiences, Expectations, and Measures IN M 2022 USENIX dsar_phrase,erasure,ccpa_law,request_sent,account_deletion,optout_tool,self_service How Are Your Zombie Accounts? Understanding Users' Practices and Expectations on Mobile App Account Deletion OUT homonym 2022 USENIX do_not_sell Mistrust Plugins You Must: A Large-Scale Study Of Malicious Plugins In WordPress Marketplaces OUT research-ethics 2022 USENIX request_sent Pre-hijacked accounts: An Empirical Study of Security Failures in User Account Creation on the Web OUT system 2022 USENIX ccpa_law,request_sent PrivGuard: Privacy Regulation Compliance Made Easier OUT attitudes 2022 USENIX self_service Security and Privacy Perceptions of Third-Party Application Access for Google Accounts OUT policy-text 2022 USENIX do_not_sell,ccpa_law,optout_tool Smart Home Privacy Policies Demystified: A Study of Availability, Content, and Coverage OUT homonym 2022 USENIX broker_optout The Security Lottery: Measuring Client-Side Web Security Inconsistencies OUT background 2022 USENIX optout_tool Towards More Robust Keyword Spotting for Voice Assistants IN D 2022 USENIX portability,self_service,usp_string Understanding and Improving Usability of Data Dashboards for Simplified Privacy Control of Voice Assistant Data OUT homonym 2022 WWW request_sent Am I a Real or Fake Celebrity? Evaluating Face Recognition and Verification APIs under Deepfake Impersonation Attack. OUT background 2023 CCS do_not_sell,ccpa_law Comprehension from Chaos: Towards Informed Consent for Private Computation. OUT system 2023 CCS dsar_phrase,erasure,portability,ccpa_law,gdpr_article General Data Protection Runtime: Enforcing Transparent GDPR Compliance for Existing Applications. OUT homonym 2023 CCS self_service "I just stopped using one and started using the other": Motivations, Techniques, and Challenges When Switching Password Managers. OUT research-ethics 2023 CCS request_sent Marketing to Children Through Online Targeted Advertising: Targeting Mechanisms and Legal Aspects. OUT research-ethics 2023 CCS optout_tool Passive SSH Key Compromise via Lattices. OUT policy-text 2023 CCS erasure,portability,ccpa_law,request_sent PolicyChecker: Analyzing the GDPR Completeness of Mobile Apps' Privacy Policies. OUT homonym 2023 CCS optout_tool Poster: Towards a Dataset for the Discrimination between Warranted and Unwarranted Emails. OUT background 2023 CCS erasure Understanding and Detecting Abused Image Hosting Modules as Malicious Services. OUT homonym 2023 CCS account_deletion "We've Disabled MFA for You": An Evaluation of the Security and Usability of Multi-Factor Authentication Recovery Deployments. IN D 2023 IEEE-SP self_service Collaborative Ad Transparency: Promises and Limitations. OUT policy-text 2023 IEEE-SP do_not_sell,request_sent Detection of Inconsistencies in Privacy Practices of Browser Extensions. OUT homonym 2023 IEEE-SP account_deletion "In Eighty Percent of the Cases, I Select the Password for Them": Security and Privacy Challenges, Advice, and Opportunities at Cybercafes in Kenya. OUT homonym 2023 IEEE-SP account_deletion Investigating Package Related Security Threats in Software Registries. OUT research-ethics 2023 IEEE-SP broker_optout "It's up to the Consumer to be Smart": Understanding the Security and Privacy Attitudes of Smart Home Users on Reddit. OUT background 2023 IEEE-SP erasure No Privacy in the Electronics Repair Industry. OUT policy-text 2023 IEEE-SP do_not_sell Protected or Porous: A Comparative Analysis of Threat Detection Capability of IoT Safeguards. OUT homonym 2023 IMC account_deletion Evolving Bots: The New Generation of Comment Bots and their Underlying Scam Campaigns in YouTube. OUT research-ethics 2023 IMC optout_tool Illuminating Router Vendor Diversity Within Providers and Along Network Paths. OUT research-ethics 2023 IMC optout_tool Inferring Changes in Daily Human Activity from Internet Response. OUT research-ethics 2023 IMC optout_tool Pushing Alias Resolution to the Limit. OUT consent 2023 IMC do_not_sell,ccpa_law Thou Shalt Not Reject: Analyzing Accept-Or-Pay Cookie Banners on the Web. OUT system 2023 NDSS dsar_phrase,erasure,do_not_sell,ccpa_law,authorized_agent,request_sent VICEROY: GDPR-/CCPA-compliant Enforcement of Verifiable Accountless Consumer Requests IN M 2023 NDSS erasure,ccpa_law,gdpr_article,self_service CHKPLUG: Checking GDPR Compliance of WordPress Plugins via Cross-language Code Property Graph IN M 2023 PETS do_not_sell,dnt,ccpa_law,request_sent,optout_tool Comparing Large-Scale Privacy and Security Notifications OUT attitudes 2023 PETS erasure Creative beyond TikToks: Investigating Adolescents' Social Privacy Management on TikTok OUT background 2023 PETS request_sent Everybody's Looking for SSOmething: A large-scale evaluation on the privacy of OAuth authentication on the web OUT policy-text 2023 PETS dsar_phrase,erasure,dnt,optout_tool Evolution of Composition, Readability, and Structure of Privacy Policies over Two Decades OUT enforcement 2023 PETS erasure,ccpa_law,request_sent,broker_optout,optout_tool GDPRxiv: Establishing the State of the Art in GDPR Enforcement OUT background 2023 PETS optout_tool Heads in the Clouds? Measuring Universities’ Migration to Public Clouds: Implications for Privacy & Academic Freedom OUT homonym 2023 PETS broker_optout I-GWAS: Privacy-Preserving Interdependent Genome-Wide Association Studies OUT attitudes 2023 PETS self_service Is There a Reverse Privacy Paradox? An Exploratory Analysis of Gaps Between Privacy Perspectives and Privacy-Seeking Behaviors IN R 2023 PETS dsar_phrase,erasure,portability,ccpa_law,gdpr_article,authorized_agent,request_sent,self_service Lessons in VCR Repair: Compliance of Android App Developers with the California Consumer Privacy Act (CCPA) OUT background 2023 PETS account_deletion,self_service No Privacy Among Spies: Assessing the Functionality and Insecurity of Consumer Android Spyware Apps OUT homonym 2023 PETS request_sent Not Your Average App: A Large-scale Privacy Analysis of Android Browsers OUT background 2023 PETS do_not_sell,ccpa_law Privacy Rarely Considered: Exploring Considerations in the Adoption of Third-Party Services by Websites OUT policy-text 2023 PETS optout_tool Researchers’ Experiences in Analyzing Privacy Policies: Challenges and Opportunities OUT attitudes 2023 PETS erasure,ccpa_law Speculative Privacy Concerns about AR Glasses Data Collection OUT attitudes 2023 PETS erasure,portability,ccpa_law,request_sent,optout_tool,self_service 'Surprised, Shocked, Worried': User Reactions to Facebook Data Collection from Third Parties OUT background 2023 PETS self_service Trust TEE?: Exploring the Impact of Trusted Execution Environments on Smart Home Privacy Norms IN S 2023 PETS gpc,do_not_sell,dnt,ccpa_law,authorized_agent,optout_tool,usp_string Usability and Enforceability of Global Privacy Control OUT homonym 2023 USENIX request_sent A Large-Scale Measurement of Website Login Policies OUT research-ethics 2023 USENIX erasure,request_sent Anatomy of a High-Profile Data Breach: Dissecting the Aftermath of a Crypto-Wallet Case OUT consent 2023 USENIX do_not_sell,ccpa_law,authorized_agent,optout_tool Automated Cookie Notice Analysis and Enforcement OUT background 2023 USENIX ccpa_law,self_service Defining "Broken": User Experiences and Remediation Tactics When Ad-Blocking or Tracking-Protection Tools Break a Website’s User Experience OUT research-ethics 2023 USENIX broker_optout How the Great Firewall of China Detects and Blocks Fully Encrypted Traffic OUT attitudes 2023 USENIX account_deletion "I'm going to trust this until it burns me" Parents' Privacy Concerns and Delegation of Trust in K-8 Educational Technology OUT policy-text 2023 USENIX do_not_sell,ccpa_law,request_sent,self_service PoliGraph: Automated Privacy Policy Analysis using Knowledge Graphs OUT homonym 2023 USENIX usp_string Pushed by Accident: A Mixed-Methods Study on Strategies of Handling Secret Information in Source Code Repositories OUT homonym 2023 USENIX account_deletion Squint Hard Enough: Attacking Perceptual Hashing with Adversarial Machine Learning OUT homonym 2023 USENIX account_deletion Strategies and Vulnerabilities of Participants in Venezuelan Influence Operations OUT homonym 2023 USENIX account_deletion The Digital-Safety Risks of Financial Technologies for Survivors of Intimate Partner Violence OUT homonym 2023 WWW request_sent Do NFTs' Owners Really Possess their Assets? A First Look at the NFT-to-Asset Connection Fragility. OUT research-ethics 2023 WWW optout_tool Measuring and Evading Turkmenistan's Internet Censorship: A Case Study in Large-Scale Measurements of a Low-Penetration Country. OUT unlearning 2023 WWW erasure Membership Inference Attacks Against Sequential Recommender Systems. OUT homonym 2023 WWW account_deletion Misbehavior and Account Suspension in an Online Financial Communication Platform. OUT homonym 2024 CCS request_sent Curator Attack: When Blackbox Differential Privacy Auditing Loses Its Power. OUT homonym 2024 CCS account_deletion End-to-End Encrypted Cloud Storage in the Wild: A Broken Ecosystem. OUT unlearning 2024 CCS erasure,ccpa_law,request_sent ERASER: Machine Unlearning in MLaaS via an Inference Serving-Aware Approach. OUT homonym 2024 CCS request_sent Stealing Trust: Unraveling Blind Message Attacks in Web3 Authentication. OUT homonym 2024 CCS account_deletion Toward Understanding the Security of Plugins in Continuous Integration Services. OUT background 2024 CCS do_not_sell Trust, Because You Can't Verify: Privacy and Security Hurdles in Education Technology Acquisition Practices. OUT sok 2024 CCS dsar_phrase,do_not_sell,ccpa_law,gdpr_article,request_sent,self_service Understanding and Addressing Online Tracking: Online Privacy's Regulatory Turn. OUT background 2024 IEEE-SP self_service C-Frame: Characterizing and measuring in-the-wild CAPTCHA attacks. OUT research-ethics 2024 IEEE-SP optout_tool DNSBomb: A New Practical-and-Powerful Pulsing DoS Attack Exploiting DNS Queries-and-Responses. OUT homonym 2024 IEEE-SP broker_optout Practical Attacks Against DNS Reputation Systems. OUT background 2024 IEEE-SP erasure SoK: Safer Digital-Safety Research Involving At-Risk Users. OUT sok 2024 IEEE-SP dsar_phrase,erasure,do_not_sell,portability,ccpa_law,authorized_agent,account_deletion,broker_optout,optout_tool,self_service SoK: Technical Implementation and Human Impact of Internet Privacy Regulations. OUT background 2024 IEEE-SP ccpa_law,optout_tool Targeted and Troublesome: Tracking and Advertising on Children's Websites. OUT policy-text 2024 IEEE-SP ccpa_law,optout_tool Understanding the Privacy Practices of Political Campaigns: A Perspective from the 2020 US Election Websites. IN M 2024 IEEE-SP erasure,do_not_sell,ccpa_law,account_deletion,optout_tool Withdrawing is believing? Detecting Inconsistencies between Withdrawal Choices and Third-party Data Collections in Mobile Apps. OUT homonym 2024 IMC request_sent A First Look at Related Website Sets. OUT policy-text 2024 IMC do_not_sell,account_deletion,optout_tool Analyzing Corporate Privacy Policies using AI Chatbots. OUT background 2024 IMC optout_tool Analyzing the (In)Accessibility of Online Advertisements. OUT background 2024 IMC account_deletion Bounce in the Wild: A Deep Dive into Email Delivery Failures from a Large Email Service Provider. OUT background 2024 IMC ccpa_law,optout_tool Browsing without Third-Party Cookies: What Do You See? OUT background 2024 IMC ccpa_law,usp_string DiffAudit: Auditing Privacy Practices of Online Services for Children and Adolescents. OUT research-ethics 2024 IMC optout_tool Ten Years of ZMap. OUT background 2024 IMC do_not_sell,ccpa_law,optout_tool Watching TV with the Second-Party: A First Look at Automatic Content Recognition Tracking in Smart TVs. OUT homonym 2024 IMC self_service Whatcha Lookin' At: Investigating Third-Party Web Content in Popular Android Apps. OUT unlearning 2024 NDSS request_sent GraphGuard: Detecting and Counteracting Training Data Misuse in Graph Neural Networks OUT homonym 2024 NDSS portability,account_deletion Maginot Line: Assessing a New Cross-app Threat to PII-as-Factor Authentication in Chinese Mobile Apps OUT homonym 2024 NDSS request_sent On Precisely Detecting Censorship Circumvention in Real-World Networks OUT homonym 2024 NDSS account_deletion The Dark Side of E-Commerce: Dropshipping Abuse as a Business Model OUT policy-text 2024 NDSS erasure,do_not_sell,dnt,portability,ccpa_law,authorized_agent,optout_tool,usp_string Towards Automated Regulation Analysis for Effective Privacy Compliance OUT policy-text 2024 PETS dsar_phrase,erasure,gpc,do_not_sell,portability,ccpa_law,gdpr_article,authorized_agent,request_sent,account_deletion,optout_tool,usp_string A Bilingual Longitudinal Analysis of Privacy Policies Measuring the Impacts of the GDPR and the CCPA/CPRA OUT background 2024 PETS erasure,gpc,dnt,ccpa_law Block Cookies, Not Websites: Analysing Mental Models and Usability of the Privacy-Preserving Browser Extension CookieBlock OUT homonym 2024 PETS dnt,request_sent Client-side and Server-side Tracking on Meta: Effectiveness and Accuracy OUT homonym 2024 PETS ccpa_law,request_sent,usp_string Connecting the Dots: Tracing Data Endpoints in IoT Devices OUT attitudes 2024 PETS erasure,ccpa_law Data Safety vs. App Privacy: Comparing the Usability of Android and iOS Privacy Labels OUT attitudes 2024 PETS erasure Decision-based Data Distribution (D³): Enabling Users to Minimize Data Propagation in Privacy-sensitive Scenarios OUT background 2024 PETS do_not_sell Exploring the Privacy Experiences of Closeted Users of Online Dating Services in the US OUT background 2024 PETS erasure,ccpa_law,request_sent GenAIPABench: A Benchmark for Generative AI-based Privacy Assistants IN M 2024 PETS gpc,do_not_sell,dnt,ccpa_law,request_sent,optout_tool Generalizable Active Privacy Choice: Designing a Graphical User Interface for Global Privacy Control OUT attitudes 2024 PETS erasure,do_not_sell,ccpa_law Generational Differences in Understandings of Privacy Terminology OUT attitudes 2024 PETS self_service How Does Connecting Online Activities to Advertising Inferences Impact Privacy Perceptions? IN S 2024 PETS gpc,do_not_sell,dnt,ccpa_law,optout_tool,usp_string Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework OUT background 2024 PETS dsar_phrase,erasure,ccpa_law Mitigating Inference Risks with the NIST Privacy Framework OUT homonym 2024 PETS self_service "My Best Friend's Husband Sees and Knows Everything": A Cross-Contextual and Cross-Country Approach to Understanding Smart Home Privacy IN S 2024 PETS dsar_phrase,do_not_sell,dnt,ccpa_law,request_sent,optout_tool Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy? OUT attitudes 2024 PETS erasure,gdpr_article,broker_optout,self_service Our Data, Our Solutions: A Participatory Approach for Enhancing Privacy in Wearable Activity Tracker Third-Party Apps IN D 2024 PETS ccpa_law,self_service Overprofiling Analysis on Major Internet Players OUT homonym 2024 PETS ccpa_law,broker_optout PrivacyLens: On-Device PII Removal from RGB Images using Thermally-Enhanced Sensing OUT background 2024 PETS self_service Support Personas: A Concept for Tailored Support of Users of Privacy-Enhancing Technologies OUT background 2024 PETS do_not_sell,ccpa_law,gdpr_article,request_sent The Devil is in the Details: Detection, Measurement and Lawfulness of Server-Side Tracking on the Web OUT developer-side 2024 PETS dsar_phrase,erasure,ccpa_law,gdpr_article “Those things are written by lawyers, and programmers are reading that.” Mapping the Communication Gap Between Software Developers and Privacy Experts IN S 2024 PETS erasure,gpc,do_not_sell,dnt,ccpa_law,request_sent,optout_tool,usp_string Two Steps Forward and One Step Back: The Right to Opt-out of Sale under CPRA OUT system 2024 PETS gpc,self_service Website Data Transparency in the Browser OUT background 2024 PETS self_service What Do Privacy Advertisements Communicate to Consumers? OUT attitudes 2024 PETS dnt,ccpa_law,optout_tool,self_service What Does It Mean to Be Creepy? Responses to Visualizations of Personal Browsing Activity, Online Tracking, and Targeted Ads IN R 2024 PETS dsar_phrase,erasure,do_not_sell,ccpa_law,authorized_agent,request_sent,account_deletion,broker_optout What to Expect When You’re Accessing: An Exploration of User Privacy Rights in People Search Websites OUT background 2024 USENIX erasure A Decade of Privacy-Relevant Android App Reviews: Large Scale Trends OUT homonym 2024 USENIX account_deletion A Mixed-Methods Study on User Experiences and Challenges of Recovery Codes for an End-to-End Encrypted Service OUT attitudes 2024 USENIX self_service ATTention Please! An Investigation of the App Tracking Transparency Permission IN R 2024 USENIX dsar_phrase,erasure,portability,ccpa_law,gdpr_article,request_sent,optout_tool,self_service Data Subjects' Reactions to Exercising Their Right of Access OUT attitudes 2024 USENIX erasure "Did They F***ing Consent to That?": Safer Digital Intimacy via Proactive Protection Against Image-Based Sexual Abuse OUT consent 2024 USENIX ccpa_law,optout_tool,usp_string Dissecting Privacy Perspectives of Websites Around the World: "Aceptar Todo, Alle Akzeptieren, Accept All..." OUT attitudes 2024 USENIX erasure,account_deletion Exploring digital security and privacy in relative poverty in Germany through qualitative interviews OUT takedown 2024 USENIX broker_optout Guardians of the Galaxy: Content Moderation in the InterPlanetary File System OUT homonym 2024 USENIX account_deletion "I chose to fight, be brave, and to deal with it": Threat Experiences and Security Practices of Pakistani Content Creators OUT homonym 2024 USENIX portability,account_deletion "I feel physically safe but not politically safe": Understanding the Digital Threats and Safety Practices of OnlyFans Creators OUT background 2024 USENIX erasure,ccpa_law iHunter: Hunting Privacy Violations at Scale in the Software Supply Chain on iOS OUT policy-text 2024 USENIX erasure,do_not_sell,ccpa_law,authorized_agent Is It a Trap? A Large-scale Empirical Study And Comprehensive Assessment of Online Automated Privacy Policy Generators for Mobile Apps OUT research-ethics 2024 USENIX optout_tool LanDscAPe: Exploring LDAP Weaknesses and Data Leaks at Internet Scale OUT developer-side 2024 USENIX dsar_phrase,do_not_sell,ccpa_law Navigating the Privacy Compliance Maze: Understanding Risks with Privacy-Configurable Mobile SDKs OUT research-ethics 2024 USENIX optout_tool ResolverFuzz: Automated Discovery of DNS Resolver Vulnerabilities with Query-Response Fuzzing OUT homonym 2024 USENIX self_service SIMurai: Slicing Through the Complexity of SIM Card Security Research OUT homonym 2024 USENIX erasure Sync+Sync: A Covert Channel Built on fsync with Storage OUT consent 2024 USENIX gpc,do_not_sell,ccpa_law The Effect of Design Patterns on (Present and Future) Cookie Consent Decisions OUT homonym 2024 USENIX self_service Tickets or Privacy? Understand the Ecosystem of Chinese Ticket Grabbing Apps OUT background 2024 USENIX optout_tool Understanding How to Inform Blind and Low-Vision Users about Data Privacy through Privacy Question Answering Assistants OUT consent 2024 WWW gpc,ccpa_law,usp_string A Study of GDPR Compliance under the Transparency and Consent Framework. OUT research-ethics 2024 WWW optout_tool A Worldwide View on the Reachability of Encrypted DNS Services. OUT homonym 2024 WWW account_deletion Identifying Risky Vendors in Cryptocurrency P2P Marketplaces. OUT unlearning 2024 WWW erasure Incentive and Dynamic Client Selection for Federated Unlearning. IN D 2024 WWW dsar_phrase,request_sent TikTok and the Art of Personalization: Investigating Exploration and Exploitation on Social Media Feeds. OUT background 2025 CCS ccpa_law,optout_tool Automatically Detecting Online Deceptive Patterns. OUT background 2025 CCS dnt,ccpa_law,self_service Exploiting the Shared Storage API. IN R 2025 CCS dsar_phrase,portability,ccpa_law,gdpr_article,request_sent,self_service Hidden in Plain Bytes: Investigating Interpersonal Account Compromise with Data Exports. OUT homonym 2025 CCS account_deletion How to Design Secure Honey Vault Schemes. OUT research-ethics 2025 CCS optout_tool In the DOM We Trust: Exploring the Hidden Dangers of Reading from the DOM on the Web. IN M 2025 CCS gpc,do_not_sell,ccpa_law,request_sent,optout_tool,self_service Layered, Overlapping, and Inconsistent: A Large-Scale Analysis of the Multiple Privacy Policies and Controls of U.S. Banks. OUT homonym 2025 CCS account_deletion Phishing Susceptibility and the (In-)Effectiveness of Common Anti-Phishing Interventions in a Large University Hospital. OUT research-ethics 2025 CCS optout_tool RebirthDay Attack: Reviving DNS Cache Poisoning with the Birthday Paradox. OUT background 2025 CCS optout_tool The Odyssey of robots.txt Governance: Measuring Convention Implications of Web Bots in Large Language Model Services. OUT background 2025 IEEE-SP ccpa_law,self_service A Big Step Forward? A User-Centric Examination of iOS App Privacy Report and Enhancements. OUT research-ethics 2025 IEEE-SP optout_tool Beyond the Horizon: Uncovering Hosts and Services Behind Misconfigured Firewalls. OUT homonym 2025 IEEE-SP account_deletion (Blind) Users Really Do Heed Aural Telephone Scam Warnings. OUT background 2025 IEEE-SP ccpa_law,self_service Characterizing the Usability and Usefulness of U.S. Ad Transparency Systems. OUT homonym 2025 IEEE-SP self_service Differentially Private Release of Israel's National Registry of Live Births. OUT research-ethics 2025 IEEE-SP optout_tool Is Nobody There? Good! Globally Measuring Connection Tampering Without Responsive Endhosts. OUT background 2025 IEEE-SP request_sent "It's been Lovely Watching you": Institutional Decision-Making on Online Proctoring Software. OUT homonym 2025 IEEE-SP request_sent Mind the Location Leakage in LEO Direct-to-Cell Satellite Networks. OUT background 2025 IEEE-SP broker_optout SoK: A Framework and Guide for Human-Centered Threat Modeling in Security and Privacy Research. OUT research-ethics 2025 IEEE-SP erasure,request_sent SoK: A Privacy Framework for Security Research Using Social Media Data. OUT background 2025 IEEE-SP erasure SoK: Self-Generated Nudes over Private Chats: How can Technology Contribute to a Safer Sexting? OUT developer-side 2025 IEEE-SP dsar_phrase,erasure,ccpa_law,gdpr_article "Sorry for Bugging you so much." Exploring Developers' Behavior Towards Privacy-Compliant Implementation. OUT background 2025 IEEE-SP optout_tool Teaching Data Science Students to Sketch Privacy Designs Through Heuristics. OUT attitudes 2025 IEEE-SP erasure,request_sent,account_deletion Understanding Users' Security and Privacy Concerns and Attitudes Towards Conversational AI Platforms. OUT background 2025 IMC ccpa_law,request_sent An In-Depth Investigation of Data Collection in LLM App Ecosystems. OUT homonym 2025 IMC self_service Automated, Cross-Layer Root Cause Analysis of 5G Video-Conferencing Quality Degradation. OUT background 2025 IMC ccpa_law,usp_string $CookieGuard: $ Characterizing and Isolating the First-Party Cookie Jar. IN R 2025 IMC erasure,request_sent From Voice to Ads: Auditing Commercial Smart Speakers for Targeted Advertising based on Voice Characteristics. OUT homonym 2025 IMC erasure,optout_tool Measuring the deployment of DNSSEC Bootstrapping Using Authenticated Signals. OUT homonym 2025 IMC self_service Replication: Performance of Cellular Networks on the Wheels. OUT background 2025 IMC self_service Scrapers Selectively Respect robots.txt Directives: Evidence From a Large-Scale Empirical Study. OUT background 2025 IMC gpc,ccpa_law,usp_string Somesite I Used To Crawl: Awareness, Agency and Efficacy in Protecting Content Creators From AI Crawlers. OUT homonym 2025 IMC self_service The Decentralization Dilemma: Performance Trade-Offs in IPFS and Breakpoints. OUT research-ethics 2025 IMC optout_tool Time To Scan: Digging into NTP-based IPv6 Scanning. OUT research-ethics 2025 IMC optout_tool Tracking Internet Disruptions in Ukraine: Insights from Three Years of Active Full Block Scans. OUT research-ethics 2025 NDSS optout_tool A Large-Scale Measurement Study of the PROXY Protocol and its Security Implications OUT attitudes 2025 NDSS ccpa_law,authorized_agent,self_service Balancing Privacy and Data Utilization: A Comparative Vignette Study on User Acceptance of Data Trustees in Germany and the US OUT homonym 2025 NDSS broker_optout HADES Attack: Understanding and Evaluating Manipulation Risks of Email Blocklists OUT policy-text 2025 NDSS dnt,optout_tool PolicyPulse: Precision Semantic Role Extraction for Enhanced Privacy Policy Comprehension OUT unlearning 2025 NDSS erasure,broker_optout Reinforcement Unlearning OUT attitudes 2025 NDSS self_service Transparency or Information Overload? Evaluating Users’ Comprehension and Perceptions of the iOS App Privacy Report OUT research-ethics 2025 NDSS optout_tool Wallbleed: A Memory Disclosure Vulnerability in the Great Firewall of China OUT homonym 2025 NDSS ccpa_law,account_deletion,self_service ”Who is Trying to Access My Account?” Exploring User Perceptions and Reactions to Risk-based Authentication Notifications OUT background 2025 PETS erasure,account_deletion Can Social Media Privacy and Safety Features Protect Targets of Interpersonal Attacks? A Systematic Analysis IN R 2025 PETS dsar_phrase,ccpa_law,optout_tool,self_service Echoes of Privacy: Uncovering the Profiling Practices of Voice Assistants IN M 2025 PETS erasure,account_deletion ``Erasing the Echo'': The Usability of Data Deletion in Smart Personal Assistants OUT attitudes 2025 PETS erasure,do_not_sell,ccpa_law,optout_tool Evaluating a Data Fiduciary Standard for Privacy: Developer and End-user Perspectives OUT attitudes 2025 PETS erasure,do_not_sell,ccpa_law "Free WiFi is not ultimately free": Privacy Perceptions of Users in the US regarding City-wide WiFi Services OUT attitudes 2025 PETS erasure,portability,ccpa_law,self_service Gig Work at What Cost? Exploring Privacy Risks of Gig Work Platform Participation in the U.S. OUT attitudes 2025 PETS erasure,gdpr_article,account_deletion,optout_tool,self_service Hoovered up as a data point: Exploring Privacy Behaviours, Awareness, and Concerns Among UK Users of LLM-based Conversational Agents IN S 2025 PETS gpc,ccpa_law,request_sent,optout_tool Intractable Cookie Crumbs: Unveiling the Nexus of Stateful Banner Interaction and Tracking Cookies OUT consent 2025 PETS erasure,ccpa_law,request_sent,account_deletion,optout_tool Johnny Can’t Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web OUT system 2025 PETS dsar_phrase,erasure,portability,gdpr_article,request_sent,self_service Making Web Applications GDPR Compliant: A Comparative Evaluation of GDPR-Enforcement Frameworks IN R 2025 PETS ccpa_law,request_sent,broker_optout,optout_tool Measuring the Accuracy and Effectiveness of PII Removal Services OUT attitudes 2025 PETS self_service Misalignments and Demographic Differences in Expected and Actual Privacy Settings on Facebook IN S 2025 PETS self_service More and Scammier Ads: The Perils of YouTube's Ad Privacy Settings OUT attitudes 2025 PETS optout_tool,self_service Privacy Perceptions and Behaviors Towards Targeted Advertising on Social Media: A Cross-Country Study on the Effect of Culture and Religion OUT background 2025 PETS erasure Real-World Deniability in Messaging OUT background 2025 PETS optout_tool Sheep's clothing, wolfish intent: Automated detection and evaluation of problematic 'allowed' advertisements OUT policy-text 2025 PETS erasure,request_sent Surveillance Disguised as Protection: A Comparative Analysis of Sideloaded and In-Store Parental Control Apps OUT unlearning 2025 PETS erasure,ccpa_law Unlearning Clients, Features and Samples in Vertical Federated Learning OUT attitudes 2025 PETS erasure,ccpa_law "What are they gonna do with my data?": Privacy Expectations, Concerns, and Behaviors in Virtual Reality OUT background 2025 PETS do_not_sell Your Signal, Their Data: An Empirical Privacy Analysis of Wireless-scanning SDKs in Android OUT background 2025 USENIX erasure,ccpa_law,request_sent,account_deletion A Stakeholder-Based Framework to Highlight Tensions when Implementing Privacy Features OUT background 2025 USENIX self_service Abusability of Automation Apps in Intimate Partner Violence IN R 2025 USENIX dsar_phrase,erasure,portability,ccpa_law,gdpr_article,request_sent,self_service Addressing the Address Books' (Interdependent) Privacy Issues OUT background 2025 USENIX account_deletion Analyzing the AI Nudification Application Ecosystem IN D 2025 USENIX portability,self_service As Advertised? Understanding the Impact of Influencer VPN Ads OUT takedown 2025 USENIX broker_optout Assessing the Aftermath: the Effects of a Global Takedown against DDoS-for-hire Services OUT research-ethics 2025 USENIX optout_tool Catch-22: Uncovering Compromised Hosts using SSH Public Keys OUT homonym 2025 USENIX erasure eSIMplicity or eSIMplification? Privacy and Security Risks in the eSIM Ecosystem OUT policy-text 2025 USENIX erasure,gpc,dnt,portability,ccpa_law,authorized_agent,request_sent,optout_tool,usp_string Evaluating Privacy Policies under Modern Privacy Laws At Scale: An LLM-Based Automated Approach OUT homonym 2025 USENIX request_sent "Helps me Take the Post With a Grain of Salt:" Soft Moderation Effects on Accuracy Perceptions and Sharing Intentions of Inauthentic Political Content on X OUT homonym 2025 USENIX self_service Hercules Droidot and the murder on the JNI Express OUT research-ethics 2025 USENIX optout_tool IRBlock: A Large-Scale Measurement Study of the Great Firewall of Iran OUT homonym 2025 USENIX erasure Misty Registry: An Empirical Study of Flawed Domain Registry Operation IN R 2025 USENIX dsar_phrase,erasure,portability,ccpa_law,gdpr_article,request_sent,account_deletion No Way to Sign Out? Unpacking Non-Compliance with Google Play's App Account Deletion Requirements OUT homonym 2025 USENIX account_deletion "Please don't send that bot anything": A Mixed-methods Study of Personal Impersonation Attacks Targeting Digital Payments on Social Media OUT enforcement 2025 USENIX ccpa_law,usp_string Privacy Law Enforcement Under Centralized Governance: A Qualitative Analysis of Four Years' Special Privacy Rectification Campaigns OUT unlearning 2025 USENIX erasure,gdpr_article,broker_optout Rectifying Privacy and Efficacy Measurements in Machine Unlearning: A New Inference Attack Perspective OUT background 2025 USENIX dsar_phrase,request_sent Regulating Smart Device Support Periods: User Expectations and the European Cyber Resilience Act OUT research-ethics 2025 USENIX optout_tool S/MINE: Collecting and Analyzing S/MIME Certificates at Scale OUT background 2025 USENIX self_service TapTrap: Animation-Driven Tapjacking on Android IN S 2025 USENIX gpc,do_not_sell,dnt,ccpa_law,authorized_agent,request_sent,optout_tool,usp_string Websites' Global Privacy Control Compliance at Scale and over Time OUT homonym 2025 WWW request_sent 50 Shades of Deceptive Patterns: A Unified Taxonomy, Multimodal Detection, and Security Implications. OUT background 2025 WWW ccpa_law,optout_tool Assessing Compliance in Digital Advertising: A Deep Dive into Acceptable Ads Standards. OUT unlearning 2025 WWW erasure Dynamic Graph Unlearning: A General and Efficient Post-Processing Method via Gradient Transformation. OUT policy-text 2025 WWW account_deletion Harmful Terms and Where to Find Them: Measuring and Modeling Unfavorable Financial Terms and Conditions in Shopping Websites at Scale. OUT background 2025 WWW ccpa_law,optout_tool The First Early Evidence of the Use of Browser Fingerprinting for Online Tracking. OUT homonym 2025 WWW dnt,self_service Unveiling Network Performance in the Wild: An Ad-Driven Analysis of Mobile Download Speeds. IN R 2026 IEEE-SP dsar_phrase,erasure,portability,ccpa_law,authorized_agent,request_sent,broker_optout,self_service Consumer Beware! Exploring Data Brokers' CCPA Compliance. OUT developer-side 2026 IEEE-SP portability,ccpa_law,account_deletion Privacy Perspectives and Practices of Chinese Smart Home Product Teams. IN R 2026 IEEE-SP dsar_phrase,portability,gdpr_article,request_sent,account_deletion,self_service Setting the Course, but Forgetting to Steer: Analyzing Compliance with GDPR's Right of Access to Data by Instagram, TikTok, and Youtube. OUT research-ethics 2026 NDSS optout_tool Actively Understanding the Dynamics and Risks of the Threat Intelligence Ecosystem OUT homonym 2026 NDSS self_service Crack in the Armor: Underlying Infrastructure Threats to RPKI Publication Point Reachability OUT research-ethics 2026 NDSS erasure FLIPPYRAM: A Large-Scale Study of Rowhammer Prevalence OUT homonym 2026 NDSS account_deletion Hey there! You are using WhatsApp: Enumerating Three Billion Accounts for Security and Privacy OUT background 2026 NDSS gpc MVPNalyzer: An Investigative Framework for Auditing the Security & Privacy of Mobile VPNs OUT homonym 2026 NDSS self_service Pruning the Tree: Rethinking RPKI Architecture from the Ground up OUT background 2026 NDSS erasure SoK: Cryptographic Authenticated Dictionaries OUT homonym 2026 NDSS self_service The Heat is On: Understanding and Mitigating Vulnerabilities of Thermal Image Perception in Autonomous Systems OUT homonym 2026 NDSS self_service Understanding the Stealthy BGP Hijacking Risk in the ROV Era OUT background 2026 PETS ccpa_law,self_service A Year Under the DSA: Ad Transparency's Uneven Landscape OUT background 2026 PETS self_service Ad Personalization and Transparency in Mobile Ecosystems: A Comparative Analysis of Google's and Apple's EU App Stores OUT background 2026 PETS dnt,self_service Analyzing Societal Awareness and Perception of Digital Fingerprinting and Fingerprinting Countermeasures OUT attitudes 2026 PETS dnt,ccpa_law,self_service Are Bite-Size Data Safety Details a Healthy Diet for Android Telehealth App Users? Impacts of Privacy Nutrition Labels on Users’ Privacy Perceptions OUT policy-text 2026 PETS ccpa_law,account_deletion AudAgent: Automated Auditing of Privacy Policy Compliance in AI Agents OUT attitudes 2026 PETS erasure Bot Among Us: Exploring User Awareness and Privacy Concerns About Chatbots in Group Chats OUT research-ethics 2026 PETS erasure,optout_tool Designing Reflective Thinking-Based Contextual Privacy Policy for Mobile Applications IN S 2026 PETS gpc,do_not_sell,dnt,ccpa_law,request_sent,optout_tool,usp_string Exercising the CCPA Opt-out Right on Android: Legally Mandated but Practically Challenging OUT homonym 2026 PETS request_sent From Syntactic Matching to Taint Tracking and Back: A Comparative Study of Web Tracking Detection Techniques OUT homonym 2026 PETS usp_string Gaze3P: Gaze-Based Prediction of User-Perceived Privacy OUT background 2026 PETS dsar_phrase How Experts Personalize Privacy & Security Advice for At-Risk Users OUT attitudes 2026 PETS erasure,ccpa_law,optout_tool “I don’t think it needs to be political”: Privacy Experiences and Concerns of FemHealth App Users in the United States OUT homonym 2026 PETS self_service Location-Enhanced Information Flow for Home Automations OUT background 2026 PETS optout_tool More Modalities, More Problems: Examining User Understanding of The Meta Quest Permissions Framework OUT background 2026 PETS erasure,do_not_sell,ccpa_law No Privacy for Privates: How Military Communities Experience and Perceive the Privacy Risks of Military-Marketed Mobile Apps IN M 2026 PETS dsar_phrase,do_not_sell,ccpa_law,gdpr_article,authorized_agent,request_sent,broker_optout,optout_tool On the Suitability of LLM-Driven Agents for Dark Pattern Audits OUT policy-text 2026 PETS erasure,portability,ccpa_law,gdpr_article,optout_tool Overcoming Language Barriers: Multilingual Analysis of the 2023 Swiss Privacy Law’s Impact OUT background 2026 PETS self_service Personal Data Flows and Privacy Policy Traceability in Third-party LLM Apps in the GPT Ecosystem OUT background 2026 PETS dsar_phrase,erasure The PET Paradox: How Amazon Instrumentalises PETs in Sidewalk to Entrench Its Infrastructural Power OUT developer-side 2026 PETS dsar_phrase,erasure,ccpa_law,request_sent,usp_string The Role of Online Forums in Developer Understanding of Privacy Law - A Reddit Case Study OUT background 2026 PETS request_sent The TCF doesn’t really A(A)ID – Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications OUT developer-side 2026 PETS ccpa_law,account_deletion,self_service ``Users are worried, but we are confused'': Exploring the Privacy, Security, and Safety Perspectives and Practices of FemHealth App Product Team Members OUT homonym 2026 PETS request_sent Waterfall: A Capsule-Based Framework for Evaluating Traffic Watermarking in Anonymity Systems OUT agent-benchmark 2026 PETS do_not_sell,ccpa_law,account_deletion,optout_tool WebSP-Eval: Evaluating Web Agents on Website Security and Privacy Tasks OUT policy-text 2026 PETS erasure,portability Word-level Annotation of GDPR Transparency Compliance in Privacy Policies using Large Language Models OUT research-ethics 2026 USENIX optout_tool A Large-Scale Study of Personalized Phishing using Large Language Models OUT homonym 2026 USENIX self_service Assessing LLM Response Quality in the Context of Technology-Facilitated Abuse OUT research-ethics 2026 USENIX optout_tool DaLens: Charting DNS Self-Amplification Threats at Large OUT homonym 2026 USENIX account_deletion Digital Risks and Coping Practices among Roblox Game Creators OUT homonym 2026 USENIX usp_string End-to-End Encrypted Collaborative Documents OUT background 2026 USENIX self_service Inconsistent, Incomplete, and Insecure: A Survey of Account Security Interfaces OUT homonym 2026 USENIX erasure Invariant-Guided Logical Testing of Open RAN Controllers OUT background 2026 USENIX account_deletion Security and Privacy Analysis of Tile's Location Tracking Protocol IN D 2026 WWW dsar_phrase,gdpr_article,request_sent Bowling with ChatGPT: On the Evolving User Interactions with Conversational AI Systems. IN R 2026 WWW gdpr_article,request_sent,self_service Does Ad-Free Mean Less Data Collection? An Empirical Study of Platform Data Practices and User Expectations. OUT background 2026 WWW self_service Does This Button Work? Investigating YouTube's Ineffective User Controls. OUT research-ethics 2026 WWW optout_tool Tracking the Stray Sheep: Understanding DNS Response Manipulation in the Wild. OUT research-ethics 2026 WWW broker_optout Unveiling the Resilience of LLM-Enhanced Search Engines against Black-Hat SEO Manipulation.
4. Every figure, with its query
scripts/dsr_report.mjs, run against data/extract/run1 on 2026-09-16. Unedited:
- dsr_report-output.txt
corpus: 5859 extracted papers (7 venues, 2010-2026) candidates from the full-text sweep: 471 population after hand audit: 51 papers precision of the candidate sweep: 10.8% share of the corpus: 0.9% 1. The population by category of instrument (N = 51) ---------------------------------------------------- R sent requests to real controllers 17 33.3% S measured an opt-out signal or setting 12 23.5% M measured a rights mechanism across a population 10 19.6% D research dataset obtained via access / export 10 19.6% O observational study of requests others sent 2 3.9% 2. Why the candidate sweep is mostly noise (N = 420 rejected) ------------------------------------------------------------- homonym 129 30.7% background 108 25.7% research-ethics 53 12.6% attitudes 44 10.5% policy-text 34 8.1% consent 11 2.6% unlearning 10 2.4% system 10 2.4% developer-side 8 1.9% takedown 7 1.7% sok 3 0.7% enforcement 2 0.5% agent-benchmark 1 0.2% 3. Per year. 2025-2026 are PROVISIONAL venue-years (see literature:corpus) -------------------------------------------------------------------------- year population candidates corpus share of corpus 2010 0 3 119 0.0% 2011 0 4 116 0.0% 2012 0 4 151 0.0% 2013 0 2 125 0.0% 2014 1 1 166 0.6% 2015 1 6 190 0.5% 2016 1 15 182 0.5% 2017 0 18 231 0.0% 2018 0 13 254 0.0% 2019 3 29 402 0.7% 2020 2 18 404 0.5% 2021 3 34 379 0.8% 2022 8 50 546 1.5% 2023 5 55 719 0.7% 2024 9 80 690 1.3% 2025 12 89 770 1.6% 2026 6 50 415 1.4% 2010-2020: 8 papers 2021-2026: 43 papers 4. Per venue, against each venue’s own size ------------------------------------------- venue population venue papers share of that venue PETS 25 510 4.9% USENIX 9 1410 0.6% CCS 5 990 0.5% IEEE-SP 5 767 0.7% WWW 4 843 0.5% NDSS 2 701 0.3% IMC 1 638 0.2% 5. What the roadmap’s title-and-summary probe was worth ------------------------------------------------------- title+summary candidates: 9 of those, in the population: 9 (precision 100.0%) of the population, caught: 9/51 (recall 17.6%) the title probe MISSES these population papers: 2014 CCS [S] The Web Never Forgets: Persistent Tracking Mechanisms in the Wild. 2015 PETS [S] Automated Experiments on Ad Privacy Settings 2019 NDSS [D] quantity-vs-quality-evaluating-user-interest-profiles-using-ad-preference-managers 2019 WWW [D] Detecting Low Self-Esteem in Youths from Web Search Data. 2020 PETS [R] CanaryTrap: Detecting Data Misuse by Third-Party Apps on Online Social Networks 2020 USENIX [D] What Twitter Knows: Characterizing Ad Targeting Practices, User Perceptions, and Ad Explanations Through Users' Own Twitter Data 2021 PETS [S] Privacy Preference Signals: Past, Present and Future 2021 PETS [R] Data Portability between Online Services: An Empirical Analysis on the Effectiveness of GDPR Art. 20 2021 USENIX [D] SocialHEISTing: Understanding Stolen Facebook Accounts 2022 CCS [S] Do Opt-Outs Really Opt Me Out? 2022 PETS [M] “It Feels Like Whack-a-mole”: User Experiences of Data Removal from People Search Websites 2022 PETS [R] Leave No Data Behind – Empirical Insights into Data Erasure from Online Services 2022 PETS [R] Revisiting Identification Issues in GDPR ‘Right Of Access’ Policies: A Technical and Longitudinal Analysis 2022 PETS [M] Setting the Bar Low: Are Websites Complying With the Minimum Requirements of the CCPA? 2022 USENIX [M] How Are Your Zombie Accounts? Understanding Users' Practices and Expectations on Mobile App Account Deletion 2022 USENIX [D] Understanding and Improving Usability of Data Dashboards for Simplified Privacy Control of Voice Assistant Data 2022 IEEE-SP [R] Scraping Sticky Leftovers: App User Information Left on Servers After Account Deletion. 2023 PETS [R] Lessons in VCR Repair: Compliance of Android App Developers with the California Consumer Privacy Act (CCPA) 2023 NDSS [M] CHKPLUG: Checking GDPR Compliance of WordPress Plugins via Cross-language Code Property Graph 2023 PETS [M] Comparing Large-Scale Privacy and Security Notifications 2023 IEEE-SP [D] Collaborative Ad Transparency: Promises and Limitations. 2024 PETS [S] Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework 2024 PETS [R] What to Expect When You’re Accessing: An Exploration of User Privacy Rights in People Search Websites 2024 PETS [D] Overprofiling Analysis on Major Internet Players 2024 USENIX [R] Data Subjects' Reactions to Exercising Their Right of Access 2024 PETS [S] Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy? 2024 WWW [D] TikTok and the Art of Personalization: Investigating Exploration and Exploitation on Social Media Feeds. 2024 IEEE-SP [M] Withdrawing is believing? Detecting Inconsistencies between Withdrawal Choices and Third-party Data Collections in Mobile Apps. 2025 CCS [R] Hidden in Plain Bytes: Investigating Interpersonal Account Compromise with Data Exports. 2025 PETS [R] Echoes of Privacy: Uncovering the Profiling Practices of Voice Assistants 2025 PETS [S] More and Scammier Ads: The Perils of YouTube's Ad Privacy Settings 2025 IMC [R] From Voice to Ads: Auditing Commercial Smart Speakers for Targeted Advertising based on Voice Characteristics. 2025 USENIX [D] As Advertised? Understanding the Impact of Influencer VPN Ads 2025 USENIX [R] Addressing the Address Books' (Interdependent) Privacy Issues 2025 PETS [M] ``Erasing the Echo'': The Usability of Data Deletion in Smart Personal Assistants 2025 USENIX [R] No Way to Sign Out? Unpacking Non-Compliance with Google Play's App Account Deletion Requirements 2025 PETS [R] Measuring the Accuracy and Effectiveness of PII Removal Services 2026 IEEE-SP [R] Consumer Beware! Exploring Data Brokers' CCPA Compliance. 2026 WWW [D] Bowling with ChatGPT: On the Evolving User Interactions with Conversational AI Systems. 2026 WWW [R] Does Ad-Free Mean Less Data Collection? An Empirical Study of Platform Data Practices and User Expectations. 2026 IEEE-SP [R] Setting the Course, but Forgetting to Steer: Analyzing Compliance with GDPR's Right of Access to Data by Instagram, TikTok, and Youtube. 2026 PETS [M] On the Suitability of LLM-Driven Agents for Dark Pattern Audits the title probe returns these NON-population papers: 6. How big is the sample when a human sends the requests? --------------------------------------------------------- 17 papers sent requests. Controllers asked, hand-keyed from each paper: year venue asked what 2020 PETS 100 third-party Facebook apps sent a data-deletion request: 87 by email, 13 through a contact form. "Only 52% of the apps (45 out of 87) responded back to our requests" counts only the emailed 87 2021 PETS 182 online services sent an Art. 20 export request ("135 of 182 services (74.2%)") 2022 PETS 90 online services ("we investigated the data deletion practices of a sample of 90 online services") 2022 PETS 40 organisations re-evaluated in 2021, by registered letter, under 5 assumed subject identities 2022 IEEE-SP 678 apps with their own sign-up, out of 1,435 analysed: account created, then deleted, by hand 2023 PETS 109 of 160 selected Android apps -- the subset whose privacy policies carried CCPA disclosures -- sent a verifiable consumer request: "We then submitted VCRs to these 109 companies". 160 is the number selected, not the number asked 2024 PETS 20 people-search websites, access and removal attempted by four researchers 2024 USENIX - 33 participants requested their own exports; 801 files. Controllers are not enumerated 2025 CCS 6 services (Apple iCloud, Google, Facebook, Instagram, Snapchat, Discord), 12 researcher accounts 2025 PETS 2 Amazon and Apple, DSARs used to discover the interest labels to target; 200 fresh accounts 2025 IMC 1 Amazon, asked for the puppet accounts’ advertising data as a cross-check on the audit 2025 USENIX 5 address-book service providers sent a data-access request ("No provider supplied the requested contact-card data") 2025 USENIX 494 apps whose deletion method was classified, out of 863 with deletion-link data 2025 PETS 4 paid PII-removal services subscribed to by 71 participants, which then send the opt-outs on their behalf. The paper surveys 10 services, which "cover a total of 1,759 unique data brokers"; its abstract says 2,024, and the body sentence is the one used 2026 IEEE-SP 454 of the 543 registered California data brokers (84%; the rest were excluded), each sent a verifiable consumer request by hand: "In total, 9 hours and 57 minutes were spent submitting VCRs to all 454 DBRs" 2026 WWW 6 author-owned platform accounts; Art. 15(3) requests before and after taking an ad-free subscription 2026 IEEE-SP 3 platforms (Instagram, TikTok, YouTube), via sock-puppet accounts and 80 recruited participants a number is stated for 16 of 17 median 30 min 1 max 678 at or below 100: 11 of 16 BASE RATE: of the 1120 corpus papers that ran a crawl, 603 state a site-or-domain population[].n; their median is 10000. 7. Is it an annotation problem? (share with humanAnnotation, vs the corpus) --------------------------------------------------------------------------- population : 43/51 84.3% corpus base rate : 3318/5859 56.6% of those that annotated, share stating an agreement metric: population : 16/43 37.2% corpus base rate : 512/3318 15.4% 8. Ethics review, against the corpus base rate for the same field ----------------------------------------------------------------- population, empirical : 32/51 62.7% state a review outcome corpus base rate : 1728/5118 33.8% reviewOutcome values in the population (sentinels shown, never counted as answers): approved 22 none-mentioned 19 (sentinel) explicitly-discussed-no-review 4 not-required 4 exempt 2 9. Which laws the population names (legal[], paper-counted) ----------------------------------------------------------- 31 of 51 papers assess a law. Folded law names, counted by paper: GDPR 19 CCPA 15 CPRA 5 ePrivacy Directive 2 Right to be Forgotten (RTBF) ruling 1 Right to be Forgotten 1 Payment Accounts Directive 2014/92/EU 1 Gramm-Leach-Bliley Act (GLBA) 1 California Financial Information Privacy Act (CalFIPA) 1 BASE RATE: 402 of 5859 corpus papers assess any law (6.9%); the population's share is 60.8%. 10. foundViolations, over the tuples in the population that assessed one ------------------------------------------------------------------------ 48 legal tuples across 31 papers (TUPLES, not papers -- a paper can assess several laws): yes 20 41.7% not-assessed 17 35.4% partial 11 22.9% 11. The page’s own population table, checked against the verdicts both ways --------------------------------------------------------------------------- page table: 51 rows, all match the verdicts, none missing page 'By instrument' sentence: {"R":17,"S":12,"M":10,"D":10,"O":2} — agrees S papers from 2024 onward: 7 of 12
Two things in that output need a note.
The controllers asked table is hand-keyed, and that is deliberate. The first version derived it from population[].n by taking the largest value whose unit could plausibly be a request target. It gave CanaryTrap 43,332 — a website list the paper never contacted — against a real request sample of 87 apps, and a spurious median of 190. population[].n answers “how big was the biggest thing this paper drew”, not “how many organisations did it write to”, and no filter on unit fixes that. The table is now keyed from each paper's own sentence and the script throws if an R paper is missing from it. Four corrections came out of hand-keying: CanaryTrap 43,332 → 87, Consumer Beware! 543 → 454 (543 are registered; 89 were excluded and 454 actually received a request), Scraping Sticky Leftovers 1,435 → 678 (the apps with their own sign-up, which is the set whose accounts were created and deleted), and — found by the generic reviewer after publication — Lessons in VCR Repair 160 → 109, because 160 is the number of apps selected and 109 is the subset whose policies carried CCPA disclosures and which actually received a request. The guards check that every R paper has a value, not that the value is right; only reading the paper does that.
Every subgroup share is printed next to the corpus base rate for the same field. The population's 84.3% hand-annotation rate only means something against the corpus's 56.6%; its 60.8% law-assessment rate only means something against 6.9%. Sections 7, 8 and 9 of the output print both sides.
5. Folding
Only one field on this page is aggregated from free text, and it is small enough to fold by hand and print in full.
legal[].law over the 51 population papers, 48 tuples across 31 papers. Four rules, applied in order, each a case-insensitive match on the law string:
/ccpa|california consumer/ → CCPA | /cpra|california privacy rights/ → CPRA |
/gdpr|general data protection/ → GDPR | /eprivacy/ → ePrivacy Directive |
Residue — every law string the four rules did not touch, printed in full, one paper each: Right to be Forgotten (RTBF) ruling, Right to be Forgotten, Payment Accounts Directive 2014/92/EU, Gramm-Leach-Bliley Act (GLBA), California Financial Information Privacy Act (CalFIPA). The two “Right to be Forgotten” strings are the same object under two spellings and are not merged, because merging them would create a fifth folded family of size 2 that the page does not use; they are counted as they are and the page quotes only GDPR 19 / CCPA 15 / CPRA 5 / ePrivacy 2. Folding them would not change any published figure.
Nothing else on the page aggregates a free-text field. detection[].phenomenon and detection[].metric are used only as pointers to a paper's own sentence, never counted; tools[], classification.resourceName and vantage.serviceName are not used at all.
6. Quotes checked
scripts/dsr_quotecheck.py extracts every //"..."// span from the page source and checks it appears verbatim in its source, after collapsing whitespace, joining hyphens split at a line break, folding curly quotes and dashes, and unwrapping Markdown link syntax. Corpus quotes are checked against paper.cols.txt, then paper.norm.txt, then a fresh pypdf extraction of paper.pdf. External quotes are checked against a byte snapshot taken at fetch time and stored under dsr/external/, not re-fetched at check time: a live re-fetch turns a transient rate-limit or 403 into “quote not found”, and would silently pass a sentence that has since been removed. The script exits non-zero if any quote fails or if the page carries a quoted span with no source listed, so the list cannot drift away from the page.
- dsr_quotecheck-output.txt
OK [cols] Above 40% failed to respond at all, in an apparent violation of the CC... OK [snapshot] one month of receipt of the request... OK [snapshot] by a maximum of two months... OK [snapshot] once by an additional 45 days when reasonably necessary, provided the ... OK [cols] In total, 9 hours and 57 minutes were spent submitting VCRs to all 454... OK [cols] varied both across and within platforms... OK [pdf] the failure to disclose processing purposes, retention periods, and ot... OK [cols] requested personal information as part of their identity verification ... OK [cols] exercising one's privacy rights under CCPA introduces new privacy risk... OK [snapshot] closed on 17 January 2019... OK [snapshot] the right to object to the processing of personal data can also be exp... OK [snapshot] Disclose how the operator responds to Web browser “do not track” signa... OK [snapshot] The US Privacy signal has been deprecated as of January 31, 2024. We s... OK [snapshot] Currently, GPC is the only UOOM considered valid by The Department... OK [snapshot] Beginning July 1, 2024... OK [snapshot] Tell websites not to sell or share my data... OK [snapshot] beginning January 1, 2027... OK [snapshot] from developing or maintaining a browser, as defined, that does not in... OK [snapshot] This year California signed a bill under the CCPA/CPRA that obligates ... OK [cols] Do Not Sell My Personal Information... OK [cols] about a third of sites that have evidence of selling or sharing person... OK [cols] only 48 out of 100 apps implement a respective setting... OK [cols] largely ineffective... OK [snapshot] A total of 1,185 controllers responded to the questionnaire... OK [snapshot] a total of 764 controllers... OK [snapshot] surprised about the large number of controllers responding having rece... OK [snapshot] As of January 1, 2026, California residents may use DROP... OK [snapshot] Data brokers are required to begin processing these requests on August... OK [cols] opt-out request... 29 quoted spans, 0 failed, 0 unlisted
Two of those results are worth recording:
[pdf]on the Setting the Course quote is not a formatting detail. The sentence “the failure to disclose processing purposes, retention periods, and other third-party data recipients serves as a further indicator of non-compliance” is absent from both.colsand.norm: the two-column repair splices the adjacent column into the middle of it. Checking only.colswould have published a false FAIL against a correct citation, and — worse — a run that trusted the FAIL would have deleted a true quote.- The W3C snapshot had to be taken twice. The first fetch, with a browser-like User-Agent, returned HTTP 403 and a 5,667-byte error page, which the snapshot writer happily stored; the quote then failed against it. The second fetch, with a plain
Mozilla/5.0, returned HTTP 200 and 40,527 bytes. The snapshot writer now asserts a 200 before writing. A cached transport failure is not evidence of anything.
Separately, six evidence.quote values from the extraction — the ones behind the largest published figures — were checked against their papers by the same normalisation. Four matched a .txt rendering directly:
| Paper | Extraction quote | Result |
|---|---|---|
| [1Syrmoudis, Emmanuel; Mager, Stefan; Kuebler-Wachendorff, Sophie; Pizzinini, Paul; Grossklags, Jens; Kranz, Johann (2021): "Data Portability between Online Services: An Empirical Analysis on the Effectiveness of GDPR Art. 20", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | “Only 135 of the 182 services (74.2%) managed to execute some sort of data export in the legally valid time horizon” | found in .cols and in the PDF |
| [2Van Nortwick, Maggie; Wilson, Christo (2022): "Setting the Bar Low: Are Websites Complying With the Minimum Requirements of the CCPA?", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | “In total, 9,838 websites (2%) in our first crawl contain a DNSMPI link.” | found in .cols and in the PDF |
| [3Aziz, Muhammad Abu Bakar; Wilson, Christo (2024): "Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | “In Crawl 1 we detected the presence of the USP API on 821 (8.2%) publishers.” | found in .cols and in the PDF |
| [4Hausladen, 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)] | “In December 2023, 44% (1,411/3,226) of such sites opted users out via all implemented privacy strings.” | found in .cols and in the PDF |
The other two are the interesting ones. Both are ellipsis-joined extraction quotes — the extractor stitched two non-adjacent sentences with … — so neither matches as a single span, and a naive check reports NOT FOUND on a correct figure. Split at the ellipsis and checked fragment by fragment:
- [5Farooqi, Shehroze; Musa, Maaz; Shafiq, Zubair; Zaffar, Fareed (2020): "CanaryTrap: Detecting Data Misuse by Third-Party Apps on Online Social Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)]: “Only 52% of the apps (45 out of 87) responded back to our requests” is in
.colsverbatim. The second fragment is a paraphrase of Table 2, whose cells the column repair has flattened into running text (Requested data deletion successfully 87 apps Not responded 42 apps Responded 45 apps); the numbers are the paper's. This check also corrected the page: the 87 is the number of apps contacted by email, and 13 more were contacted through a contact form, so the request sample is 100, not 87. The page and the report script now say 100 and name the split. - [6Rupp, Eduard; Syrmoudis, Emmanuel; Grossklags, Jens (2022): "Leave No Data Behind – Empirical Insights into Data Erasure from Online Services", in: Proceedings on Privacy Enhancing Technologies. (DOI)]: “we find that 24 (27%) of the 90 services did not complete the data erasure request in a way which ensures that all personal data is deleted or anonymized” is in the paper, interrupted in
.colsby a table caption spliced in from the adjacent column. Confirmed by reading the sentence around it.
No extraction quote used on this page turned out to be wrong about its paper. One was wrong about its denominator, and only reading the surrounding paragraph caught it.
7. External sources
Every external claim on the content page, with the primary source it was read from and the HTTP status at fetch time. Byte snapshots of the ones carrying a published quote are under dsr/external/ and are what dsr_quotecheck.py checks against.
| Claim on the page | Primary source, read 2026-09-16 | Status |
|---|---|---|
| GPC is a W3C Working Draft of 11 June 2026, Privacy Working Group; editors Zimmeck, Snyder, Brookman, Zucker-Scharff | https://www.w3.org/TR/gpc/ | 200, 99,238 bytes |
| GPC browser support: Firefox 120 desktop, Firefox 122 Android, opt-in; not Chrome, not Safari | mdn/browser-compat-data, api/Navigator.json, field api.Navigator.globalPrivacyControl | 200, 196,919 bytes |
| Brave, DuckDuckGo and Mozilla are among the organisations implementing GPC | https://globalprivacycontrol.org/orgs | 200, 24,928 bytes |
| The US Privacy String was deprecated on 31 January 2024 | https://github.com/InteractiveAdvertisingBureau/USPrivacy README | 200, 5,163 bytes |
| GPP renamed Global Privacy Platform → Global Privacy Protocol; spec page last updated 12 August 2026; August 2026 MSPA update in public comment until 11 September 2026 | https://iabtechlab.com/gpp/ | 200, 121,863 bytes |
| The W3C Tracking Protection Working Group closed on 17 January 2019; DNT is a retired specification | https://www.w3.org/2011/tracking-protection/ | 200, 40,527 bytes (see §6 — the first attempt returned 403) |
| GPC is the only universal opt-out mechanism Colorado recognises, and is mandatory from 1 July 2024 | https://coag.gov/uoom/ | 200, 81,392 bytes |
| DROP: consumers from 1 January 2026, brokers must process from 1 August 2026 | https://cppa.ca.gov/data_broker_registry/ | 200, 95,726 bytes |
| EDPB CEF 2024, right of access: 30 SAs, 1,185 controllers, adopted 16 January 2025 | edpb_cef-report-2024_20250116_rightofaccess_en.pdf | 200, 659,756 bytes, 31 pages |
| EDPB CEF 2025, right to erasure: 32 SAs, 764 controllers, adopted 10 February 2026 | edpb_cef-report_2025_right-to-erasure_en.pdf | 200, 441,986 bytes, 29 pages |
Rejected, and why. These were found and deliberately not used:
- Every vendor and consultancy “GPC in 2026” guide returned by search — weblegal.ai, consenteo.com, vucense.com, ketch.com, getadmiral.com, cookiebeam.com, sourcepoint, cookiehub, onetrust's knowledge base. Several were accurate. None is a primary source, all are marketing for a consent product, and at least two disagreed with the W3C and IAB documents on the specification's status. The page cites the W3C and the IAB instead.
- An AI search summary claiming the California data broker registry currently lists 0 brokers. It was a mis-parse of a dynamically loaded table; the raw page contains no such statement. The page publishes no current broker count at all — it quotes [7Kempen, Elina van; Bagayatkar, Isita; Frolikov, Pavel; Georgiou, Chloe; Tsudik, Gene (2026): "Consumer Beware! Exploring Data Brokers' CCPA Compliance", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)]'s 543 registered / 454 asked with the study's own date, which is checkable. The registry's live table is behind a viewer this sandbox could not read, and guessing was not worth it.
- Law-firm and IAPP commentary on the EDPB coordinated actions. Useful for orientation, and the source of the pointer to the 2025 erasure action, but every figure on the page comes from the EDPB's own PDFs, read page by page.
- The Colorado AG's Universal Opt-Out Mechanisms: Global Privacy Control Comments page (https://coag.gov/resources/universal-opt-out-mechanisms/) — a navigation stub with no substantive content at fetch time. The substantive statement is on
coag.gov/uoom/and that is what is cited.
8. What could not be established
- A current count of registered California data brokers. See above. The Delete Act's 1 August 2026 processing deadline has now passed and there is presumably compliance data somewhere; none was found in a form this sandbox could read.
- ~~Whether the EDPB has chosen a 2026 CEF topic.~~ Closed during the run by the external-currency reviewer: CEF 2026 launched 19 March 2026 with 25 DPAs, on transparency and information obligations under Arts. 12–14 — not a rights action. It is now on the content page. The EDPB's own search endpoint returns 404; the news page had to be reached by its slug.
- The false-negative rate of the hand audit. Two probes added mid-run moved the population from 41 to 51 — a 20% under-count that survived a complete audit — which bounds the error at “at least this large, once”. There is no way to estimate it from inside the process. A second, independently written probe set, ideally by someone else, is the only thing that would.
- Whether any DSAR study has been replicated. [7Kempen, Elina van; Bagayatkar, Isita; Frolikov, Pavel; Georgiou, Chloe; Tsudik, Gene (2026): "Consumer Beware! Exploring Data Brokers' CCPA Compliance", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)]'s Table 1 lines up 13 prior studies' response rates (55%–100%, over populations of 20 to 454) but they are thirteen populations, not thirteen attempts at one. An earlier draft of the content page said “seven … 57% to 93%” in one place and “four … none of which is in this corpus” in another; both were invented counts, both were wrong, and three of the thirteen are in this page's own population. Neither the quote checker nor the figure checker could see it — a paraphrased count with no quoted span and no script behind it is outside every guard this page has. Nothing in the corpus is a replication.
- Inter-requester variance. No paper in the population sends the same request twice, or has two people send it. The content page states this as a gap, and scopes it to the 51 papers' abstracts and methodology sections — which is as far as the reading went. The
request_sentprobe's 99 hits were screened at the matched-sentence level like every other candidate, so an appendix could refute either claim. - What share of the population's crawls used Chrome without injecting
Sec-GPC.crawlConfig.browsersis stated by only 47.2% of the 1,120 crawling papers corpus-wide, and the population is too small for that field to say anything. The page makes the point as advice, not as a measured claim.
9. Judgement calls
Each of these could reasonably have gone the other way.
- A new page rather than a section on Consent or Policies. The queued reasoning held. The decisive argument is the one the content page opens with: the instrument is a person, so the sample-size, ethics and non-response problems are structurally different from anything else in the
privacy:namespace, and they would have been a footnote inside either neighbour. - Requests and opt-out signals on one page. They are two instruments with different scales — 30 controllers against 10,000 sites. The alternative was two pages. They are together because they answer the same question (“does the right work in practice”), a student who needs one usually needs the other, and splitting them would have put the CCPA on both pages and the GDPR on neither. The cost is a long page.
- Johnny Can't Revoke Consent Either (PoPETs 2025) is OUT. Consent withdrawal under Art. 7(3) is a data-subject right, and the paper measures whether websites let you exercise it. It is excluded because the interface it measures is the cookie banner, which Consent owns. A reasonable person would include it. The boundary is stated on both the content page and here so the decision is visible rather than silent.
- On the Suitability of LLM-Driven Agents for Dark Pattern Audits (PoPETs 2026) is IN, WebSP-Eval (PoPETs 2026) is OUT. Both measure an LLM agent rather than a website. The first is included because its entire substrate is CCPA rights-request portals and it reports on those portals across a 456-site registry census; the second is excluded because an opt-out task is one item in a general web-security benchmark. This is the least comfortable call in the audit and is flagged on the content page.
- Access Denied! (PoPETs 2016) is OUT. It is the earliest paper in the corpus about the right of access and it is a survey of 873 people's attitudes, with no request sent and no mechanism observed. Excluding it makes the population's start date 2014 rather than 2016 and removes the one paper a reader might expect to find. It is cited nowhere on the content page, which is arguably a loss.
- Category **D requires the paper's dataset to come from an access or export surface, regardless of the research question.** That is why Detecting Low Self-Esteem in Youths from Web Search Data (TheWebConf 2019) — a mental-health prediction paper — is in the population: its data is Google Takeout histories donated by participants. Under a research-question rule it would be out. The dataset rule was chosen because “you can get data this way” is the methodologically useful fact for the reader, and because a research-question rule made the boundary unstable across four other papers.
- Are Privacy Dashboards Good for End Users? (USENIX 2021) is OUT and Understanding and Improving Usability of Data Dashboards (USENIX 2022) is IN, although both are surveys about a Google transparency surface. The 2022 paper's participants donated their actual My Activity data, which the paper then analyses; the 2021 paper's dataset is survey responses about having looked. That is the D rule applied consistently, and it separates two papers that look alike.
- Machine unlearning is out, categorically. Ten candidates. The word “right to be forgotten” is the same; nothing else is.
10. The run
| Date | 2026-09-16 |
| Corpus | data/extract/run1, 5,859 extracted papers, 5,855 with full text, seven venues, 2010–2026 |
| Pages written | data_subject_rights (new), this page (new) |
| Pages edited | roadmap (queued row → assessed, with corrected counts; queue now empty), Privacy (18th child, count 17→18), Requests (one-line disambiguator), bibliography (+20 entries) |
| Scripts added | dsr_probe.mjs, dsr_ctxdump.mjs, dsr_verdicts_build.py, dsr_report.mjs, dsr_quotecheck.py, and dsr_verdicts.json / dsr_quote_sources.json |
| Scripts changed | sitemap.mjs — the roadmap gate threw on an empty Queued table, which is now a legitimate state; it accepts one only if the section says the queue is empty in words |
| Bibliography | 20 new entries, 0 citekey collisions, 0 definite duplicates under bib_dedup_scan.py (96 same-surname candidates, all judged noise) |
| Models | Opus 5 wrote the page and ran the audit; three Sonnet reviewers (figures-vs-script, citations-and-quotes, external currency) and one Fable generic reviewer, findings in §11 |
Two things worth recording about the run itself.
Seven PoPETs author lists had to be filled by hand, because the corpus index carries no authors for any PoPETs or USENIX record. fetch_authors.py resolved the USENIX ones and failed on all seven PoPETs landing pages. The first-page text of paper.cols.txt was not sufficient: for three of the seven it silently dropped authors — Erasing the Echo lost Kopo M. Ramokapane, Measuring the Accuracy and Effectiveness of PII Removal Services lost Peter Snyder, Hamed Haddadi and Gareth Tyson, and Overprofiling Analysis lost José González-Cabañas and Rubén Cuevas — because the two-column repair reads only one column of the author block. All seven were taken from the PoPETs landing page instead, which lists authors and affiliations in one line.
The bibliography needed a cache purge. After 20 entries were appended and the page saved, the content page rendered 32 of 52 references, with gaps in the numbering — exactly the 32 that were in the bibliography before. Requesting literature:bibliography with ?purge=true and then the content page with ?purge=true fixed it: 52 references, no gaps. Counting rendered <dt> entries against distinct citekey markers is the check; the citation links themselves were present and blue in both states, so nothing but the count would have caught it.
11. Review
Four reviewers, all told explicitly that the author's context may not be exhaustive, and all handed the page text, the scripts and their output, and these notes. The three focused passes ran in parallel first; the generic pass ran last, after their findings were applied, and its own findings are in §11.4. Findings are logged below whether accepted or rejected — a rejection is the only record of whether a reviewer slot is earning its place.
11.1 External currency (model: sonnet)
The most productive of the four. It re-fetched all ten external claims and checked each against a primary source.
| Finding | Disposition |
|---|---|
| The ten claims are all correct as written: GPC's Working Draft date and editors, the Firefox/Chrome/Safari support matrix, the US Privacy String deprecation, the GPP rename and dates, the W3C group's closure, Colorado's UOOM list, both DROP dates, both EDPB reports, and the two statutory deadlines. | Confirmed, no change. It also noted that several secondary sources date the EDPB erasure report to 18 February 2026 where the PDF itself says 10 February; the page already had the primary-source date. |
| Chrome is no longer static on GPC. | Accepted, with the reviewer's own evidence rejected. The reviewer gave chromestatus id 6249068542164992, which is a TC39 iterator proposal, and asserted that Chrome Canary began sending Sec-GPC behind a flag in mid-2026. Neither checks out. The real entry is 5137324344213504, at stage Proposed, last touched 2026-01-02, no milestone, filed from a non-Google address. What is real and load-bearing is the thing behind it: California AB 566, Chapter 465, approved 8 October 2025, which from 1 January 2027 forbids maintaining a browser without a configurable opt-out preference signal. That is now on the page with the statute as its source, and the chromestatus entry is cited for what it actually is. |
| The Colorado-only framing undersells a multi-state cluster (CT, DE, MT, OR, TX confirmed; five more reported but not verified against state sources). | Accepted in substance, not in form. A state count is now explicitly not published: the circulating lists are vendor trackers, effective dates differ from enforcement dates, and no authoritative register exists. The page names the states it can name, dates the two claims it can source, and tells the reader to derive the count from each AG's own page. |
| DROP has an early volume figure (345,000+ requests by 7 August 2026). | Rejected as a citation, accepted as a prompt. Every source the reviewer offered was a law firm or a vendor. The agency's own announcements page carries no such figure. The page instead says the 1 August 2026 deadline has passed, that no agency figure could be found, and that this is the most obviously available study on the topic. |
| The EDPB's 2024→2025 series looks cut off; the 2026 topic has been announced. | Accepted. Verified at the EDPB's own news page: CEF 2026 launched 19 March 2026, 25 DPAs, on transparency and information obligations under Arts. 12–14 — not a rights action. One sentence added so the series does not read as unfinished. |
| The GPP public-comment window closed on 11 September 2026 with no outcome posted. | Accepted; the row is now in the past tense and says the outcome is still pending. |
11.2 Citations and quotes (model: sonnet)
Checked all 52 citekeys, the 20 new bibliography entries against both the PDFs and the publisher landing pages, all quoted phrases, and the external footnotes.
| Finding | Disposition |
|---|---|
| All 20 new bibliography entries are correct — authors, author order, title, venue and year — including the two 2026 TheWebConf entries, which it confirmed are registered ACM publications rather than preprints. All footnotes resolve and match. All 34 quotes and figures it checked are verbatim or numerically exact with the right denominator. | Confirmed, no change. |
| The lead box said “43% of California's registered data brokers never replied at all”. The paper's 43% is 195 of the 454 it wrote to; against the 543-entry registry it would be 36%. | Accepted, fixed. This is the exact defect the page spends a section warning about, in the page's most-read paragraph, on a figure the author had already keyed correctly two screens further down. |
| [8Zimmeck, Sebastian; Kuller, Eliza; Ma, Chunyue; Tassone, Bella; Champeau, Joe (2024): "Generalizable Active Privacy Choice: Designing a Graphical User Interface for Global Privacy Control", in: Proceedings on Privacy Enhancing Technologies. (DOI)] was categorised S but is a 410-participant usability study of a GPC choice interface, not a measurement of site-side deployment; it fits M. | Accepted. Recategorised, and every dependent figure moved with it: the by-instrument line is now R 17, S 12, M 10, D 10, O 2, and the methods are current table now says seven of the twelve S papers are 2024 or later. The report script gained a check that reads the published table and compares it to the verdicts in both directions — a row the page invented, and a paper the page dropped — plus the by-instrument sentence and the category letters. Both mutations (delete a row; flip one letter) make it throw. |
UNMATCHED: [] was published inside the population table. | Accepted, fixed. A diagnostic print from the throwaway script that generated the table's rows leaked into the file that was pasted into the page, and it survived the wrap check, the quote check, the citekey check and a rendered-DOM inspection, because none of them looks for text that is merely wrong to be there. Same failure as a generator's stdout reaching a live bibliography page on this wiki before. |
| “Brave and DuckDuckGo ship it; Chrome does not” sat immediately after the MDN footnote but is not covered by it — neither vendor is in MDN's compatibility table. | Accepted, rewritten. Brave's own support site returns 403 to this sandbox and DuckDuckGo's help page renders client-side, so neither vendor's documentation could be read. The page now cites the GPC project's implementers list for the weaker claim it actually supports, says explicitly that the list does not state default-on behaviour, and turns the paragraph into advice that is better anyway: verify the signal on the wire against a server you control rather than trusting any support table. |
The two red links to provenance:privacy:data_subject_rights look like a stale cache, because the page “returns HTTP 200”. | Rejected. DokuWiki serves the themed error page with HTTP 200 for a page that does not exist; export_raw on a missing page returns HTML rather than an error. The provenance page genuinely did not exist at review time — it is this one. |
abramova2023_anatomy is missing from dsr/citekeys.json. | Accepted as accurate, not fixed. That map is built from the population only, and the entry is an out-of-population aside. The report script's new page-vs-verdicts check reads the map in the direction that matters (citekey → population paper) and throws on a page row it cannot resolve, so an incomplete map cannot hide a bad row. |
Re-review after the fixes. The citations reviewer was re-run on the changed page and confirmed all four of its own findings fixed, and checked the material added afterwards: the Landgericht Berlin and CalOPPA quotes, AB 566's text and chapter number, the EDPB CEF 2026 figures, both statutory-deadline quotes, and the two rescoped “no paper in this population” claims against [9Martino, Mariano Di; Meers, Isaac; Quax, Peter; Andries, Ken; Lamotte, Wim (2022): "Revisiting Identification Issues in GDPR ‘Right Of Access’ Policies: A Technical and Longitudinal Analysis", in: Proceedings on Privacy Enhancing Technologies. (DOI)] and [10Take, Kejsi; Young, Jordyn; Bhalerao, Rasika; Gallagher, Kevin; Forte, Andrea; McCoy, Damon; Greenstadt, Rachel (2024): "What to Expect When You’re Accessing: An Exploration of User Privacy Rights in People Search Websites", in: Proceedings on Privacy Enhancing Technologies. (DOI)]. All matched. It also independently re-derived R 17 / S 12 / M 10 / D 10 / O 2 and the seven-of-twelve claim from the verdict file. Two notes from it, one accepted and one rejected:
- Accepted: the EDPB CEF 2026 URL 301-redirects to a slightly different slug. It resolves 200 with
-L; a future check that omits-Lwill see the redirect and should follow it rather than record a failure. - Rejected as a finding, recorded as a limitation: it could not verify the
chromestatusfeature entry or the Coloradocoag.gov/uoom/page, becauseapi.chromestatus.comrefused its TLS connection and both pages render client-side forWebFetch. Both were fetched successfully during the run — chromestatus through its JSON API (HTTP 200, 11,059 bytes) andcoag.gov/uoom/withcurland a browser User-Agent (HTTP 200, 81,392 bytes) — and both are stored as dated byte snapshots underdsr/external/, which is whatdsr_quotecheck.pychecks the published quotes against. This is the case the snapshot design exists for: a source that one tool can read and another cannot is not a source that has gone away.
11.3 Figures against the script (model: sonnet)
Re-ran every script, reproduced dsr_report-output.txt byte for byte, checked all 51 population-table rows on three fields each, all 28 quoted spans, and about 80 individual paper-level numbers across 20 papers — well over 150 figures in total. It also mutation-tested every guard.
| Finding | Disposition |
|---|---|
Every figure quoted from the report script matches its output, and every paper-level number it spot-checked is exact with the right denominator — including the 821 versus 825 publishers in [3Aziz, Muhammad Abu Bakar; Wilson, Christo (2024): "Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework", in: Proceedings on Privacy Enhancing Technologies. (DOI)], which are two different crawls and not an error. | Confirmed, no change. |
| The methods are current table said hand-sent requests run “2016 → 2026”. The earliest R paper in the population is [5Farooqi, Shehroze; Musa, Maaz; Shafiq, Zubair; Zaffar, Fareed (2020): "CanaryTrap: Detecting Data Misuse by Third-Party Apps on Online Social Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)], 2020. | Accepted, fixed — and turned into a finding rather than a correction: no paper in this corpus sent a rights request before 2020, two years after the GDPR applied. That is now stated in the row. The error was a date, on a page whose own argument is that dating matters. |
The category-sum guard in dsr_report.mjs was vacuous. It summed byCat’s own values, so an invalid category still summed to the population while the printed table — which only prints R/S/M/D/O — was silently one paper short, and the script exited 0. The reviewer demonstrated this by assigning a paper the category X. The page's Methodology section claimed the script throws in exactly that case. | Accepted, fixed, and re-mutation-tested. The guard now rejects any category outside the five and sums only over the five; the reviewer's mutation now throws. dsr_verdicts_build.py did already enforce the five-letter set, so no published number was ever wrong — but the page made a claim about the script that the script did not honour, which is the more interesting half. |
All other guards fired correctly under mutation: the ASKED-map gap and stale-category checks, the corpus-membership check, the tight ⊆ loose narrowing check, and both asserts in dsr_verdicts_build.py. | Confirmed. The page-versus-verdicts check added after §11.2 was mutation-tested separately by the author: deleting a table row and flipping a category letter both throw. |
11.4 Generic, no checklist (model: fable)
The most useful pass of the four, because it found the class of error the other three cannot reach: paraphrased counts with no quoted span and no script behind them.
| Finding | Disposition |
|---|---|
| [7Kempen, Elina van; Bagayatkar, Isita; Frolikov, Pavel; Georgiou, Chloe; Tsudik, Gene (2026): "Consumer Beware! Exploring Data Brokers' CCPA Compliance", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)]'s Table 1 was described twice, differently, and both descriptions were invented. “Seven earlier studies … 57% to 93%” in one place, “four earlier response-rate studies, none of which is in this corpus” in another. The table has 13 prior rows, the rates run 55%–100%, and three of the studies are in this page's own population. | Accepted, fixed in both places and in §8 above. The strongest finding of the review layer. Nothing guards a number that is neither quoted nor computed. |
| [11Samarin, Nikita; Kothari, Shayna; Siyed, Zaina; Bjorkman, Oscar; Yuan, Reena; Wijesekera, Primal; Alomar, Noura; Fischer, Jordan; Hoofnagle, Chris; Egelman, Serge (2023): "Lessons in VCR Repair: Compliance of Android App Developers with the California Consumer Privacy Act (CCPA)", in: Proceedings on Privacy Enhancing Technologies. (DOI)] was keyed at 160 controllers asked; the paper submitted VCRs to 109. 160 is the number of apps selected. | Accepted, fixed in the page and in the ASKED map. No downstream figure moved — the median stays 30 and “eleven of sixteen at or below 100” holds — but it is precisely the denominator error the page spends a section warning about. |
| The short version said “Do Not Track is dead as a legal signal” while the table two screens down said “legal status not zero”. And “three generations of signal … only one alive” sat above a four-row table calling GPP “live and the successor”. | Accepted, both fixed. Two drafts of the same paragraph written a day apart, neither reconciled against the other. |
| Five arithmetic and wording slips: “40 times … twice over” (764/30 ≈ 25), “two papers in eleven years”, “three in five” against “two in three” for the same 62.8%, “uses four of them” for four of four, and “Chrome and Chromium cannot send GPC” when Brave is Chromium and does. | All accepted and fixed. |
| The lede promises the data-donation use case and the page does not deliver it. Ten papers — a fifth of the population — were represented by one bullet inside the opt-out-signal section. | Accepted. A new section, The export as a dataset, now covers it: the six papers that do it, and the four things it costs (product export ≠ Art. 15 response; participants and IRB; format drift as a longitudinal confound; reusing somebody else's donation corpus). |
The DNT row in Which methods are current dated a set nobody audited. No DNT-compliance paper is in the population and the dnt probe never drove a candidate. | Accepted. The row's period column now reads “none in this population” and says why. |
| Provenance §3 pointed at a list of paper reads in §7 that does not exist, and the page's “hand-auditing all 471” overstates what ~395 of the verdicts rest on. | Accepted, both fixed here. §3 now says plainly that ~395 verdicts are a screen on one matched sentence plus the title. |
Provenance §8 still said the 2026 EDPB topic could not be established, and that the request_sent probe's 99 hits “were all read”. | Accepted, both fixed. |
| The GPC boundary with Consent is stated on one side only, and that page's advice (“do not inject the header; set the browser preference”) reads as the opposite of this page's. | Accepted in part. A pointer has been added to Consent. The deeper merge — deciding which page owns the GPC section outright — is a two-page edit that belongs to a sitting that can re-review both, and is recorded here rather than half-done. |
| Structure: “Read first” is last; the provisional-years caveat appears three times; the two results sections are split by instrument without saying so; tooling is the thinnest part of the page. | Partly accepted. The two results sections are now named What the signal-side papers measured and What the request-side papers measured. The rest — section order, the duplicate caveat, and a tools section the page genuinely lacks — is not fixed, and is the clearest thing for a later sitting to pick up. |
utz2023_comparing is IN as M with no explanation on either page. | Accepted as accurate, not fixed. Its DNSMPI-link check is one of four privacy issues it measures, which is why it is in; the page never cites it in prose. A borderline inclusion that the verdict file records and the prose does not justify. |
12. The scripts, as committed
These are the files themselves, not a sample. Each is pasted from the committed copy under scripts/.
- dsr_probe.mjs
// Full-text candidate probes for privacy:data_subject_rights. // // The roadmap row that queued this page was a TITLE+SUMMARY probe (9 papers, // scripts/gap_probe_roadmap.mjs, family `dsar_rights`). A title probe is a // floor: a paper that sends 100 access requests in one section of a study about // something else is invisible to it. So the candidate set here is a full-text // sweep over data/fulltext/<year>/<venue>/<slug>/paper.cols.txt, and every // candidate is then hand-judged (see dsr_verdicts.json). // // Three things this script does on purpose, each because of a past defect: // * whitespace is COLLAPSED before matching, because a PDF line break inside // "data subject access request" otherwise silently drops the paper; // * acronym probes are CASE-SENSITIVE (\bGPC\b/i also matches "gpcr"), and // every acronym probe prints its residue so the homonyms stay visible; // * each tight probe is paired with a LOOSE superset and the script asserts // tight ⊆ loose, so a "narrowing" regex that is really a different regex // fails the run instead of returning a confident wrong number. // // node scripts/dsr_probe.mjs # per-probe counts + union // node scripts/dsr_probe.mjs --list <probe> # papers matching one probe // node scripts/dsr_probe.mjs --ctx <probe> # + the matching sentence // node scripts/dsr_probe.mjs --union # every candidate, one per line // import fs from 'node:fs'; import path from 'node:path'; import { loadExtractions, dataRoot } from './lib.mjs'; const ROOT = dataRoot(); const rows = loadExtractions(); const byKey = new Map(rows.map((p) => [`${p.venue}/${p.year}/${p.slug}`, p])); export const key = (p) => `${p.venue}/${p.year}/${p.slug}`; export function fullText(p) { const f = path.join(ROOT, 'fulltext', String(p.year), p.venue, p.slug, 'paper.cols.txt'); if (!fs.existsSync(f)) return null; // Collapse every run of whitespace (including the newlines the two-column // repair leaves mid-phrase) to a single space. Also join a hyphen that a PDF // line break split: "dele-\ntion" -> "deletion". return fs.readFileSync(f, 'utf8').replace(/-\s*\n\s*/g, '').replace(/\s+/g, ' '); } // --- the probes ------------------------------------------------------------- // TIGHT is what the count is reported from; LOOSE is a strict superset used // only to prove the tight pattern is a narrowing of the same idea. export const PROBES = { dsar_phrase: { tier: 'core', tight: /\b(data )?subject access request|\bDSAR\b|subject rights request|\bright of access\b|\bright to access (their|his|her|one'?s|the) (own )?(personal )?data/, loose: /subject access|\bDSAR|access request|right of access|right to access/i, what: 'a request for a copy of one’s own data', }, erasure: { tier: 'core', tight: /right to be forgotten|\bRTBF\b|right to erasure|right to deletion|right to delete\b|deletion request|erasure request|data deletion request|request(ed|ing)? (the )?(deletion|erasure) of/i, loose: /forgotten|erasure|deletion|delete/i, what: 'a request to have data erased', }, gpc: { tier: 'core', tight: /Global Privacy Control|\bGPC\b[^.]{0,120}(privacy|opt-?out|signal|header|sell)|(privacy|opt-?out|signal|header|sell)[^.]{0,120}\bGPC\b/, loose: /global privacy control|\bgpc/i, what: 'the Global Privacy Control signal', }, do_not_sell: { tier: 'core', tight: /[Dd]o [Nn]ot [Ss]ell|right to opt.?out of (the )?sale|opt.?out of sale|limit the use of (my )?sensitive personal/i, loose: /do not sell|opt.?out of|sale of (personal|my)/i, what: 'the CCPA/CPRA "Do Not Sell" opt-out surface', }, dnt: { tier: 'context', tight: /Do Not Track|\bDNT\b/, loose: /do not track|\bdnt/i, what: 'the Do Not Track header (GPC’s predecessor)', }, portability: { tier: 'context', tight: /right to (data )?portability|data portability|download (your|my|their) (own )?data|takeout/i, loose: /portab|takeout|(download|export) (your|my|their|the)/i, what: 'a data-export / portability request', }, ccpa_law: { tier: 'context', tight: /\bCCPA\b|\bCPRA\b|California Consumer Privacy Act|California Privacy Rights Act/, loose: /ccpa|cpra|california consumer privacy|california privacy rights/i, what: 'the California statutes that create the opt-out right', }, gdpr_article: { tier: 'context', tight: /Article ?1[5-8] (of )?(the )?GDPR|GDPR Article ?1[5-8]|Art\.? ?1[5-8] GDPR|data subject rights?\b/i, loose: /article ?1[5-8]|art\.? ?1[5-8]|data subject right/i, what: 'the GDPR data-subject-rights articles, named', }, authorized_agent: { tier: 'context', tight: /authoriz(ed|ing) agent|privacy request|consumer request|verifiable (consumer )?request/i, loose: /agent|privacy request|consumer request|verifiab/i, what: 'the CCPA authorised-agent / verifiable-request machinery', }, request_sent: { tier: 'core', // The instrument: the paper says a request was SENT. A first attempt at this // ("we sent \u2026 an access request", one clause) matched 3 papers and missed // every DSAR study in the corpus, including //Access Denied!// and //Leave No // Data Behind//. Six alternations, each added after reading what the previous // one missed, take it to the number below. A narrow probe here is a recall // claim, and the narrow one was wrong. tight: new RegExp( [ /\b(sent|submitted|filed|issued|exercised|dispatched)\b[^.]{0,120}\b(subject access request|access request|DSAR|deletion request|erasure request|privacy request|opt-?out request|data request)s?\b/, /\b(subject access request|access request|DSAR|deletion request|erasure request|privacy request|opt-?out request)s?\b[^.]{0,120}\b(sent|submitted|filed|issued|exercised|were made|we made)\b/, /\bwe\b[^.]{0,150}\brequest(ed)?\b[^.]{0,80}\b(our|the) (personal )?data\b/, /exercis(e|ed|ing) (our|their|the|his|her|my) (right|rights|data subject)/, /\b(sent|submitted|filed|issued)\b[^.]{0,60}\brequests?\b[^.]{0,80}\b(controller|company|companies|website|websites|vendor|data broker|app developer)s?\b/, /\bright to be forgotten\b[^.]{0,120}\brequest/, ].map((r) => r.source).join('|'), 'i', ), loose: /request|exercis/i, what: 'the paper says a request was SENT \u2014 the instrument, not the topic', }, account_deletion: { tier: 'core', tight: /account deletion|delete (your|my|their|the) account|account (closure|termination)|deactivat(e|ion) (your|my|the) account/i, loose: /account|deletion|delete|closure|terminat|deactivat/i, what: 'account deletion as the user-facing form of the erasure right', }, broker_optout: { tier: 'core', tight: /people.?search (site|website|engine|service)|data (broker|removal) (opt.?out|service|request)|PII removal|data removal service|removal request/i, loose: /people search|data broker|removal|broker/i, what: 'data-broker / people-search opt-out and removal services', }, optout_tool: { tier: 'core', // RECALL PASS. Added after the first audit: //Do Opt-Outs Really Opt Me // Out?// (CCS 2022) is squarely in the population and fired only the // context-tier `dnt` probe, because the industry opt-out tools it measures // are never called "do not sell". A probe that cannot see the paper the // page is partly about is a recall claim that was wrong. tight: /opt-?out (tool|mechanism|link|page|choice|setting|button|interface|process|request|form|portal)s?|Network Advertising Initiative|Digital Advertising Alliance|YourAdChoices|\bAdChoices\b|aboutads\.info|optout\.networkadvertising/i, loose: /opt-?out|advertising initiative|advertising alliance|adchoices|aboutads/i, what: 'an industry or site opt-out tool (NAI, DAA/AdChoices, an opt-out page)', }, self_service: { tier: 'core', tight: /privacy dashboard|data download|Google Takeout|Download Your Information|ad(vertising)? (preference|settings) (manager|page|centre|center)|Off-?Facebook Activity|My ?Activity|data export|export (your|my|their) data/i, loose: /dashboard|takeout|download|preference|activity|export/i, what: 'the in-product self-service surface people actually use (dashboard, export)', }, usp_string: { tier: 'core', tight: /\bUS ?Privacy\b|\busprivacy\b|\bUSP ?String\b|\bGPP\b|Global Privacy Platform/i, loose: /usprivacy|us privacy|gpp|global privacy platform/i, what: 'the IAB US Privacy / Global Privacy Platform opt-out strings', }, }; // Everything below is the CLI. It is skipped when this module is imported // (dsr_ctxdump.mjs imports PROBES/fullText/key), so importing does not re-stream // all 5,855 full texts and does not print the summary table into someone else's // stdout. const IS_CLI = process.argv[1] && process.argv[1].endsWith('dsr_probe.mjs'); if (IS_CLI) { // Stream: read each paper once, keep only the hit sets and, for --ctx, one // snippet per matching paper. Holding 5,859 full texts resident OOMs node. const hits = {}; for (const n of Object.keys(PROBES)) hits[n] = { tight: new Set(), loose: new Set() }; const ctx = new Map(); // `${probe}|${key}` -> snippet, only for the --ctx probe const wantCtx = process.argv[2] === '--ctx' ? process.argv[3] : null; let noText = 0; let withText = 0; for (const p of rows) { const t = fullText(p); if (t === null) { noText++; continue; } withText++; const k = key(p); for (const [name, def] of Object.entries(PROBES)) { const m = def.tight.exec(t); if (m) { hits[name].tight.add(k); if (name === wantCtx) { const i = t.indexOf(m[0]); ctx.set(k, t.slice(Math.max(0, i - 200), i + 260)); } } if (def.loose.test(t)) hits[name].loose.add(k); } } for (const [name, def] of Object.entries(PROBES)) { const escaped = [...hits[name].tight].filter((k) => !hits[name].loose.has(k)); if (escaped.length) { throw new Error( `probe ${name}: ${escaped.length} paper(s) match the TIGHT pattern but not the LOOSE one, ` + `so LOOSE is not a superset and the "narrowing" claim is false. e.g. ${escaped[0]}`, ); } if (hits[name].tight.size > hits[name].loose.size) { throw new Error(`probe ${name}: tight ${hits[name].tight.size} > loose ${hits[name].loose.size}`); } void def; } const texts = { size: withText }; const arg = process.argv[2]; const which = process.argv[3]; if (arg === '--list' || arg === '--ctx') { const def = PROBES[which]; if (!def) throw new Error(`unknown probe ${which}; one of ${Object.keys(PROBES).join(', ')}`); void def; const ks = [...hits[which].tight].sort(); for (const k of ks) { const p = byKey.get(k); console.log(`${p.year}\t${p.venue}\t${p.slug}\t${p.title}`); if (arg === '--ctx') { const t = texts.get(k); const m = t.match(def.tight); const i = t.indexOf(m[0]); console.log(`\t…${t.slice(Math.max(0, i - 160), i + 200)}…`); } } console.log(`\n${ks.length} papers`); process.exit(0); } const unionOf = (names) => { const u = new Set(); for (const n of names) for (const k of hits[n].tight) u.add(k); return u; }; const CORE = Object.keys(PROBES).filter((n) => PROBES[n].tier === 'core'); const CONTEXT = Object.keys(PROBES).filter((n) => PROBES[n].tier === 'context'); const coreUnion = unionOf(CORE); const union = unionOf(Object.keys(PROBES)); if (arg === '--union') { const set = which === 'core' ? coreUnion : which === 'context' ? unionOf(CONTEXT) : union; for (const k of [...set].sort()) { const p = byKey.get(k); const fired = Object.keys(PROBES).filter((n) => hits[n].tight.has(k)); console.log(`${k}\t${p.year}\t${p.venue}\t${fired.join(',')}\t${p.title}`); } console.log(`\n${set.size} papers`); process.exit(0); } console.log(`corpus: ${rows.length} extracted papers; ${texts.size} with full text on disk (${noText} without)\n`); console.log('probe\ttier\ttight\tloose\twhat'); for (const [n, def] of Object.entries(PROBES)) { console.log(`${n}\t${def.tier}\t${hits[n].tight.size}\t${hits[n].loose.size}\t${def.what}`); } console.log(`\nUNION, core probes only: ${coreUnion.size} papers (${((100 * coreUnion.size) / texts.size).toFixed(1)}% of ${texts.size} with full text)`); console.log(`UNION, all probes: ${union.size} papers (${((100 * union.size) / texts.size).toFixed(1)}%)`); console.log(`context-only candidates (no core probe fired): ${union.size - coreUnion.size}`); const yrs = new Map(); for (const k of union) { const y = byKey.get(k).year; yrs.set(y, (yrs.get(y) ?? 0) + 1); } console.log('\nyear\tcandidates\tcorpus papers\tshare'); const corpusYr = new Map(); for (const p of rows) corpusYr.set(p.year, (corpusYr.get(p.year) ?? 0) + 1); for (const y of [...corpusYr.keys()].sort()) { const c = yrs.get(y) ?? 0; console.log(`${y}\t${c}\t${corpusYr.get(y)}\t${((100 * c) / corpusYr.get(y)).toFixed(1)}%`); } }
- dsr_report.mjs
// Every figure on privacy:data_subject_rights, with its denominator. // // node --max-old-space-size=3000 scripts/dsr_report.mjs // // The population is the hand audit in scripts/dsr_verdicts.json (built by // scripts/dsr_verdicts_build.py from the full-text candidate sweep in // scripts/dsr_probe.mjs). Nothing here is a title probe: the roadmap row that // queued this page was one, and its precision and recall are reported below as // a finding about the row rather than used as a population. // // Rules this file follows, each because breaking it has published a wrong // number on this wiki before: // * every table prints its own denominator in the heading; // * every subgroup share is printed next to the corpus base rate for the // same field, so "DSAR papers do X more" is checkable; // * sentinels are counted separately and never as an answer; // * a shelled-out denominator is asserted, not assumed. import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { loadExtractions, isSentinel } from './lib.mjs'; const HERE = path.dirname(fileURLToPath(import.meta.url)); const verdicts = JSON.parse(fs.readFileSync(path.join(HERE, 'dsr_verdicts.json'), 'utf8')); const rows = loadExtractions(); const key = (p) => `${p.venue}/${p.year}/${p.slug}`; const CAND = new Set(Object.keys(verdicts)); const IN = new Set(Object.entries(verdicts).filter(([, v]) => v.verdict === 'IN').map(([k]) => k)); const CAT = new Map( Object.entries(verdicts).filter(([, v]) => v.verdict === 'IN').map(([k, v]) => [k, v.category]), ); const pop = rows.filter((p) => IN.has(key(p))); if (pop.length !== IN.size) { throw new Error( `${IN.size} papers are marked IN but only ${pop.length} of them are in extractions.jsonl. ` + `A verdict key that matches no paper is a typo, not a finding.`, ); } const corpus = rows.length; const pct = (a, b) => `${((100 * a) / b).toFixed(1)}%`; const rule = (s) => console.log(`\n${s}\n${'-'.repeat(s.length)}`); console.log(`corpus: ${corpus} extracted papers (7 venues, 2010-2026)`); console.log(`candidates from the full-text sweep: ${CAND.size}`); console.log(`population after hand audit: ${pop.length} papers`); console.log(` precision of the candidate sweep: ${pct(IN.size, CAND.size)}`); console.log(` share of the corpus: ${pct(pop.length, corpus)}`); rule('1. The population by category of instrument (N = ' + pop.length + ')'); const CATNAME = { R: 'R sent requests to real controllers', S: 'S measured an opt-out signal or setting', M: 'M measured a rights mechanism across a population', D: 'D research dataset obtained via access / export', O: 'O observational study of requests others sent', }; const byCat = new Map(); for (const p of pop) { const c = CAT.get(key(p)); byCat.set(c, (byCat.get(c) ?? 0) + 1); } for (const c of ['R', 'S', 'M', 'D', 'O']) { console.log(`${CATNAME[c]}\t${byCat.get(c) ?? 0}\t${pct(byCat.get(c) ?? 0, pop.length)}`); } // Sum over the five KNOWN categories, not over whatever keys happen to be in // the map. Summing the map's own values is vacuous: an invalid category still // lands in byCat, the total still equals the population, and the printed table // -- which only prints R/S/M/D/O -- is silently one paper short. Caught by a // reviewer's mutation test on 2026-09-16. const CATS = ['R', 'S', 'M', 'D', 'O']; const bad = [...new Set(pop.map((p) => CAT.get(key(p))))].filter((c) => !CATS.includes(c)); if (bad.length) { throw new Error(`population papers carry categories outside R/S/M/D/O: ${bad.join(', ')}`); } const catTotal = CATS.reduce((a, c) => a + (byCat.get(c) ?? 0), 0); if (catTotal !== pop.length) { throw new Error( `the five instrument categories sum to ${catTotal}, but the population is ${pop.length}`, ); } rule('2. Why the candidate sweep is mostly noise (N = ' + (CAND.size - IN.size) + ' rejected)'); const reasons = new Map(); for (const v of Object.values(verdicts)) { if (v.verdict === 'OUT') reasons.set(v.reason, (reasons.get(v.reason) ?? 0) + 1); } for (const [r, n] of [...reasons].sort((a, b) => b[1] - a[1])) { console.log(`${r}\t${n}\t${pct(n, CAND.size - IN.size)}`); } rule('3. Per year. 2025-2026 are PROVISIONAL venue-years (see literature:corpus)'); const yrCorpus = new Map(); const yrPop = new Map(); const yrCand = new Map(); for (const p of rows) { yrCorpus.set(p.year, (yrCorpus.get(p.year) ?? 0) + 1); if (IN.has(key(p))) yrPop.set(p.year, (yrPop.get(p.year) ?? 0) + 1); if (CAND.has(key(p))) yrCand.set(p.year, (yrCand.get(p.year) ?? 0) + 1); } console.log('year\tpopulation\tcandidates\tcorpus\tshare of corpus'); for (const y of [...yrCorpus.keys()].sort()) { console.log( `${y}\t${yrPop.get(y) ?? 0}\t${yrCand.get(y) ?? 0}\t${yrCorpus.get(y)}\t${pct(yrPop.get(y) ?? 0, yrCorpus.get(y))}`, ); } const before = [...yrPop].filter(([y]) => y <= 2020).reduce((a, [, n]) => a + n, 0); const after = [...yrPop].filter(([y]) => y >= 2021).reduce((a, [, n]) => a + n, 0); console.log(`\n2010-2020: ${before} papers 2021-2026: ${after} papers`); rule('4. Per venue, against each venue’s own size'); const vCorpus = new Map(); const vPop = new Map(); for (const p of rows) { vCorpus.set(p.venue, (vCorpus.get(p.venue) ?? 0) + 1); if (IN.has(key(p))) vPop.set(p.venue, (vPop.get(p.venue) ?? 0) + 1); } console.log('venue\tpopulation\tvenue papers\tshare of that venue'); for (const [v, n] of [...vPop].sort((a, b) => b[1] - a[1])) { console.log(`${v}\t${n}\t${vCorpus.get(v)}\t${pct(n, vCorpus.get(v))}`); } for (const v of [...vCorpus.keys()].filter((v) => !vPop.has(v))) { console.log(`${v}\t0\t${vCorpus.get(v)}\t0.0%`); } rule('5. What the roadmap’s title-and-summary probe was worth'); // scripts/gap_probe_roadmap.mjs, family dsar_rights, re-run here verbatim. const TITLE_RE = /data subject access|\bDSAR\b|right to (be forgotten|erasure|access|delete)|deletion request|opt-?out request|\bGPC\b|Global Privacy Control|do not sell/i; const titleHits = rows.filter((p) => TITLE_RE.test(`${p.title ?? ''} • ${p.summary ?? ''}`)); const titleIn = titleHits.filter((p) => IN.has(key(p))); console.log(`title+summary candidates: ${titleHits.length}`); console.log(` of those, in the population: ${titleIn.length} (precision ${pct(titleIn.length, titleHits.length)})`); console.log(` of the population, caught: ${titleIn.length}/${pop.length} (recall ${pct(titleIn.length, pop.length)})`); console.log('\nthe title probe MISSES these population papers:'); for (const p of pop.filter((q) => !TITLE_RE.test(`${q.title ?? ''} • ${q.summary ?? ''}`)).sort((a, b) => a.year - b.year)) { console.log(` ${p.year} ${p.venue}\t[${CAT.get(key(p))}]\t${p.title}`); } console.log('\nthe title probe returns these NON-population papers:'); for (const p of titleHits.filter((q) => !IN.has(key(q)))) { console.log(` ${p.year} ${p.venue}\t${verdicts[key(p)] ? verdicts[key(p)].reason : 'not even a full-text candidate'}\t${p.title}`); } rule('6. How big is the sample when a human sends the requests?'); // HAND-KEYED, on purpose. `population[].n` is the largest number the paper // drew, not the number of controllers it wrote to: CanaryTrap's biggest n is a // 43,332-website list it never contacted, and its request sample is 87 apps. // Deriving this from the extraction produced exactly that error, so the count // is keyed here from each paper's own sentence, and the script throws if an R // paper is missing from the map. const ASKED = { 'PETS/2020/canarytrap-detecting-data-misuse-by-third-party-apps-on-online-social-networks': [100, 'third-party Facebook apps sent a data-deletion request: 87 by email, 13 through a contact form. "Only 52% of the apps (45 out of 87) responded back to our requests" counts only the emailed 87'], 'PETS/2021/data-portability-between-online-services-an-empirical-analysis-on-the-effectiven': [182, 'online services sent an Art. 20 export request ("135 of 182 services (74.2%)")'], 'PETS/2022/leave-no-data-behind-empirical-insights-into-data-erasure-from-online-services': [90, 'online services ("we investigated the data deletion practices of a sample of 90 online services")'], 'PETS/2022/revisiting-identification-issues-in-gdpr-right-of-access-policies-a-technical-an': [40, 'organisations re-evaluated in 2021, by registered letter, under 5 assumed subject identities'], 'IEEE-SP/2022/scraping-sticky-leftovers-app-user-information-left-on-servers-after-account-del': [678, 'apps with their own sign-up, out of 1,435 analysed: account created, then deleted, by hand'], 'PETS/2023/lessons-in-vcr-repair-compliance-of-android-app-developers-with-the-california-c': [109, 'of 160 selected Android apps -- the subset whose privacy policies carried CCPA disclosures -- sent a verifiable consumer request: "We then submitted VCRs to these 109 companies". 160 is the number selected, not the number asked'], 'USENIX/2024/data-subjects-reactions-to-exercising-their-right-of-access': [null, '33 participants requested their own exports; 801 files. Controllers are not enumerated'], 'PETS/2024/what-to-expect-when-you-re-accessing-an-exploration-of-user-privacy-rights-in-pe': [20, 'people-search websites, access and removal attempted by four researchers'], 'CCS/2025/hidden-in-plain-bytes-investigating-interpersonal-account-compromise-with-data-e': [6, 'services (Apple iCloud, Google, Facebook, Instagram, Snapchat, Discord), 12 researcher accounts'], 'IMC/2025/from-voice-to-ads-auditing-commercial-smart-speakers-for-targeted-advertising-ba': [1, 'Amazon, asked for the puppet accounts\u2019 advertising data as a cross-check on the audit'], 'PETS/2025/echoes-of-privacy-uncovering-the-profiling-practices-of-voice-assistants': [2, 'Amazon and Apple, DSARs used to discover the interest labels to target; 200 fresh accounts'], 'PETS/2025/measuring-the-accuracy-and-effectiveness-of-pii-removal-services': [4, 'paid PII-removal services subscribed to by 71 participants, which then send the opt-outs on their behalf. The paper surveys 10 services, which "cover a total of 1,759 unique data brokers"; its abstract says 2,024, and the body sentence is the one used'], 'USENIX/2025/addressing-the-address-books-interdependent-privacy-issues': [5, 'address-book service providers sent a data-access request ("No provider supplied the requested contact-card data")'], 'USENIX/2025/no-way-to-sign-out-unpacking-non-compliance-with-google-plays-app-account-deleti': [494, 'apps whose deletion method was classified, out of 863 with deletion-link data'], 'IEEE-SP/2026/consumer-beware-exploring-data-brokers-ccpa-compliance': [454, 'of the 543 registered California data brokers (84%; the rest were excluded), each sent a verifiable consumer request by hand: "In total, 9 hours and 57 minutes were spent submitting VCRs to all 454 DBRs"'], 'IEEE-SP/2026/setting-the-course-but-forgetting-to-steer-analyzing-compliance-with-gdprs-right': [3, 'platforms (Instagram, TikTok, YouTube), via sock-puppet accounts and 80 recruited participants'], 'WWW/2026/does-ad-free-mean-less-data-collection-an-empirical-study-of-platform-data-pract': [6, 'author-owned platform accounts; Art. 15(3) requests before and after taking an ad-free subscription'], }; const rPapers = pop.filter((p) => CAT.get(key(p)) === 'R').sort((a, b) => a.year - b.year); const gaps = rPapers.filter((p) => !(key(p) in ASKED)); if (gaps.length) { throw new Error( `${gaps.length} R paper(s) have no hand-keyed "controllers asked": ${gaps.map(key).join(', ')}. ` + `Read the paper and add the row; do not let the table silently omit it.`, ); } const stale = Object.keys(ASKED).filter((k) => !IN.has(k) || CAT.get(k) !== 'R'); if (stale.length) throw new Error(`ASKED has rows that are no longer R papers: ${stale.join(', ')}`); console.log(`${rPapers.length} papers sent requests. Controllers asked, hand-keyed from each paper:\n`); console.log('year\tvenue\tasked\twhat'); const ns = []; for (const p of rPapers) { const [n, what] = ASKED[key(p)]; if (n !== null) ns.push(n); console.log(`${p.year}\t${p.venue}\t${n === null ? '-' : n}\t${what}`); } ns.sort((a, b) => a - b); const median = ns.length % 2 ? ns[(ns.length - 1) / 2] : (ns[ns.length / 2 - 1] + ns[ns.length / 2]) / 2; console.log(`\n a number is stated for ${ns.length} of ${rPapers.length}`); console.log(` median ${median} min ${ns[0]} max ${ns[ns.length - 1]}`); console.log(` at or below 100: ${ns.filter((n) => n <= 100).length} of ${ns.length}`); // The comparable crawl figure, same schema field, so the contrast has a base rate. const crawled = rows.filter( (p) => p.crawlConfig !== null || p.studyTypes.includes('automated-web-crawl'), ); const crawlNs = []; for (const p of crawled) { const c = p.population.filter( (x) => typeof x.n === 'number' && (x.unit === 'websites' || x.unit === 'domains'), ); if (c.length) crawlNs.push(Math.max(...c.map((x) => x.n))); } crawlNs.sort((a, b) => a - b); console.log( `\n BASE RATE: of the ${crawled.length} corpus papers that ran a crawl, ${crawlNs.length} state a ` + `site-or-domain population[].n; their median is ${crawlNs[Math.floor(crawlNs.length / 2)]}.`, ); rule('7. Is it an annotation problem? (share with humanAnnotation, vs the corpus)'); const withAnn = (set) => set.filter((p) => p.humanAnnotation.length > 0).length; console.log(`population : ${withAnn(pop)}/${pop.length}\t${pct(withAnn(pop), pop.length)}`); console.log(`corpus base rate : ${withAnn(rows)}/${corpus}\t${pct(withAnn(rows), corpus)}`); const annStated = pop.filter((p) => p.humanAnnotation.some((a) => !isSentinel(a.agreementMetric)), ).length; const annAll = pop.filter((p) => p.humanAnnotation.length > 0).length; const corpusAnn = rows.filter((p) => p.humanAnnotation.length > 0); const corpusAnnStated = corpusAnn.filter((p) => p.humanAnnotation.some((a) => !isSentinel(a.agreementMetric)), ).length; console.log( `\nof those that annotated, share stating an agreement metric:\n` + `population : ${annStated}/${annAll}\t${pct(annStated, annAll)}\n` + `corpus base rate : ${corpusAnnStated}/${corpusAnn.length}\t${pct(corpusAnnStated, corpusAnn.length)}`, ); rule('8. Ethics review, against the corpus base rate for the same field'); const EMP = rows.filter((p) => p.isEmpirical === true); const revStated = (set) => set.filter((p) => p.ethics && !isSentinel(p.ethics.reviewOutcome)).length; const popEmp = pop.filter((p) => p.isEmpirical === true); console.log(`population, empirical : ${revStated(popEmp)}/${popEmp.length}\t${pct(revStated(popEmp), popEmp.length)} state a review outcome`); console.log(`corpus base rate : ${revStated(EMP)}/${EMP.length}\t${pct(revStated(EMP), EMP.length)}`); const outcomes = new Map(); for (const p of popEmp) { const v = p.ethics.reviewOutcome; outcomes.set(v, (outcomes.get(v) ?? 0) + 1); } console.log('\nreviewOutcome values in the population (sentinels shown, never counted as answers):'); for (const [v, n] of [...outcomes].sort((a, b) => b[1] - a[1])) { console.log(` ${v}\t${n}${isSentinel(v) ? '\t(sentinel)' : ''}`); } rule('9. Which laws the population names (legal[], paper-counted)'); const laws = new Map(); let withLegal = 0; for (const p of pop) { if (!p.legal.length) continue; withLegal++; const seen = new Set(); for (const l of p.legal) { const n = /ccpa|california consumer/i.test(l.law) ? 'CCPA' : /cpra|california privacy rights/i.test(l.law) ? 'CPRA' : /gdpr|general data protection/i.test(l.law) ? 'GDPR' : /eprivacy/i.test(l.law) ? 'ePrivacy Directive' : l.law; if (seen.has(n)) continue; seen.add(n); laws.set(n, (laws.get(n) ?? 0) + 1); } } console.log(`${withLegal} of ${pop.length} papers assess a law. Folded law names, counted by paper:`); for (const [l, n] of [...laws].sort((a, b) => b[1] - a[1])) console.log(` ${l}\t${n}`); const corpusLegal = rows.filter((p) => p.legal.length > 0).length; console.log(`\nBASE RATE: ${corpusLegal} of ${corpus} corpus papers assess any law (${pct(corpusLegal, corpus)});`); console.log(`the population's share is ${pct(withLegal, pop.length)}.`); rule('10. foundViolations, over the tuples in the population that assessed one'); const fv = new Map(); for (const p of pop) for (const l of p.legal) fv.set(l.foundViolations, (fv.get(l.foundViolations) ?? 0) + 1); const fvTot = [...fv.values()].reduce((a, b) => a + b, 0); console.log(`${fvTot} legal tuples across ${withLegal} papers (TUPLES, not papers -- a paper can assess several laws):`); for (const [v, n] of [...fv].sort((a, b) => b[1] - a[1])) console.log(` ${v}\t${n}\t${pct(n, fvTot)}`); rule('11. The page’s own population table, checked against the verdicts both ways'); // "Assert the table against the data, and the data against the table." Only the // first direction catches a row the page invented; only the second catches a // paper the page silently dropped. Both have shipped on this wiki before. const PAGE = path.join(HERE, '..', 'dsr', 'page.txt'); if (fs.existsSync(PAGE)) { const src = fs.readFileSync(PAGE, 'utf8'); const keyed = JSON.parse( fs.readFileSync(path.join(HERE, '..', 'dsr', 'citekeys.json'), 'utf8'), ); // slug -> citekey const byCitekey = new Map(Object.entries(keyed).map(([k, c]) => [c, k])); const rowsOnPage = [...src.matchAll(/^\| (\d{4}) \| ([\w &]+) \| ([RSMDO]) \| \{\[([^\]]+)\]\}/gm)].map( (m) => ({ year: +m[1], cat: m[3], citekey: m[4] }), ); const seen = new Set(); for (const r of rowsOnPage) { const slug = byCitekey.get(r.citekey); if (!slug) throw new Error(`page table row cites ${r.citekey}, which is in no population paper`); if (!IN.has(slug)) throw new Error(`page table row ${r.citekey} is not in the population`); if (CAT.get(slug) !== r.cat) { throw new Error( `page table says ${r.citekey} is category ${r.cat}; the verdicts say ${CAT.get(slug)}`, ); } if (seen.has(slug)) throw new Error(`page table lists ${r.citekey} twice`); seen.add(slug); } const dropped = [...IN].filter((k) => !seen.has(k)); if (dropped.length) { throw new Error( `${dropped.length} population paper(s) are in the verdicts but NOT on the page's table: ` + dropped.join(', '), ); } console.log(`page table: ${rowsOnPage.length} rows, all match the verdicts, none missing`); // The counts sentence has to agree with the table it sits under. const stated = src.match(/By instrument: \*\*R (\d+)\*\*, \*\*S (\d+)\*\*, \*\*M (\d+)\*\*, \*\*D (\d+)\*\*, \*\*O (\d+)\*\*/); if (!stated) throw new Error("the page's 'By instrument' sentence did not parse"); const want = { R: 17, S: 0, M: 0, D: 0, O: 0 }; for (const c of Object.keys(want)) want[c] = pop.filter((p) => CAT.get(key(p)) === c).length; const got = { R: +stated[1], S: +stated[2], M: +stated[3], D: +stated[4], O: +stated[5] }; for (const c of ['R', 'S', 'M', 'D', 'O']) { if (want[c] !== got[c]) throw new Error(`page says ${c} ${got[c]}; the verdicts say ${want[c]}`); } console.log(`page 'By instrument' sentence: ${JSON.stringify(got)} — agrees`); // And the "N of the M S papers are 2024 or later" claim. const sLate = pop.filter((p) => CAT.get(key(p)) === 'S' && p.year >= 2024).length; console.log(`S papers from 2024 onward: ${sLate} of ${want.S}`); } else { console.log(`(${PAGE} not present; page-vs-verdicts check skipped)`); }
- dsr_verdicts_build.py
# Build scripts/dsr_verdicts.json: the hand audit of the 289 full-text candidates # for privacy:data_subject_rights. Every candidate must appear exactly once, and # the script throws rather than defaulting a verdict -- a canned default reason # would read as per-paper evidence when it is not. # # python3 scripts/dsr_verdicts_build.py # # IN categories (see the page's inclusion rule): # R the authors or their participants SENT requests to real controllers # S measured a machine-readable opt-out SIGNAL's deployment or honouring # M measured a rights-exercise MECHANISM across a population # D the research DATASET was obtained through the right of access # O OBSERVATIONAL study of requests other people sent # # OUT reasons: # homonym the probe matched an unrelated sense (HTTP request, NVIDIA # "GPC", "do not sell" of goods, DNS/cache/stream deletion) # background names a right in motivation, related work or references; the # paper's object is something else # policy-text measures what a policy or store declaration SAYS about rights # -> privacy:policies # unlearning right to be forgotten as a machine-learning problem # takedown content removal, delisting, blocklist or abuse removal # consent consent banner or consent withdrawal -> privacy:consent # system proposes or builds a rights mechanism, measures no deployment # attitudes survey/interview on awareness or perception, with no request # exercised and no mechanism observed # research-ethics the paper RECEIVED or honoured requests about its own study # -> practices:ethics # developer-side studies the controller's implementation side, not the # subject's request # enforcement regulator decisions and fines -> practices:legal_enforcement # sok systematization; read it, but it measures nothing itself # agent-benchmark the object measured is an LLM agent's capability, and a # rights task is one item in a wider benchmark import json, os from collections import Counter HERE = os.path.dirname(os.path.abspath(__file__)) DSR = os.path.join(HERE, '..', 'dsr') OUT_BY_IDX = { 'homonym': [1,2,3,5,6,16,17,18,20,21,24,25,26,27,30,32,33,37,40,42,49,50,51,53,54,55,56,57,59,60,61,63,65,72,74,82,83,84,86,88,90,94,97,99,111,122,124,130,131,139,158,159,168,171,172,173,174,175,176,180,182,190,194,195,201,202,203,204,206,211,212,216,221,223,224,225,229,230,231,234,237,238,240,241,243,245,247], 'background': [8,11,15,22,28,29,35,38,41,43,45,52,67,68,69,70,71,73,77,78,91,92,96,98,101,108,114,115,116,119,123,125,129,134,135,137,140,143,150,154,160,162,164,166,205,213,218,219,228,232], 'policy-text': [7,14,31,36,66,85,95,102,103,104,117,120,128,151,155,163,170,177,178,188,193,200,214,222,236,239,249], 'unlearning': [9,19,81,87,109,152,227,242,246,248], 'takedown': [58,62,186,210,220,233,235], 'consent': [4,10,64,148,184,197,208,217,244], 'system': [12,75,76,79,100,142,149,179,192], 'attitudes': [47,93,106,107,113,118,126,127,132,133,136,138,144,145,146,147,153,156,161,181,183,187,189,199,207,209], 'research-ethics': [13,34,44,89,157,185,191,196,198,250], 'developer-side': [46,48,110,112,141,165,167,215], 'enforcement': [121,226], 'sok': [23,39], 'agent-benchmark': [169], } NEW_BY_IDX = { 'homonym': [1,2,3,4,6,18,20,25,26,29,32,44,49,53,54,58,59,61,76,78,79,80,82,84,92,94,110,112,116,118,131,133,142,146,148,149,156,163,169,172,174,176], 'research-ethics': [9,13,14,19,22,23,31,41,47,55,60,62,63,64,71,81,83,91,93,97,98,104,105,114,115,119,121,122,124,125,128,130,135,140,141,147,151,153,158,161,164,167,179], 'background': [5,7,11,12,15,17,21,24,27,28,30,33,34,37,38,40,42,48,51,52,56,65,66,67,85,88,90,95,100,101,102,103,107,108,117,123,126,127,132,139,144,145,150,152,154,155,159,160,162,166,168,170,171,173,175,177,181,182], 'attitudes': [16,39,50,69,70,74,86,87,89,96,106,109,113,129,134,137,138,157], 'policy-text': [35,36,68,75,99,136,180], 'consent': [45,46], 'system': [5.5, 72], 'sok': [120], } NEW_BY_IDX['system'] = [72] rows = [l.rstrip('\n').split('\t') for l in open(os.path.join(DSR, 'out_list.txt'))] idx2key = {i + 1: r[0] for i, r in enumerate(rows)} # Second wave: the 182 candidates the two recall probes (optout_tool, self_service) # added after the first audit. Numbered in the order dsr/ctx_new.txt prints them. new_ordered = [l.strip() for l in open(os.path.join(DSR, 'new_ordered.txt')) if l.strip()] OFF = 1000 for i, k in enumerate(new_ordered): idx2key[OFF + i + 1] = k for reason, idxs in NEW_BY_IDX.items(): OUT_BY_IDX.setdefault(reason, []) OUT_BY_IDX[reason].extend(OFF + i for i in idxs) ins = {} for l in open(os.path.join(DSR, 'in_keys.txt')): if not l.strip(): continue k, c = l.rstrip('\n').split('\t') assert c in 'RSMDO' and len(c) == 1, (k, c) ins[k] = c seen = {} for reason, idxs in OUT_BY_IDX.items(): for i in idxs: assert i in idx2key, i assert i not in seen, f'index {i} assigned twice: {seen[i]} and {reason}' seen[i] = reason unassigned = [(i, k) for i, k in idx2key.items() if i not in seen and k not in ins] assert not unassigned, f'unassigned candidates: {unassigned}' crossed = [k for i, k in idx2key.items() if i in seen and k in ins] assert not crossed, f'both IN and OUT: {crossed}' verdicts = {k: {'verdict': 'IN', 'category': c} for k, c in ins.items()} for i, k in idx2key.items(): if k in verdicts: continue verdicts[k] = {'verdict': 'OUT', 'reason': seen[i]} cands = set(open(os.path.join(DSR, 'keys.txt')).read().split()) assert set(verdicts) == cands, (len(verdicts), len(cands), list(set(verdicts) ^ cands)[:5]) json.dump(verdicts, open(os.path.join(HERE, 'dsr_verdicts.json'), 'w'), indent=0, sort_keys=True) n_in = sum(1 for v in verdicts.values() if v['verdict'] == 'IN') print(f'{len(verdicts)} candidates, {n_in} IN ({100 * n_in / len(verdicts):.1f}% precision), {len(verdicts) - n_in} OUT') print('IN by category :', dict(sorted(Counter(v['category'] for v in verdicts.values() if v['verdict'] == 'IN').items()))) print('OUT by reason :', dict(Counter(v['reason'] for v in verdicts.values() if v['verdict'] == 'OUT').most_common()))
- dsr_quotecheck.py
#!/usr/bin/env python3 """Verify every quoted span on privacy:data_subject_rights against its source. Extracts each //"..."// span from the page source and checks it appears verbatim in the cited paper's full text. Three normalisations, each because a PDF extraction defect otherwise produces a false FAIL: * whitespace collapsed (a line break inside a phrase), * soft hyphen at a line break removed, * curly quotes and dashes folded to ASCII. Both paper.cols.txt and paper.norm.txt are searched: the two-column repair and the raw extraction fail on different sentences. python3 scripts/dsr_quotecheck.py dsr/page.txt Exits non-zero if any quote is not found, or if the page contains a quoted span this script was not given a source for -- a curated quote list drifts from its page otherwise. """ import json import os import re import sys import unicodedata ROOT = '/workspace/publications_dataset/data/fulltext' HERE = os.path.dirname(os.path.abspath(__file__)) # citekey -> corpus slug, for the quotes that come from corpus papers. SRC = json.load(open(os.path.join(HERE, 'dsr_quote_sources.json'))) def fold(s): s = unicodedata.normalize('NFKD', s) s = s.replace('', '') for a, b in [('‘', "'"), ('’', "'"), ('“', '"'), ('”', '"'), ('–', '-'), ('—', '-'), ('−', '-'), (' ', ' ')]: s = s.replace(a, b) s = re.sub(r'-\s*\n\s*', '', s) # Markdown link syntax: the IAB snapshot is a README, so a sentence that # reads "transition to the Global Privacy Protocol" on the page is # "transition to the [Global Privacy Protocol](https://...)" in the source. s = re.sub(r'\[([^\]]+)\]\((?:[^()]|\([^()]*\))*\)', r'\1', s) s = re.sub(r'\s+', ' ', s) return s.strip() _pdf_cache = {} def text(slug, which): # 'pdf' re-extracts with pypdf. The two-column repair in paper.cols.txt # splices the other column into the middle of a sentence on roughly a # quarter of pages, so a quote that is genuinely in the paper can be absent # from every .txt rendering. Checking only .cols publishes a false FAIL. if which == 'pdf': if slug in _pdf_cache: return _pdf_cache[slug] f = os.path.join(ROOT, slug, 'paper.pdf') if not os.path.exists(f): return None try: from pypdf import PdfReader except ImportError: from PyPDF2 import PdfReader t = fold(' '.join(pg.extract_text() or '' for pg in PdfReader(f).pages)) _pdf_cache[slug] = t return t f = os.path.join(ROOT, slug, f'paper.{which}.txt') if not os.path.exists(f): return None return fold(open(f, encoding='utf8', errors='replace').read()) def main(): page = open(sys.argv[1], encoding='utf8').read() spans = re.findall(r'//"(.+?)"//', page, re.S) if not spans: print('no //"..."// spans found -- did the page markup change?') return 1 unlisted = [q for q in spans if fold(q) not in {fold(k) for k in SRC}] fails = [] for q in spans: key = next((k for k in SRC if fold(k) == fold(q)), None) if key is None: continue src = SRC[key] if src.startswith('EXTERNAL:'): # Checked against the byte snapshot taken at fetch time, not # re-fetched: a live re-fetch turns a rate-limit stub into # "quote not found" and a removed sentence into a silent pass. snap = os.path.join(HERE, '..', 'dsr', 'external', re.sub(r'[^A-Za-z0-9]+', '_', src.split(':', 1)[1].strip())[:90] + '.txt') if not os.path.exists(snap): fails.append((q, src)) print(f'FAIL (no snapshot) {q[:70]}... ({snap})') continue body = fold(open(snap, encoding='utf8', errors='replace').read()) if fold(q) in body: print(f'OK [snapshot] {q[:70]}...') else: fails.append((q, src)) print(f'FAIL (snapshot) {q[:70]}... ({src})') continue hit = None for which in ('cols', 'norm', 'pdf'): t = text(src, which) if t and fold(q) in t: hit = which break if hit: print(f'OK [{hit}] {q[:70]}...') else: fails.append((q, src)) print(f'FAIL {q[:70]}... ({src})') if unlisted: print(f'\n{len(unlisted)} quoted span(s) on the page have no source listed:') for q in unlisted: print(' ' + q[:100]) print(f'\n{len(spans)} quoted spans, {len(fails)} failed, {len(unlisted)} unlisted') return 1 if (fails or unlisted) else 0 if __name__ == '__main__': sys.exit(main())
References
- [1]
- Syrmoudis, Emmanuel; Mager, Stefan; Kuebler-Wachendorff, Sophie; Pizzinini, Paul; Grossklags, Jens; Kranz, Johann (2021): "Data Portability between Online Services: An Empirical Analysis on the Effectiveness of GDPR Art. 20", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [2]
- Van Nortwick, Maggie; Wilson, Christo (2022): "Setting the Bar Low: Are Websites Complying With the Minimum Requirements of the CCPA?", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [3]
- Aziz, Muhammad Abu Bakar; Wilson, Christo (2024): "Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [4]
- 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)
- [5]
- Farooqi, Shehroze; Musa, Maaz; Shafiq, Zubair; Zaffar, Fareed (2020): "CanaryTrap: Detecting Data Misuse by Third-Party Apps on Online Social Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [6]
- Rupp, Eduard; Syrmoudis, Emmanuel; Grossklags, Jens (2022): "Leave No Data Behind – Empirical Insights into Data Erasure from Online Services", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [7]
- Kempen, Elina van; Bagayatkar, Isita; Frolikov, Pavel; Georgiou, Chloe; Tsudik, Gene (2026): "Consumer Beware! Exploring Data Brokers' CCPA Compliance", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)
- [8]
- Zimmeck, Sebastian; Kuller, Eliza; Ma, Chunyue; Tassone, Bella; Champeau, Joe (2024): "Generalizable Active Privacy Choice: Designing a Graphical User Interface for Global Privacy Control", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [9]
- Martino, Mariano Di; Meers, Isaac; Quax, Peter; Andries, Ken; Lamotte, Wim (2022): "Revisiting Identification Issues in GDPR ‘Right Of Access’ Policies: A Technical and Longitudinal Analysis", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [10]
- Take, Kejsi; Young, Jordyn; Bhalerao, Rasika; Gallagher, Kevin; Forte, Andrea; McCoy, Damon; Greenstadt, Rachel (2024): "What to Expect When You’re Accessing: An Exploration of User Privacy Rights in People Search Websites", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [11]
- Samarin, Nikita; Kothari, Shayna; Siyed, Zaina; Bjorkman, Oscar; Yuan, Reena; Wijesekera, Primal; Alomar, Noura; Fischer, Jordan; Hoofnagle, Chris; Egelman, Serge (2023): "Lessons in VCR Repair: Compliance of Android App Developers with the California Consumer Privacy Act (CCPA)", in: Proceedings on Privacy Enhancing Technologies. (DOI)
