This is an old revision of the document!
Table of Contents
Provenance: Algorithm Audits
Working log for algorithm_audits. Every figure on that page has its query here, with the population it is a share of. Corpus-level caveats — venue scope, the selection funnel, provisional years — are on corpus and are not restated.
Run: 2026-09-11. Corpus at the time: data/extract/run1/extractions.jsonl, 5,859 papers, 7 venues (CCS, IMC, NDSS, PETS, USENIX Security, TheWebConf, IEEE S&P), 2010–2026; 5,855 of them have full text on disk. Model: Claude Opus 5 for the run, four review sub-agents (three sonnet, one fable) — findings logged at the foot of this page.
Why this page exists rather than a section on a neighbour
The task brief flagged this as the smallest of five page proposals and asked for it to be sized before writing. It was. The sizing result and the decision:
| Question | Answer |
|---|---|
| Does the wiki already cover it? | No. Stateful stateless owns the profile axis and lists personalisation as a phenomenon that needs a stateful design; Hypothesis testing owns the test; Platforms owns sock puppets as an access route and says in its own Open Questions that “Search-engine and ads-ecosystem auditing has no page on this wiki”. Nobody owned the experimental design. |
| How large is the in-corpus population? | 32 papers under a written inclusion rule (below), of 5,859. Twelve further candidates were read and rejected. |
| Is it growing or historical? | Growing: 11 papers in 2020–2023 and 10 in 2024–2026*, against 6 in 2010–2015. |
| Could it be a section instead? | It could have been ~3 KB on Automated measurements. It was not, for two reasons: (a) that page is a routing page between crawl / scan / app, and an audit is a fourth instrument that cuts across the crawl branch rather than sitting beside it; (b) the material that makes the page worth writing — control arms, carry-over, the noise floor — is design advice, not routing, and would have doubled the length of a page whose job is to be short. |
| The counter-argument | The 32 is a lower bound with a known bias (see The screening loss below), so a reader could reasonably say the page is built on a population the corpus cannot see properly. That is stated on the page itself, in its own box, rather than buried here. |
Decision: created as a new page, design:algorithm_audits, linked from Design and from Automated measurements.
The inclusion rule
Written before any table, and encoded in scripts/algorithm_audits_set.mjs rather than in prose. A paper is in if all three hold:
- (T) Treatment. It deliberately varies a property of the measuring identity or request — profile history, declared attribute, location, device, opt-out setting, ad creative — and holds the rest fixed.
- (O) Outcome. What it measures is the platform's own response: ads served, results ranked, prices quoted, feed or recommendation contents, or an access decision.
- (C) Contrast. The result is a difference (or a bounded absence of difference) between arms, not a prevalence over a crawl of many sites.
Deliberate consequences of this rule, each of which a reasonable person could have decided the other way:
- Attack and defence papers are in if they run the arms. [1Meng, Wei; Xing, Xinyu; Sheth, Anmol; Weinsberg, Udi; Lee, Wenke (2014): "Your Online Interests: Pwned! A Pollution Attack Against Targeted Advertising", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)], [2Kim, I Luk; Wang, Weihang; Kwon, Yonghwi; Zheng, Yunhui; Aafer, Yousra; Meng, Weijie; Zhang, Xiangyu (2018): "AdBudgetKiller: Online Advertising Budget Draining Attack", in: Proceedings of the ACM Web Conference. (DOI)] and [3Zhang, Jiang; Psounis, Konstantinos; Haroon, Muhammad; Shafiq, Zubair (2022): "HARPO: Learning to Subvert Online Behavioral Advertising", in: Proceedings of the Network and Distributed System Security Symposium. (Link)] are not audit studies — they are an attack, an attack and a defence — but each runs a differential experiment against a live ad platform, and a student reading this page wants those designs. The criterion is the measurement design, not the paper's contribution type.
- Instrument papers are in. [4Lécuyer, Mathias; Spahn, Riley; Spiliopolous, Yannis; Chaintreau, Augustin; Geambasu, Roxana; Hsu, Daniel J. (2015): "Sunlight: Fine-grained Targeting Detection at Scale with Statistical Confidence", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] and [5Datta, Amit; Tschantz, Michael Carl; Datta, Anupam (2015): "Automated Experiments on Ad Privacy Settings", in: Proceedings on Privacy Enhancing Technologies. (DOI)] contribute tooling; they are the two papers the page most wants read.
- Observational “audits” are out. [6Silva, Márcio; Oliveira, Lucas Santos de; Andreou, Athanasios; Melo, Pedro Olmo Stancioli Vaz de; Goga, Oana; Benevenuto, Fabrício (2020): "Facebook Ads Monitor: An Independent Auditing System for Political Ads on Facebook", in: Proceedings of the ACM Web Conference. (DOI)] calls itself “An Independent Auditing System” and collects ads from volunteers. It fails (C). So does [7Ali, Muhammad; Goetzen, Angelica; Mislove, Alan; Redmiles, Elissa M.; Sapiezynski, Piotr (2023): "Problematic Advertising and its Disparate Exposure on Facebook", in: Proceedings of the USENIX Security Symposium. (Link)] and so does Auditing the Partisanship of Google Search Snippets (TheWebConf 2019), which audits snippets against the pages they summarise with no identity treatment at all.
- ML fairness, DP and system-log auditing are out. They share the word and nothing else.
- RCTs whose treatment is not applied to the platform are out. [8Lone, Qasim; Frik, Alisa; Luckie, Matthew; Korczyński, Maciej; van Eeten, Michel; Gañán, Carlos (2022): "Deployment of Source Address Validation by Network Operators: A Randomized Control Trial", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] is a randomised controlled trial, but the treatment is a notification sent to network operators; the outcome is not platform output.
The probes that built the candidate set
No single regex finds this literature: the five vocabularies barely overlap and three of them (“audit”, “persona”, “personalisation”) are dominated by other meanings. The candidate set is the union of six probes, and each entry records which probe caught it.
| # | Probe | Script | Candidates | What it is for |
|---|---|---|---|---|
| 1 | Full text, 15 term families (sock-puppet, persona, paired arm, control arm, A/A, personalisation, price discrimination, differential treatment, algorithmic audit, ad targeting, filter bubble, SERP, trained profile, audit-verb proximity) over all 5,855 papers with text, whitespace collapsed | _aa_probe1.mjs | 1,746 with ≥1 hit | recall |
| 2 | Probe 1 narrowed: ≥1 outcome-family hit and ≥1 apparatus-family hit | _aa_cands.mjs loose | 190 | the working pool |
| 3 | Probe 1 narrowed further: ≥3 outcome hits and ≥1 strong-apparatus hit | _aa_cands.mjs tight | 27 | precision check; tight ⊆ loose was asserted (0 tight papers outside loose) |
| 4 | Title sweep over the 5,859 extracted titles, audit vocabulary | _aa_union.mjs | 71 | catches papers whose method words are only in the abstract |
| 5 | Topical sweep over title + abstract of all 16,864 index records, including the papers the extraction never saw | _aa_abs2.mjs | 117 (69 extracted, 48 not) | the screening-loss measurement |
| 6 | detection[].phenomenon / .technique and classification[].targetDetail over the extraction | _aa_union.mjs | 74 + 4 | catches papers the prose probes miss |
| 7 | Apparatus-density probe: ≥4 distinct arm-vocabulary matches in full text, run over the whole corpus and again over the years the union left empty | _aa_gap.mjs | — | recall repair |
Probe 7 is the one that mattered. After probes 1–6 the set had a hole at 2020–2021 and I did not trust it. Running the density probe over those two years surfaced three papers the union had missed entirely — [9Cook, John; Nithyanand, Rishab; Shafiq, Zubair (2020): "Inferring Tracker-Advertiser Relationships in the Online Advertising Ecosystem using Header Bidding", in: Proceedings on Privacy Enhancing Technologies. (DOI)], [10Agarwal, Pushkal; Joglekar, Sagar; Papadopoulos, Panagiotis; Sastry, Nishanth; Kourtellis, Nicolas (2020): "Stop tracking me Bro! Differential Tracking of User Demographics on Hyper-Partisan Websites", in: Proceedings of the ACM Web Conference. (DOI)] and, when run over all years, [11Iqbal, Hassan; Khan, Usman Mahmood; Khan, Hassan Ali; Shahzad, Muhammad (2022): "Left or Right: A Peek into the Political Biases in Email Spam Filtering Algorithms During US Election 2020", in: Proceedings of the ACM Web Conference. (DOI)] (102 email accounts on Gmail/Outlook/Yahoo, a design no “personalisation” or “persona” probe reaches because the paper's vocabulary is spam filtering). Three of the final 32, or 9.4%, were found only by the seventh probe. Re-running probe 7 on 2017 and 2021 after that returned nothing but the observational sockpuppet study, so those two zero-years are reported as real.
What no probe reached. The inclusion rule needs a paper's design, and design language is not a vocabulary. A paper that ran arms and described them only as “Group A and Group B” would be invisible to all seven probes. No claim on the page depends on the 32 being exhaustive; the page says so.
The adjudication
108 candidates scored ≥3 across the probes were shortlisted with their abstracts (_aa_short.mjs). The 58 scoring ≥4, plus 17 lower-scored papers flagged by hand, were passed through _aa_adj.mjs, which prints every sentence in the paper matching an arm/treatment/control/persona pattern. Each verdict was then made by reading those sentences, and where they were ambiguous, by grepping the paper's methods section directly.
Every verdict, with the sentence that settled it, is in the script output below (–list). The script refuses to run if any entry lacks an adjudication note.
The screening loss
The most important finding about this page's own evidence base.
The extraction's selection screen labels each abstract securityMeasurement and privacyMeasurement and keeps a paper if either is true. An algorithm audit is frequently neither — a search-personalisation or price-discrimination study reads as fairness, economics or information retrieval.
| Query | Count |
|---|---|
records in data/corpus2/.meta (the bibliographic index) | 16,864 |
label records in data/labels/run1/labels.jsonl | 15,800 |
| audit-topical candidates in the index (probe 5) | 117 |
| … in the 5,859-paper extraction | 69 |
| … not in the extraction | 48 |
… of those, screened out with both labels false | 45 |
| … of those, in a venue-year with no label records at all | 3 |
The script asserts that these buckets sum, and that seven named papers are still found by the query — so a corpus refresh that quietly re-admits them will fail the run rather than leave a stale claim on the page.
Verified individually against labels.jsonl:
| Paper | Why it is not in the extraction |
|---|---|
| Hannak et al., TheWebConf 2013, Measuring personalization of web search | securityMeasurement=false, privacyMeasurement=false |
| Hannak et al., IMC 2014, Measuring Price Discrimination and Steering on E-commerce Web Sites | securityMeasurement=false, privacyMeasurement=false |
| Imana et al., TheWebConf 2021, Auditing for Discrimination in Algorithms Delivering Job Ads | securityMeasurement=false, privacyMeasurement=false |
| Boeker and Urman, TheWebConf 2022, An Empirical Investigation of Personalization Factors on TikTok | securityMeasurement=false, privacyMeasurement=false |
| Soeller et al., TheWebConf 2016, MapWatch | securityMeasurement=false, privacyMeasurement=false |
| Vissers et al., PETS 2014, Crying Wolf? | no label record — PETS 2010–2014 has none |
| Khattak et al., NDSS 2016, Do You See What I See? | no label record — NDSS 2016 has none |
The full list of 48 is in the –list output below. Consequence, stated on the content page: every audit count on it is a lower bound, biased against fairness-framed work, and the page publishes no estimate of the wider literature's size.
Folding
Almost nothing on this page needs folding, because almost nothing on it is a free-text aggregate — the population is hand-keyed and the rest are enum-backed counts. Two exceptions:
statistics.methodis free text and ~20% stable run-to-run. It is folded to an alphanumeric skeleton (lowercase, non-alphanumerics stripped) and paper-counted, and it is published as a ranking, not as percentages. The fold does not merge synonyms:Holm-Bonferroni correction(3),Holm-Bonferroni(1) andHolm-Bonferroni method(1) are three rows in the raw output. An unfolded reading would publish “Holm–Bonferroni 3”; the true paper count for the Holm–Bonferroni family is 5 of 32, and for any Bonferroni-family correction 7 of 32. The report script now prints the hand-folded family counts alongside the raw skeleton ranking, so the page quotes a number the script produced rather than one assembled in prose. Both are in the output below.- The eight noise-baseline phrasings are not a fold but a deliberately widened probe (
_aa_noise.mjs): the narrow term “A/A test” returns 2 papers corpus-wide, so seven further phrasings were added. The count rose from 0 to 11 of 32. Residue is not applicable — the probe reports term presence, and the page states explicitly that a paper can build a null without any of the eight phrasings.
Residue of the candidate probes. Probe 2 returned 190 candidates of which 32 are in and 12 were explicitly rejected; the remaining 146 were read at title-and-abstract level and dropped without an individual note. They are overwhelmingly papers that mention personalisation or targeted advertising in passing. That is the honest residue of this page: 146 papers whose exclusion rests on a title-level read, not a full-text read.
Quotes checked
scripts/quotecheck_algorithm_audits.mjs verifies every quoted fragment on the content page against the paper's own text, in three modes (whitespace-collapsed exact; hyphen- and quote-normalised; longest 8-word run), against both paper.cols.txt and paper.norm.txt. It exits non-zero on any failure.
28 quotes, 0 failures, all matching exactly in paper.cols.txt. Full output below.
Two quotes were caught and removed before publication, both column-splice artefacts:
- [12Guha, Saikat; Cheng, Bin; Francis, Paul (2010): "Challenges in measuring online advertising systems", in: Proceedings of the ACM Internet Measurement Conference. (DOI)]: the sentence naming the two seeded interest sets reads, in both renderings, “C was Even with static DNS entries, we sometimes (but not al- seeded with long-term interests in 'Autos & Vehicles', while ways) observed discrepancies…” — two columns interleaved. The contiguous fragment “enabled, but are seeded with different user personae” is used instead, and no quote naming the two interest sets is published.
- [9Cook, John; Nithyanand, Rishab; Shafiq, Zubair (2020): "Inferring Tracker-Advertiser Relationships in the Online Advertising Ecosystem using Header Bidding", in: Proceedings on Privacy Enhancing Technologies. (DOI)]: this PDF is interleaved throughout in both
colsandnorm. “we first selectively expose a” is followed by text from the adjacent column. No verbatim quote from this paper is published anywhere on either page; its contribution is described instead.
That is the page's one unfixable data-quality problem and it is why the checker tries two renderings rather than one.
External and industry sources
Deliberately few. This page's subject is a research method, not a product, so there is no vendor documentation to verify and no version numbers to date.
| Source | How verified | Verdict |
|---|---|---|
petsymposium.org/popets/2023/popets-2023-0123.php, …/2025/popets-2025-0050.php, …/2026/popets-2026-0152.php | fetched with curl and a browser User-Agent on 2026-09-11; author lists read off the landing pages, because PETS records in the index have no authors (100% of 2,974 PETS/USENIX records) | used — three BibTeX entries |
petsymposium.org/2014/papers/Vissers.pdf (from the index record's pdfUrl) | filename confirms the first author of Crying Wolf?; the index has no author list for it | used for “Vissers et al.”; no BibTeX entry added, because the paper is cited by title only |
OpenAlex, via scripts/bibgen.mjs | DOIs and author lists for the nine non-PETS additions come from the index's OpenAlex records, not from recall | used |
| Any industry writing on “algorithm auditing” (consultancy and NGO audit frameworks, AI-audit vendors) | — | rejected, not searched. The page's claims are about how measurement papers are designed. An AI-governance vendor's audit checklist is a different object with the same name, and importing it would have been the SEO-listicle failure mode in a new costume. |
What could not be established
- The size of this literature. The corpus cannot give it; see The screening loss. Closing it needs a pass over FAccT, EuroS&P and the IR venues, which is out of scope for a corpus-backed page.
- Whether the 146 dropped probe-2 candidates contain any true audits. They were read at title-and-abstract level only. A full-text read of all 146 would settle it and was not done.
- Whether papers build a null without naming it. The eight-term probe is a lower bound. Establishing the real rate needs 32 methods sections read for the concept, which is a different and slower exercise than the verdict read that produced the population.
- Effect sizes. Every audit measures a different outcome on a different platform with a different metric. Nothing is poolable, and the page publishes no cross-paper effect size deliberately.
- Whether sharing an egress IP across arms actually biases an ad-targeting outcome. No paper in the corpus measures it. Filed as an Open Question on the content page rather than asserted.
- The 2011–2013 and 2017 and 2021 zeros. They are real in this corpus. Whether they are real in the field is exactly the question the screening loss prevents answering — 2013 is the year of Hannak et al., which the screen dropped.
Judgement calls
- A new page, not a section. Reasoning in the first table above.
- Hand-adjudicated population rather than a regex population. A regex set would be reproducible and wrong: the tight probe (27 papers) includes an inaudible-voice-command attack and a NIST privacy-framework paper, and misses AdFisher. Hand verdicts are recorded with their evidence sentence and the script refuses to run without them.
- Attack and defence papers counted as audits. See The inclusion rule. Counting only audit studies would give 26 rather than 32 and would exclude the pollution attack, which is one of the clearest illustrations of a blank-vs-trained-profile contrast in the corpus.
- “Price discrimination is dormant” was drafted and then withdrawn. The first draft said the last price-outcome audit was [13Chen, Le; Mislove, Alan; Wilson, Christo (2015): "Peeking Beneath the Hood of Uber", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] (2015). Checking the post-2015
price discrimination/price steeringhits found [14Becerril-Arreola, Rafael (2023): "A Method to Assess and Explain Disparate Impact in Online Retailing", in: Proceedings of the ACM Web Conference. (DOI)], whose outcomes are “price, recommendations, and delivery fees”. The row now reads “rare, not dormant”, with 2 of 32 measuring a price. - The A/A-test claim is stated as a **term count plus an eight-way concept probe, never as “nobody does this”. The distinction is load-bearing: the corpus can prove the vocabulary is absent, and can only lower-bound the practice. - **
design:platformsreports 26 for “sock puppet” corpus-wide and 14 within its own platform-study population. This page reports the same 26. Both are correct; the page says so explicitly rather than letting a reader find two numbers. - No
~~DISCUSSION~~block on this provenance page. Comments belong on the content page. This is the default recorded forprovenance:pages and it is followed here.
Reviewer findings
REVIEWLOG
The report script
Committed as scripts/report_algorithm_audits.mjs with the population in scripts/algorithm_audits_set.mjs. It exits 1 if the corpus size, the empirical / crawled / measuredFrom populations, the year and venue bucket sums, the screening-loss bucket sums, or the seven named screening losses disagree with the contracts it encodes.
- algorithm_audits_set.mjs
// The hand-adjudicated audit population for design:algorithm_audits. // Imported by report_algorithm_audits.mjs and by the probe scripts, so every // figure on the page and every probe share one definition of the set. // // --------------------------------------------------------------------------- // The inclusion rule, as applied. A paper is IN if all three hold: // (T) it deliberately varies a property of the measuring identity or request // -- profile history, declared attribute, location, device, opt-out // setting, ad creative -- and holds the rest fixed; // (O) the outcome it measures is the platform's own response: ads served, // results ranked, prices quoted, feed or recommendation contents, or an // access/labelling decision; // (C) the result is a difference (or a bounded absence of difference) // BETWEEN arms, not a prevalence over a crawl of many sites. // The `why` string is the evidence sentence that settled (T)+(C). // --------------------------------------------------------------------------- export const AUDITS = [ ['IMC/2010/challenges-in-measuring-online-advertising-systems', 'seeded profile pairs: "enabled, but are seeded with different user personae" (the sentence naming the two interest sets is column-spliced in both renderings)'], ['CCS/2014/your-online-interests-pwned-a-pollution-attack-against-targeted-advertising', 'blank profile vs polluted profile: "the polluter can impersonate a user with a blank profile ... and browse pages"'], ['CCS/2015/sunlight-fine-grained-targeting-detection-at-scale-with-statistical-confidence', 'instrument paper: varies personal-data inputs one at a time "compared to a control group", with statistical confidence'], ['IMC/2015/location-location-location-the-impact-of-geolocation-on-web-search-personalizati', 'location as the treatment: "all other browser attributes were the same across treatments"'], ['IMC/2015/peeking-beneath-the-hood-of-uber', '"We created 43 Uber accounts ... blanket a small geographic area with measurement points"'], ['PETS/2015/automated-experiments-on-ad-privacy-settings', 'AdFisher: "We created an experimental group and a control group of agents"'], ['USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads', '"We train 90 personas by visiting popular e-commerce sites, and then crawl major publishers"'], ['WWW/2018/adbudgetkiller-online-advertising-budget-draining-attack', '"Starting from a fresh profile, the profile trainer produces" crafted browsing profiles'], ['WWW/2018/auditing-the-personalization-and-composition-of-politically-related-search-engin', 'standard-vs-incognito paired SERPs: "our controls were paired within the individual"'], ['PETS/2019/investigating-sources-of-pii-used-in-facebook-s-targeted-advertising', '"Take a Facebook account that we control (call it the control account) and the test PII"'], ['WWW/2019/measuring-political-personalization-of-google-news-search', '"a \'sock puppet\' auditing system in which a pair of fresh browser profiles" visits divergent pages then runs identical queries'], ['PETS/2020/inferring-tracker-advertiser-relationships-in-the-online-advertising-ecosystem-u', 'intent vs no-intent versions of each of 16 interest personas, with trackers selectively exposed (this PDF is column-spliced in both cols and norm renderings, so no contiguous quote was publishable)'], ['WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa', '"We create 9 carefully crafted personas representing different genders and age groups"'], ['IMC/2022/measurement-and-analysis-of-implied-identity-in-ad-delivery-optimization', '"We ran 200 versions of this ad at the same time, all from the same account and with the same budget"'], ['IMC/2022/what-factors-affect-targeting-and-bids-in-online-advertising-a-field-measurement', '"All participants were asked to visit the same websites to control for contextual targeting, in randomized order"'], ['NDSS/2022/auto-draft-209', 'HARPO: obfuscated vs unobfuscated personas measured against live profiling models'], ['PETS/2022/atom-ad-network-tomography', '"create a number of online user personas associated with specific interest groups" and gather ads while systematically blocking trackers'], ['WWW/2022/left-or-right-a-peek-into-the-political-biases-in-email-spam-filtering-algorithm', '"We created 102 email accounts" and compared spam placement across treatment and control affiliations'], ['CCS/2023/marketing-to-children-through-online-targeted-advertising-targeting-mechanisms-a', '"We launch the six personas simultaneously by creating six Selenium" browsers'], ['IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem', '"Each treatment persona is simulated by installing and interacting with skills ... By contrast, in the control persona, we do" not'], ['PETS/2023/a-utility-preserving-obfuscation-approach-for-youtube-recommendations', '"We deploy and evaluate De-Harpo\'s effectiveness on YouTube using 10,000 sock puppet based personas"'], ['WWW/2023/a-method-to-assess-and-explain-disparate-impact-in-online-retailing', '"Each observation ... is paired with a set of \'counter-factuals\'" from neighbouring zip codes'], ['PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy', '"We then visit the filtered websites with user interest personas" -- 16 interest personas, two regions'], ['WWW/2024/tiktok-and-the-art-of-personalization-investigating-exploration-and-exploitation', '"validate our results using a baseline generated from automated TikTok bots, as well as a randomized baseline"'], ['IMC/2025/from-voice-to-ads-auditing-commercial-smart-speakers-for-targeted-advertising-ba', '"we used each of the 21 cloned voice models to train two puppets, which we refer to as \'paired puppets\'"'], ['PETS/2025/echoes-of-privacy-uncovering-the-profiling-practices-of-voice-assistants', '"each meticulously trained with a curated set of voice queries designed to simulate various user personas"'], ['PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings', '"running controlled experiments with sock puppet accounts that emulate users watching YouTube videos"'], ['PETS/2025/sheeps-clothing-wolfish-intent-automated-detection-and-evaluation-of-problematic', '"two separate crawlers were deployed: one for the Control group (without ABP) and another for the AccAds group"'], ['USENIX/2025/big-help-or-big-brother-auditing-tracking-profiling-and-personalization-in-gener', '"Training phase involves browsing through 10 webpages - 2 pages per leaked attribute", then personalisation is measured'], ['IEEE-SP/2026/setting-the-course-but-forgetting-to-steer-analyzing-compliance-with-gdprs-right', '"we use sock-puppet accounts to systematically browse and log the behavior of the sock-puppet to generate the ground truth"'], ['PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis', '"We construct accounts with specific parameters or interests, so-called personas, and measure the ads displayed to them"'], ['WWW/2026/does-this-button-work-investigating-youtubes-ineffective-user-controls', '"depending on randomized assignment - triggered one of four native feedback signals to YouTube ... or no signal at all in the control group"'], ]; // Adjudicated OUT, with the reason. These are the near misses a later run will // otherwise re-add; the rule that excluded them is printed with each. export const REJECTED = [ ['WWW/2017/an-army-of-me-sockpuppets-in-online-discussion-communities', 'observational study OF sockpuppets others created; no arm the authors control'], ['WWW/2019/auditing-the-partisanship-of-google-search-snippets', 'audits snippet vs linked page; no identity treatment, no arms'], ['WWW/2020/facebook-ads-monitor-an-independent-auditing-system-for-political-ads-on-faceboo', 'volunteer ad donation; observational, no arms'], ['USENIX/2020/what-twitter-knows-characterizing-ad-targeting-practices-user-perceptions-and-ad', "users' own Twitter data; no arms"], ['IEEE-SP/2023/collaborative-ad-transparency-promises-and-limitations', 'explicitly the non-persona alternative: "One method that does not use fake personas"'], ['USENIX/2023/problematic-advertising-and-its-disparate-exposure-on-facebook', 'donated ad exposure from real users; disparity is observational'], ['CCS/2022/cart-ology-intercepting-targeted-advertising-via-ad-network-identity-entanglemen', 'attack on ad-network identity linking; no persona arms'], ['CCS/2022/privacy-limitations-of-interest-based-advertising-on-the-web-a-post-mortem-empir', 'randomised control is a data permutation over a browsing panel, not a live-platform arm'], ['IEEE-SP/2024/targeted-and-troublesome-tracking-and-advertising-on-childrens-websites', 'fresh profile per page visit; the paper itself says "Future work could extend our method to incorporate personas"'], ['PETS/2024/interest-disclosing-mechanisms-for-advertising-are-privacy-exposing-not-preservi', 'Topics API analysed over real browsing histories, not persona arms'], ['WWW/2026/when-ads-become-profiles-uncovering-the-invisible-risk-of-web-advertising-at-sca', '"Random Control group" is a model ablation, not a platform arm'], ['IEEE-SP/2022/deployment-of-source-address-validation-by-network-operators-a-randomized-contro', 'an RCT, but the treatment is a notification to operators; outcome is not platform output'], ];
- report_algorithm_audits.mjs
#!/usr/bin/env node // Report script for design:algorithm_audits (and provenance:design:algorithm_audits). // // Every figure on the page is printed here with the population it is a share of. // Counts are of PAPERS, never tuples. Sentinels are never answers. // // The audit population is HAND-KEYED below rather than derived from a regex. // That is deliberate: the corpus has no field for "ran a differential audit", // the regex probes that find candidates have 20-60% precision, and a script that // silently re-derives the split from prose is how a wrong split reaches a page. // The candidate probes that produced the list are in _aa_probe1.mjs / _aa_abs2.mjs // and are documented on the provenance page; this file records the verdicts. // // Usage: node scripts/report_algorithm_audits.mjs [--list] import fs from 'node:fs'; import path from 'node:path'; import { dataRoot, loadExtractions, isSentinel } from './lib.mjs'; const SHOW_LIST = process.argv.includes('--list'); const ROOT = dataRoot(); const papers = loadExtractions(); const byKey = new Map(papers.map((p) => [`${p.venue}/${p.year}/${p.slug}`, p])); import { AUDITS, REJECTED } from './algorithm_audits_set.mjs'; // --------------------------------------------------------------------------- function die(msg) { console.error(`CONTRACT VIOLATED: ${msg}`); process.exit(1); } const pct = (n, d) => (d === 0 ? 'n/a' : `${((100 * n) / d).toFixed(1)}%`); // Contracts against the corpus, so a corpus refresh cannot silently move a page. if (papers.length !== 5859) die(`corpus is ${papers.length} papers, page says 5,859`); const CRAWLED = papers.filter((p) => p.crawlConfig !== null || p.studyTypes.includes('automated-web-crawl')); const INFERENTIAL = papers.filter((p) => p.statistics.some((s) => s.kind && s.kind !== 'descriptive-only')); const EMPIRICAL = papers.filter((p) => p.isEmpirical === true); if (CRAWLED.length !== 1120) die(`crawled population is ${CRAWLED.length}, OVERVIEW.md says 1120`); if (INFERENTIAL.length !== 1762) die(`inferential population is ${INFERENTIAL.length}, OVERVIEW.md says 1762`); if (EMPIRICAL.length !== 5118) die(`empirical population is ${EMPIRICAL.length}, OVERVIEW.md says 5118`); const audit = []; for (const [key, why] of AUDITS) { const p = byKey.get(key); if (!p) die(`hand-keyed audit paper not in the extraction: ${key}`); if (!why || why.length < 25) die(`no adjudication evidence recorded for ${key}`); audit.push(p); } if (new Set(AUDITS.map((a) => a[0])).size !== AUDITS.length) die('duplicate key in AUDITS'); for (const [key] of REJECTED) if (!byKey.get(key)) die(`rejected paper not in the extraction: ${key}`); const N = audit.length; console.log('='.repeat(78)); console.log('design:algorithm_audits -- report script'); console.log(`run ${new Date().toISOString().slice(0, 10)} corpus ${papers.length} papers, 7 venues, 2010-2026`); console.log('='.repeat(78)); console.log(''); console.log('## Populations'); console.log(` all papers ${papers.length}`); console.log(` empirical ${EMPIRICAL.length}`); console.log(` crawled ${CRAWLED.length}`); console.log(` inferential (any non-descriptive statistic) ${INFERENTIAL.length}`); console.log(` AUDIT (hand-adjudicated, rule above) ${N}`); console.log(` adjudicated and rejected ${REJECTED.length}`); console.log(''); // --- by year ----------------------------------------------------------------- console.log('## Audit papers by year (denominator: the 32-paper audit set)'); const years = [...new Set(papers.map((p) => p.year))].sort(); let run = 0; for (const y of years) { const n = audit.filter((p) => p.year === y).length; run += n; const star = y >= 2025 ? ' *provisional' : ''; console.log(` ${y} ${String(n).padStart(2)} ${'#'.repeat(n)}${star}`); } if (run !== N) die(`year buckets sum to ${run}, not ${N}`); console.log(` total ${run}`); const gaps = years.filter((y) => audit.every((p) => p.year !== y)); console.log(` years with zero audit papers: ${gaps.join(', ')}`); console.log(''); for (const [lo, hi] of [[2010, 2015], [2016, 2019], [2020, 2023], [2024, 2026]]) { const n = audit.filter((p) => p.year >= lo && p.year <= hi).length; console.log(` ${lo}-${hi}: ${n} of ${N} (${pct(n, N)})`); } console.log(''); // --- by venue and platform --------------------------------------------------- console.log('## Audit papers by venue, against that venue\'s own output'); const venues = [...new Set(papers.map((p) => p.venue))].sort(); let vsum = 0; for (const v of venues) { const tot = papers.filter((p) => p.venue === v).length; const n = audit.filter((p) => p.venue === v).length; vsum += n; console.log(` ${v.padEnd(9)} ${String(n).padStart(2)} of ${String(tot).padStart(5)} ${pct(n, tot).padStart(6)}`); } if (vsum !== N) die(`venue buckets sum to ${vsum}, not ${N}`); console.log(''); console.log('## Platform measured (multi-valued; does not sum to N)'); for (const pl of ['web', 'other-online-service', 'mobile', 'iot', 'offline']) { const n = audit.filter((p) => p.platforms.includes(pl)).length; console.log(` ${pl.padEnd(22)} ${String(n).padStart(2)} of ${N} ${pct(n, N)}`); } console.log(''); // --- what the audit set reports, each row against the same-denominator baseline console.log('## What audit papers report, vs the comparable corpus baseline'); console.log(' Each row states both populations. The baseline is the population named,'); console.log(' not "all papers", so the two cells are comparable.'); const statedStat = (p) => p.statistics.some((s) => s.kind && s.kind !== 'descriptive-only'); const statedEthics = (p) => !isSentinel(p.ethics && p.ethics.reviewOutcome); const hasArtifact = (p) => p.artifacts && !isSentinel(p.artifacts.availability); const hasCrawlCfg = (p) => p.crawlConfig !== null; const statefulStated = (p) => p.crawlConfig !== null && !isSentinel(p.crawlConfig.statefulness); const interactionStated = (p) => p.crawlConfig !== null && !isSentinel(p.crawlConfig.interactionDepth); const vantageStated = (p) => p.vantage.some((v) => (v.locations || []).some((l) => !isSentinel(l))); const rows = [ ['runs a non-descriptive statistic', audit, statedStat, EMPIRICAL, statedStat, 'empirical (5,118)'], ['states an ethics-review outcome', audit, statedEthics, EMPIRICAL, statedEthics, 'empirical (5,118)'], ['states artifact availability', audit, hasArtifact, EMPIRICAL, hasArtifact, 'empirical (5,118)'], ['has a crawlConfig at all', audit, hasCrawlCfg, CRAWLED, hasCrawlCfg, 'crawled (1,120)'], ['states crawl statefulness', audit, statefulStated, CRAWLED, statefulStated, 'crawled (1,120)'], ['states interaction depth', audit, interactionStated, CRAWLED, interactionStated, 'crawled (1,120)'], ['states a vantage location', audit, vantageStated, papers.filter((p) => p.vantage.length > 0), vantageStated, 'measuredFrom (3,908)'], ]; console.log(` ${'indicator'.padEnd(34)} ${'audit (32)'.padStart(14)} baseline`); for (const [label, aSet, aFn, bSet, bFn, bName] of rows) { const a = aSet.filter(aFn).length; const b = bSet.filter(bFn).length; console.log(` ${label.padEnd(34)} ${(`${a}/${aSet.length} (${pct(a, aSet.length)})`).padStart(14)} ${b}/${bSet.length} (${pct(b, bSet.length)}) of ${bName}`); } console.log(''); // --- statistics named in the audit set -------------------------------------- console.log('## Statistical methods named by audit papers (paper-counted, free text, ranking only)'); const smeth = new Map(); for (const p of audit) { const seen = new Set(); for (const s of p.statistics) { if (!s.method || isSentinel(s.method)) continue; const k = String(s.method).toLowerCase().replace(/[^a-z0-9]+/g, ''); if (seen.has(k)) continue; seen.add(k); smeth.set(k, (smeth.get(k) || 0) + 1); } } const disp = new Map(); for (const p of audit) for (const s of p.statistics) { if (!s.method || isSentinel(s.method)) continue; const k = String(s.method).toLowerCase().replace(/[^a-z0-9]+/g, ''); if (!disp.has(k)) disp.set(k, s.method); } for (const [k, v] of [...smeth.entries()].sort((a, b) => b[1] - a[1]).slice(0, 15)) console.log(` ${String(v).padStart(2)} ${disp.get(k)}`); // Synonym families the alphanumeric skeleton fold does NOT merge. Printed here // so the page quotes a family count produced by this script rather than by prose. console.log(' -- correction families, folded by hand (paper-counted; the skeleton fold does not merge these):'); const FAMILIES = { 'Holm-Bonferroni (any spelling)': (m) => /holm/i.test(m), 'Bonferroni without Holm': (m) => /bonferroni/i.test(m) && !/holm/i.test(m), 'any Bonferroni-family': (m) => /bonferroni/i.test(m), 'Benjamini-Hochberg/Yekutieli': (m) => /benjamini/i.test(m), }; for (const [name, fn] of Object.entries(FAMILIES)) { const n = audit.filter((p) => p.statistics.some((s) => s.method && !isSentinel(s.method) && fn(s.method))).length; console.log(` ${name.padEnd(32)} ${n} of ${N}`); } const noStat = audit.filter((p) => !statedStat(p)); console.log(` -- ${noStat.length} of ${N} audit papers report no non-descriptive statistic at all:`); for (const p of noStat) console.log(` ${p.year} ${p.venue} ${p.title}`); console.log(''); // --- vocabulary the field uses ---------------------------------------------- console.log('## Apparatus vocabulary in full text (paper-counted over all 5,859 with text)'); const VOCAB = { 'sock puppet': /\bsock[ -]?puppets?\b/i, persona: /\b(?:user|shopper|synthetic|training|treatment|control) personas?\b|\bpersonas?\b/i, 'control profile/account/persona': /\bcontrol (?:profile|account|persona|browser)s?\b/i, 'treatment group/profile': /\btreatment (?:group|profile|persona|condition|arm)s?\b/i, 'trained profile': /\btrain(?:ed|ing) (?:the |our |a )?(?:browser )?profiles?\b/i, 'A/A test': /\bA\/A test/i, 'noise floor': /\bnoise floor\b/i, 'price discrimination/steering': /\bprice (?:discrimination|steering)\b/i, }; const vocabCount = Object.fromEntries(Object.keys(VOCAB).map((k) => [k, [0, 0]])); let withText = 0; for (const p of papers) { const f = path.join(ROOT, 'fulltext', String(p.year), p.venue, p.slug, 'paper.cols.txt'); if (!fs.existsSync(f)) continue; withText++; const t = fs.readFileSync(f, 'utf8').replace(/\s+/g, ' '); const inAudit = audit.includes(p); for (const [name, re] of Object.entries(VOCAB)) if (re.test(t)) { vocabCount[name][0]++; if (inAudit) vocabCount[name][1]++; } } console.log(` full text present for ${withText} of ${papers.length} papers`); console.log(` ${'term'.padEnd(32)} ${'corpus'.padStart(7)} ${'in audit set'.padStart(12)}`); for (const [k, [c, a]] of Object.entries(vocabCount)) console.log(` ${k.padEnd(32)} ${String(c).padStart(7)} ${String(a).padStart(5)} of ${N}`); console.log(''); // --- what the corpus cannot see --------------------------------------------- console.log('## Screening loss: audit-topical papers in the index but not in the extraction'); const meta = []; const md = path.join(ROOT, 'corpus2/.meta'); for (const f of fs.readdirSync(md)) { if (!f.endsWith('.json')) continue; const j = JSON.parse(fs.readFileSync(path.join(md, f), 'utf8')); const arr = Array.isArray(j) ? j : Object.values(j).find((v) => Array.isArray(v)) || []; for (const r of arr) meta.push(r); } const labels = new Map(); for (const l of fs.readFileSync(path.join(ROOT, 'labels/run1/labels.jsonl'), 'utf8').split('\n').filter(Boolean)) { const r = JSON.parse(l); labels.set(`${r.venue}/${r.year}/${r.slug}`, r); } const TOPIC = /\balgorithm(?:ic)? audit|\baudit(?:ing)? (?:the |of )?(?:search|recommend|ad |ads\b|advertis|algorithm|platform|feed|targeting|ranking)|sock ?-?puppet|price (?:discrimination|steering)|differential pricing|differential treatment|personali[sz]ation of|web search personali|search personali|ad delivery|ad targeting|targeted advertis|filter bubble|echo chamber|rabbit hole|discriminat\w+ (?:in|by) (?:ad|algorithm|ranking|recommend)/i; const cands = meta.filter((r) => TOPIC.test(`${r.title || ''} ${r.abstract || ''}`.replace(/\s+/g, ' '))); const out = cands.filter((r) => !byKey.has(`${r.venue}/${r.year}/${r.slug}`)); let screened = 0, nolabel = 0; const lost = []; for (const r of out) { const lab = labels.get(`${r.venue}/${r.year}/${r.slug}`); if (!lab) { nolabel++; lost.push(['no label record (venue-year gap)', r]); } else if (!lab.securityMeasurement && !lab.privacyMeasurement) { screened++; lost.push(['screened out: both labels false', r]); } else die(`unexpected: selected but not extracted: ${r.venue}/${r.year}/${r.slug}`); } console.log(` index records ${meta.length}`); console.log(` audit-topical candidates in the index ${cands.length}`); console.log(` ... of which extracted (in the 5,859) ${cands.length - out.length}`); console.log(` ... of which NOT extracted ${out.length}`); console.log(` screened out (both screen labels false) ${screened}`); console.log(` no label record at all (venue-year gap) ${nolabel}`); if (screened + nolabel !== out.length) die('screening-loss buckets do not sum'); console.log(''); console.log(' Named losses a reader of this page would expect to find:'); const NAMED = [/measuring personalization of web search/i, /measuring price discrimination/i, /crying wolf/i, /auditing for discrimination in algorithms delivering job ads/i, /do you see what i see/i, /an empirical investigation of personalization factors on tiktok/i, /mapwatch/i]; for (const re of NAMED) { const hit = lost.find(([, r]) => re.test(r.title || '')); if (!hit) die(`named loss no longer found by the screening-loss query: ${re}`); console.log(` ${hit[1].year} ${String(hit[1].venue).padEnd(8)} ${hit[1].title} -- ${hit[0]}`); } console.log(''); if (SHOW_LIST) { console.log('## The audit set in full, with the sentence that settled the verdict'); for (const [key, why] of AUDITS) { const p = byKey.get(key); console.log(` ${p.year} ${p.venue.padEnd(8)} ${p.title}`); console.log(` ${key}`); console.log(` IN: ${why}`); } console.log(''); console.log('## Adjudicated and rejected'); for (const [key, why] of REJECTED) { const p = byKey.get(key); console.log(` ${p.year} ${p.venue.padEnd(8)} ${p.title}`); console.log(` OUT: ${why}`); } console.log(''); console.log('## Screening loss in full'); for (const [why, r] of lost.sort((a, b) => a[1].year - b[1].year)) console.log(` ${r.year} ${String(r.venue).padEnd(8)} ${r.title}\n ${why}`); } console.log('OK: all contracts held.');
Its output, unedited
Run on 2026-09-11 against data/extract/run1.
- report_algorithm_audits-output.txt
============================================================================== design:algorithm_audits -- report script run 2026-09-11 corpus 5859 papers, 7 venues, 2010-2026 ============================================================================== ## Populations all papers 5859 empirical 5118 crawled 1120 inferential (any non-descriptive statistic) 1762 AUDIT (hand-adjudicated, rule above) 32 adjudicated and rejected 12 ## Audit papers by year (denominator: the 32-paper audit set) 2010 1 # 2011 0 2012 0 2013 0 2014 1 # 2015 4 #### 2016 1 # 2017 0 2018 2 ## 2019 2 ## 2020 2 ## 2021 0 2022 5 ##### 2023 4 #### 2024 2 ## 2025 5 ##### *provisional 2026 3 ### *provisional total 32 years with zero audit papers: 2011, 2012, 2013, 2017, 2021 2010-2015: 6 of 32 (18.8%) 2016-2019: 5 of 32 (15.6%) 2020-2023: 11 of 32 (34.4%) 2024-2026: 10 of 32 (31.3%) ## Audit papers by venue, against that venue's own output CCS 3 of 990 0.3% IEEE-SP 1 of 767 0.1% IMC 7 of 638 1.1% NDSS 1 of 701 0.1% PETS 10 of 510 2.0% USENIX 2 of 1410 0.1% WWW 8 of 843 0.9% ## Platform measured (multi-valued; does not sum to N) web 25 of 32 78.1% other-online-service 18 of 32 56.3% mobile 4 of 32 12.5% iot 3 of 32 9.4% offline 0 of 32 0.0% ## What audit papers report, vs the comparable corpus baseline Each row states both populations. The baseline is the population named, not "all papers", so the two cells are comparable. indicator audit (32) baseline runs a non-descriptive statistic 21/32 (65.6%) 1637/5118 (32.0%) of empirical (5,118) states an ethics-review outcome 20/32 (62.5%) 1728/5118 (33.8%) of empirical (5,118) states artifact availability 22/32 (68.8%) 2890/5118 (56.5%) of empirical (5,118) has a crawlConfig at all 24/32 (75.0%) 1080/1120 (96.4%) of crawled (1,120) states crawl statefulness 22/32 (68.8%) 219/1120 (19.6%) of crawled (1,120) states interaction depth 21/32 (65.6%) 841/1120 (75.1%) of crawled (1,120) states a vantage location 14/32 (43.8%) 1228/3908 (31.4%) of measuredFrom (3,908) ## Statistical methods named by audit papers (paper-counted, free text, ranking only) 3 Holm-Bonferroni correction 2 linear regression 2 Bonferroni correction 2 Mann-Whitney U test 1 CDFs, medians, percentiles, and percentages 1 descriptive comparison of ad fractions and indexed CPM 1 exact statistical test based on Pearson's correlation 1 Holm-Bonferroni 1 Benjamini-Yekutieli 1 averages and standard deviations 1 cross correlation 1 blocked permutation test 1 Holm-Bonferroni method 1 Clopper-Pearson interval 1 Counts and percentages of advertisements -- correction families, folded by hand (paper-counted; the skeleton fold does not merge these): Holm-Bonferroni (any spelling) 5 of 32 Bonferroni without Holm 3 of 32 any Bonferroni-family 7 of 32 Benjamini-Hochberg/Yekutieli 1 of 32 -- 11 of 32 audit papers report no non-descriptive statistic at all: 2010 IMC Challenges in measuring online advertising systems. 2014 CCS Your Online Interests: Pwned! A Pollution Attack Against Targeted Advertising. 2015 IMC Location, Location, Location: The Impact of Geolocation on Web Search Personalization. 2016 USENIX Tracing Information Flows Between Ad Exchanges Using Retargeted Ads 2018 WWW AdBudgetKiller: Online Advertising Budget Draining Attack. 2019 PETS Investigating sources of PII used in Facebook’s targeted advertising 2022 NDSS HARPO: Learning to Subvert Online Behavioral Advertising 2023 CCS Marketing to Children Through Online Targeted Advertising: Targeting Mechanisms and Legal Aspects. 2023 PETS A Utility-Preserving Obfuscation Approach for YouTube Recommendations 2025 PETS Echoes of Privacy: Uncovering the Profiling Practices of Voice Assistants 2026 IEEE-SP Setting the Course, but Forgetting to Steer: Analyzing Compliance with GDPR's Right of Access to Data by Instagram, TikTok, and Youtube. ## Apparatus vocabulary in full text (paper-counted over all 5,859 with text) full text present for 5855 of 5859 papers term corpus in audit set sock puppet 26 5 of 32 persona 190 14 of 32 control profile/account/persona 33 11 of 32 treatment group/profile 66 5 of 32 trained profile 4 1 of 32 A/A test 2 0 of 32 noise floor 35 2 of 32 price discrimination/steering 33 9 of 32 ## Screening loss: audit-topical papers in the index but not in the extraction index records 16864 audit-topical candidates in the index 117 ... of which extracted (in the 5,859) 69 ... of which NOT extracted 48 screened out (both screen labels false) 45 no label record at all (venue-year gap) 3 Named losses a reader of this page would expect to find: 2013 WWW Measuring personalization of web search. -- screened out: both labels false 2014 IMC Measuring Price Discrimination and Steering on E-commerce Web Sites. -- screened out: both labels false 2014 PETS Crying Wolf? On the Price Discrimination of Online Airline Tickets -- no label record (venue-year gap) 2021 WWW Auditing for Discrimination in Algorithms Delivering Job Ads. -- screened out: both labels false 2016 NDSS Do You See What I See? Differential Treatment of Anonymous Users -- no label record (venue-year gap) 2022 WWW An Empirical Investigation of Personalization Factors on TikTok. -- screened out: both labels false 2016 WWW MapWatch: Detecting and Monitoring International Border Personalization on Online Maps. -- screened out: both labels false OK: all contracts held.
The full verdict list
node scripts/report_algorithm_audits.mjs –list — the 32 verdicts with their evidence sentence, the 12 rejections with their reason, and all 48 screening losses.
- report_algorithm_audits-list-output.txt
============================================================================== design:algorithm_audits -- report script run 2026-09-11 corpus 5859 papers, 7 venues, 2010-2026 ============================================================================== ## Populations all papers 5859 empirical 5118 crawled 1120 inferential (any non-descriptive statistic) 1762 AUDIT (hand-adjudicated, rule above) 32 adjudicated and rejected 12 ## Audit papers by year (denominator: the 32-paper audit set) 2010 1 # 2011 0 2012 0 2013 0 2014 1 # 2015 4 #### 2016 1 # 2017 0 2018 2 ## 2019 2 ## 2020 2 ## 2021 0 2022 5 ##### 2023 4 #### 2024 2 ## 2025 5 ##### *provisional 2026 3 ### *provisional total 32 years with zero audit papers: 2011, 2012, 2013, 2017, 2021 2010-2015: 6 of 32 (18.8%) 2016-2019: 5 of 32 (15.6%) 2020-2023: 11 of 32 (34.4%) 2024-2026: 10 of 32 (31.3%) ## Audit papers by venue, against that venue's own output CCS 3 of 990 0.3% IEEE-SP 1 of 767 0.1% IMC 7 of 638 1.1% NDSS 1 of 701 0.1% PETS 10 of 510 2.0% USENIX 2 of 1410 0.1% WWW 8 of 843 0.9% ## Platform measured (multi-valued; does not sum to N) web 25 of 32 78.1% other-online-service 18 of 32 56.3% mobile 4 of 32 12.5% iot 3 of 32 9.4% offline 0 of 32 0.0% ## What audit papers report, vs the comparable corpus baseline Each row states both populations. The baseline is the population named, not "all papers", so the two cells are comparable. indicator audit (32) baseline runs a non-descriptive statistic 21/32 (65.6%) 1637/5118 (32.0%) of empirical (5,118) states an ethics-review outcome 20/32 (62.5%) 1728/5118 (33.8%) of empirical (5,118) states artifact availability 22/32 (68.8%) 2890/5118 (56.5%) of empirical (5,118) has a crawlConfig at all 24/32 (75.0%) 1080/1120 (96.4%) of crawled (1,120) states crawl statefulness 22/32 (68.8%) 219/1120 (19.6%) of crawled (1,120) states interaction depth 21/32 (65.6%) 841/1120 (75.1%) of crawled (1,120) states a vantage location 14/32 (43.8%) 1228/3908 (31.4%) of measuredFrom (3,908) ## Statistical methods named by audit papers (paper-counted, free text, ranking only) 3 Holm-Bonferroni correction 2 linear regression 2 Bonferroni correction 2 Mann-Whitney U test 1 CDFs, medians, percentiles, and percentages 1 descriptive comparison of ad fractions and indexed CPM 1 exact statistical test based on Pearson's correlation 1 Holm-Bonferroni 1 Benjamini-Yekutieli 1 averages and standard deviations 1 cross correlation 1 blocked permutation test 1 Holm-Bonferroni method 1 Clopper-Pearson interval 1 Counts and percentages of advertisements -- correction families, folded by hand (paper-counted; the skeleton fold does not merge these): Holm-Bonferroni (any spelling) 5 of 32 Bonferroni without Holm 3 of 32 any Bonferroni-family 7 of 32 Benjamini-Hochberg/Yekutieli 1 of 32 -- 11 of 32 audit papers report no non-descriptive statistic at all: 2010 IMC Challenges in measuring online advertising systems. 2014 CCS Your Online Interests: Pwned! A Pollution Attack Against Targeted Advertising. 2015 IMC Location, Location, Location: The Impact of Geolocation on Web Search Personalization. 2016 USENIX Tracing Information Flows Between Ad Exchanges Using Retargeted Ads 2018 WWW AdBudgetKiller: Online Advertising Budget Draining Attack. 2019 PETS Investigating sources of PII used in Facebook’s targeted advertising 2022 NDSS HARPO: Learning to Subvert Online Behavioral Advertising 2023 CCS Marketing to Children Through Online Targeted Advertising: Targeting Mechanisms and Legal Aspects. 2023 PETS A Utility-Preserving Obfuscation Approach for YouTube Recommendations 2025 PETS Echoes of Privacy: Uncovering the Profiling Practices of Voice Assistants 2026 IEEE-SP Setting the Course, but Forgetting to Steer: Analyzing Compliance with GDPR's Right of Access to Data by Instagram, TikTok, and Youtube. ## Apparatus vocabulary in full text (paper-counted over all 5,859 with text) full text present for 5855 of 5859 papers term corpus in audit set sock puppet 26 5 of 32 persona 190 14 of 32 control profile/account/persona 33 11 of 32 treatment group/profile 66 5 of 32 trained profile 4 1 of 32 A/A test 2 0 of 32 noise floor 35 2 of 32 price discrimination/steering 33 9 of 32 ## Screening loss: audit-topical papers in the index but not in the extraction index records 16864 audit-topical candidates in the index 117 ... of which extracted (in the 5,859) 69 ... of which NOT extracted 48 screened out (both screen labels false) 45 no label record at all (venue-year gap) 3 Named losses a reader of this page would expect to find: 2013 WWW Measuring personalization of web search. -- screened out: both labels false 2014 IMC Measuring Price Discrimination and Steering on E-commerce Web Sites. -- screened out: both labels false 2014 PETS Crying Wolf? On the Price Discrimination of Online Airline Tickets -- no label record (venue-year gap) 2021 WWW Auditing for Discrimination in Algorithms Delivering Job Ads. -- screened out: both labels false 2016 NDSS Do You See What I See? Differential Treatment of Anonymous Users -- no label record (venue-year gap) 2022 WWW An Empirical Investigation of Personalization Factors on TikTok. -- screened out: both labels false 2016 WWW MapWatch: Detecting and Monitoring International Border Personalization on Online Maps. -- screened out: both labels false ## The audit set in full, with the sentence that settled the verdict 2010 IMC Challenges in measuring online advertising systems. IMC/2010/challenges-in-measuring-online-advertising-systems IN: seeded profile pairs: "enabled, but are seeded with different user personae" (the sentence naming the two interest sets is column-spliced in both renderings) 2014 CCS Your Online Interests: Pwned! A Pollution Attack Against Targeted Advertising. CCS/2014/your-online-interests-pwned-a-pollution-attack-against-targeted-advertising IN: blank profile vs polluted profile: "the polluter can impersonate a user with a blank profile ... and browse pages" 2015 CCS Sunlight: Fine-grained Targeting Detection at Scale with Statistical Confidence. CCS/2015/sunlight-fine-grained-targeting-detection-at-scale-with-statistical-confidence IN: instrument paper: varies personal-data inputs one at a time "compared to a control group", with statistical confidence 2015 IMC Location, Location, Location: The Impact of Geolocation on Web Search Personalization. IMC/2015/location-location-location-the-impact-of-geolocation-on-web-search-personalizati IN: location as the treatment: "all other browser attributes were the same across treatments" 2015 IMC Peeking Beneath the Hood of Uber. IMC/2015/peeking-beneath-the-hood-of-uber IN: "We created 43 Uber accounts ... blanket a small geographic area with measurement points" 2015 PETS Automated Experiments on Ad Privacy Settings PETS/2015/automated-experiments-on-ad-privacy-settings IN: AdFisher: "We created an experimental group and a control group of agents" 2016 USENIX Tracing Information Flows Between Ad Exchanges Using Retargeted Ads USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads IN: "We train 90 personas by visiting popular e-commerce sites, and then crawl major publishers" 2018 WWW AdBudgetKiller: Online Advertising Budget Draining Attack. WWW/2018/adbudgetkiller-online-advertising-budget-draining-attack IN: "Starting from a fresh profile, the profile trainer produces" crafted browsing profiles 2018 WWW Auditing the Personalization and Composition of Politically-Related Search Engine Results Pages. WWW/2018/auditing-the-personalization-and-composition-of-politically-related-search-engin IN: standard-vs-incognito paired SERPs: "our controls were paired within the individual" 2019 PETS Investigating sources of PII used in Facebook’s targeted advertising PETS/2019/investigating-sources-of-pii-used-in-facebook-s-targeted-advertising IN: "Take a Facebook account that we control (call it the control account) and the test PII" 2019 WWW Measuring Political Personalization of Google News Search. WWW/2019/measuring-political-personalization-of-google-news-search IN: "a 'sock puppet' auditing system in which a pair of fresh browser profiles" visits divergent pages then runs identical queries 2020 PETS Inferring Tracker-Advertiser Relationships in the Online Advertising Ecosystem using Header Bidding PETS/2020/inferring-tracker-advertiser-relationships-in-the-online-advertising-ecosystem-u IN: intent vs no-intent versions of each of 16 interest personas, with trackers selectively exposed (this PDF is column-spliced in both cols and norm renderings, so no contiguous quote was publishable) 2020 WWW Stop tracking me Bro! Differential Tracking of User Demographics on Hyper-Partisan Websites. WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa IN: "We create 9 carefully crafted personas representing different genders and age groups" 2022 IMC Measurement and analysis of implied identity in ad delivery optimization. IMC/2022/measurement-and-analysis-of-implied-identity-in-ad-delivery-optimization IN: "We ran 200 versions of this ad at the same time, all from the same account and with the same budget" 2022 IMC What factors affect targeting and bids in online advertising?: a field measurement study. IMC/2022/what-factors-affect-targeting-and-bids-in-online-advertising-a-field-measurement IN: "All participants were asked to visit the same websites to control for contextual targeting, in randomized order" 2022 NDSS HARPO: Learning to Subvert Online Behavioral Advertising NDSS/2022/auto-draft-209 IN: HARPO: obfuscated vs unobfuscated personas measured against live profiling models 2022 PETS ATOM: Ad-network Tomography PETS/2022/atom-ad-network-tomography IN: "create a number of online user personas associated with specific interest groups" and gather ads while systematically blocking trackers 2022 WWW Left or Right: A Peek into the Political Biases in Email Spam Filtering Algorithms During US Election 2020. WWW/2022/left-or-right-a-peek-into-the-political-biases-in-email-spam-filtering-algorithm IN: "We created 102 email accounts" and compared spam placement across treatment and control affiliations 2023 CCS Marketing to Children Through Online Targeted Advertising: Targeting Mechanisms and Legal Aspects. CCS/2023/marketing-to-children-through-online-targeted-advertising-targeting-mechanisms-a IN: "We launch the six personas simultaneously by creating six Selenium" browsers 2023 IMC Tracking, Profiling, and Ad Targeting in the Alexa Echo Smart Speaker Ecosystem. IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem IN: "Each treatment persona is simulated by installing and interacting with skills ... By contrast, in the control persona, we do" not 2023 PETS A Utility-Preserving Obfuscation Approach for YouTube Recommendations PETS/2023/a-utility-preserving-obfuscation-approach-for-youtube-recommendations IN: "We deploy and evaluate De-Harpo's effectiveness on YouTube using 10,000 sock puppet based personas" 2023 WWW A Method to Assess and Explain Disparate Impact in Online Retailing. WWW/2023/a-method-to-assess-and-explain-disparate-impact-in-online-retailing IN: "Each observation ... is paired with a set of 'counter-factuals'" from neighbouring zip codes 2024 PETS Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy? PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy IN: "We then visit the filtered websites with user interest personas" -- 16 interest personas, two regions 2024 WWW TikTok and the Art of Personalization: Investigating Exploration and Exploitation on Social Media Feeds. WWW/2024/tiktok-and-the-art-of-personalization-investigating-exploration-and-exploitation IN: "validate our results using a baseline generated from automated TikTok bots, as well as a randomized baseline" 2025 IMC From Voice to Ads: Auditing Commercial Smart Speakers for Targeted Advertising based on Voice Characteristics. IMC/2025/from-voice-to-ads-auditing-commercial-smart-speakers-for-targeted-advertising-ba IN: "we used each of the 21 cloned voice models to train two puppets, which we refer to as 'paired puppets'" 2025 PETS Echoes of Privacy: Uncovering the Profiling Practices of Voice Assistants PETS/2025/echoes-of-privacy-uncovering-the-profiling-practices-of-voice-assistants IN: "each meticulously trained with a curated set of voice queries designed to simulate various user personas" 2025 PETS More and Scammier Ads: The Perils of YouTube's Ad Privacy Settings PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings IN: "running controlled experiments with sock puppet accounts that emulate users watching YouTube videos" 2025 PETS Sheep's clothing, wolfish intent: Automated detection and evaluation of problematic 'allowed' advertisements PETS/2025/sheeps-clothing-wolfish-intent-automated-detection-and-evaluation-of-problematic IN: "two separate crawlers were deployed: one for the Control group (without ABP) and another for the AccAds group" 2025 USENIX Big Help or Big Brother? Auditing Tracking, Profiling, and Personalization in Generative AI Assistants USENIX/2025/big-help-or-big-brother-auditing-tracking-profiling-and-personalization-in-gener IN: "Training phase involves browsing through 10 webpages - 2 pages per leaked attribute", then personalisation is measured 2026 IEEE-SP Setting the Course, but Forgetting to Steer: Analyzing Compliance with GDPR's Right of Access to Data by Instagram, TikTok, and Youtube. IEEE-SP/2026/setting-the-course-but-forgetting-to-steer-analyzing-compliance-with-gdprs-right IN: "we use sock-puppet accounts to systematically browse and log the behavior of the sock-puppet to generate the ground truth" 2026 PETS Ad Personalization and Transparency in Mobile Ecosystems: A Comparative Analysis of Google's and Apple's EU App Stores PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis IN: "We construct accounts with specific parameters or interests, so-called personas, and measure the ads displayed to them" 2026 WWW Does This Button Work? Investigating YouTube's Ineffective User Controls. WWW/2026/does-this-button-work-investigating-youtubes-ineffective-user-controls IN: "depending on randomized assignment - triggered one of four native feedback signals to YouTube ... or no signal at all in the control group" ## Adjudicated and rejected 2017 WWW An Army of Me: Sockpuppets in Online Discussion Communities. OUT: observational study OF sockpuppets others created; no arm the authors control 2019 WWW Auditing the Partisanship of Google Search Snippets. OUT: audits snippet vs linked page; no identity treatment, no arms 2020 WWW Facebook Ads Monitor: An Independent Auditing System for Political Ads on Facebook. OUT: volunteer ad donation; observational, no arms 2020 USENIX What Twitter Knows: Characterizing Ad Targeting Practices, User Perceptions, and Ad Explanations Through Users' Own Twitter Data OUT: users' own Twitter data; no arms 2023 IEEE-SP Collaborative Ad Transparency: Promises and Limitations. OUT: explicitly the non-persona alternative: "One method that does not use fake personas" 2023 USENIX Problematic Advertising and its Disparate Exposure on Facebook OUT: donated ad exposure from real users; disparity is observational 2022 CCS Cart-ology: Intercepting Targeted Advertising via Ad Network Identity Entanglement. OUT: attack on ad-network identity linking; no persona arms 2022 CCS Privacy Limitations of Interest-based Advertising on The Web: A Post-mortem Empirical Analysis of Google's FLoC. OUT: randomised control is a data permutation over a browsing panel, not a live-platform arm 2024 IEEE-SP Targeted and Troublesome: Tracking and Advertising on Children's Websites. OUT: fresh profile per page visit; the paper itself says "Future work could extend our method to incorporate personas" 2024 PETS Interest-disclosing Mechanisms for Advertising are Privacy-Exposing (not Preserving) OUT: Topics API analysed over real browsing histories, not persona arms 2026 WWW When Ads Become Profiles: Uncovering the Invisible Risk of Web Advertising at Scale with LLMs. OUT: "Random Control group" is a model ablation, not a platform arm 2022 IEEE-SP Deployment of Source Address Validation by Network Operators: A Randomized Control Trial. OUT: an RCT, but the treatment is a notification to operators; outcome is not platform output ## Screening loss in full 2010 NDSS Adnostic: Privacy Preserving Targeted Advertising no label record (venue-year gap) 2010 WWW Using a model of social dynamics to predict popularity of news. screened out: both labels false 2012 CCS Privacy-aware personalization for mobile advertising. screened out: both labels false 2012 WWW How effective is targeted advertising? screened out: both labels false 2013 WWW Measuring personalization of web search. screened out: both labels false 2013 WWW Spatio-temporal dynamics of online memes: a study of geo-tagged tweets. screened out: both labels false 2014 IMC Measuring Price Discrimination and Steering on E-commerce Web Sites. screened out: both labels false 2014 PETS Crying Wolf? On the Price Discrimination of Online Airline Tickets no label record (venue-year gap) 2014 WWW Quizz: targeted crowdsourcing with a billion (potential) users. screened out: both labels false 2014 WWW Mining novelty-seeking trait across heterogeneous domains. screened out: both labels false 2014 WWW Exploring the filter bubble: the effect of using recommender systems on content diversity. screened out: both labels false 2014 WWW Fast topic discovery from web search streams. screened out: both labels false 2015 WWW Events and Controversies: Influences of a Shocking News Event on Information Seeking. screened out: both labels false 2016 NDSS Do You See What I See? Differential Treatment of Anonymous Users no label record (venue-year gap) 2016 USENIX Micro-Virtualization Memory Tracing to Detect and Prevent Spraying Attacks screened out: both labels false 2016 WWW MapWatch: Detecting and Monitoring International Border Personalization on Online Maps. screened out: both labels false 2018 IEEE-SP FuturesMEX: Secure, Distributed Futures Market Exchange. screened out: both labels false 2018 WWW Modeling Interdependent and Periodic Real-World Action Sequences. screened out: both labels false 2018 WWW Me, My Echo Chamber, and I: Introspection on Social Media Polarization. screened out: both labels false 2018 WWW Political Discourse on Social Media: Echo Chambers, Gatekeepers, and the Price of Bipartisanship. screened out: both labels false 2020 CCS DECO: Liberating Web Data Using Decentralized Oracles for TLS. screened out: both labels false 2020 IMC Mis-shapes, Mistakes, Misfits: An Analysis of Domain Classification Services. screened out: both labels false 2020 WWW Architectures for Autonomy: Towards an Equitable Web of Data in the Age of AI. screened out: both labels false 2021 USENIX SIGL: Securing Software Installations Through Deep Graph Learning screened out: both labels false 2021 WWW Rabbit Holes and Taste Distortion: Distribution-Aware Recommendation with Evolving Interests. screened out: both labels false 2021 WWW Local Clustering in Contextual Multi-Armed Bandits. screened out: both labels false 2021 WWW Incrementality Testing in Programmatic Advertising: Enhanced Precision with Double-Blind Designs. screened out: both labels false 2021 WWW Causal Network Motifs: Identifying Heterogeneous Spillover Effects in A/B Tests. screened out: both labels false 2021 WWW Auditing for Discrimination in Algorithms Delivering Job Ads. screened out: both labels false 2021 WWW The Interaction between Political Typology and Filter Bubbles in News Recommendation Algorithms. screened out: both labels false 2022 PETS PUBA: Privacy-Preserving User-Data Bookkeeping and Analytics screened out: both labels false 2022 WWW An Empirical Investigation of Personalization Factors on TikTok. screened out: both labels false 2023 PETS Find Thy Neighbourhood: Privacy-Preserving Local Clustering screened out: both labels false 2023 WWW pFedPrompt: Learning Personalized Prompt for Vision-Language Models in Federated Learning. screened out: both labels false 2023 WWW Breaking Filter Bubble: A Reinforcement Learning Framework of Controllable Recommender System. screened out: both labels false 2024 PETS Evaluating Google's Protected Audience Protocol screened out: both labels false 2024 WWW Filter Bubble or Homogenization? Disentangling the Long-Term Effects of Recommendations on User Consumption Patterns. screened out: both labels false 2024 WWW Optimal Engagement-Diversity Tradeoffs in Social Media. screened out: both labels false 2024 WWW Learning Category Trees for ID-Based Recommendation: Exploring the Power of Differentiable Vector Quantization. screened out: both labels false 2024 WWW Full-stage Diversified Recommendation: Large-scale Online Experiments in Short-video Platform. screened out: both labels false 2024 WWW Uncovering the Deep Filter Bubble: Narrow Exposure in Short-Video Recommendation. screened out: both labels false 2025 CCS Cascading Adversarial Bias from Injection to Distillation in Language Models. screened out: both labels false 2025 USENIX Privacy Audit as Bits Transmission: (Im)possibilities for Audit by One Run screened out: both labels false 2025 WWW LLM4Rerank: LLM-based Auto-Reranking Framework for Recommendations. screened out: both labels false 2025 WWW SPRec: Self-Play to Debias LLM-based Recommendation. screened out: both labels false 2026 PETS Making Sense of Private Advertising: A Principled Approach to a Complex Ecosystem screened out: both labels false 2026 WWW DynaMoLTV: A Cross-Game Dynamic Mixture Model with Weighted Sub-Distributions for Player Lifetime Value Prediction. screened out: both labels false 2026 WWW Audit?of?Audits for the Web: Bayesian Meta?Evaluation that Yields Interval?Valued, Threshold?Aligned Fairness Claims. screened out: both labels false OK: all contracts held.
The quote checker and its output
- quotecheck_algorithm_audits.mjs
#!/usr/bin/env node // Verifies every quoted fragment used on design:algorithm_audits and on its // provenance page against the paper's own text. // // Three matching modes, because a two-column PDF loses in different places in // each rendering: (1) whitespace-collapsed exact, (2) hyphen/quote-normalised, // (3) longest 8-word run. Each quote is tried against paper.cols.txt AND // paper.norm.txt; a quote found in either is PASS, with the rendering recorded. // Exits non-zero on any FAIL. import fs from 'node:fs'; import path from 'node:path'; import { dataRoot } from './lib.mjs'; const ROOT = dataRoot(); const norm = (s) => s .replace(/\s+/g, ' ') .replace(/[‘’ʼ]/g, "'") .replace(/[“”]/g, '"') .replace(/[‐-―−]/g, '-') .trim(); const strip = (s) => norm(s).replace(/-\s*/g, '').toLowerCase(); function readModes(key) { const [venue, year, slug] = key.split('/'); const out = {}; for (const name of ['paper.cols.txt', 'paper.norm.txt']) { const f = path.join(ROOT, 'fulltext', year, venue, slug, name); if (fs.existsSync(f)) out[name] = fs.readFileSync(f, 'utf8'); } if (Object.keys(out).length === 0) throw new Error(`no text for ${key}`); return out; } export function checkQuote(key, quote) { const modes = readModes(key); const q = norm(quote); const qs = strip(quote); const words = q.split(' '); for (const [name, raw] of Object.entries(modes)) { const t = norm(raw); if (t.includes(q)) return { ok: true, how: `exact in ${name}` }; if (strip(raw).includes(qs)) return { ok: true, how: `hyphen/quote-normalised in ${name}` }; } // longest 8-word run for (const [name, raw] of Object.entries(modes)) { const ts = strip(raw); let best = 0; for (let i = 0; i + 8 <= words.length; i++) { if (ts.includes(strip(words.slice(i, i + 8).join(' ')))) best++; } if (best > 0) return { ok: true, how: `${best} of ${Math.max(0, words.length - 7)} 8-word runs in ${name}` }; } return { ok: false, how: 'NOT FOUND in cols or norm' }; } // Quotes used on the two pages. Each entry: [paper key, quote as published]. export const QUOTES = [ ['IMC/2010/challenges-in-measuring-online-advertising-systems', 'Even queries launched simultaneously from two identically configured clients on the same subnet can produce wildly different ads over multiple timescales.'], ['IMC/2010/challenges-in-measuring-online-advertising-systems', 'In this paper we perform all analysis relative to a control experiment'], ['IMC/2010/challenges-in-measuring-online-advertising-systems', 'enabled, but are seeded with different user personae'], ['PETS/2015/automated-experiments-on-ad-privacy-settings', 'We created an experimental group and a control group of agents.'], ['PETS/2015/automated-experiments-on-ad-privacy-settings', 'The browser agents in the experimental group visited websites on substance abuse while the agents in the control group simply waited.'], ['WWW/2019/measuring-political-personalization-of-google-news-search', 'we develop a "sock puppet" auditing system in which a pair of fresh browser profiles, first, visits web pages that reflect divergent political discourses and, second, executes identical politically oriented Google News searches'], ['WWW/2018/auditing-the-personalization-and-composition-of-politically-related-search-engin', 'our controls were paired within the individual, enabling us to isolate the impact that their browser mode had on their search rankings for each query we searched'], ['IMC/2015/location-location-location-the-impact-of-geolocation-on-web-search-personalizati', 'all other browser attributes were the same across treatments, so each treatment should present an identical browser fingerprint'], ['IMC/2025/from-voice-to-ads-auditing-commercial-smart-speakers-for-targeted-advertising-ba', 'We assigned voices randomly to days, and scheduled paired puppets in parallel.'], ['IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem', 'By contrast, in the control persona, we do'], ['PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings', 'our methodology consists of running controlled experiments with sock puppet accounts that emulate users watching YouTube videos in an instrumented browser'], ['WWW/2026/does-this-button-work-investigating-youtubes-ineffective-user-controls', 'depending on randomized assignment'], ['WWW/2022/left-or-right-a-peek-into-the-political-biases-in-email-spam-filtering-algorithm', 'We created 102 email accounts'], ['IMC/2022/measurement-and-analysis-of-implied-identity-in-ad-delivery-optimization', 'We ran 200 versions of this ad at the same time, all from the same account and with the same budget'], ['WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa', 'We create 9 carefully crafted personas representing different genders and age groups.'], ['IEEE-SP/2026/setting-the-course-but-forgetting-to-steer-analyzing-compliance-with-gdprs-right', 'we use sock-puppet accounts to system- atically browse and log the behavior of the sock-puppet to generate the ground truth'], ['PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis', 'We construct accounts with specific parameters or interests, so-called personas, and measure the ads displayed to them'], ['IMC/2015/peeking-beneath-the-hood-of-uber', 'We created 43 Uber accounts'], ['IEEE-SP/2023/collaborative-ad-transparency-promises-and-limitations', 'One method that does not use fake personas'], ['IEEE-SP/2024/targeted-and-troublesome-tracking-and-advertising-on-childrens-websites', 'Future work could extend our method to incorporate personas and warmup crawls to study such ads.'], ['PETS/2023/a-utility-preserving-obfuscation-approach-for-youtube-recommendations', 'We deploy and evaluate De-Harpo'], ['USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads', 'We train 90 personas by visiting popular e-commerce sites, and then crawl major publishers to gather retargeted ads'], ['WWW/2024/tiktok-and-the-art-of-personalization-investigating-exploration-and-exploitation', 'validate our results using a baseline generated from automated TikTok bots, as well as a randomized baseline'], ['CCS/2015/sunlight-fine-grained-targeting-detection-at-scale-with-statistical-confidence', 'prior studies conduct tightly controlled experiments that vary personal data inputs (such as location, search terms, or profile interests) one at a time and observe the effect on service outputs (such as ads, recommendations, or prices) compared to a control group'], ['WWW/2022/using-survival-models-to-estimate-user-engagement-in-online-experiments', 'We simulate A/A tests by re-randomizing the treatment assignments on the observed exposure logs from our experiment corpus.'], ['PETS/2026/on-the-suitability-of-llm-driven-agents-for-dark-pattern-audits', 'We design and deploy an LLM-driven auditing agent capable of end-to-end traversal of rights-request workflows'], ['PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy', 'we also conduct Bonferroni correction on the statistical test'], ['IMC/2022/what-factors-affect-targeting-and-bids-in-online-advertising-a-field-measurement', 'Most commonly, web crawlers with synthetic profiles or personas are used to measure behavioral targeting and contextual targeting.'], ]; if (import.meta.url === `file://${process.argv[1]}`) { let fail = 0; for (const [key, q] of QUOTES) { let r; try { r = checkQuote(key, q); } catch (e) { r = { ok: false, how: e.message }; } if (!r.ok) fail++; console.log(`${r.ok ? 'PASS' : 'FAIL'} ${key}\n ${r.how}\n "${q.slice(0, 110)}${q.length > 110 ? '…' : ''}"`); } console.log(`\n${QUOTES.length} quotes checked, ${fail} failed.`); process.exit(fail ? 1 : 0); }
- quotecheck_algorithm_audits-output.txt
PASS IMC/2010/challenges-in-measuring-online-advertising-systems exact in paper.cols.txt "Even queries launched simultaneously from two identically configured clients on the same subnet can produce wi…" PASS IMC/2010/challenges-in-measuring-online-advertising-systems exact in paper.cols.txt "In this paper we perform all analysis relative to a control experiment" PASS IMC/2010/challenges-in-measuring-online-advertising-systems exact in paper.cols.txt "enabled, but are seeded with different user personae" PASS PETS/2015/automated-experiments-on-ad-privacy-settings exact in paper.cols.txt "We created an experimental group and a control group of agents." PASS PETS/2015/automated-experiments-on-ad-privacy-settings exact in paper.cols.txt "The browser agents in the experimental group visited websites on substance abuse while the agents in the contr…" PASS WWW/2019/measuring-political-personalization-of-google-news-search exact in paper.cols.txt "we develop a "sock puppet" auditing system in which a pair of fresh browser profiles, first, visits web pages …" PASS WWW/2018/auditing-the-personalization-and-composition-of-politically-related-search-engin exact in paper.cols.txt "our controls were paired within the individual, enabling us to isolate the impact that their browser mode had …" PASS IMC/2015/location-location-location-the-impact-of-geolocation-on-web-search-personalizati exact in paper.cols.txt "all other browser attributes were the same across treatments, so each treatment should present an identical br…" PASS IMC/2025/from-voice-to-ads-auditing-commercial-smart-speakers-for-targeted-advertising-ba exact in paper.cols.txt "We assigned voices randomly to days, and scheduled paired puppets in parallel." PASS IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem exact in paper.cols.txt "By contrast, in the control persona, we do" PASS PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings exact in paper.cols.txt "our methodology consists of running controlled experiments with sock puppet accounts that emulate users watchi…" PASS WWW/2026/does-this-button-work-investigating-youtubes-ineffective-user-controls exact in paper.cols.txt "depending on randomized assignment" PASS WWW/2022/left-or-right-a-peek-into-the-political-biases-in-email-spam-filtering-algorithm exact in paper.cols.txt "We created 102 email accounts" PASS IMC/2022/measurement-and-analysis-of-implied-identity-in-ad-delivery-optimization exact in paper.cols.txt "We ran 200 versions of this ad at the same time, all from the same account and with the same budget" PASS WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa exact in paper.cols.txt "We create 9 carefully crafted personas representing different genders and age groups." PASS IEEE-SP/2026/setting-the-course-but-forgetting-to-steer-analyzing-compliance-with-gdprs-right exact in paper.cols.txt "we use sock-puppet accounts to system- atically browse and log the behavior of the sock-puppet to generate the…" PASS PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis exact in paper.cols.txt "We construct accounts with specific parameters or interests, so-called personas, and measure the ads displayed…" PASS IMC/2015/peeking-beneath-the-hood-of-uber exact in paper.cols.txt "We created 43 Uber accounts" PASS IEEE-SP/2023/collaborative-ad-transparency-promises-and-limitations exact in paper.cols.txt "One method that does not use fake personas" PASS IEEE-SP/2024/targeted-and-troublesome-tracking-and-advertising-on-childrens-websites exact in paper.cols.txt "Future work could extend our method to incorporate personas and warmup crawls to study such ads." PASS PETS/2023/a-utility-preserving-obfuscation-approach-for-youtube-recommendations exact in paper.cols.txt "We deploy and evaluate De-Harpo" PASS USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads exact in paper.cols.txt "We train 90 personas by visiting popular e-commerce sites, and then crawl major publishers to gather retargete…" PASS WWW/2024/tiktok-and-the-art-of-personalization-investigating-exploration-and-exploitation exact in paper.cols.txt "validate our results using a baseline generated from automated TikTok bots, as well as a randomized baseline" PASS CCS/2015/sunlight-fine-grained-targeting-detection-at-scale-with-statistical-confidence exact in paper.cols.txt "prior studies conduct tightly controlled experiments that vary personal data inputs (such as location, search …" PASS WWW/2022/using-survival-models-to-estimate-user-engagement-in-online-experiments exact in paper.cols.txt "We simulate A/A tests by re-randomizing the treatment assignments on the observed exposure logs from our exper…" PASS PETS/2026/on-the-suitability-of-llm-driven-agents-for-dark-pattern-audits exact in paper.cols.txt "We design and deploy an LLM-driven auditing agent capable of end-to-end traversal of rights-request workflows" PASS PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy exact in paper.cols.txt "we also conduct Bonferroni correction on the statistical test" PASS IMC/2022/what-factors-affect-targeting-and-bids-in-online-advertising-a-field-measurement exact in paper.cols.txt "Most commonly, web crawlers with synthetic profiles or personas are used to measure behavioral targeting and c…" 28 quotes checked, 0 failed.
The noise-baseline probe and its output
Eight phrasings for the same idea, run over all 5,855 papers with text. The narrow term returns 2; the widened probe returns 11 of 32 within the audit set.
- _aa_noise.mjs
// Concept-level probe: does the paper establish a same-treatment baseline // (what an A/A test is), under ANY name? import fs from 'node:fs'; import path from 'node:path'; import { dataRoot, loadExtractions } from './lib.mjs'; const ROOT=dataRoot(); const TERMS={ 'A/A test': /\bA\/A[ -]?(?:test|experiment)/i, 'control-control / null experiment': /\bcontrol[- ]control\b|\bnull experiment/i, 'noise floor': /\bnoise floor\b/i, 'identical/identically configured arms': /\bidentical(?:ly)? (?:configured |trained |seeded )?(?:client|browser|profile|persona|account|agent|machine|instance)s?\b/i, 'permutation / randomisation test': /\bpermutation test|\brandomi[sz]ation test\b/i, 'null distribution': /\bnull distribution\b/i, 'baseline noise / measurement noise': /\b(?:baseline|measurement|inherent|background) noise\b/i, 'two arms with the same treatment': /\bsame treatment\b|\bno[- ]?treatment (?:arm|group|control)\b/i, }; const papers=loadExtractions(); import { AUDITS, REJECTED } from './algorithm_audits_set.mjs'; const AUDIT=new Set(AUDITS.map(a=>a[0])); const REJ=new Set(REJECTED.map(a=>a[0])); if ([...AUDIT].some(k=>REJ.has(k))) throw new Error('a key is in both AUDITS and REJECTED'); const inAudit=k=>AUDIT.has(k); const tot={},aud={}; const per=new Map(); for(const p of papers){ const k=`${p.venue}/${p.year}/${p.slug}`; const f=path.join(ROOT,'fulltext',String(p.year),p.venue,p.slug,'paper.cols.txt'); if(!fs.existsSync(f))continue; const t=fs.readFileSync(f,'utf8').replace(/\s+/g,' '); for(const [n,re] of Object.entries(TERMS)) if(re.test(t)){ tot[n]=(tot[n]||0)+1; if(inAudit(k)){aud[n]=(aud[n]||0)+1; if(!per.has(k))per.set(k,[]); per.get(k).push(n);} } } console.log(`AUDIT keys parsed from report script: ${AUDIT.size}`); console.log(`${'term'.padEnd(38)} ${'corpus'.padStart(7)} ${'audit'.padStart(6)}`); for(const n of Object.keys(TERMS)) console.log(`${n.padEnd(38)} ${String(tot[n]||0).padStart(7)} ${String(aud[n]||0).padStart(6)}`); console.log(`\naudit papers with >=1 noise-baseline term: ${per.size} of ${AUDIT.size}`); for(const [k,v] of [...per].sort()) console.log(` ${k}\n ${v.join(', ')}`); console.log('\naudit papers with NONE:'); for(const k of AUDIT) if(!per.has(k)) console.log(` ${k}`);
- _aa_noise-output.txt
AUDIT keys parsed from report script: 32 term corpus audit A/A test 2 0 control-control / null experiment 31 1 noise floor 35 2 identical/identically configured arms 22 5 permutation / randomisation test 32 4 null distribution 1 0 baseline noise / measurement noise 219 2 two arms with the same treatment 13 1 audit papers with >=1 noise-baseline term: 11 of 32 CCS/2015/sunlight-fine-grained-targeting-detection-at-scale-with-statistical-confidence permutation / randomisation test IMC/2010/challenges-in-measuring-online-advertising-systems control-control / null experiment, identical/identically configured arms IMC/2015/location-location-location-the-impact-of-geolocation-on-web-search-personalizati noise floor, identical/identically configured arms IMC/2025/from-voice-to-ads-auditing-commercial-smart-speakers-for-targeted-advertising-ba permutation / randomisation test, baseline noise / measurement noise PETS/2015/automated-experiments-on-ad-privacy-settings identical/identically configured arms, permutation / randomisation test PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings identical/identically configured arms PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis permutation / randomisation test WWW/2018/auditing-the-personalization-and-composition-of-politically-related-search-engin noise floor WWW/2019/measuring-political-personalization-of-google-news-search identical/identically configured arms WWW/2022/left-or-right-a-peek-into-the-political-biases-in-email-spam-filtering-algorithm two arms with the same treatment WWW/2024/tiktok-and-the-art-of-personalization-investigating-exploration-and-exploitation baseline noise / measurement noise audit papers with NONE: CCS/2014/your-online-interests-pwned-a-pollution-attack-against-targeted-advertising IMC/2015/peeking-beneath-the-hood-of-uber USENIX/2016/tracing-information-flows-between-ad-exchanges-using-retargeted-ads WWW/2018/adbudgetkiller-online-advertising-budget-draining-attack PETS/2019/investigating-sources-of-pii-used-in-facebook-s-targeted-advertising PETS/2020/inferring-tracker-advertiser-relationships-in-the-online-advertising-ecosystem-u WWW/2020/stop-tracking-me-bro-differential-tracking-of-user-demographics-on-hyper-partisa IMC/2022/measurement-and-analysis-of-implied-identity-in-ad-delivery-optimization IMC/2022/what-factors-affect-targeting-and-bids-in-online-advertising-a-field-measurement NDSS/2022/auto-draft-209 PETS/2022/atom-ad-network-tomography CCS/2023/marketing-to-children-through-online-targeted-advertising-targeting-mechanisms-a IMC/2023/tracking-profiling-and-ad-targeting-in-the-alexa-echo-smart-speaker-ecosystem PETS/2023/a-utility-preserving-obfuscation-approach-for-youtube-recommendations WWW/2023/a-method-to-assess-and-explain-disparate-impact-in-online-retailing PETS/2024/opted-out-yet-tracked-are-regulations-enough-to-protect-your-privacy PETS/2025/echoes-of-privacy-uncovering-the-profiling-practices-of-voice-assistants PETS/2025/sheeps-clothing-wolfish-intent-automated-detection-and-evaluation-of-problematic USENIX/2025/big-help-or-big-brother-auditing-tracking-profiling-and-personalization-in-gener IEEE-SP/2026/setting-the-course-but-forgetting-to-steer-analyzing-compliance-with-gdprs-right WWW/2026/does-this-button-work-investigating-youtubes-ineffective-user-controls
Related
- algorithm_audits — the page this log is for.
- corpus — the corpus, its funnel and its provisional years.
- stateful_stateless — the neighbouring log; its 29-paper comparison-study audit is the closest methodological precedent for the hand-adjudication done here.
- platforms — where the corpus-wide “sock puppet” count also appears, against a different denominator.
- [1]
- Meng, Wei; Xing, Xinyu; Sheth, Anmol; Weinsberg, Udi; Lee, Wenke (2014): "Your Online Interests: Pwned! A Pollution Attack Against Targeted Advertising", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)
- [2]
- Kim, I Luk; Wang, Weihang; Kwon, Yonghwi; Zheng, Yunhui; Aafer, Yousra; Meng, Weijie; Zhang, Xiangyu (2018): "AdBudgetKiller: Online Advertising Budget Draining Attack", in: Proceedings of the ACM Web Conference. (DOI)
- [3]
- Zhang, Jiang; Psounis, Konstantinos; Haroon, Muhammad; Shafiq, Zubair (2022): "HARPO: Learning to Subvert Online Behavioral Advertising", in: Proceedings of the Network and Distributed System Security Symposium. (Link)
- [4]
- Lécuyer, Mathias; Spahn, Riley; Spiliopolous, Yannis; Chaintreau, Augustin; Geambasu, Roxana; Hsu, Daniel J. (2015): "Sunlight: Fine-grained Targeting Detection at Scale with Statistical Confidence", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)
- [5]
- Datta, Amit; Tschantz, Michael Carl; Datta, Anupam (2015): "Automated Experiments on Ad Privacy Settings", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [6]
- Silva, Márcio; Oliveira, Lucas Santos de; Andreou, Athanasios; Melo, Pedro Olmo Stancioli Vaz de; Goga, Oana; Benevenuto, Fabrício (2020): "Facebook Ads Monitor: An Independent Auditing System for Political Ads on Facebook", in: Proceedings of the ACM Web Conference. (DOI)
- [7]
- Ali, Muhammad; Goetzen, Angelica; Mislove, Alan; Redmiles, Elissa M.; Sapiezynski, Piotr (2023): "Problematic Advertising and its Disparate Exposure on Facebook", in: Proceedings of the USENIX Security Symposium. (Link)
- [8]
- Lone, Qasim; Frik, Alisa; Luckie, Matthew; Korczyński, Maciej; van Eeten, Michel; Gañán, Carlos (2022): "Deployment of Source Address Validation by Network Operators: A Randomized Control Trial", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)
- [9]
- Cook, John; Nithyanand, Rishab; Shafiq, Zubair (2020): "Inferring Tracker-Advertiser Relationships in the Online Advertising Ecosystem using Header Bidding", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [10]
- Agarwal, Pushkal; Joglekar, Sagar; Papadopoulos, Panagiotis; Sastry, Nishanth; Kourtellis, Nicolas (2020): "Stop tracking me Bro! Differential Tracking of User Demographics on Hyper-Partisan Websites", in: Proceedings of the ACM Web Conference. (DOI)
- [11]
- Iqbal, Hassan; Khan, Usman Mahmood; Khan, Hassan Ali; Shahzad, Muhammad (2022): "Left or Right: A Peek into the Political Biases in Email Spam Filtering Algorithms During US Election 2020", in: Proceedings of the ACM Web Conference. (DOI)
- [12]
- Guha, Saikat; Cheng, Bin; Francis, Paul (2010): "Challenges in measuring online advertising systems", in: Proceedings of the ACM Internet Measurement Conference. (DOI)
- [13]
- Chen, Le; Mislove, Alan; Wilson, Christo (2015): "Peeking Beneath the Hood of Uber", in: Proceedings of the ACM Internet Measurement Conference. (DOI)
- [14]
- Becerril-Arreola, Rafael (2023): "A Method to Assess and Explain Disparate Impact in Online Retailing", in: Proceedings of the ACM Web Conference. (DOI)
