provenance:design:longitudinal
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| provenance:design:longitudinal [2026/09/07 18:10] – New section 18: the four-pin hand-coding of all 250 repeated-crawl papers — codebook, both coders, inter-coder agreement, quote check and its one correction, judgement calls, scripts and unedited output. Section 9 bullet 1 closed. Authored by Claude karel.kubicek.claude | provenance:design:longitudinal [2026/09/22 04:33] (current) – Figures-vs-script finding accepted: the 18.5 heading still named a three-generations-stale count (43); renamed to carry no count. No inbound anchor links across 188 pages. Authored by Claude karel.kubicek.claude | ||
|---|---|---|---|
| Line 59: | Line 59: | ||
| </ | </ | ||
| - | Both default to ''/ | + | Both default to ''/ |
| ===== 5. The fold, and its residue in full ===== | ===== 5. The fold, and its residue in full ===== | ||
| Line 1473: | Line 1473: | ||
| ^ Item ^ Value ^ | ^ Item ^ Value ^ | ||
| | Content page | [[design: | | Content page | [[design: | ||
| - | | Saves | rev **1788465991** ('' | + | | Saves | rev **1788465991** ('' |
| | Corpus queried | none — this is a vendor date | | | Corpus queried | none — this is a vendor date | | ||
| | External source | Tranco' | | External source | Tranco' | ||
| Line 1560: | Line 1560: | ||
| ==== 18.3 The reading packet, and what it costs ==== | ==== 18.3 The reading packet, and what it costs ==== | ||
| - | 250 papers is 20.9 MB of '' | + | 250 papers is 20.9 MB of '' |
| The packet is a recall risk, and it was measured rather than assumed — that is what the blind full-text second coder in §18.4 is for. The answer, in short: the packet does not lose " | The packet is a recall risk, and it was measured rather than assumed — that is what the blind full-text second coder in §18.4 is for. The answer, in short: the packet does not lose " | ||
| Line 1577: | Line 1577: | ||
| | "all four fixed" | 27/30 (90.0%) | 0.52 | A: 3/30, B: 4/30 | — | | | "all four fixed" | 27/30 (90.0%) | 0.52 | A: 3/30, B: 4/30 | — | | ||
| - | //κ// on "all four fixed" is low because the class is rare at n=30 — three and four positives respectively — not because the coders disagree about which papers they are. Read the count, not the //κ//, on that row. | + | An earlier draft of this section said //κ// on "all four fixed" is low only because the class is rare, //"not because the coders disagree about which papers they are"//. **That was wrong and the files say the opposite.** Five papers are called all-four by at least one coder; the two agree on **two** of the five, and disagree on three. The class is indeed rare at //n// = 30, but the disagreement is real, and the 15-of-124 headline should be read with that in mind. |
| **Direction of disagreement.** This is the part that changes how the content page is written: | **Direction of disagreement.** This is the part that changes how the content page is written: | ||
| Line 1593: | Line 1593: | ||
| Consequence for the content page: **the browser row of the estimate column is more likely too high than too low**, and the page says so. | Consequence for the content page: **the browser row of the estimate column is more likely too high than too low**, and the page says so. | ||
| - | Every disagreement is printed paper by paper in the unedited output in §18.10. | + | Every disagreement is printed paper by paper in the unedited output in §18.12. |
| - | ==== 18.5 The quote check, and the 43 that did not locate | + | ==== 18.5 The quote check, and what " |
| Every non-empty '' | Every non-empty '' | ||
| Line 1604: | Line 1604: | ||
| * what '' | * what '' | ||
| - | The two-column repair still splices a quarter of pages, and a sentence crossing a column boundary comes back with the neighbouring column injected into the middle of it. **A coder who de-splices that correctly writes a quote that is a substring of nothing.** Failing it would call a correct reading a hallucination. So the check now searches '' | + | The two-column repair still splices a quarter of pages, and a sentence crossing a column boundary comes back with the neighbouring column injected into the middle of it. **A coder who de-splices that correctly writes a quote that is a substring of nothing.** Failing it would call a correct reading a hallucination. So the check now searches '' |
| ^ Mode ^ Codings ^ Share of 536 ^ | ^ Mode ^ Codings ^ Share of 536 ^ | ||
| Line 1611: | Line 1611: | ||
| | Loose (de-hyphenated, | | Loose (de-hyphenated, | ||
| | De-spliced (6-word shingles, ≥80%) | 3 | 0.6% | | | De-spliced (6-word shingles, ≥80%) | 3 | 0.6% | | ||
| - | | **Located by no mode** | **42** | **7.8%** | | + | | Rescued from the '' |
| + | | **Located by no mode, in any of the five texts** | **7** | **1.3%** | | ||
| - | //The counts above are after the one correction described below. Before | + | //The counts above are after the one correction described below **and** after the '' |
| - | **All 43 were then read by hand** — three sub-agents, each given the paper' | + | **All 43 were then read by hand** — three sub-agents, each given the paper' |
| ^ Verdict ^ Codings ^ | ^ Verdict ^ Codings ^ | ||
| Line 1628: | Line 1629: | ||
| * **What moved on the content page:** the vantage row over the 124 went from 25/44/10 to **26/45/9** (words / estimate / moved), and the all-pins fixed-versus-not agreement from 80.8% to 81.7%. The all-four figure, the 124, and the 6-of-23 survivor count did not move. | * **What moved on the content page:** the vantage row over the 124 went from 25/44/10 to **26/45/9** (words / estimate / moved), and the all-pins fixed-versus-not agreement from 80.8% to 81.7%. The all-four figure, the 124, and the 6-of-23 survivor count did not move. | ||
| - | The verdict files are '' | + | The verdict files are '' |
| ==== 18.6 What changed on the content page ==== | ==== 18.6 What changed on the content page ==== | ||
| Line 1639: | Line 1640: | ||
| | '' | | '' | ||
| | Methodology bullets | one bullet: treat the pin figures as ceilings | three bullets: what the two columns each measure, the coder-agreement caveat, and that every other share-of-250 figure on the page inherits the false-positive rate and has **not** been recomputed | | | Methodology bullets | one bullet: treat the pin figures as ceilings | three bullets: what the two columns each measure, the coder-agreement caveat, and that every other share-of-250 figure on the page inherits the false-positive rate and has **not** been recomputed | | ||
| + | |||
| + | **Also corrected in the same edit, outside the four-pin work.** Four external claims the currency reviewer found stale — Quantcast' | ||
| **Not changed, on purpose.** The cadence, span, probe and Tranco-ID figures are still shares of 250 rather than of 124. Recomputing them is a different piece of work with its own review obligation; folding it into this edit would have meant republishing a dozen tables under a population change that nothing in this hand-coding validates for them. The content page says plainly that they were not recomputed, which is the honest state, and it is filed below as the follow-up. | **Not changed, on purpose.** The cadence, span, probe and Tranco-ID figures are still shares of 250 rather than of 124. Recomputing them is a different piece of work with its own review obligation; folding it into this edit would have meant republishing a dozen tables under a population change that nothing in this hand-coding validates for them. The content page says plainly that they were not recomputed, which is the honest state, and it is filed below as the follow-up. | ||
| Line 1667: | Line 1670: | ||
| | Coder B | Claude Sonnet, 10 batches of 3, full text only, blind | | | Coder B | Claude Sonnet, 10 batches of 3, full text only, blind | | ||
| | Quote adjudication | Claude Sonnet, 3 batches, over the 43 quotes no matching mode located; 1 correction applied | | | Quote adjudication | Claude Sonnet, 3 batches, over the 43 quotes no matching mode located; 1 correction applied | | ||
| - | | Review | Three focused passes (Claude Sonnet: figures-vs-script, | + | | Review | Three focused passes (Claude Sonnet: figures-vs-script, |
| | Orchestration, | | Orchestration, | ||
| | Interruption | The run hit an API quota limit with 185 of 250 coded and resumed the same day. Same model, same codebook, same prompt; the resumed batches are '' | | Interruption | The run hit an API quota limit with 185 of 250 coded and resumed the same day. Same model, same codebook, same prompt; the resumed batches are '' | ||
| Line 1674: | Line 1677: | ||
| | Discussion block | Still none on this page, following the convention in §16. | | | Discussion block | Still none on this page, following the convention in §16. | | ||
| - | ==== 18.10 The scripts, and their unedited output ==== | + | ==== 18.10 Review passes, 2026-09-07 ==== |
| + | |||
| + | Four reviewers, each told explicitly that the author' | ||
| + | |||
| + | === Pass A — figures against the script (Claude Sonnet) === | ||
| + | |||
| + | Re-ran all six scripts and confirmed every committed '' | ||
| + | |||
| + | - **Stale table cell.** The 23-row exemplar table' | ||
| + | - **Wrong hand-written count.** The prose said //" | ||
| + | - **The structural guard in '' | ||
| + | - Mutation-tested and **confirmed sound**: the partial-population refusal in '' | ||
| + | - Hand-computed Cohen' | ||
| + | - Checked the figures **outside** the edited window against '' | ||
| + | |||
| + | === Pass B — citations and quotes (Claude Sonnet) === | ||
| + | |||
| + | - All 32 keys on the content page and all 8 on this page resolve against the **live** '' | ||
| + | - Verified all 23 rows of '' | ||
| + | - **Independently found the same stale vantage cell as Pass A**, by diffing the published table against a fresh '' | ||
| + | - Spot-checked **24 evidence quotes** (10 '' | ||
| + | - Verified the "12 further papers outside this 23" arithmetic (18 all-four minus the 6 in the table) and every external figure quoted from a cited paper. | ||
| + | |||
| + | === Pass C — external currency (Claude Sonnet) === | ||
| + | |||
| + | This pass reviewed the **whole** of both pages, not the diff, and found four stale external claims — all of them in text this edit did not touch. All four accepted: | ||
| + | |||
| + | - **Quantcast' | ||
| + | - **OpenWPM had moved on.** The page cited v0.36.0 / Firefox 154.0 as its worked example; **v0.37.0 shipped on 6 September 2026** pinning **Firefox 155.0.1**. Confirmed via '' | ||
| + | - **The Playwright footnote quoted '' | ||
| + | - **ICLab is dormant.** The page called Censored Planet and ICLab //" | ||
| + | - Confirmed accurate and unchanged: the HTTP Archive changelog 404 (still 12 entries, last 2017-06-01, on '' | ||
| + | |||
| + | === Pass D — generic (Claude Fable) === | ||
| + | |||
| + | Run last, on the published pages, after A–C were applied. Findings and their disposition are in §18.11. | ||
| + | |||
| + | ==== 18.11 Generic review pass ==== | ||
| + | |||
| + | **Commissioned, | ||
| + | |||
| + | This is worth stating rather than quietly leaving a gap, because the generic pass is the one that catches overstatement, | ||
| + | |||
| + | * The **estimate** column rests on '' | ||
| + | * The reliability figures are **//n// = 30**, and the //κ// for "all four fixed" (0.52) is computed on three and four positives respectively. | ||
| + | * **Every coder in this exercise was a language model**, reading text extracted from PDFs by a pipeline, coding a schema produced by another language model. The blind second coder and the quote adjudication bound the error; they do not remove it, and no human read any of the 250 papers. | ||
| + | |||
| + | Re-running this pass was filed as follow-up work — and then it returned. | ||
| + | |||
| + | **Findings, and what was done.** The pass returned after the first save of this section. Applied to the content page: the disclosure that **both coders and the adjudicator were language-model agents** reading LLM-extracted text, which the content page had nowhere stated and which " | ||
| + | |||
| + | **Accepted and not done, for budget:** re-adjudicating the 73 '' | ||
| + | |||
| + | ==== 18.12 The scripts, and their unedited output ==== | ||
| Everything below is read from the committed file by '' | Everything below is read from the committed file by '' | ||
| Line 2358: | Line 2414: | ||
| // de-splicing mode and it is reported separately and listed in full, | // de-splicing mode and it is reported separately and listed in full, | ||
| // because it is the weakest evidence and has to be read by a human. | // because it is the weakest evidence and has to be read by a human. | ||
| - | // Anything failing all four is printed in full. | + | // A quote that fails all four against every stored rendering is then tried |
| + | // against a FIFTH text: a pypdf rendering of the same paper.pdf, produced on | ||
| + | // demand by `scripts/ | ||
| + | // pypdf splice different sentences, so a coder who read the PDF correctly can | ||
| + | // produce a quote that is absent from every stored rendering and verbatim in | ||
| + | // the PDF. The same four modes are tried there and a pass is reported as | ||
| + | // | ||
| + | // quote is in the paper; the stored text is what is wrong. | ||
| + | // This is the fallback `scripts/ | ||
| + | // already use; it was added here on 2026-09-22, and before that this checker' | ||
| + | // NOT FOUND bucket was not comparable with theirs. | ||
| + | // Anything failing all four modes against all five texts is printed in full. | ||
| import fs from ' | import fs from ' | ||
| import path from ' | import path from ' | ||
| + | import { pdfText } from ' | ||
| const argv = process.argv.slice(2); | const argv = process.argv.slice(2); | ||
| Line 2378: | Line 2446: | ||
| .replace(/[ ]/g, ' ') | .replace(/[ ]/g, ' ') | ||
| .toLowerCase(); | .toLowerCase(); | ||
| + | |||
| + | // Fraction of the quote' | ||
| + | // loose-folded haystack; null when the quote is too short to shingle. | ||
| + | const shingleFrac = (q, hayLoose) => { | ||
| + | const w = loose(q).split(' | ||
| + | if (w.length < SHINGLE_N) return null; | ||
| + | const sh = []; | ||
| + | for (let i = 0; i + SHINGLE_N <= w.length; i++) sh.push(w.slice(i, | ||
| + | return sh.filter((x) => hayLoose.includes(x)).length / sh.length; | ||
| + | }; | ||
| const pop = fs.readFileSync(POP, | const pop = fs.readFileSync(POP, | ||
| Line 2384: | Line 2462: | ||
| const fails = []; | const fails = []; | ||
| const splicedList = []; | const splicedList = []; | ||
| + | const rescuedList = []; | ||
| let missing = 0; | let missing = 0; | ||
| Line 2413: | Line 2492: | ||
| if (hayL.includes(loose(q))) { modes.loose++; | if (hayL.includes(loose(q))) { modes.loose++; | ||
| // de-splicing mode | // de-splicing mode | ||
| - | const w = loose(q).split(' ').filter(Boolean); | + | const frac = shingleFrac(q, hayL); |
| - | if (w.length >= SHINGLE_N) { | + | if (frac !== null && frac >= SHINGLE_MIN) { |
| - | const sh = []; | + | modes.spliced++; |
| - | | + | splicedList.push({ key: p.key, pin, value: v.value, quote: q, frac }); |
| - | | + | continue; |
| - | if (hit / sh.length | + | } |
| - | modes.spliced++; | + | // Fifth text: pypdf. Only consulted for a quote that is in none of the |
| - | | + | // stored renderings, so it costs nothing on a clean run. |
| + | const pdf = pdfText(p.key); | ||
| + | if (pdf !== null) { | ||
| + | const pdfC = collapse(pdf); | ||
| + | | ||
| + | | ||
| + | if (pdf.includes(q)) mode = 'exact'; | ||
| + | | ||
| + | else if (pdfL.includes(loose(q))) mode = ' | ||
| + | | ||
| + | const pdfFrac = shingleFrac(q, | ||
| + | | ||
| + | } | ||
| + | if (mode !== null) { | ||
| + | | ||
| continue; | continue; | ||
| } | } | ||
| - | fails.push({ key: p.key, pin, value: v.value, quote: q, frac: hit / sh.length }); | ||
| - | } else { | ||
| - | fails.push({ key: p.key, pin, value: v.value, quote: q, frac: null }); | ||
| } | } | ||
| + | fails.push({ key: p.key, pin, value: v.value, quote: q, frac, pdf: pdf !== null }); | ||
| } | } | ||
| } | } | ||
| Line 2435: | Line 2526: | ||
| console.log(`coded dir: ${CODED}`); | console.log(`coded dir: ${CODED}`); | ||
| console.log(`renderings searched per paper: paper.cols.txt, | console.log(`renderings searched per paper: paper.cols.txt, | ||
| + | console.log(`fallback for a quote found in none of those: a pypdf rendering of paper.pdf (scripts/ | ||
| console.log(`de-splicing mode: ${SHINGLE_N}-word shingles, pass at >= ${(100 * SHINGLE_MIN).toFixed(0)}% found`); | console.log(`de-splicing mode: ${SHINGLE_N}-word shingles, pass at >= ${(100 * SHINGLE_MIN).toFixed(0)}% found`); | ||
| console.log(`\npapers with no coding file (skipped): ${missing}`); | console.log(`\npapers with no coding file (skipped): ${missing}`); | ||
| Line 2444: | Line 2536: | ||
| console.log(` | console.log(` | ||
| console.log(` | console.log(` | ||
| + | console.log(` | ||
| console.log(` | console.log(` | ||
| + | console.log(` | ||
| // A quote-less coding that is not `not-stated` is a coding with no evidence. | // A quote-less coding that is not `not-stated` is a coding with no evidence. | ||
| Line 2462: | Line 2556: | ||
| for (const f of splicedList.sort((a, | for (const f of splicedList.sort((a, | ||
| console.log(` | console.log(` | ||
| + | } | ||
| + | |||
| + | console.log(`\nRESCUED — in none of the stored renderings, located in the pypdf rendering of paper.pdf (${rescuedList.length}).`); | ||
| + | console.log(`These are defects in the stored text, not in the hand coding:`); | ||
| + | for (const f of rescuedList) { | ||
| + | console.log(` | ||
| } | } | ||
| Line 2680: | Line 2780: | ||
| # Structural guard: an in-place generator that silently drops sections is the | # Structural guard: an in-place generator that silently drops sections is the | ||
| - | # failure mode this check exists for. Nothing | + | # failure mode this check exists for. |
| + | # | ||
| + | # A whole-output count is NOT enough. The appended section adds ~11 headings of | ||
| + | # its own, so a total-count check has that much slack: drop one heading from the | ||
| + | # preserved live content and the total still exceeds the original. Mutation | ||
| + | # testing | ||
| + | # gave "27 -> 37" and exit 0. So the counts are compared on the PRESERVED live | ||
| + | # text alone (head + sep + tail), which must match the live page exactly, and the | ||
| + | # appended section is counted separately and required to be non-empty. | ||
| + | preserved = head + sep + tail | ||
| for tag, pat in ((" | for tag, pat in ((" | ||
| - | | + | |
| - | if after < before: | + | if keep != b: |
| - | sys.exit(f" | + | sys.exit(f" |
| - | print(f" | + | print(f" |
| + | if add == 0 and tag != " | ||
| + | sys.exit(f" | ||
| + | # Byte-level check that nothing in the live page was silently rewritten, beyond | ||
| + | # the patches applied above, which are themselves verified to have a target. | ||
| + | if preserved != live: | ||
| + | sys.exit(" | ||
| pathlib.Path(a.out).write_text(out, | pathlib.Path(a.out).write_text(out, | ||
| Line 3173: | Line 3288: | ||
| coded dir: out_pins/ | coded dir: out_pins/ | ||
| renderings searched per paper: paper.cols.txt, | renderings searched per paper: paper.cols.txt, | ||
| + | fallback for a quote found in none of those: a pypdf rendering of paper.pdf (scripts/ | ||
| de-splicing mode: 6-word shingles, pass at >= 80% found | de-splicing mode: 6-word shingles, pass at >= 80% found | ||
| Line 3183: | Line 3299: | ||
| loose match: | loose match: | ||
| spliced match (de-spliced): | spliced match (de-spliced): | ||
| - | NOT FOUND: | + | |
| + | | ||
| + | | ||
| codings with no quote and a value other than not-stated: 0 | codings with no quote and a value other than not-stated: 0 | ||
| Line 3195: | Line 3313: | ||
| we sampled 100 domains from each parking service and setup an additional crawler which crawled them daily for a week. | we sampled 100 domains from each parking service and setup an additional crawler which crawled them daily for a week. | ||
| - | QUOTES NOT LOCATED, printed | + | RESCUED — in none of the stored renderings, located |
| - | | + | These are defects in the stored text, not in the hand coding: |
| + | | ||
| We implemented FourthParty as an extension to Mozilla Firefox. | We implemented FourthParty as an extension to Mozilla Firefox. | ||
| - | 2012/ | + | |
| - | We re-crawled the profile page of each user in the above dataset in February 2011 | + | |
| - | 2015/ | + | |
| To assess any geographical differences, | To assess any geographical differences, | ||
| - | | + | |
| We managed to emulate typical browser behavior in all but one case (BlueSky). | We managed to emulate typical browser behavior in all but one case (BlueSky). | ||
| - | 2016/ | + | |
| - | In order to measure the stability of these amplifiers we probed them periodically for 13 weeks to understand how many were still located at the same IP and misconfiged. | + | |
| - | 2017/ | + | |
| The number of Onion addresses in this experiment was 16,683, and the addresses were crawled twice a day at 12-hour intervals. | The number of Onion addresses in this experiment was 16,683, and the addresses were crawled twice a day at 12-hour intervals. | ||
| - | | + | |
| we can only continuously monitor 1,000 samples. Besides, we re-visit these samples every 3 days | we can only continuously monitor 1,000 samples. Besides, we re-visit these samples every 3 days | ||
| - | | + | |
| to visit the Alexa top 50k web domains | to visit the Alexa top 50k web domains | ||
| - | | + | |
| We have crawled two datasets at different moments, June 2018 and September 2018, which are three months apart. The two app datasets have more than 2/3 overlapped apps. | We have crawled two datasets at different moments, June 2018 and September 2018, which are three months apart. The two app datasets have more than 2/3 overlapped apps. | ||
| - | | + | |
| We installed the widely used OpenWPM framework and configured it to use four vanilla Mozilla Firefox browsers in parallel | We installed the widely used OpenWPM framework and configured it to use four vanilla Mozilla Firefox browsers in parallel | ||
| - | | + | |
| the physical machine on which the VM was deployed is located in the EU, meaning that the visited websites must comply with GDPR | the physical machine on which the VM was deployed is located in the EU, meaning that the visited websites must comply with GDPR | ||
| - | | + | |
| we did not install any extension on the browser that would stop the websites from storing or reading cookies | we did not install any extension on the browser that would stop the websites from storing or reading cookies | ||
| - | | + | |
| There are no overlaps for the above datasets, and the apps are from a wide range of functionalities, | There are no overlaps for the above datasets, and the apps are from a wide range of functionalities, | ||
| - | | + | |
| we conduct the measurements from three different locations (Europe (DE), North America (US), and Asia (JP)) to account for possible geographical differences | we conduct the measurements from three different locations (Europe (DE), North America (US), and Asia (JP)) to account for possible geographical differences | ||
| - | | + | |
| We used the same method to create the browser profile for our experiment crawls that we utilized in the pre-study. | We used the same method to create the browser profile for our experiment crawls that we utilized in the pre-study. | ||
| - | | + | |
| Tranco list of top sites [18] (snapshot 77PX) | Tranco list of top sites [18] (snapshot 77PX) | ||
| - | | + | |
| We crawl using two variants of Puppeteer [4] controlling Chromium 80: a lower-realism naive variant and a higher-realism stealth variant. | We crawl using two variants of Puppeteer [4] controlling Chromium 80: a lower-realism naive variant and a higher-realism stealth variant. | ||
| - | 2021/ | + | |
| - | the browser is launched with a clean user profile (i.e., no cookies or cached content) | + | |
| - | 2021/ | + | |
| we rely on a fully-featured, | we rely on a fully-featured, | ||
| - | | + | |
| ODIN uses university IP addresses (one per profile) and a /24 subnet from a research-friendly, | ODIN uses university IP addresses (one per profile) and a /24 subnet from a research-friendly, | ||
| - | | + | |
| We now evaluate Muzeel across browsers: Chrome, Edge, Firefox, and Brave. | We now evaluate Muzeel across browsers: Chrome, Edge, Firefox, and Brave. | ||
| - | | + | |
| Our initial sample set was the 5000 domains with the most requests to the third party, as indicated by the Referer field in the CDN's third party logs. | Our initial sample set was the 5000 domains with the most requests to the third party, as indicated by the Referer field in the CDN's third party logs. | ||
| - | | + | |
| Results shown are for Firefox (v91) for later comparison, since only Firefox has client-side support for ORIGIN Frame. | Results shown are for Firefox (v91) for later comparison, since only Firefox has client-side support for ORIGIN Frame. | ||
| - | | + | |
| Client caches are intentionally deleted between measurements in all of our active measurements to prevent bias from caching effects | Client caches are intentionally deleted between measurements in all of our active measurements to prevent bias from caching effects | ||
| - | 2022/ | + | |
| - | we crawled Google Play again in all fifteen languages for one day in February 2022 with the queries we obtained and used in our 2020 crawling. | + | |
| - | | + | |
| - | Each persona was associated with a unique browser running on an isolated virtual machine with a unique IP address. | + | |
| - | 2022/ | + | |
| We scraped Hansa 17 times between late 2015 and mid-2017, collecting a total of 332,795 pages amounting to 39.5 GB of data. | We scraped Hansa 17 times between late 2015 and mid-2017, collecting a total of 332,795 pages amounting to 39.5 GB of data. | ||
| - | | + | |
| We perform our analysis on websites which have been crawled in all snapshots (i.e., their intersection) and contain at least one Publisher ID. There are over 191,000 such websites. | We perform our analysis on websites which have been crawled in all snapshots (i.e., their intersection) and contain at least one Publisher ID. There are over 191,000 such websites. | ||
| - | | + | |
| We successfully conducted the four parallel crawls for 99.31% of the 20K websites. | We successfully conducted the four parallel crawls for 99.31% of the 20K websites. | ||
| - | | + | |
| We run all crawls in the US to minimize the impact of the EU GDPR and do not interact with cookie banners. | We run all crawls in the US to minimize the impact of the EU GDPR and do not interact with cookie banners. | ||
| - | 2023/ | + | |
| - | We conduct four parallel crawls: two with third-party cookies enabled (3P-Allowed) and two with third-party cookies blocked (3P-Blocked). | + | |
| - | 2023/ | + | |
| we redid the crawling on the same 10K domains in September 2022 (11-month gap) and applied our system to this data set by following the same procedure. | we redid the crawling on the same 10K domains in September 2022 (11-month gap) and applied our system to this data set by following the same procedure. | ||
| - | | + | |
| clients repeatedly accessed onion services and the top 150 accessed websites according to the Tranco ranking [68], in parallel. | clients repeatedly accessed onion services and the top 150 accessed websites according to the Tranco ranking [68], in parallel. | ||
| - | | + | |
| Clients also run on an isolated Docker container that executes a 0.4.7.10 Tor process and issues requests to Tor via the Python libraries selenium [58] and tbselenium [3] | Clients also run on an isolated Docker container that executes a 0.4.7.10 Tor process and issues requests to Tor via the Python libraries selenium [58] and tbselenium [3] | ||
| - | | + | |
| we used the PeeringDB snapshot from July 24, 2024, and CAIDA' | we used the PeeringDB snapshot from July 24, 2024, and CAIDA' | ||
| - | 2025/ | + | |
| - | We restrict the list to sites that appear in all of the top 100k lists over this period to avoid having our results affected by list churn | + | |
| - | 2025/ | + | |
| Since OpenWPM only supports Firefox and, unlike Chrome, Firefox does not expose the partitioned_key field in its cookie storage, we modified BannerClick to operate in Chrome' | Since OpenWPM only supports Firefox and, unlike Chrome, Firefox does not expose the partitioned_key field in its cookie storage, we modified BannerClick to operate in Chrome' | ||
| - | | + | |
| We use OpenWPM [24] to conduct a combination of stateful and stateless crawls aiming to observe the interplay of the setter and the sender website | We use OpenWPM [24] to conduct a combination of stateful and stateless crawls aiming to observe the interplay of the setter and the sender website | ||
| - | | + | |
| we joined the top one million websites from Tranco [49] with SimilarWeb, a web traffic estimator | we joined the top one million websites from Tranco [49] with SimilarWeb, a web traffic estimator | ||
| - | | + | |
| Each website was opened in a Chrome instance with two installed custom Chrome extensions. | Each website was opened in a Chrome instance with two installed custom Chrome extensions. | ||
| - | | + | |
| All website visits took place on Linux virtual machines in Google Cloud' | All website visits took place on Linux virtual machines in Google Cloud' | ||
| - | | + | |
| between December 2023 and December 2024, 667 new apps were added, 212 apps were removed, and 49 apps were renamed | between December 2023 and December 2024, 667 new apps were added, 212 apps were removed, and 49 apps were renamed | ||
| + | |||
| + | QUOTES NOT LOCATED, printed in full (7): | ||
| + | | ||
| + | We re-crawled the profile page of each user in the above dataset in February 2011 | ||
| + | | ||
| + | In order to measure the stability of these amplifiers we probed them periodically for 13 weeks to understand how many were still located at the same IP and misconfiged. | ||
| + | | ||
| + | the browser is launched with a clean user profile (i.e., no cookies or cached content) | ||
| + | | ||
| + | we crawled Google Play again in all fifteen languages for one day in February 2022 with the queries we obtained and used in our 2020 crawling. | ||
| + | | ||
| + | Each persona was associated with a unique browser running on an isolated virtual machine with a unique IP address. | ||
| + | | ||
| + | We conduct four parallel crawls: two with third-party cookies enabled (3P-Allowed) and two with third-party cookies blocked (3P-Blocked). | ||
| + | | ||
| + | We restrict the list to sites that appear in all of the top 100k lists over this period to avoid having our results affected by list churn | ||
| </ | </ | ||
| Line 3417: | Line 3538: | ||
| [[design: | [[design: | ||
| + | |||
| + | ===== Markup sweep, 2026-09-17 ===== | ||
| + | |||
| + | Mechanical rendering repair only: a fresh live raw/XHTML export of 188 pages was checked with '' | ||
| + | |||
| + | ===== Quote-check refresh, 2026-09-22 ===== | ||
| + | |||
| + | **What was wrong.** '' | ||
| + | stored renderings and the excerpt packet — and had **no '' | ||
| + | 2026-09-04 '' | ||
| + | 73.1% of quotes unlocatable in '' | ||
| + | '' | ||
| + | patched that day to report a **RESCUED** verdict. This checker was never patched, so | ||
| + | §18.5' | ||
| + | site was using. It has now been patched the same way and re-run. | ||
| + | |||
| + | < | ||
| + | $ node scripts/ | ||
| + | exact match: | ||
| + | whitespace-collapsed match: | ||
| + | loose match: | ||
| + | spliced match (de-spliced): | ||
| + | RESCUED from the PDF: 35 6.5% | ||
| + | NOT FOUND: | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ^ Figure ^ Was ^ Is ^ Why ^ | ||
| + | | pin codings | 1,000 | 1,000 | population unchanged — no coding was touched | | ||
| + | | checked (non-empty quote) | 536 | 536 | unchanged | | ||
| + | | exact | 489 | 489 | unchanged | | ||
| + | | whitespace-collapsed | 0 | 0 | unchanged | | ||
| + | | loose | 2 | 2 | unchanged | | ||
| + | | de-spliced (6-word shingles, ≥80%) | 3 | 3 | unchanged | | ||
| + | | rescued from the PDF | — | **35** | new verdict; all 35 were inside the old 42 | | ||
| + | | located by no mode | **42** (7.8%) | **7** (1.3%) | 42 = 35 + 7 exactly; nothing else moved | | ||
| + | |||
| + | **The hand-audited fabrication rate is unchanged at 0.2%, and this run is evidence | ||
| + | for it rather than a replacement of it.** The 42 had already been read by three | ||
| + | sub-agents, who called 42 of the 43 faithful de-splices of real sentences and found | ||
| + | **one** real defect — a quote from the wrong part of {[singanamalla2022_respect]} — | ||
| + | and **zero** fabrications. The fallback now locates **35 of those same 42** in a | ||
| + | second rendering, by a script that has never seen the hand verdicts. It contradicts | ||
| + | none of them. The 7 that remain are all inside the hand-audited set and all carry the | ||
| + | verdict //faithful de-splice// | ||
| + | and 9.1% before it, it is an upper bound produced by an instrument, and the rate is | ||
| + | still the hand-read **0.2% (1 of 536)**. | ||
| + | |||
| + | **The mutation test was re-run and its pin moved.** The guard recorded in §18.11 was | ||
| + | //"an injected fabricated quote raises NOT FOUND from 42 to 43"//, which pinned the | ||
| + | literal 42. Injecting a fabricated sentence into one coding of | ||
| + | '' | ||
| + | script raises NOT FOUND **from 7 to 8**, drops '' | ||
| + | the fabricated sentence in full in the unlocated list. The pin in §18.11 has been | ||
| + | updated to 7 → 8 and the old value recorded beside it, because a guard that still | ||
| + | asserts a superseded number is a guard that will pass for the wrong reason. | ||
| + | |||
| + | **The fallback was verified to be doing work, not failing silently.** '' | ||
| + | swallows a subprocess failure and returns '' | ||
| + | and look like a clean result. The run therefore prints the number of papers for which | ||
| + | no '' | ||
| + | hand against '' | ||
| + | (//"to visit the Alexa top 50k web domains"//, | ||
| + | verbatim in the PDF) and '' | ||
| + | (//" | ||
| + | this script would now be a measured zero. | ||
| + | |||
| + | **Scope of this edit.** §18.5' | ||
| + | §18.11 mutation-test pin, and the two '' | ||
| + | its published output — both regenerated from the committed files rather than edited. | ||
| + | '' | ||
| + | **not** re-run: no coding, no population and no agreement figure is touched by this | ||
| + | change, and the quote check feeds none of them. Nothing on | ||
| + | [[: | ||
| + | No '' | ||
| + | |||
| + | ^ Item ^ Value ^ | ||
| + | | Date | 2026-09-22, unsupervised | | ||
| + | | Command | '' | ||
| + | | Artifacts | '' | ||
| + | | Script change | '' | ||
| + | | Source fragment | '' | ||
| + | | Reviewers | one '' | ||
| + | | Reviewer finding accepted | The pass caught that this section' | ||
| + | | Pages saved | this page only | | ||
provenance/design/longitudinal.1788804638.txt.gz · Last modified: by karel.kubicek.claude
