This is an old revision of the document!
Table of Contents
Provenance: privacy:age_assurance
Working notes behind age_assurance: every query, the report script and its unedited output, the hand verdict for all 38 candidates, the quote checks, the external sources and the ones that were rejected. Corpus-level caveats — venue scope, the selection funnel, the provisional 2025–2026 venue-years, extraction stability — are on corpus and are not restated here.
Written 2026-09-15 against data/extract/run1, 5,859 extracted papers, 5,855 with full text on disk.
Why this page exists at all, and why it is short
privacy:age_assurance was queued on roadmap on 2026-09-07 with the note that it would be thin on purpose. That held, and the queued reasoning was corrected in one direction and confirmed in another.
| Queued claim | What derivation found |
|---|---|
11 candidates from the title-and-summary probe in scripts/gap_probe_roadmap.mjs | The title probe's 11 have 1 paper in the derived population — Easy As Child's Play — and 9.1% precision by the page's inclusion rule. A full-text probe finds 38 candidates and 5 population papers, so the title probe has 20% recall against this page's own population. |
| “most are children's-privacy and COPPA-compliance work” | Confirmed, and sized: 36 papers name COPPA in legal[], against 5 in the age-assurance population, and exactly 1 paper is in both. |
| “the one squarely on it is Easy As Child's Play” | Confirmed. It is the only OBJECT verdict in the audit, and it has 194 phrase matches against the runner-up's 22. |
| “the 2019 IMC porn-ecosystem paper is adjacent and useful for the web case” | Confirmed, and it turned out to be the only web-platform measurement of age gates in the corpus, and the source of the page's vantage-point argument. |
| “the regulatory surface is moving years ahead of the published measurement” | Confirmed with nine dated primary sources, 2025-01-16 to 2026-09-11. |
One thing the queue did not anticipate and the page now leads on: six papers hit age assurance as an obstacle to a measurement about something else, and that is the most common way it appears in the corpus. Four of those six are from 2025–2026.
The population
Inclusion rule, as written before the first count
A paper is in the population if it reports an empirical result about a mechanism that establishes or gates on a user's age — how many services have one, which kind, or how well it works. Proposing a privacy-preserving age credential is out; measuring a deployed one is in. Measuring what a children's service does with data is out.
Five verdict values, applied to every one of the 38 candidates:
| Verdict | Meaning | Papers |
|---|---|---|
OBJECT | the paper's research question is age assurance | 1 |
SECTION | a section of the paper measures age assurance in the wild | 4 |
OBSTACLE | age assurance is a constraint on, or a treatment in, the method | 6 |
MENTION | background, related work, regulation text, or a category label | 19 |
ARTEFACT | a de-columning artefact, or a cited title in the bibliography only | 8 |
OBJECT + SECTION = the 5-paper population the page uses. 13.2% precision against the candidate set.
Probe history — three widths, and the one that was wrong
Probe width decided the claim here more than anywhere else on the page. All three widths were run over all 5,855 papers with paper.cols.txt, after collapsing whitespace and rejoining hyphenated line breaks.
| # | Pattern (age-assurance family) | Candidates | Verdict on the probe |
|---|---|---|---|
| 1 | age[- ](verification|…|signal|…) — no word boundary before age | 233 | Broken. voltage signal and image signal match. Nine of the top thirteen hits by mention count were electromagnetic side-channel papers. Discarded. |
| 2 | \bage[- ](verification|…)…|prove (their|…) age | 40 | Still broken, subtly: prove their age with no leading \b matches improve their agency. Two Jordanian smart-home papers entered the set on the phrase “improve their agency”. Discarded. |
| 3 | as #2 with \bprove … age\b — the published probe | 38 | Used. Every matched surface form is printed in the script output below, so what the probe actually caught is visible rather than summarised. |
The lesson is in the residue, not the count: probe #1's 233 looked like a healthy literature and was 82% electromagnetics.
Recall probes: four more vocabularies, one new paper
A phrase probe is a recall claim, so four further probe families were run over the same 5,855 papers to find papers that measure age assurance without using any of the five phrases. Counts are candidate sets and were read by title.
| Probe family | Pattern sketch | Hits | New population papers |
|---|---|---|---|
| date of birth | date of birth, birth ?date, \bDOB\b, birth year | 195 | 0 — the high-mention hits are health-forum disclosure, policy-comparison and PII-removal studies |
| identity document | identity (verification|document|proof), \bKYC\b, government-issued ID, passport/licence scan | 158 | 0 — payments, mobile money, CCPA data-broker compliance, remote proctoring |
| facial age / liveness | facial age, age from (a )?(face|photo|selfie), liveness (check|detection) | 110 | 0 — this family is almost entirely biometric authentication attack work, not age estimation |
| parental gate | parental gate, \bparent gate\b, \bage screen\b, \bage-?gate\b | 4 | 0 |
| age rating | age rating, content rating, \bESRB\b, \bPEGI\b, \bIARC\b, Designed for Families, Teacher[- ]Approved, maturity rating | 193 | 1 found, then excluded — Are Mobile Advertisements in Compliance with App's Age Group? (TheWebConf 2023). It measures ad content against the host app's rating, which the inclusion rule puts out of the population. It is cited on the page in the denominator section as the thing that is not age assurance. |
| zero-knowledge / credential | zero-?knowledge…age, anonymous credential…age, EUDI, eIDAS, digital identity wallet | 64 | 0 — the one substantial hit is an attribute-based-credential acceptance study (PoPETs 2024) |
| AU social-media ban | social media (minimum age|ban), under-?16 (ban|law) | 1 | 0 |
The parental gate probe was also broken on its first run and is a second instance of the same defect: without \b before age, age screen matches webpage screenshot, and it returned 57 papers of which the top five were phishing-detection work. Fixed, it returns 4.
This is a bounded negative, not a proof. Four probe families found no measurement paper the phrase probe had missed. That raises confidence in the 5; it does not establish that a paper measuring age gates under some vocabulary none of these eleven patterns covers does not exist. The page says so.
The 11 title-probe candidates, judged
scripts/gap_probe_roadmap.mjs (committed, with its output) matched 11 papers on title and summary. They are listed here because the roadmap row rests on them and because their precision is the number that justified writing a thin page rather than a full one.
| Year | Venue | Title | In the full-text candidate set? | Verdict |
|---|---|---|---|---|
| 2012 | IMC | New kid on the block: exploring the google+ social graph | no | off topic — matched kid |
| 2013 | CCS | When kids' toys breach mobile phone security | no | matched kids — children's security, no age mechanism |
| 2013 | IMC | Profiling high-school students with facebook | yes | MENTION |
| 2018 | PETS | “Won't Somebody Think of the Children?” Examining COPPA Compliance at Scale | no | children's-privacy compliance; the page's reference construction for that denominator |
| 2019 | IEEE S&P | F-BLEAU: Fast Black-Box Leakage Estimation | no | a probe defect. It matched on Leakage Estimation: gap_probe_roadmap.mjs has no word boundary before age either. Corrected, the age_assurance row of that probe is 10, not 11. |
| 2019 | IMC | Tales from the Porn | yes | SECTION |
| 2019 | USENIX | Evaluating the Contextual Integrity of Privacy Regulation: Parents' IoT Toy Privacy Norms Versus COPPA | no | children's-privacy norms, user study |
| 2020 | CCS | Dangerous Skills Got Certified | no | voice-skill certification; COPPA in legal[] |
| 2022 | CCS | Poster: An Analysis of Privacy Features in 'Expert-Approved' Kids' Apps | yes | SECTION |
| 2025 | USENIX | Easy As Child's Play | yes | OBJECT |
| 2025 | NDSS | The Kids Are All Right: YouTube Giveaway Scams | no | scam susceptibility by age group, not age assurance |
1 of 11 in the population; 4 of 11 reached by the full-text probe. Conversely the full-text probe's 38 include 34 the title probe never saw, and 4 of the 5 population papers are among them. A title-and-summary probe is the wrong instrument for this topic because the measurement is almost always one section of a paper about something else.
Report script and output
Every corpus figure on the content page is produced by this script. It throws rather than printing a warning on four conditions: an unjudged candidate, a verdict keyed to a paper not in the extraction, a TIGHT probe that is not a subset of LOOSE, and any published figure whose quote cannot be located in its source.
The full script.
- report_age_assurance.mjs
// Every figure on privacy:age_assurance, with its denominator. // // node scripts/report_age_assurance.mjs > scripts/report_age_assurance-output.txt // // The page is thin on purpose. This script exists to make the thinness // checkable: it prints the probe that produced the candidate set, the // hand-keyed verdict for every candidate, and a verbatim-quote check for every // per-paper figure the page publishes. // // Three rules from data/extract/README.md are load-bearing here: // * every count names its own denominator (never "of 5,859 papers"); // * a probe count is a CANDIDATE SET, not a population — the population is // the hand audit below; // * a figure taken from a paper is quoted with the paper's own denominator, // and the quote is checked against data/fulltext/.../paper.cols.txt. import fs from 'node:fs'; import path from 'node:path'; import { execFileSync } from 'node:child_process'; import { loadExtractions, dataRoot, pct, table } from './lib.mjs'; const ROOT = path.join(dataRoot(), 'fulltext'); const P = loadExtractions(); const key = (p) => `${p.venue}/${p.year}/${p.slug}`; const BY_KEY = new Map(P.map((p) => [key(p), p])); // PDF line breaks inside a phrase otherwise silently undercount. const norm = (s) => s.replace(//g, '').replace(/-\n/g, '').replace(/\s+/g, ' '); const colsPath = (k) => { const [venue, year, slug] = k.split('/'); return path.join(ROOT, year, venue, slug, 'paper.cols.txt'); }; const TEXT = new Map(); function text(k) { if (TEXT.has(k)) return TEXT.get(k); const f = colsPath(k); const t = fs.existsSync(f) ? norm(fs.readFileSync(f, 'utf8')) : null; TEXT.set(k, t); return t; } // Where a needle is located. .cols.txt repairs two-column reading order but // still splices some sentences at a column boundary, and pypdf splices // different ones — so a needle is checked against every rendering the mount // has before it is called a bad quote, and the winning rendering is printed. const RENDERINGS = ['paper.cols.txt', 'paper.norm.txt', 'paper.txt']; function locate(k, needle) { const [venue, year, slug] = k.split('/'); const dir = path.join(ROOT, year, venue, slug); for (const r of RENDERINGS) { const f = path.join(dir, r); if (fs.existsSync(f) && norm(fs.readFileSync(f, 'utf8')).includes(needle)) return r; } if (fs.existsSync(path.join(dir, 'paper.pdf'))) { const out = execFileSync('python3', [path.join('scripts', 'pdftext.py'), k], { encoding: 'utf8', maxBuffer: 1 << 28, stdio: ['ignore', 'pipe', 'ignore'] }); if (norm(out).includes(needle)) return 'paper.pdf (pypdf)'; } return null; } // ---------------------------------------------------------------- 1. the frame console.log('============================================================='); console.log('1. CORPUS FRAME'); console.log('============================================================='); const withText = P.filter((p) => fs.existsSync(colsPath(key(p)))); console.log(`papers in extraction ${P.length}`); console.log(` with paper.cols.txt ${withText.length}`); console.log(` WITHOUT full text ${P.length - withText.length}`); for (const p of P.filter((x) => !fs.existsSync(colsPath(key(x))))) console.log(` ${key(p)}`); const crawled = P.filter((p) => p.crawlConfig !== null || p.studyTypes.includes('automated-web-crawl')); const webCrawled = crawled.filter((p) => p.platforms.includes('web')); const legalPop = P.filter((p) => p.legal.length > 0); console.log(`ran a crawl (\`crawled\`) ${crawled.length}`); console.log(` ... on the web platform ${webCrawled.length}`); console.log(`assessed a law (\`legal\`) ${legalPop.length}`); // ------------------------------------------------------- 2. the full-text probe console.log('\n============================================================='); console.log('2. FULL-TEXT PROBE (candidate set, not a population)'); console.log('============================================================='); // TIGHT is what the page quotes. LOOSE is a strictly wider phrasing of the same // question and MUST contain TIGHT — a narrowing probe that returns more hits is // broken, and so is a "loose" probe that is merely different. const TIGHT = /\bage[- ](verification|verifying|assurance|estimation|gate|gating|check|checking|attestation|token|signal|declaration|disclosure)s?\b|verif(y|ied|ication|ying) (of )?(the )?(a )?(user'?s?|users'?|their|his|her|customer'?s?|visitor'?s?) age|estimat(e|ing|ion|ed) (of )?(the )?(a )?(user'?s?|users'?|their) age|\bage-?gated\b|\bprove (their|his|her|the user'?s) age\b/i; const LOOSE = /\bage[- ]\w+|\bunder-?age\b|verif\w+ [^.]{0,30}\bage\b|\bage\b [^.]{0,30}verif\w+/i; const hit = (re) => withText.filter((p) => re.test(text(key(p)))); const tight = hit(TIGHT); const loose = hit(LOOSE); const tightKeys = new Set(tight.map(key)); const looseKeys = new Set(loose.map(key)); const outside = [...tightKeys].filter((k) => !looseKeys.has(k)); console.log(`TIGHT "age verification / age gate / age assurance / …" ${tight.length} papers`); console.log(`LOOSE "age <word>" anywhere ${loose.length} papers`); console.log(`TIGHT papers NOT inside LOOSE (must be 0) ${outside.length}`); if (outside.length) { console.log(outside.join('\n')); throw new Error('TIGHT is not a subset of LOOSE'); } if (tight.length > loose.length) throw new Error('TIGHT > LOOSE'); // Every distinct surface form the TIGHT probe matched, so the residue of the // normalisation is visible rather than summarised. const forms = new Map(); for (const p of tight) { for (const m of text(key(p)).match(new RegExp(TIGHT.source, 'gi')) ?? []) forms.set(m.toLowerCase(), (forms.get(m.toLowerCase()) ?? 0) + 1); } console.log('\nmatched surface forms (tuples, not papers):'); for (const [s, c] of [...forms.entries()].sort((a, b) => b[1] - a[1])) console.log(` ${String(c).padStart(4)} ${s}`); // ------------------------------------------------------------ 3. the hand audit console.log('\n============================================================='); console.log('3. HAND AUDIT OF EVERY CANDIDATE'); console.log('============================================================='); console.log(`OBJECT the paper's research question is age assurance`); console.log(`SECTION a section of the paper measures age assurance in the wild`); console.log(`OBSTACLE age assurance is a constraint on, or a treatment in, the method`); console.log(`MENTION background, related work, regulation text, or a category label`); console.log(`ARTEFACT the phrase is a de-columning artefact ("voltage signal") or a`); console.log(` cited title in the bibliography only\n`); const VERDICT = new Map(Object.entries({ 'USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and': 'OBJECT', 'IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem': 'SECTION', 'IEEE-SP/2024/a-picture-is-worth-500-labels-a-case-study-of-demographic-disparities-in-local-m': 'SECTION', 'CCS/2022/poster-an-analysis-of-privacy-features-in-expert-approved-kids-apps': 'SECTION', 'PETS/2022/developers-say-the-darnedest-things-privacy-compliance-processes-followed-by-dev': 'SECTION', 'CCS/2025/whispertest-a-voice-control-based-library-for-ios-ui-automation': 'OBSTACLE', 'IMC/2023/the-prevalence-of-single-sign-on-on-the-web-towards-the-next-generation-of-web-c': 'OBSTACLE', 'PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis': 'OBSTACLE', 'PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings': 'OBSTACLE', 'USENIX/2025/analyzing-the-ai-nudification-application-ecosystem': 'OBSTACLE', 'PETS/2025/understanding-privacy-norms-through-web-forms': 'OBSTACLE', 'PETS/2026/a-risk-assessment-framework-for-digital-identification-systems': 'MENTION', 'IMC/2024/diffaudit-auditing-privacy-practices-of-online-services-for-children-and-adolesc': 'MENTION', 'PETS/2023/creative-beyond-tiktoks-investigating-adolescents-social-privacy-management-on-t': 'MENTION', 'PETS/2025/sok-web-authentication-and-recovery-in-the-age-of-end-to-end-encryption': 'MENTION', 'CCS/2023/marketing-to-children-through-online-targeted-advertising-targeting-mechanisms-a': 'MENTION', 'PETS/2024/exploring-the-privacy-experiences-of-closeted-users-of-online-dating-services-in': 'MENTION', 'CCS/2025/digital-safety-for-children-with-intellectual-disabilities-when-using-mobile-dev': 'MENTION', 'IMC/2013/profiling-high-school-students-with-facebook-how-online-privacy-laws-can-actuall': 'MENTION', 'PETS/2017/topics-of-controversy-an-empirical-analysis-of-web-censorship-lists': 'MENTION', 'WWW/2019/measurement-and-early-detection-of-third-party-application-abuse-on-twitter': 'MENTION', 'PETS/2023/on-the-role-and-form-of-personal-information-disclosure-in-cyberbullying-inciden': 'MENTION', 'USENIX/2023/a-study-of-chinas-censorship-and-its-evasion-through-the-lens-of-online-gaming': 'MENTION', 'PETS/2023/everybodys-looking-for-ssomething-a-large-scale-evaluation-on-the-privacy-of-oau': 'MENTION', 'IEEE-SP/2024/sok-technical-implementation-and-human-impact-of-internet-privacy-regulations': 'MENTION', 'IEEE-SP/2025/exploring-parent-child-perceptions-on-safety-in-generative-ai-concerns-mitigatio': 'MENTION', 'PETS/2025/making-web-applications-gdpr-compliant-a-comparative-evaluation-of-gdpr-enforcem': 'MENTION', 'IEEE-SP/2026/zkfuzz-foundation-and-framework-for-effective-fuzzing-of-zero-knowledge-circuits': 'MENTION', 'PETS/2025/sheeps-clothing-wolfish-intent-automated-detection-and-evaluation-of-problematic': 'MENTION', 'PETS/2026/chatbot-confessions-large-scale-analysis-of-private-data-disclosure-in-shared-ai': 'MENTION', 'PETS/2020/illuminating-the-dark-or-how-to-recover-what-should-not-be-seen-in-fe-based-clas': 'ARTEFACT', 'PETS/2022/personal-information-inference-from-voice-recordings-user-awareness-and-privacy': 'ARTEFACT', 'WWW/2019/demographic-inference-and-representative-population-estimates-from-multilingual': 'ARTEFACT', 'NDSS/2025/songbsab-a-dual-prevention-approach-against-singing-voice-conversion-based-illegal-song-covers': 'ARTEFACT', 'USENIX/2023/eavesdropping-mobile-app-activity-via-radio-frequency-energy-harvesting': 'ARTEFACT', 'USENIX/2023/glitchhiker-uncovering-vulnerabilities-of-image-signal-transmission-with-iemi': 'ARTEFACT', 'NDSS/2026/peering-inside-the-black-box-long-range-and-scalable-model-architecture-snooping-via-gpu-electromagnetic-side-channel': 'ARTEFACT', // No paper.cols.txt in the mount, so this one was NOT reachable by the probe; // it is here because the title probe on the roadmap reached it. Judged from // title and summary only — say so rather than pretend it was read. 'PETS/2026/gan-invert-unveiling-vulnerabilities-in-privacy-preserving-facial-transformation': 'ARTEFACT', })); const missingVerdict = [...tightKeys].filter((k) => !VERDICT.has(k)); const strayVerdict = [...VERDICT.keys()].filter((k) => !tightKeys.has(k) && BY_KEY.has(k)); const unknownKey = [...VERDICT.keys()].filter((k) => !BY_KEY.has(k)); if (missingVerdict.length) { console.log('UNJUDGED:\n' + missingVerdict.join('\n')); throw new Error(`${missingVerdict.length} candidates have no verdict`); } if (unknownKey.length) { console.log('NOT IN CORPUS:\n' + unknownKey.join('\n')); throw new Error('verdict map names a paper that is not in the extraction'); } console.log(`verdicts keyed ${VERDICT.size}; candidates ${tightKeys.size}; keyed-but-not-a-candidate ${strayVerdict.length}`); for (const k of strayVerdict) console.log(` (not reached by the probe) ${k}`); const counts = {}; for (const v of VERDICT.values()) counts[v] = (counts[v] ?? 0) + 1; console.log('\n' + table(['verdict', 'papers'], Object.entries(counts).sort((a, b) => b[1] - a[1]))); console.log('\nper-candidate:'); const ORDER = { OBJECT: 0, SECTION: 1, OBSTACLE: 2, MENTION: 3, ARTEFACT: 4 }; const rows = [...VERDICT.entries()] .map(([k, v]) => ({ k, v, p: BY_KEY.get(k) })) .sort((a, b) => ORDER[a.v] - ORDER[b.v] || a.p.year - b.p.year); for (const r of rows) console.log(` ${r.v.padEnd(9)} ${r.p.year} ${r.p.venue.padEnd(7)} ${r.p.title.replace(/\s+/g, ' ').slice(0, 88)}`); const POPULATION = rows.filter((r) => r.v === 'OBJECT' || r.v === 'SECTION'); console.log(`\nPOPULATION (measures age assurance) = ${POPULATION.length} papers of the ${tightKeys.size} candidates` + ` = ${pct(POPULATION.length, tightKeys.size)} precision`); console.log(` of the ${P.length}-paper corpus: ${pct(POPULATION.length, P.length)}`); console.log(` of the ${crawled.length} papers that ran a crawl: ${POPULATION.filter((r) => crawled.includes(r.p)).length}`); // --------------------------------------------------- 4. when, and in which venue console.log('\n============================================================='); console.log('4. WHEN AND WHERE (candidate set of ' + tightKeys.size + ')'); console.log('============================================================='); const yearRows = []; for (let y = 2010; y <= 2026; y += 1) { const c = rows.filter((r) => r.p.year === y); if (!c.length) continue; yearRows.push([y === 2025 || y === 2026 ? `${y} *` : String(y), c.length, c.filter((r) => r.v === 'OBJECT' || r.v === 'SECTION').length, c.filter((r) => r.v === 'OBSTACLE').length]); } console.log(table(['year', 'candidates', 'measures it', 'obstructed by it'], yearRows)); console.log('* 2025-2026 are provisional venue-years — see literature:corpus.'); const venueRows = [...new Set(P.map((p) => p.venue))] .map((v) => [v, rows.filter((r) => r.p.venue === v).length, rows.filter((r) => r.p.venue === v && (r.v === 'OBJECT' || r.v === 'SECTION')).length]) .sort((a, b) => b[1] - a[1]); console.log('\n' + table(['venue', 'candidates', 'measures it'], venueRows)); // ------------------------------------------- 5. children's privacy, for contrast console.log('\n============================================================='); console.log("5. CHILDREN'S PRIVACY COMPLIANCE — a different question"); console.log('============================================================='); const coppa = P.filter((p) => p.legal.some((l) => /coppa/i.test(l.law ?? ''))); console.log(`papers whose legal[] names COPPA ${coppa.length}` + ` (of the ${legalPop.length} that assessed any law = ${pct(coppa.length, legalPop.length)})`); const coppaYears = {}; for (const p of coppa) coppaYears[p.year] = (coppaYears[p.year] ?? 0) + 1; console.log('by year: ' + Object.entries(coppaYears).map(([y, c]) => `${y}:${c}`).join(' ')); const coppaVenues = {}; for (const p of coppa) coppaVenues[p.venue] = (coppaVenues[p.venue] ?? 0) + 1; console.log('by venue: ' + Object.entries(coppaVenues).sort((a, b) => b[1] - a[1]).map(([v, c]) => `${v}:${c}`).join(' ')); const overlap = coppa.filter((p) => POPULATION.some((r) => r.k === key(p))); console.log(`papers in BOTH the COPPA set and the age-assurance population: ${overlap.length}` + (overlap.length ? ' — ' + overlap.map(key).join(', ') : '')); console.log('\nthe COPPA set, by year:'); for (const p of coppa.sort((a, b) => a.year - b.year)) console.log(` ${p.year} ${p.venue.padEnd(7)} ${p.title.replace(/\s+/g, ' ').slice(0, 92)}`); // --------------------------------------------- 6. the figures the page publishes console.log('\n============================================================='); console.log('6. PER-PAPER FIGURES, WITH THE PAPER\'S OWN DENOMINATOR'); console.log('============================================================='); console.log('Each needle below is checked verbatim against paper.cols.txt after the\n' + 'same whitespace normalisation. A needle must be SPECIFIC: a bare percentage\n' + 'is shared across papers and would pass against the wrong sentence.\n'); const FIGURES = [ { k: 'USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and', what: 'adult-only ("17+") Google Play apps implementing any age verification', den: '31,750 adult-only apps, themselves drawn from 693,334 Google Play apps', val: '1,165 (3.67%)', needle: 'Our analysis of 31,750 adult-only apps (out of 693,334 apps on Google Play) reveals that only 1,165 (3.67%) implement age verification' }, { k: 'USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and', what: 'the paper\'s own two figures for the same quantity disagree', den: 'same 31,750; 1,165/31,750 = 3.669%, so the abstract is right and §RQ5 is wrong', val: '3.67% in the abstract and conclusion, 3.75% in the results section', needle: 'our results show that there are only 1,165 (3.75%) adult-only apps that have implemented the age verification' }, { k: 'USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and', what: 'share of the verifying apps using the weakest and the strongest method', den: 'the 1,165 apps that implement age verification', val: 'age gate 31.84%, biometric verification 8.48%', needle: 'are the most widely implemented method' }, { k: 'USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and', what: 'the declared minimum age does not match the store rating', den: 'apps carrying Google Play\'s "17+" rating', val: '152 apps enforce 21, 309 apps enforce 16', needle: 'Despite being rated as 17+, 152 apps actually enforce an age limit of 21 years' }, { k: 'IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem', what: 'pornographic websites showing any age-verification mechanism, by vantage point', den: '6,843 pornographic websites (6,346 crawled successfully by OpenWPM)', val: '20% from the USA, UK and Spain; 14% from Russia', needle: 'the same set of 20% of the pornographic websites implement and show to the end user the same age verification mechanism' }, { k: 'IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem', what: 'the same site behaves differently depending on where the crawl appears to come from', den: 'the same 6,843', val: '8% verify only in Russia; 12% verify everywhere except Russia', needle: '8% of the websites that do not verify users\' age for the rest of countries do so in Russia' }, { k: 'IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem', what: 'what the mechanism actually was', den: 'the 20% that had one', val: 'a warning text and a button; the crawler bypassed it', needle: 'if our automatic crawler manages to bypass the mechanism, a child could do it as well' }, { k: 'CCS/2022/poster-an-analysis-of-privacy-features-in-expert-approved-kids-apps', what: 'distinct age-assurance methods observed in expert-approved kids\' apps', den: '137 apps analysed, from 150 selected out of a 470-app candidate set', val: '13 distinct methods; year of birth in 12 apps', needle: 'Apps used a total of 13 different methods for' }, { k: 'PETS/2022/developers-say-the-darnedest-things-privacy-compliance-processes-followed-by-dev', what: 'child-directed app developers who say they use an age gate for parental consent', den: '50 responses to the initial organizational survey', val: '16%; and 6% said their own gate is trivially bypassed by a birth year', needle: 'In terms of how parental consent is obtained, 16% mentioned they use age gates' }, { k: 'PETS/2022/developers-say-the-darnedest-things-privacy-compliance-processes-followed-by-dev', what: 'self-report against observation — the gap that makes a survey figure unusable alone', den: 'the same organizations\' apps, tested from California IP addresses', val: 'no verifiable parental consent mechanism was observed at all', needle: 'did not observe any mechanisms for obtaining verifiable parental consent' }, { k: 'IEEE-SP/2024/a-picture-is-worth-500-labels-a-case-study-of-demographic-disparities-in-local-m', what: 'accuracy of a deployed facial age-estimation model, by demographic', den: 'the on-device vision models extracted from the TikTok and Instagram Android apps', val: 'qualitative — "less effective for younger demographics"; no accuracy figure published here', needle: 'if done using the model deployed by TikTok, is less effective for younger' }, { k: 'PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis', what: 'an age gate removing a category from a measurement population', den: 'app categories the authors wanted in their app-store study', val: 'dating apps dropped — age verification could not be met at scale', needle: 'some potentially interesting app categories, such as dating apps, require age verification to install them' }, { k: 'PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings', what: 'what the researchers themselves had to submit, by jurisdiction', den: 'the Google accounts used as experiment instances', val: 'selfie verification in AU, IE and UK; a button click in the US and Canada', needle: 'we used a mobile VPN and selfie verification in Australia, Ireland, and the UK' }, { k: 'IMC/2023/the-prevalence-of-single-sign-on-on-the-web-towards-the-next-generation-of-web-c', what: 'age gates as a named cause of crawler failure', den: 'the login pages the crawler failed to find', val: 'age-verification prompts listed among the blocking artefacts', needle: 'These include age-verification prompts from adult websites' }, { k: 'CCS/2025/whispertest-a-voice-control-based-library-for-ios-ui-automation', what: 'ads reached only after clearing a parental gate or age check', den: '20 children\'s iOS apps interacted with manually for 100 seconds each', val: '7 of 20 apps', needle: 'In seven out of 20 apps, we observed at least one ad, typically after bypassing challenging flows such as parental gates' }, { k: 'PETS/2025/understanding-privacy-norms-through-web-forms', what: 'the one adjacent web-form study excludes standalone age forms by construction', den: 'the paper\'s web-form dataset', val: 'standalone age-verification forms are not in the dataset', needle: 'Many websites use standalone age verification forms that only ask for age but no other identifiers. These web forms are not included in the dataset' }, { k: 'USENIX/2025/analyzing-the-ai-nudification-application-ecosystem', what: 'the vantage point chosen to avoid triggering an age check', den: 'the 20 nudification websites studied', val: 'data collected from a US region with no age-verification law for explicit content', needle: 'a region in the U.S. that does not have an age verification law' }, { k: 'PETS/2018/won-t-somebody-think-of-the-children-examining-coppa-compliance-at-scale', what: "children's apps in Google Play's Designed for Families programme, accessing location", den: '5,855 DFF-enrolled Android apps (not "children\'s apps" in general)', val: '235 (4.0%) reached GPS; 28% accessed permission-protected sensitive data', needle: 'Our instrumentation observed 235 apps (4.0% of 5,855)' }, { k: 'IEEE-SP/2024/targeted-and-troublesome-tracking-and-advertising-on-childrens-websites', what: 'trackers and targeted ads on child-directed websites', den: '2,004 manually verified child-directed websites, classified out of Common Crawl', val: '~90% embed a tracker; ~27% carry targeted ads', needle: 'around 90% of child-directed websites embed one or more trackers' }, { k: 'WWW/2023/are-mobile-advertisements-in-compliance-with-apps-age-group', what: 'ads shown inside apps whose declared audience includes children', den: '11,270 ad views collected across 25,000 apps', val: '1,289 ad violations from 775 apps', needle: 'We collected 11,270 ad views' }, ]; let bad = 0; const whereCount = new Map(); for (const f of FIGURES) { const where = locate(f.k, norm(f.needle)); if (!where) bad += 1; else whereCount.set(where, (whereCount.get(where) ?? 0) + 1); console.log(`[${where ? ' ok ' : 'FAIL'}] ${f.k}`); console.log(` what: ${f.what}`); console.log(` DENOMINATOR: ${f.den}`); console.log(` value: ${f.val}`); console.log(` needle: "${f.needle}"`); console.log(` found in: ${where ?? 'NO RENDERING'}`); console.log(''); } console.log('located in: ' + [...whereCount.entries()].map(([r, c]) => `${r} ${c}`).join(', ')); console.log(`quote check: ${FIGURES.length - bad}/${FIGURES.length} located verbatim`); // Positive control for the checker itself: a sentence that is not in the paper // must not be located, or the check is asserting nothing. const CONTROL_KEY = FIGURES[0].k; const CONTROL = 'reveals that only 9,999 (99.99%) implement age verification'; if (locate(CONTROL_KEY, norm(CONTROL)) !== null) throw new Error('quote checker located a sentence that is not in the paper'); console.log(`control: a fabricated needle is correctly NOT located in ${CONTROL_KEY}`); if (bad) throw new Error(`${bad} published figures could not be located in their source`); // Every paper the page cites for a figure must be in the corpus. for (const f of FIGURES) if (!BY_KEY.has(f.k)) throw new Error(`figure cites a paper not in the extraction: ${f.k}`); // -------------------------------------------- 7. what the extraction itself says console.log('\n============================================================='); console.log('7. WHAT THE EXTRACTION SCHEMA CARRIES'); console.log('============================================================='); const easy = BY_KEY.get('USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and'); for (const d of easy.detection) console.log(` detection phenomenon="${d.phenomenon}"\n technique="${d.technique}"\n metric="${d.metric}"\n prevalence="${d.prevalence}"`); for (const c of easy.classification) console.log(` classification target=${c.target} resource="${c.resourceName}" taxonomy="${c.taxonomy}"`); console.log(`\nNo enum in the schema names age assurance. The phenomenon above is free text,`); console.log(`which is ~20% stable run-to-run, so it cannot be aggregated — it is usable`); console.log(`only as a pointer back to the paper.`);
Its unedited output, as run on 2026-09-15.
=============================================================
1. CORPUS FRAME
=============================================================
papers in extraction 5859
with paper.cols.txt 5855
WITHOUT full text 4
USENIX/2010/idle-port-scanning-and-non-interference-analysis-of-network-protocol-stacks-usin
CCS/2014/beware-your-hands-reveal-your-secrets
IMC/2020/bgp-beacons-network-tomography-and-bayesian-computation-to-locate-route-flap-dam
IEEE-SP/2020/burglars-iot-paradise-understanding-and-mitigating-security-risks-of-general-mes
ran a crawl (`crawled`) 1120
... on the web platform 857
assessed a law (`legal`) 402
=============================================================
2. FULL-TEXT PROBE (candidate set, not a population)
=============================================================
TIGHT "age verification / age gate / age assurance / …" 38 papers
LOOSE "age <word>" anywhere 1752 papers
TIGHT papers NOT inside LOOSE (must be 0) 0
matched surface forms (tuples, not papers):
236 age verification
19 age-verification
14 age gates
14 age gate
12 age estimation
4 age assurance
4 age disclosure
4 age checks
3 verify their age
2 verify users' age
2 verify user age
2 age signals
2 age check
1 age-gates
1 age signal
1 verifying a user's age
1 verify the user's age
1 prove their age
1 age disclosures
=============================================================
3. HAND AUDIT OF EVERY CANDIDATE
=============================================================
OBJECT the paper's research question is age assurance
SECTION a section of the paper measures age assurance in the wild
OBSTACLE age assurance is a constraint on, or a treatment in, the method
MENTION background, related work, regulation text, or a category label
ARTEFACT the phrase is a de-columning artefact ("voltage signal") or a
cited title in the bibliography only
verdicts keyed 38; candidates 38; keyed-but-not-a-candidate 0
verdict papers
-------- ------
MENTION 19
ARTEFACT 8
OBSTACLE 6
SECTION 4
OBJECT 1
per-candidate:
OBJECT 2025 USENIX Easy As Child's Play: An Empirical Study on Age Verification of Adult-Oriented Android A
SECTION 2019 IMC Tales from the Porn: A Comprehensive Privacy Analysis of the Web Porn Ecosystem.
SECTION 2022 CCS Poster: An Analysis of Privacy Features in 'Expert-Approved' Kids' Apps.
SECTION 2022 PETS Developers Say the Darnedest Things: Privacy Compliance Processes Followed by Developers
SECTION 2024 IEEE-SP A Picture is Worth 500 Labels: A Case Study of Demographic Disparities in Local Machine
OBSTACLE 2023 IMC The Prevalence of Single Sign-On on the Web: Towards the Next Generation of Web Content
OBSTACLE 2025 CCS WhisperTest: A Voice-Control-based Library for iOS UI Automation.
OBSTACLE 2025 PETS More and Scammier Ads: The Perils of YouTube's Ad Privacy Settings
OBSTACLE 2025 USENIX Analyzing the AI Nudification Application Ecosystem
OBSTACLE 2025 PETS Understanding Privacy Norms through Web Forms
OBSTACLE 2026 PETS Ad Personalization and Transparency in Mobile Ecosystems: A Comparative Analysis of Goog
MENTION 2013 IMC Profiling high-school students with facebook: how online privacy laws can actually incre
MENTION 2017 PETS Topics of Controversy: An Empirical Analysis of Web Censorship Lists
MENTION 2019 WWW Measurement and Early Detection of Third-Party Application Abuse on Twitter.
MENTION 2023 PETS Creative beyond TikToks: Investigating Adolescents' Social Privacy Management on TikTok
MENTION 2023 CCS Marketing to Children Through Online Targeted Advertising: Targeting Mechanisms and Lega
MENTION 2023 PETS On the Role and Form of Personal Information Disclosure in Cyberbullying Incidents
MENTION 2023 USENIX A Study of China's Censorship and Its Evasion Through the Lens of Online Gaming
MENTION 2023 PETS Everybody's Looking for SSOmething: A large-scale evaluation on the privacy of OAuth aut
MENTION 2024 IMC DiffAudit: Auditing Privacy Practices of Online Services for Children and Adolescents.
MENTION 2024 PETS Exploring the Privacy Experiences of Closeted Users of Online Dating Services in the US
MENTION 2024 IEEE-SP SoK: Technical Implementation and Human Impact of Internet Privacy Regulations.
MENTION 2025 PETS SoK: Web Authentication and Recovery in the Age of End-to-End Encryption
MENTION 2025 CCS Digital Safety for Children with Intellectual Disabilities When Using Mobile Devices fro
MENTION 2025 IEEE-SP Exploring Parent-Child Perceptions on Safety in Generative AI: Concerns, Mitigation Stra
MENTION 2025 PETS Making Web Applications GDPR Compliant: A Comparative Evaluation of GDPR-Enforcement Fra
MENTION 2025 PETS Sheep's clothing, wolfish intent: Automated detection and evaluation of problematic 'all
MENTION 2026 PETS A Risk Assessment Framework for Digital Identification Systems
MENTION 2026 IEEE-SP zkFuzz: Foundation and Framework for Effective Fuzzing of Zero-Knowledge Circuits.
MENTION 2026 PETS Chatbot Confessions:~Large-Scale Analysis of Private Data Disclosure in Shared AI Chatbo
ARTEFACT 2019 WWW Demographic Inference and Representative Population Estimates from Multilingual Social M
ARTEFACT 2020 PETS Illuminating the Dark or how to recover what should not be seen in FE-based classifiers
ARTEFACT 2022 PETS Personal information inference from voice recordings: User awareness and privacy concern
ARTEFACT 2023 USENIX Eavesdropping Mobile App Activity via Radio-Frequency Energy Harvesting
ARTEFACT 2023 USENIX GlitchHiker: Uncovering Vulnerabilities of Image Signal Transmission with IEMI
ARTEFACT 2025 NDSS SongBsAb: A Dual Prevention Approach against Singing Voice Conversion based Illegal Song
ARTEFACT 2026 NDSS Peering Inside the Black-Box: Long-Range and Scalable Model Architecture Snooping via GP
ARTEFACT 2026 PETS GAN-Invert: Unveiling Vulnerabilities in Privacy-Preserving Facial Transformations
POPULATION (measures age assurance) = 5 papers of the 38 candidates = 13.2% precision
of the 5859-paper corpus: 0.1%
of the 1120 papers that ran a crawl: 2
=============================================================
4. WHEN AND WHERE (candidate set of 38)
=============================================================
year candidates measures it obstructed by it
------ ---------- ----------- ----------------
2013 1 0 0
2017 1 0 0
2019 3 1 0
2020 1 0 0
2022 3 2 0
2023 8 0 1
2024 4 1 0
2025 * 11 1 4
2026 * 6 0 1
* 2025-2026 are provisional venue-years — see literature:corpus.
venue candidates measures it
------- ---------- -----------
PETS 17 1
USENIX 5 1
CCS 4 1
IMC 4 1
IEEE-SP 4 1
WWW 2 0
NDSS 2 0
=============================================================
5. CHILDREN'S PRIVACY COMPLIANCE — a different question
=============================================================
papers whose legal[] names COPPA 36 (of the 402 that assessed any law = 9.0%)
by year: 2013:1 2014:1 2016:1 2017:1 2018:1 2019:3 2020:4 2021:4 2022:5 2023:3 2024:6 2025:5 2026:1
by venue: PETS:15 USENIX:6 CCS:4 IMC:3 NDSS:3 IEEE-SP:3 WWW:2
papers in BOTH the COPPA set and the age-assurance population: 1 — PETS/2022/developers-say-the-darnedest-things-privacy-compliance-processes-followed-by-dev
the COPPA set, by year:
2013 IMC Profiling high-school students with facebook: how online privacy laws can actually increase
2014 USENIX Brahmastra: Driving Apps to Test the Security of Third-Party Components
2016 IMC Characterizing Website Behaviors Across Logged-in and Not-logged-in Users.
2017 NDSS Automated Analysis of Privacy Requirements for Mobile Apps
2018 PETS “Won’t Somebody Think of the Children?” Examining COPPA Compliance at Scale
2019 PETS MAPS: Scaling Privacy Compliance Analysis to a Million Apps
2019 USENIX 50 Ways to Leak Your Data: An Exploration of Apps' Circumvention of the Android Permissions
2019 USENIX Evaluating the Contextual Integrity of Privacy Regulation: Parents' IoT Toy Privacy Norms Ve
2020 CCS Dangerous Skills Got Certified: Measuring the Trustworthiness of Skill Certification in Voic
2020 PETS Angel or Devil? A Privacy Study of Mobile Parental Control Apps
2020 PETS The Price is (Not) Right: Comparing Privacy in Free and Paid Apps
2020 IEEE-SP An Analysis of Pre-installed Android Software.
2021 NDSS Hey Alexa, is this Skill Safe?: Taking a Closer Look at the Alexa Skill Ecosystem
2021 NDSS PrivacyFlash Pro: Automating Privacy Policy Generation for Mobile Apps
2021 PETS A Calculus of Tracking: Theory and Practice
2021 USENIX Understanding Malicious Cross-library Data Harvesting on Android
2022 PETS Are iPhones Really Better for Privacy? A Comparative Study of iOS and Android Apps
2022 PETS Charting App Developers’ Journey Through Privacy Regulation Features in Ad Networks
2022 PETS Developers Say the Darnedest Things: Privacy Compliance Processes Followed by Developers of
2022 PETS “We may share the number of diaper changes”: A Privacy and Security Analysis of Mobile Child
2022 USENIX Electronic Monitoring Smartphone Apps: An Analysis of Risks from Technical, Human-Centered,
2023 CCS Marketing to Children Through Online Targeted Advertising: Targeting Mechanisms and Legal As
2023 WWW Are Mobile Advertisements in Compliance with App's Age Group?
2023 WWW Not Seen, Not Heard in the Digital World! Measuring Privacy Practices in Children's Apps.
2024 IMC DiffAudit: Auditing Privacy Practices of Online Services for Children and Adolescents.
2024 PETS Honesty is the Best Policy: On the Accuracy of Apple Privacy Labels Compared to Apps' Privac
2024 CCS VPVet: Vetting Privacy Policies of Virtual Reality Apps.
2024 IEEE-SP SoK: Technical Implementation and Human Impact of Internet Privacy Regulations.
2024 USENIX Navigating the Privacy Compliance Maze: Understanding Risks with Privacy-Configurable Mobile
2024 IEEE-SP Targeted and Troublesome: Tracking and Advertising on Children's Websites.
2025 PETS Understanding Privacy Norms through Web Forms
2025 PETS The Effect of Platform Policies on App Privacy Compliance: A Study of Child-Directed Apps
2025 PETS Privacy Settings of Third-Party Libraries in Android Apps: A Study of Facebook SDKs
2025 PETS Who’s Watching You Zoom? Investigating Privacy of Third-Party Zoom Apps
2025 CCS WhisperTest: A Voice-Control-based Library for iOS UI Automation.
2026 PETS Are Bite-Size Data Safety Details a Healthy Diet for Android Telehealth App Users? Impacts o
=============================================================
6. PER-PAPER FIGURES, WITH THE PAPER'S OWN DENOMINATOR
=============================================================
Each needle below is checked verbatim against paper.cols.txt after the
same whitespace normalisation. A needle must be SPECIFIC: a bare percentage
is shared across papers and would pass against the wrong sentence.
[ ok ] USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and
what: adult-only ("17+") Google Play apps implementing any age verification
DENOMINATOR: 31,750 adult-only apps, themselves drawn from 693,334 Google Play apps
value: 1,165 (3.67%)
needle: "Our analysis of 31,750 adult-only apps (out of 693,334 apps on Google Play) reveals that only 1,165 (3.67%) implement age verification"
found in: paper.cols.txt
[ ok ] USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and
what: the paper's own two figures for the same quantity disagree
DENOMINATOR: same 31,750; 1,165/31,750 = 3.669%, so the abstract is right and §RQ5 is wrong
value: 3.67% in the abstract and conclusion, 3.75% in the results section
needle: "our results show that there are only 1,165 (3.75%) adult-only apps that have implemented the age verification"
found in: paper.cols.txt
[ ok ] USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and
what: share of the verifying apps using the weakest and the strongest method
DENOMINATOR: the 1,165 apps that implement age verification
value: age gate 31.84%, biometric verification 8.48%
needle: "are the most widely implemented method"
found in: paper.cols.txt
[ ok ] USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and
what: the declared minimum age does not match the store rating
DENOMINATOR: apps carrying Google Play's "17+" rating
value: 152 apps enforce 21, 309 apps enforce 16
needle: "Despite being rated as 17+, 152 apps actually enforce an age limit of 21 years"
found in: paper.cols.txt
[ ok ] IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem
what: pornographic websites showing any age-verification mechanism, by vantage point
DENOMINATOR: 6,843 pornographic websites (6,346 crawled successfully by OpenWPM)
value: 20% from the USA, UK and Spain; 14% from Russia
needle: "the same set of 20% of the pornographic websites implement and show to the end user the same age verification mechanism"
found in: paper.cols.txt
[ ok ] IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem
what: the same site behaves differently depending on where the crawl appears to come from
DENOMINATOR: the same 6,843
value: 8% verify only in Russia; 12% verify everywhere except Russia
needle: "8% of the websites that do not verify users' age for the rest of countries do so in Russia"
found in: paper.cols.txt
[ ok ] IMC/2019/tales-from-the-porn-a-comprehensive-privacy-analysis-of-the-web-porn-ecosystem
what: what the mechanism actually was
DENOMINATOR: the 20% that had one
value: a warning text and a button; the crawler bypassed it
needle: "if our automatic crawler manages to bypass the mechanism, a child could do it as well"
found in: paper.cols.txt
[ ok ] CCS/2022/poster-an-analysis-of-privacy-features-in-expert-approved-kids-apps
what: distinct age-assurance methods observed in expert-approved kids' apps
DENOMINATOR: 137 apps analysed, from 150 selected out of a 470-app candidate set
value: 13 distinct methods; year of birth in 12 apps
needle: "Apps used a total of 13 different methods for"
found in: paper.cols.txt
[ ok ] PETS/2022/developers-say-the-darnedest-things-privacy-compliance-processes-followed-by-dev
what: child-directed app developers who say they use an age gate for parental consent
DENOMINATOR: 50 responses to the initial organizational survey
value: 16%; and 6% said their own gate is trivially bypassed by a birth year
needle: "In terms of how parental consent is obtained, 16% mentioned they use age gates"
found in: paper.cols.txt
[ ok ] PETS/2022/developers-say-the-darnedest-things-privacy-compliance-processes-followed-by-dev
what: self-report against observation — the gap that makes a survey figure unusable alone
DENOMINATOR: the same organizations' apps, tested from California IP addresses
value: no verifiable parental consent mechanism was observed at all
needle: "did not observe any mechanisms for obtaining verifiable parental consent"
found in: paper.cols.txt
[ ok ] IEEE-SP/2024/a-picture-is-worth-500-labels-a-case-study-of-demographic-disparities-in-local-m
what: accuracy of a deployed facial age-estimation model, by demographic
DENOMINATOR: the on-device vision models extracted from the TikTok and Instagram Android apps
value: qualitative — "less effective for younger demographics"; no accuracy figure published here
needle: "if done using the model deployed by TikTok, is less effective for younger"
found in: paper.pdf (pypdf)
[ ok ] PETS/2026/ad-personalization-and-transparency-in-mobile-ecosystems-a-comparative-analysis
what: an age gate removing a category from a measurement population
DENOMINATOR: app categories the authors wanted in their app-store study
value: dating apps dropped — age verification could not be met at scale
needle: "some potentially interesting app categories, such as dating apps, require age verification to install them"
found in: paper.cols.txt
[ ok ] PETS/2025/more-and-scammier-ads-the-perils-of-youtubes-ad-privacy-settings
what: what the researchers themselves had to submit, by jurisdiction
DENOMINATOR: the Google accounts used as experiment instances
value: selfie verification in AU, IE and UK; a button click in the US and Canada
needle: "we used a mobile VPN and selfie verification in Australia, Ireland, and the UK"
found in: paper.cols.txt
[ ok ] IMC/2023/the-prevalence-of-single-sign-on-on-the-web-towards-the-next-generation-of-web-c
what: age gates as a named cause of crawler failure
DENOMINATOR: the login pages the crawler failed to find
value: age-verification prompts listed among the blocking artefacts
needle: "These include age-verification prompts from adult websites"
found in: paper.cols.txt
[ ok ] CCS/2025/whispertest-a-voice-control-based-library-for-ios-ui-automation
what: ads reached only after clearing a parental gate or age check
DENOMINATOR: 20 children's iOS apps interacted with manually for 100 seconds each
value: 7 of 20 apps
needle: "In seven out of 20 apps, we observed at least one ad, typically after bypassing challenging flows such as parental gates"
found in: paper.cols.txt
[ ok ] PETS/2025/understanding-privacy-norms-through-web-forms
what: the one adjacent web-form study excludes standalone age forms by construction
DENOMINATOR: the paper's web-form dataset
value: standalone age-verification forms are not in the dataset
needle: "Many websites use standalone age verification forms that only ask for age but no other identifiers. These web forms are not included in the dataset"
found in: paper.cols.txt
[ ok ] USENIX/2025/analyzing-the-ai-nudification-application-ecosystem
what: the vantage point chosen to avoid triggering an age check
DENOMINATOR: the 20 nudification websites studied
value: data collected from a US region with no age-verification law for explicit content
needle: "a region in the U.S. that does not have an age verification law"
found in: paper.cols.txt
[ ok ] PETS/2018/won-t-somebody-think-of-the-children-examining-coppa-compliance-at-scale
what: children's apps in Google Play's Designed for Families programme, accessing location
DENOMINATOR: 5,855 DFF-enrolled Android apps (not "children's apps" in general)
value: 235 (4.0%) reached GPS; 28% accessed permission-protected sensitive data
needle: "Our instrumentation observed 235 apps (4.0% of 5,855)"
found in: paper.cols.txt
[ ok ] IEEE-SP/2024/targeted-and-troublesome-tracking-and-advertising-on-childrens-websites
what: trackers and targeted ads on child-directed websites
DENOMINATOR: 2,004 manually verified child-directed websites, classified out of Common Crawl
value: ~90% embed a tracker; ~27% carry targeted ads
needle: "around 90% of child-directed websites embed one or more trackers"
found in: paper.cols.txt
[ ok ] WWW/2023/are-mobile-advertisements-in-compliance-with-apps-age-group
what: ads shown inside apps whose declared audience includes children
DENOMINATOR: 11,270 ad views collected across 25,000 apps
value: 1,289 ad violations from 775 apps
needle: "We collected 11,270 ad views"
found in: paper.cols.txt
located in: paper.cols.txt 19, paper.pdf (pypdf) 1
quote check: 20/20 located verbatim
control: a fabricated needle is correctly NOT located in USENIX/2025/easy-as-childs-play-an-empirical-study-on-age-verification-of-adult-oriented-and
=============================================================
7. WHAT THE EXTRACTION SCHEMA CARRIES
=============================================================
detection phenomenon="age-verification implementation"
technique="Static UI extraction, taint analysis, and dynamic path exploration"
metric="share of analyzed adult-only apps"
prevalence="1,165 apps; 3.67% in the abstract, 3.75% in the evaluation"
detection phenomenon="age-verification method types"
technique="Code-feature heuristics and API, keyword, and file-upload detection"
metric="distribution by verification method"
prevalence="Age gate 31.84%; biometric verification 8.48%"
detection phenomenon="false positives and negatives"
technique="Manual verification of randomly sampled apps"
metric="false-positive and false-negative counts"
prevalence="3 false positives and 2 false negatives"
detection phenomenon="personal-data collection"
technique="Checking strings of UI components co-located in layouts"
metric="counts of apps or instances collecting data"
prevalence="Entertainment apps had 302 full-name and 156 address instances"
detection phenomenon="attack susceptibility"
technique="Theoretical mapping of app mechanisms to six attack types"
metric="share of verification-method categories"
prevalence="Age gates vulnerable to A1; all non-biometric methods vulnerable to A4"
classification target=mobile-app resource="GUARD" taxonomy="age-verification mechanism presence and type"
classification target=mobile-app resource="GUARD" taxonomy="age-verification mechanism presence and type"
classification target=mobile-app resource="GUARD custom rules" taxonomy="age gate, template-based, online ID, credit card, document upload, biometric verification"
No enum in the schema names age assurance. The phenomenon above is free text,
which is ~20% stable run-to-run, so it cannot be aggregated — it is usable
only as a pointer back to the paper.
The PDF fallback the quote checker calls when no .txt rendering has the needle.
- pdftext.py
#!/usr/bin/env python3 """Print a paper's PDF text, whitespace-collapsed, for quote checking. paper.cols.txt repairs two-column reading order but still splices some sentences across column boundaries; pypdf's own extraction splices different ones. A needle that cannot be found in any .txt rendering is checked here before it is called a bad quote. python3 scripts/pdftext.py <venue>/<year>/<slug> """ import re import sys import pathlib import pypdf ROOTS = ["/workspace/publications_dataset/data/fulltext", "/workspace/publications_dataset/fulltext"] venue, year, slug = sys.argv[1].split("/") for root in ROOTS: pdf = pathlib.Path(root) / year / venue / slug / "paper.pdf" if pdf.exists(): break else: sys.exit(f"no paper.pdf for {sys.argv[1]}") reader = pypdf.PdfReader(str(pdf)) text = " ".join(page.extract_text() or "" for page in reader.pages) text = text.replace("", "").replace("-\n", "") sys.stdout.write(re.sub(r"\s+", " ", text))
Quote checks
Every per-paper figure on the content page carries a verbatim needle, checked by the script above. Two rules were applied after earlier runs on this wiki got them wrong:
- The needle must be specific. A bare percentage is shared across papers and would pass against the wrong sentence. The one generic needle in the first draft —
our data was collected from, for the nudification paper — was replaced witha region in the U.S. that does not have an age verification law. - The checker must be able to fail. A fabricated needle (
reveals that only 9,999 (99.99%) implement age verification) is run against the same paper on every execution and the script throws if it is located. Without that control the check asserts nothing.
20 of 20 needles located. 19 in paper.cols.txt; 1 only in the PDF.
| Needle | Paper | Where it was found |
|---|---|---|
we evaluate the effectiveness of age verification. We find that age verification, if done using the model deployed by TikTok, is less effective for younger demographics | [1West, Jack; Thiemt, Lea; Ahmed, Shimaa; Bartig, Maggie; Fawaz, Kassem; Banerjee, Suman (2024): "A Picture is Worth 500 Labels: A Case Study of Demographic Disparities in Local Machine Learning Models for Instagram and TikTok", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] | none of paper.cols.txt, paper.norm.txt or paper.txt — the sentence is interleaved with the adjacent column (“…the effectiveness of age Java, apps create links to JNI calls through the native verification…”). Re-extracting paper.pdf with pypdf finds it verbatim. |
scripts/pdftext.py exists for exactly this and is called by the report script as a last resort. The lesson is the one already recorded for this corpus: a quote-check keyed on paper.cols.txt alone can score a faithful quote as a fabrication.
One needle is truncated on purpose: Apps used a total of 13 different methods for [2Ekambaranathan, Anirudh; Zhao, Jun; Van Kleek, Max (2022): "Poster: An Analysis of Privacy Features in 'Expert-Approved' Kids' Apps", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)]. The next words in the file are “Moat age assurance” — a vendor name from the adjacent column has been spliced into the sentence. The needle stops before the splice.
Folding
Nothing on the content page is a fold. Free-text aggregation was deliberately not used: with a 5-paper population and a 38-paper candidate set, every value is read rather than counted, and there is no field in the extraction whose values would be aggregated.
What is printed instead is the matched-form residue of the probe — every distinct surface string the regex caught, with its tuple count, in section 2 of the output above. 19 distinct forms across 310 tuples. age verification alone is 236 of them; age assurance appears 4 times in the entire corpus, which is itself a finding about how new the regulator's vocabulary is.
What the extraction schema does and does not carry
There is no enum anywhere in the schema for age assurance. It appears only as free text, and only in one paper's detection[] tuples:
phenomenon: “age-verification implementation”/metric: “share of analyzed adult-only apps”/prevalence: “1,165 apps; 3.67% in the abstract, 3.75% in the evaluation”phenomenon: “age-verification method types”/prevalence: “Age gate 31.84%; biometric verification 8.48%”
The first of those is worth noting: the extraction caught an internal inconsistency in the paper that the page then verified by hand. Easy As Child's Play reports 3.67% in its abstract and conclusion and 3.75% in §RQ5 for the same quantity. 1,165 ÷ 31,750 = 3.669%, so the abstract is right and the results section is wrong. The page quotes 3.67% and both quotes are checked.
classification[] carries GUARD's own taxonomy — “age gate, template-based, online ID, credit card, document upload, biometric verification” — which is the source of six of the eight rows in the page's mechanism table. The other two rows (click-through interstitial, device or OS signal) come from [3Vallina, Pelayo; Feal, Álvaro; Gamba, Julien; Vallina-Rodriguez, Narseo; Anta, Antonio Fernández (2019): "Tales from the Porn: A Comprehensive Privacy Analysis of the Web Porn Ecosystem", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] and from the platform documentation below.
Because detection[].phenomenon is free text and ~20% stable run-to-run, it was used only to find the paper, never to count anything.
External sources
Everything in the regulatory surface table and in the platform-API bullets was fetched on 2026-09-15. Nothing was written from recall.
| Claim on the page | Primary source | How it was verified |
|---|---|---|
| Ofcom's list of methods capable of being highly effective; self-declaration explicitly excluded; the “do not host circumvention content” expectation | Ofcom, Ofcom publishes industry guidance on effective age checks, 16 January 2025 | ofcom.org.uk returns HTTP 403 to curl, to WebFetch and to a headless Chromium with a desktop user-agent and a full browser context. Read instead from the Internet Archive capture web.archive.org/web/20260513043257/…, which is Ofcom's own page text. Both quotes on the page are verbatim from that capture. |
| FSC v. Paxton holding | US Supreme Court slip opinion, No. 23–1122 | PDF fetched from supremecourt.gov directly, text extracted with pypdf, quote read from the syllabus. Argued 15 Jan 2025, decided 27 Jun 2025. |
| EU age-verification blueprint v1, five first-adopter Member States, interoperability with EUDI Wallets | digital-strategy.ec.europa.eu news article, published 14 July 2025 | Fetched with curl and a browser user-agent; HTTP 200; the five countries and the date read from the article body. |
| Blueprint v2 adds passport/ID-card onboarding and Digital Credentials API support | Same site, published 10 October 2025 | As above. |
| Commission recommendation urging deployment by end of 2026 | Same site, published 29 April 2026 | As above. |
Apple DeclaredAgeRange availability | developer.apple.com/documentation/declaredagerange | The HTML page requires JavaScript and renders empty in a headless browser. Fetched the documentation JSON at /tutorials/data/documentation/declaredagerange.json instead: platforms gives iOS/iPadOS/Mac Catalyst/macOS introducedAt 26.0, beta: false. |
| Play Age Signals dates for Brazil and Texas | developer.android.com/google/play/age-signals | Fetched with curl; the two dates are in the page's own banner. The API is marked beta and the page says so. |
| Digital Credentials API status | chromestatus API, features 5166035265650688 and 5099333963874304 | Queried the JSON API rather than the HTML. Presentation: Origin trial, milestone 141. Issuance: Proposed, milestone 155. Stable channel at the time of writing is 153.0.8010.36, released 2026-09-08, from chromiumdash.appspot.com/fetch_releases. |
| Australian minimum-age Act, day-of-effect instrument, and the 2026 enforcement amendment | Federal Register of Legislation | Queried api.prod.legislation.gov.au/v1/titles with an OData filter. Three records: C2024A00127 (Act, 10 Dec 2024), F2025N00628 (day-of-effect instrument, 29 Jul 2025), C2026A00083 (enforcement amendment, 11 Sep 2026). |
Rejected, and why
| Source | Why it was not used |
|---|---|
| Law-firm and vendor explainers on the UK OSA (Lewis Silkin, White & Case, Norton Rose, Reed Smith, Crowell) | Secondary. Every fact they carry is in Ofcom's own page, which was obtained. |
| Age-assurance vendor blogs (Yoti, Incode, VerifyMy) | Vendors selling the mechanism the page is about. Not cited, in any form. |
| The Age Verification Providers Association's US state-law tracker | A trade body's count of state statutes. Found by following a citation in a corpus paper (the PoPETs 2025 SoK on web authentication cites it for “US State age verification laws for adult content”), which is how it came to be considered at all. Rejected: the page makes no claim about how many US states have such a law, because every available count is advocacy-side. One statute with a Supreme Court citation is used instead. |
| Free Speech Coalition's bill tracker | Same reason, other side. Also unreachable: action.freespeechcoalition.com failed to load in the headless browser. |
| Australian eSafety Commissioner's minimum-age industry page | esafety.gov.au returned ERR_HTTP2_PROTOCOL_ERROR. The legislative register was used instead, which is the primary source anyway. |
| News coverage of the EU app's April 2026 “technically ready” status | Replaced by the Commission's own 29 April 2026 recommendation page. |
What could not be established
- The calendar day of effect of the Australian minimum-age rule. The instrument F2025N00628 is registered and named, but its text would not extract —
legislation.gov.aureturns HTML from every/textand/downloadPdfroute tried, and the API has no document endpoint for a notifiable instrument. The page names the Act and the instrument and does not assert the day. - How many US states have an age-verification statute. No non-advocacy tracker was found. Not claimed.
- Any web-side prevalence figure after 2019. This is the single biggest hole. Tales from the Porn is seven years old, predates the UK duty, the EU blueprint and every US state statute, and its 20% is a figure for click-through interstitials — a category the current UK rules explicitly exclude. There is no more recent web measurement in these seven venues. The page says this rather than interpolating.
- Recall of either published detector. Neither [3Vallina, Pelayo; Feal, Álvaro; Gamba, Julien; Vallina-Rodriguez, Narseo; Anta, Antonio Fernández (2019): "Tales from the Porn: A Comprehensive Privacy Analysis of the Web Porn Ecosystem", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] nor [4Yao, Yifan; McCollum, Shawn; Sun, Zhibo; Zhang, Yue (2025): "Easy As Child's Play: An Empirical Study on Age Verification of Adult-Oriented Android Apps", in: Proceedings of the USENIX Security Symposium. (Link)] reports detector recall against an independent hand-labelled sample. The page lists this as the first thing a new measurement should do.
- One candidate was judged from title and summary only.
PETS/2026/gan-invert-unveiling-vulnerabilities-in-privacy-preserving-facial-transformationhas nopaper.cols.txtin the mount (one of four such papers in the whole corpus), so the full-text probe never reached it; it is in the verdict map asARTEFACTon the basis of its title and abstract, which are about inverting privacy-preserving face transformations, not about age. If that judgement is wrong the population is 5, not 6, by at most one.
Judgement calls
- A new page rather than a section on a neighbour. The obvious alternative hosts were blocking_and_geodifference (same detection problem) and consent (same interstitial-as-treatment problem). Rejected because the denominator and the ethics are both unlike anything on either page, and because the id was already promised on roadmap and gated by
scripts/sitemap.mjs. The cross-links do the work the alternative would have done. - Publishing a page backed by five papers. The alternative was to record “not enough literature” on the roadmap and stop. Rejected because the page's useful content is method and denominators, not a literature review, and because the six
OBSTACLEpapers mean a reader will meet this topic whether or not they set out to study it. SECTIONas a verdict, and four papers in it. A stricter rule (“the paper is about age assurance”) gives a population of 1 and a page with nothing in it. A looser one (“the paper mentions a measurement”) pulls in the 19MENTIONpapers. The line drawn is reports an empirical result about the mechanism, and a reasonable person could exclude [5Alomar, Noura; Egelman, Serge (2022): "Developers Say the Darnedest Things: Privacy Compliance Processes Followed by Developers of Child-Directed Apps", in: Proceedings on Privacy Enhancing Technologies. (DOI)] on the grounds that a developer survey measures beliefs rather than deployment — which is why the page presents that paper's self-report and its contradicting observation together.- Counting the CCS 2022 poster. It is a poster with n=137 and no peer-reviewed full paper behind it in this corpus. Included because it is the only mechanism taxonomy in the corpus derived from observation, and labelled as a poster on the page.
- Not manufacturing a figure table. The queued row asked for this explicitly and it was honoured: the page has one table of per-year candidate counts and one of per-paper figures, and no aggregate prevalence table, because five studies of five populations cannot be tabulated together.
- Dating methods rather than ranking them. The corpus's own ranking would put “click-through interstitial” first because that is what 2019 measured. The page instead uses Ofcom's 2025 line — self-declaration is not age assurance — to say plainly that the corpus's most-measured mechanism is the one the regulator excludes. That is an external standard imported into a corpus-driven page, and it is a judgement.
- Ethics given its own section rather than a line. ethics does not currently cover adult-content populations, synthetic identity submission, or publishing a working bypass. Rather than edit that page in the same sitting (and orphan its own figures), the four questions are stated here and flagged as a gap for it.
The run
| Date | 2026-09-15, one sitting |
| Corpus | data/extract/run1, 5,859 papers, 5,855 with paper.cols.txt, seven venues, 2010–2026 |
| Model | Claude Opus 5 for the derivation, drafting and external fetches |
| Scripts committed | scripts/report_age_assurance.mjs, scripts/pdftext.py, scripts/build_provenance_age_assurance.py |
| Bibliography | 11 new entries; 0 duplicate keys, 0 duplicate DOIs against the live file; scripts/bib_dedup_scan.py reports 0 definite duplicate pairs over the merged 1,036 entries |
| Authors filled by hand | four PoPETs records whose landing pages fetch_authors.py could not parse (2018-0021, 2022-0108, 2025-0094, 2026-0046), read from petsymposium.org and written to out/authors.json |
Mistakes caught during the run
Recorded because they are the part with value.
- Two probe regexes were wrong in the same way, and both were caught only by reading the printed residue rather than the count.
voltage signalmatchedage signal,improve their agencymatchedprove their age,webpage screenshotmatchedage screen. The first version of the candidate set was 233 papers, of which nine of the top thirteen were electromagnetic side-channel work. - The roadmap's own committed probe has the same defect and is the reason F-BLEAU: Fast Black-Box Leakage Estimation is one of its 11 age-assurance candidates.
- The first quote check failed on a true quote. [1West, Jack; Thiemt, Lea; Ahmed, Shimaa; Bartig, Maggie; Fawaz, Kassem; Banerjee, Suman (2024): "A Picture is Worth 500 Labels: A Case Study of Demographic Disparities in Local Machine Learning Models for Instagram and TikTok", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)]'s contribution sentence is spliced across a column boundary in all three
.txtrenderings;pypdfhas it verbatim. The checker was rewritten to try four renderings and to print which one located each needle, and a fabricated-needle control was added so the check cannot pass vacuously. - The bibliography cache served a stale parse. After appending 11 entries and saving the page, 11 of 20 references rendered as allocated-but-empty numbers while both sources looked perfect. Purging
literature/bibliography?purge=trueand then the page fixed it; the rendered reference count was then checked against the distinct marker count (20 = 20, 42 markers, 42bibtex_citekeyspans). - ofcom.org.uk is unreachable from this sandbox (403 to curl, to WebFetch, and to a full headless-Chromium context). The page's two Ofcom quotes come from an Internet Archive capture, and the page says so in the footnote rather than implying a direct read.
Review log
Four reviewers, each told explicitly that the author's context may not be exhaustive, and each handed the page text, the report script, its output and this provenance draft.
Related
- corpus — venue scope, the selection funnel, and the provisional 2025–2026 years
- privacy — the namespace's own log
No ~~DISCUSSION~~ block here, following the convention set by the other provenance pages: comments belong on the content page.
- [1]
- West, Jack; Thiemt, Lea; Ahmed, Shimaa; Bartig, Maggie; Fawaz, Kassem; Banerjee, Suman (2024): "A Picture is Worth 500 Labels: A Case Study of Demographic Disparities in Local Machine Learning Models for Instagram and TikTok", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)
- [2]
- Ekambaranathan, Anirudh; Zhao, Jun; Van Kleek, Max (2022): "Poster: An Analysis of Privacy Features in 'Expert-Approved' Kids' Apps", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)
- [3]
- Vallina, Pelayo; Feal, Álvaro; Gamba, Julien; Vallina-Rodriguez, Narseo; Anta, Antonio Fernández (2019): "Tales from the Porn: A Comprehensive Privacy Analysis of the Web Porn Ecosystem", in: Proceedings of the ACM Internet Measurement Conference. (DOI)
- [4]
- Yao, Yifan; McCollum, Shawn; Sun, Zhibo; Zhang, Yue (2025): "Easy As Child's Play: An Empirical Study on Age Verification of Adult-Oriented Android Apps", in: Proceedings of the USENIX Security Symposium. (Link)
- [5]
- Alomar, Noura; Egelman, Serge (2022): "Developers Say the Darnedest Things: Privacy Compliance Processes Followed by Developers of Child-Directed Apps", in: Proceedings on Privacy Enhancing Technologies. (DOI)
