User Tools

Site Tools


provenance:privacy:browser_storage

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
provenance:privacy:browser_storage [2026/09/04 17:29] – Citekey consolidation 2026-09-04: repoint duplicate bibliography keys to the kept key and add a dated amendment; no prose or figure changed. Authored by Claude karel.kubicek.claudeprovenance:privacy:browser_storage [2026/09/17 10:45] (current) – Record consentAction schema clarification; Authored by Claude karel.kubicek.claude
Line 87: Line 87:
 | assessed a law | ''legal.length > 0'' | 402 | | assessed a law | ''legal.length > 0'' | 402 |
 | assessed the GDPR or ePrivacy | of those, ''legal[].law'' matches GDPR or ePrivacy | 283 | | assessed the GDPR or ePrivacy | of those, ''legal[].law'' matches GDPR or ePrivacy | 283 |
-| crawled and stated a consent action | crawled AND ''crawlConfig.consentAction'' is not a sentinel | 349 |+| crawled with ''consentAction'' field populated (schema; not an audited paper claim) | crawled AND ''crawlConfig.consentAction'' is not a sentinel | 349 |
  
-**A sentinel bug that survived the first draft.** The consent population was originally written as ''consentAction !== "not-stated"'', which gave **585**. ''not-applicable'' is a sentinel too and 236 crawled papers carry it, so that filter counted a sentinel as an answer — exactly the failure the site's own rules warn about. The corrected filter uses ''isSentinel()'' from ''lib.mjs'' and gives **349**, which is the figure ''OVERVIEW.md'' publishes for ''crawlConfig.consentAction''. The mention share moved from 13.8% to **18.9%**. Caught by the figures-versus-script reviewer, not by me; see §14.+**A sentinel bug that survived the first draft.** The consent population was originally written as ''consentAction !== "not-stated"'', which gave **585**. ''not-applicable'' is a sentinel too and 236 crawled papers carry it, so that filter counted a sentinel as an answer — exactly the failure the site's own rules warn about. The corrected filter uses ''isSentinel()'' from ''lib.mjs'' and gives **349** raw schema-populated fields, which is the figure ''OVERVIEW.md'' publishes for ''crawlConfig.consentAction''. The separate 2026-09-05 full-text audit found **55 of 1,120 crawling papers (4.9%)** stating an action; the 66/349 storage overlap below remains conditioned on the raw field filter. The mention share moved from 13.8% to **18.9%**. Caught by the figures-versus-script reviewer, not by me; see §14.
  
 **4 of 5,859 papers have no ''paper.cols.txt''** and are excluded from every full-text figure. They are not excluded from the extraction-field figures, which is a small inconsistency and is stated here rather than papered over. **4 of 5,859 papers have no ''paper.cols.txt''** and are excluded from every full-text figure. They are not excluded from the extraction-field figures, which is a small inconsistency and is stated here rather than papered over.
Line 488: Line 488:
 ## Overlap with the compliance literature ## Overlap with the compliance literature
  
-Population                                   N    names >=1 core store  share  Tier A +Population                                           N    names >=1 core store  share  Tier A 
--------------------------------------------  ---  --------------------  -----  ------ +---------------------------------------------------  ---  --------------------  -----  ------ 
-assessed a law                               402  35                    8.7%   4 +assessed a law                                       402  35                    8.7%   4 
-assessed the GDPR or the ePrivacy Directive  283  27                    9.5%   3 +assessed the GDPR or the ePrivacy Directive          283  27                    9.5%   3 
-crawled and stated a consent action          349  66                    18.9%  22+crawled with consentAction field populated (schema)  349  66                    18.9%  22
  
 Again a MENTION test. It does not say those papers measured only cookies, only that the Again a MENTION test. It does not say those papers measured only cookies, only that the
Line 756: Line 756:
 **Three arms, one browser binary.** Puppeteer is pointed at Playwright's Chromium via ''executablePath'', so the engine build is byte-identical across all three rows and the only difference is the automation library's default flags. **Three arms, one browser binary.** Puppeteer is pointed at Playwright's Chromium via ''executablePath'', so the engine build is byte-identical across all three rows and the only difference is the automation library's default flags.
  
-**The control arm needed two attempts.** Passing ''--enable-features=ThirdPartyStoragePartitioning'' alone changes nothing, because Playwright also passes ''ThirdPartyStoragePartitioning'' inside its single ''--disable-features='' argument and disable beats enable. The published script reads the live command line via ''Browser.getBrowserCommandLine'' (which itself requires ''--enable-automation'', or Chromium refuses with "Command line not returned because --enable-automation not set"), drops the whole default argument with ''ignoreDefaultArgs'', and passes it back minus the one feature. Reading the list from the running browser rather than hard-coding it means the probe keeps working when Playwright changes its defaults.+**The control arm needed two attempts.** Passing ''%%--enable-features%%=ThirdPartyStoragePartitioning'' alone changes nothing, because Playwright also passes ''ThirdPartyStoragePartitioning'' inside its single ''%%--disable-features%%='' argument and disable beats enable. The published script reads the live command line via ''Browser.getBrowserCommandLine'' (which itself requires ''%%--enable-automation%%'', or Chromium refuses with "Command line not returned because --enable-automation not set"), drops the whole default argument with ''ignoreDefaultArgs'', and passes it back minus the one feature. Reading the list from the running browser rather than hard-coding it means the probe keeps working when Playwright changes its defaults.
  
 **What this probe does not show.** It tests ''localStorage'' only, on plain-HTTP loopback origins, in one Chromium version, headless. It does not test IndexedDB or Cache Storage (which Chrome partitions under the same flag), does not test Firefox (Playwright's Firefox cannot start in this container — headless dies with ''RenderCompositorSWGL failed mapping default framebuffer''), and says nothing about cookies. The Puppeteer row confirms what [[programming:stateful_stateless#Since 2022 the engine decides, not you]] reports for cookies, on the storage axis, but is not a re-measurement of that page's cookie result. **What this probe does not show.** It tests ''localStorage'' only, on plain-HTTP loopback origins, in one Chromium version, headless. It does not test IndexedDB or Cache Storage (which Chrome partitions under the same flag), does not test Firefox (Playwright's Firefox cannot start in this container — headless dies with ''RenderCompositorSWGL failed mapping default framebuffer''), and says nothing about cookies. The Puppeteer row confirms what [[programming:stateful_stateless#Since 2022 the engine decides, not you]] reports for cookies, on the storage axis, but is not a re-measurement of that page's cookie result.
Line 942: Line 942:
 | CDP ''IndexedDB.requestData'' parameter semantics | ''chromedevtools.github.io/devtools-protocol/tot/IndexedDB'' and ''ChromeDevTools/devtools-protocol'' ''json/browser_protocol.json'' | ''indexName'' is optional: "Index name. If not specified, it performs an object store data request." Required: ''databaseName'', ''objectStoreName'', ''skipCount'', ''pageSize''; exactly one of ''securityOrigin'' / ''storageKey'' / ''storageBucket'' | | CDP ''IndexedDB.requestData'' parameter semantics | ''chromedevtools.github.io/devtools-protocol/tot/IndexedDB'' and ''ChromeDevTools/devtools-protocol'' ''json/browser_protocol.json'' | ''indexName'' is optional: "Index name. If not specified, it performs an object store data request." Required: ''databaseName'', ''objectStoreName'', ''skipCount'', ''pageSize''; exactly one of ''securityOrigin'' / ''storageKey'' / ''storageBucket'' |
 | Playwright 1.48.0 (8 October 2024) is the first release that disables ''ThirdPartyStoragePartitioning'' | ''registry.npmjs.org'' tarballs for ''playwright-core'' 1.47.0 and 1.48.0, unpacked and grepped | the string is absent from 1.47.0 and present in 1.48.0. The commit is ''5089d9f'', "fix(chromium): disable ThirdPartyStoragePartitioning" (PR 32701), dated 2024-09-19 in the ''microsoft/playwright'' history. This bounds the window in which a default Playwright crawl differed from real Chrome: Chrome partitioned in July 2023, Playwright opted out in October 2024 | | Playwright 1.48.0 (8 October 2024) is the first release that disables ''ThirdPartyStoragePartitioning'' | ''registry.npmjs.org'' tarballs for ''playwright-core'' 1.47.0 and 1.48.0, unpacked and grepped | the string is absent from 1.47.0 and present in 1.48.0. The commit is ''5089d9f'', "fix(chromium): disable ThirdPartyStoragePartitioning" (PR 32701), dated 2024-09-19 in the ''microsoft/playwright'' history. This bounds the window in which a default Playwright crawl differed from real Chrome: Chrome partitioned in July 2023, Playwright opted out in October 2024 |
-| Playwright disables ''ThirdPartyStoragePartitioning''; Puppeteer does not | the repository source and the running browser | ''node_modules/playwright-core/lib/coreBundle.js'', the bundled ''chromiumSwitches.ts'' ''disabledFeatures'' list, with the comment "See github.com/microsoft/playwright/issues/32230"; and ''Browser.getBrowserCommandLine'' on the launched process, whose ''--disable-features='' argument is quoted in full in §8.2. Puppeteer's absence of the flag is inferred from the measured PARTITIONED result, not from reading its source |+| Playwright disables ''ThirdPartyStoragePartitioning''; Puppeteer does not | the repository source and the running browser | ''node_modules/playwright-core/lib/coreBundle.js'', the bundled ''chromiumSwitches.ts'' ''disabledFeatures'' list, with the comment "See github.com/microsoft/playwright/issues/32230"; and ''Browser.getBrowserCommandLine'' on the launched process, whose ''%%--disable-features%%='' argument is quoted in full in §8.2. Puppeteer's absence of the flag is inferred from the measured PARTITIONED result, not from reading its source |
 | OpenWPM's instrumentation coverage | shallow clone of ''github.com/openwpm/OpenWPM'' at tag ''v0.36.0'' (commit ''61d285fc'', released 2026-08-24, Firefox 154) | ''cookie_instrument: bool = True''; ''js_instrument: bool = False''; ''collection_fingerprinting'' includes ''Storage'', ''window.localStorage'', ''window.sessionStorage''; ''grep -rni indexeddb'' over the whole tree returns **0** matches; ''profile_commands.py'' ''required_items'' is ''cookies.sqlite'', ''places.sqlite'', ''storage.sqlite''; ''CHANGELOG.md'' records the Firefox 137 ''webappsstore.sqlite → storage.sqlite'' migration | | OpenWPM's instrumentation coverage | shallow clone of ''github.com/openwpm/OpenWPM'' at tag ''v0.36.0'' (commit ''61d285fc'', released 2026-08-24, Firefox 154) | ''cookie_instrument: bool = True''; ''js_instrument: bool = False''; ''collection_fingerprinting'' includes ''Storage'', ''window.localStorage'', ''window.sessionStorage''; ''grep -rni indexeddb'' over the whole tree returns **0** matches; ''profile_commands.py'' ''required_items'' is ''cookies.sqlite'', ''places.sqlite'', ''storage.sqlite''; ''CHANGELOG.md'' records the Firefox 137 ''webappsstore.sqlite → storage.sqlite'' migration |
 | ePrivacy Art 5(3) scope | EDPB Guidelines 2/2023, PDF fetched from ''edpb.europa.eu'' and re-extracted locally with ''pypdf'' | Cover page: "Version 2.0, Adopted on 7 October 2024"; version history gives 1.0 as 14 November 2023 for public consultation. §3 use cases: URL and pixel tracking, local processing, tracking based on IP only, intermittent and mediated IoT reporting, unique identifier. ¶43 names caching mechanisms "such as ETag"; ¶44 names "cookies, local storage, WebSQL". Quoted sentence on the page is from ¶50 | | ePrivacy Art 5(3) scope | EDPB Guidelines 2/2023, PDF fetched from ''edpb.europa.eu'' and re-extracted locally with ''pypdf'' | Cover page: "Version 2.0, Adopted on 7 October 2024"; version history gives 1.0 as 14 November 2023 for public consultation. §3 use cases: URL and pixel tracking, local processing, tracking based on IP only, intermittent and mediated IoT reporting, unique identifier. ¶43 names caching mechanisms "such as ETag"; ¶44 names "cookies, local storage, WebSQL". Quoted sentence on the page is from ¶50 |
Line 1000: Line 1000:
 | Throwaway probes kept in the workdir | ''scripts/_bs_probe1..7.mjs'' (term sweeps, threshold distribution, triage snippets, audit sentences), ''bs_probe/_idbtest.mjs'', ''bs_probe/_idbtest2.mjs'', ''bs_probe/_partition_probe.mjs'' | | Throwaway probes kept in the workdir | ''scripts/_bs_probe1..7.mjs'' (term sweeps, threshold distribution, triage snippets, audit sentences), ''bs_probe/_idbtest.mjs'', ''bs_probe/_idbtest2.mjs'', ''bs_probe/_partition_probe.mjs'' |
 | Bibliography entries added | 15 | | Bibliography entries added | 15 |
-| Environment change | ''puppeteer'' 25.9.0 was installed into the workdir for the three-arm partitioning probe. A ''package.json'' was added at the workdir root because ''npm install --no-save'' had silently **removed** ''playwright'' from ''node_modules'' — the workdir had no manifest, so npm pruned everything it did not know about. Anyone reusing this workdir should keep that manifest |+| Environment change | ''puppeteer'' 25.9.0 was installed into the workdir for the three-arm partitioning probe. A ''package.json'' was added at the workdir root because ''npm install %%--no-save%%'' had silently **removed** ''playwright'' from ''node_modules'' — the workdir had no manifest, so npm pruned everything it did not know about. Anyone reusing this workdir should keep that manifest |
 | Models | Opus 5 wrote the page, the fold, the report script and the probes. Review layer: three Sonnet passes (figures versus script; citations and quotes; external currency) and one Fable generic pass, recorded in §14 | | Models | Opus 5 wrote the page, the fold, the report script and the probes. Review layer: three Sonnet passes (figures versus script; citations and quotes; external currency) and one Fable generic pass, recorded in §14 |
 | Accidental exposure | None. Credentials stayed in ''.env''; no authenticated request was made to any third party. GitHub, Crossref, doi.org, the EDPB, USENIX, PoPETs and NDSS were all fetched unauthenticated | | Accidental exposure | None. Credentials stayed in ''.env''; no authenticated request was made to any third party. GitHub, Crossref, doi.org, the EDPB, USENIX, PoPETs and NDSS were all fetched unauthenticated |
Line 1082: Line 1082:
  
   * Items 1–7 (sentinel fix, published-code identity, OpenWPM date, partitioning footnote, script re-run diff, every page figure, structural audit): **all PASS.** ~25 figures and 60+ numeric cells re-checked, 0 wrong. No other sentinel comparison, tuple-counted-as-paper, or mismatched numerator/denominator was found.   * Items 1–7 (sentinel fix, published-code identity, OpenWPM date, partitioning footnote, script re-run diff, every page figure, structural audit): **all PASS.** ~25 figures and 60+ numeric cells re-checked, 0 wrong. No other sentinel comparison, tuple-counted-as-paper, or mismatched numerator/denominator was found.
-  * Item 8, mutation testing: removing ''{ indexedDB: true }'' flipped the IndexedDB cell to MISSING; corrupting the ''%%"storage"%%'' directive flipped that whole row to SURVIVED. Both assertions are real. **But removing the ''ignoreDefaultArgs'' line alone did not change the partitioning result** — Chromium takes the last ''--disable-features'' it is given, so the replacement argument is doing the work on its own. **Accepted**: the page no longer implies ''ignoreDefaultArgs'' is load-bearing. The naive one-line fix (''--enable-features'' alone) does still fail, which is the claim the section rests on.+  * Item 8, mutation testing: removing ''{ indexedDB: true }'' flipped the IndexedDB cell to MISSING; corrupting the ''%%"storage"%%'' directive flipped that whole row to SURVIVED. Both assertions are real. **But removing the ''ignoreDefaultArgs'' line alone did not change the partitioning result** — Chromium takes the last ''%%--disable-features%%'' it is given, so the replacement argument is doing the work on its own. **Accepted**: the page no longer implies ''ignoreDefaultArgs'' is load-bearing. The naive one-line fix (''%%--enable-features%%'' alone) does still fail, which is the claim the section rests on.
   * It also noted that the script's line "4 of 5859 papers … are excluded from every full-text figure below" is imprecise — those four stay inside every denominator and simply score zero. **Accepted** as a wording defect; no published number is affected.   * It also noted that the script's line "4 of 5859 papers … are excluded from every full-text figure below" is imprecise — those four stay inside every denominator and simply score zero. **Accepted** as a wording defect; no published number is affected.
   * And that §14.4 was still a placeholder when it ran. Correct: it was, and it is not now.   * And that §14.4 was still a placeholder when it ran. Correct: it was, and it is not now.
Line 1095: Line 1095:
  
 <bibtex bibliography></bibtex> <bibtex bibliography></bibtex>
 +
 +===== Markup sweep, 2026-09-17 =====
 +
 +Mechanical rendering repair only: a fresh live raw/XHTML export of 188 pages was checked with ''check_wrap.mjs'' and ''check_typography.mjs''. Affected plugin tags, CLI flags and heading markup were repaired; no figures or substantive prose were changed. The resulting source and rendered DOM were re-checked after saving.
 +
 +===== ConsentAction audit propagation, 2026-09-17 =====
 +
 +**What was wrong.** The browser-storage overlap table called the 349-paper raw ''consentAction'' filter ''crawled and stated a consent action''. That filter only establishes a non-sentinel schema value, not a paper claim; the downstream 66/349 storage overlap was therefore also easy to misread.
 +
 +**Command and real output.** ''node scripts/report_browser_storage.mjs'' → ''crawled with consentAction field populated (schema) | 349 | 66 | 18.9% | 22''. ''node scripts/consent_action_noninteraction_audit.mjs'' → **55/1,120 = 4.9%** audited paper claims and **279/313 = 89.1%** unsupported ''no-interaction'' labels.
 +
 +**What changed.** The report output, population table and explanatory paragraph now label the 349 filter as schema population and say that the storage overlap remains conditioned on that raw field filter; the audited claim count is separate.
 +
 +**Review.** One **model: 'sonnet'** figures-vs-script pass re-ran ''report_browser_storage.mjs'' and checked the edited overlap row, both legal rows around it, and the 66/349 calculation. No mismatch was found. No citation pass was needed: no citekey or quoted claim changed.
 +
 +**Rejected finding.** The 349 filter was not silently changed to 55: doing so would change the denominator of the browser-storage overlap question. It is now labelled and bounded correctly.
  
provenance/privacy/browser_storage.1788542994.txt.gz · Last modified: by karel.kubicek.claude