| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| provenance:design:ownership_resolution [2026/09/11 18:06] – Reviewer log: two of three focused passes returned, one substantive finding each, both re-verified by hand before acceptance and both applied. Records what each reviewer confirmed, three observations noted but not acted on (a moved PSL, a Wayback CDX wind karel.kubicek.claude | provenance:design:ownership_resolution [2026/09/11 22:45] (current) – Section L.9: the third sweep and the two 2026-09-05 judgement-call bullets it found still stating 69.9%/93.9% in the present tense; dated rather than refreshed. Authored by Claude karel.kubicek.claude |
|---|
| |
| No ''~~DISCUSSION~~'' block: comments belong on the content page. Citations use the same ''%%{[citekey]}%%'' keys and the same shared [[Literature:Bibliography]]; this page adds no bibliography entries of its own. | No ''~~DISCUSSION~~'' block: comments belong on the content page. Citations use the same ''%%{[citekey]}%%'' keys and the same shared [[Literature:Bibliography]]; this page adds no bibliography entries of its own. |
| | |
| | <WRAP important> |
| | **Updated 2026-09-11 (second sitting the same day).** The 40 sampled domains the |
| | 2026-09-05 pass could not adjudicate were re-adjudicated against harder sourcing |
| | and **28 of them settled**, which changed the content page's headline table, its |
| | ''error'' bullet, its residue bullet and — the consequential one — **its Fisher |
| | table, where the one comparison that survived Bonferroni no longer does**. |
| | Section **L** below is that pass in full: its queries, its new source kinds, the |
| | citations it broke and fixed, the 12 rows still unresolved with every route |
| | tried, and its own reviewer log. Everything above section L is the 2026-09-05 |
| | sitting as it stood and is **not** rewritten, except the query table in section K, |
| | which names the script and rows file the live figures now come from. |
| | </WRAP> |
| |
| ===== The run ===== | ===== The run ===== |
| | New code | ''scripts/report_ownership_resolution.mjs'' (346 lines), committed with its output. | | | New code | ''scripts/report_ownership_resolution.mjs'' (346 lines), committed with its output. | |
| | Code changed | ''scripts/report_webxray.mjs'' — a denominator defect, section C below. | | | Code changed | ''scripts/report_webxray.mjs'' — a denominator defect, section C below. | |
| | Models | Opus 5 wrote the pages and the script. Review layer: three focused Sonnet passes and one Fable generic pass, section I. | | | Models | Opus 5 wrote the pages and the script. Review layer: three focused Sonnet passes and one Fable generic pass — **all four ran**, section I. The 2026-08-17 and 2026-09-05 ownership adjudications this page inherits were also made by language models, not by a human expert; that disclosure belongs on the content page and section I records that the carve-out dropped it. | |
| | Accidental exposure or mistakes caught | none in this sitting beyond the defect in C, which was found by the new script disagreeing with the old one. | | | Accidental exposure or mistakes caught | no exposure. **Nine defects**, all caught before or during review and all listed in C and I: the denominator in C; a stale ALLOW list and an unreachable guard in ''report_webxray.mjs''; a **dropped LLM-adjudicator disclosure**; an asserted p-value that was never computed; a raw-versus-post-stratified rate description; three arithmetic slips; four stale inbound links; a broken anchor; a pipe in a table cell. The most serious two — the disclosure and the p-value — were found by the generic pass, which is the pass with no checklist. | |
| |
| ==== Scope decision: why a separate page, when the last sitting decided against one ==== | ==== Scope decision: why a separate page, when the last sitting decided against one ==== |
| | webXray, ''Related pages'' | listed [[Privacy:Requests]], [[Privacy:Cookies]], [[Design:IP classification]] — all of which were there for the ownership material | new page took those; webXray's list now leads with the new page and adds [[Privacy:Policies]] for policyXray | | | webXray, ''Related pages'' | listed [[Privacy:Requests]], [[Privacy:Cookies]], [[Design:IP classification]] — all of which were there for the ownership material | new page took those; webXray's list now leads with the new page and adds [[Privacy:Policies]] for policyXray | |
| | webXray methodology | listed nine ''owner_*'' scripts it no longer publishes figures from | one bullet saying where they went and that their provenance ids are unchanged | | | webXray methodology | listed nine ''owner_*'' scripts it no longer publishes figures from | one bullet saying where they went and that their provenance ids are unchanged | |
| | | **the 28-row adjudication paragraph** | the old page said the adjudicators were "**Sonnet sub-agents working to a published brief, single-rated**". The rewrite dropped the clause, leaving "adjudicated one by one against primary sources — company newsrooms, SEC filings" — which reads as human expert work. **This was accepted as a //blocking// finding on 2026-09-05** and the carve-out silently reversed it six days later | restored, and the same disclosure added to the random-sample section, which never carried it | |
| | [[Programming:Crawler]], webXray bullet | "see [[Programming:Crawler:webXray]] for what survives of it: the ownership database, and how it compares to Tracker Radar and Disconnect today" — that comparison had moved | repointed to the new page; see section H | | | [[Programming:Crawler]], webXray bullet | "see [[Programming:Crawler:webXray]] for what survives of it: the ownership database, and how it compares to Tracker Radar and Disconnect today" — that comparison had moved | repointed to the new page; see section H | |
| |
| | ''owner_random_sample.py'' | ''python3 scripts/owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_scored.json --table --wiki'' | **byte-identical** to ''out/owner_random_sample-output.txt'' | | | ''owner_random_sample.py'' | ''python3 scripts/owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_scored.json --table --wiki'' | **byte-identical** to ''out/owner_random_sample-output.txt'' | |
| | ''owner_selfname_census.py'' | ''python3 scripts/owner_selfname_census.py'' | reproduces 0.8% / 0.7% / 3.2% (25 of 3,215; 250 of 38,368; 250 of 7,850) | | | ''owner_selfname_census.py'' | ''python3 scripts/owner_selfname_census.py'' | reproduces 0.8% / 0.7% / 3.2% (25 of 3,215; 250 of 38,368; 250 of 7,850) | |
| | | ''owner_adjudication.py'' | ''python3 scripts/owner_adjudication.py --table'' | reproduces the 28-row table exactly: 1/18/4/1/4, 8/12/6/2/0, 26/0/2/0/0, and the three rows scored as error rather than staleness | |
| | | ''owner_irr_kappa.py'' | invocation reconstructed by the figures reviewer, since it was missing from the brief | reproduces pooled kappa +0.400 (+0.241, +0.551), per-list +0.027 / +0.478 / +0.460, settled-only +0.680 | |
| | ''report_ownership_resolution.mjs'' | ''node scripts/report_ownership_resolution.mjs'' | new; section K | | | ''report_ownership_resolution.mjs'' | ''node scripts/report_ownership_resolution.mjs'' | new; section K | |
| |
| * **Recall of the candidate set is unknown.** The 136 is a union of six patterns over full text. A paper that resolves domain ownership from a source none of the five names — a bespoke WHOIS pipeline, a commercial feed, an internal list — matches nothing at any width. The page reports 136 as an upper bound on **use** and says nothing about recall, because nothing here measures it. | * **Recall of the candidate set is unknown.** The 136 is a union of six patterns over full text. A paper that resolves domain ownership from a source none of the five names — a bespoke WHOIS pipeline, a commercial feed, an internal list — matches nothing at any width. The page reports 136 as an upper bound on **use** and says nothing about recall, because nothing here measures it. |
| * **The share of the 136 that actually //resolved// an owner is not measured.** Only two rows (webXray's 15 and Tracker Radar's 32) carry a hand verdict per paper. Doing the same for Disconnect's 74 is the obvious next increment and was not attempted this sitting. | * **The share of the 136 that actually //resolved// an owner is not measured.** Only two rows (webXray's 15 and Tracker Radar's 32) carry a hand verdict per paper. Doing the same for Disconnect's 74 is the obvious next increment and was not attempted this sitting. |
| * **No accuracy figure exists for the tail.** Every rate is conditional on the entry being adjudicable, and 18–30% of each list's draws were not. Whether unadjudicable domains differ systematically **between** lists is exactly what would decide whether Disconnect's lead survives, and a random sample cannot answer it. | * **~~No accuracy figure exists for the tail.~~ Partly closed on 2026-09-11, and the answer mattered.** This read: //"Every rate is conditional on the entry being adjudicable, and 18–30% of each list's draws were not. Whether unadjudicable domains differ systematically **between** lists is exactly what would decide whether Disconnect's lead survives, and a random sample cannot answer it."// A second pass with harder sourcing settled 28 of the 40, leaving 6.7% / 6.7% / 10.0%. The formal test found no significant difference between recovered and already-eligible rows (//p// = 0.64 / 1.00 / 0.40, on 7, 9 and 12 rows — almost no power), but Disconnect's estimate fell 94.4% → 89.2% and **its lead over webXray stopped surviving Bonferroni**. So the answer is: the tail was somewhat worse for the list the worry named, and the worry was worth acting on. See section L. **What remains open is the residue's own residue** — 12 domains that no register, no registry record and no archived legal page can reach, and nothing bounds those from inside the sample either. |
| * **The coverage census has no neutral denominator.** Tracker Radar's own crawl output is the frame, which flatters Tracker Radar. There is no independent census of third-party domains to use instead, and the page says so at every coverage figure rather than pretending otherwise. | * **The coverage census has no neutral denominator.** Tracker Radar's own crawl output is the frame, which flatters Tracker Radar. There is no independent census of third-party domains to use instead, and the page says so at every coverage figure rather than pretending otherwise. |
| * **Whether a hierarchy built from a current list would beat both.** webXray's ''parent_id'' tree is the only hierarchy any of these files carries and it is frozen; nobody has tried grafting a current corporate-structure source onto Tracker Radar's entities. Filed as an open question. | * **Whether a hierarchy built from a current list would beat both.** webXray's ''parent_id'' tree is the only hierarchy any of these files carries and it is frozen; nobody has tried grafting a current corporate-structure source onto Tracker Radar's entities. Filed as an open question. |
| ===== I. Reviewers ===== | ===== I. Reviewers ===== |
| |
| All four were told explicitly that the author's context may not be exhaustive, and all four were handed the page text, the report script, its unedited output and these notes. The three focused passes ran in parallel; the generic pass ran after their findings were applied. | All four were told explicitly that the author's context may not be exhaustive, and all four were handed the page text, the report script, its unedited output and these notes. The three focused passes ran in parallel; the generic pass ran afterwards, against the pages as the first three had left them. |
| |
| **Two of the three focused passes returned and were applied; the third and the generic pass had not.** Each was handed the page text, ''scripts/report_ownership_resolution.mjs'', its unedited output, ''scripts/report_webxray-output.txt'' and these notes, against the bundle in ''review_own/''. **Every finding below was re-verified by the author before being accepted** — a reviewer's report is a lead, not a result. | **All four passes returned and every finding was applied.** The generic pass — the one with no checklist — found more, and worse, than the three focused passes combined. Each was handed the page text, ''scripts/report_ownership_resolution.mjs'', its unedited output, ''scripts/report_webxray-output.txt'' and these notes, against the bundle in ''review_own/''. **Every finding below was re-verified by the author before being accepted** — a reviewer's report is a lead, not a result. |
| |
| ^ Pass ^ Model ^ Returned ^ Findings ^ Accepted ^ Rejected ^ | ^ Pass ^ Model ^ Returned ^ Findings ^ Accepted ^ Rejected ^ |
| | external currency | Sonnet | **yes** | 1 substantive of ~40 checks | 1 | 0 | | | external currency | Sonnet | **yes** | 1 substantive of ~40 checks | 1 | 0 | |
| | citations and quotes | Sonnet | **yes** | 1 substantive of 22 citekeys, 11 quotes, 13 attributed claims, 7 vendor sources and all 15 rows of the webXray table | 1 | 0 | | | citations and quotes | Sonnet | **yes** | 1 substantive of 22 citekeys, 11 quotes, 13 attributed claims, 7 vendor sources and all 15 rows of the webXray table | 1 | 0 | |
| | figures versus script | Sonnet | **no** | — | — | — | | | figures versus script | Sonnet | **yes** | 2 substantive, **both inside a published script rather than on a page** | 2 | 0 | |
| | generic, no checklist | Fable | **not run** — sequenced after the other three | — | — | — | | | generic, no checklist | Fable | **yes** | **13 substantive**, including the two most serious of the sitting | 13 | 2 partial | |
| |
| === Accepted: the LLM row was an overclaim (external currency) === | === Accepted: the LLM row was an overclaim (external currency) === |
| |
| This is the two-renderings rule in both directions on one page: Libert fails in **every** rendering and is real; Borges fails in the **column-repaired** rendering and is real. A quote-check against a single rendering would have reported one false FAIL and, had the Libert footnote not already existed, one apparent fabrication. | This is the two-renderings rule in both directions on one page: Libert fails in **every** rendering and is real; Borges fails in the **column-repaired** rendering and is real. A quote-check against a single rendering would have reported one false FAIL and, had the Libert footnote not already existed, one apparent fabrication. |
| | |
| | === Accepted: a published script's own ALLOW list carried the fold it warns against (figures versus script) === |
| | |
| | **This is the most valuable finding of the sitting, and section B of this page had just asserted the opposite.** |
| | |
| | ''report_webxray.mjs'' ends with a section Z, //Every number on the page that does NOT come from this corpus//, which exists so ''check_page_numbers.mjs'' can tell a non-corpus figure from a corpus one. Five of its lines were hardcoded constants, and they were the **ICANN+PRIVATE fold with exact-key lookup** — the variant ''owner_dbs.py'''s own output labels ''%%<- THE TRAP%%'' and both content pages warn against by name, because it manufactures a coverage hole out of ''googleapis.com'': |
| | |
| | ^ Section Z said ^ The published fold gives ^ |
| | | 45,525 registrable domains | **32,369** | |
| | | webXray 657 (1.4%), TR 5,539 (12.2%), Disconnect 2,277 (5.0%) | **669 (2.1%), 5,581 (17.2%), 2,268 (7.0%)** | |
| | | weighted 54.5% / 79.3% / 75.8% | **58.6% / 84.3% / 80.5%** | |
| | | top 100: 70% / 95% / 91% | **71% / 98% / 94%** | |
| | | 197 of 601, 216 of 461, 584 of 1,532 | **198 of 612, 217 of 464, 584 of 1,538** | |
| | | "16,396 of 47,836 rows are hostnames" | the label-count heuristic the page says "answers neither question; do not use it" — replaced with the ICANN fold's **15,651** | |
| | |
| | **Verified independently before accepting:** each figure was matched against the live ''owner_dbs.py'' run in section B, and grepped for on both content pages. None appears as prose on a live page, so nothing a reader saw was wrong — **but the ALLOW list of a number guard is exactly where a wrong figure does its damage silently**, by blessing the wrong value if it ever reaches a page. Corrected, and the corrected lines carry a comment naming the trap. |
| | |
| | **What this says about section B of this page.** B calls ''report_webxray.mjs'''s output "byte-identical" to its committed copy, and it was — before and after. Byte-identity proves a script matches its own last run. It proves nothing about whether the content is still true, and here the script had been faithfully reproducing a stale constant. A reproduction record is not a correctness record, and this page should not have implied otherwise. |
| | |
| | === Accepted: a guard that loses its own warning (figures versus script) === |
| | |
| | ''report_webxray.mjs'' buffered every line and flushed once at the bottom. Its section-A guard — |
| | |
| | <code javascript> |
| | if (roleResidue.length || roleExtra.length) { |
| | P('FAILURE: the hand map and the sweep disagree. Re-read the new papers before publishing any figure below.'); |
| | } |
| | </code> |
| | |
| | — called ''P()'' and let the script continue. Section B then dereferences ''ROLE.get(k).role'' on the now-missing key and throws, **before the single ''console.log'' at the bottom has run**. |
| | |
| | **Reproduced by deleting one ROLE entry:** stdout **0 bytes**, a bare ''TypeError'' stack, and the FAILURE line that exists for precisely that case nowhere at all. The guard fires and is then thrown away. Fixed with a ''fail()'' helper that flushes the buffer, repeats the message on stderr and exits 1; re-running the same mutation now prints 1,283 bytes ending in the named paper and the FAILURE line, and exits 1. **On a healthy run the output is byte-identical to before**, so the fix is behaviour-neutral where it should be. |
| |
| === What the reviewers confirmed, which is also a result === | === What the reviewers confirmed, which is also a result === |
| * All **11** quoted strings and **13** attributed non-quote claims verified verbatim or in substance, including the self-contradictory {[steffens2021_blockparty]} sentence this page declines to derive a percentage from, and the {[yang2020_comparative]} 411/251 split this sitting corrected. | * All **11** quoted strings and **13** attributed non-quote claims verified verbatim or in substance, including the self-contradictory {[steffens2021_blockparty]} sentence this page declines to derive a percentage from, and the {[yang2020_comparative]} 411/251 split this sitting corrected. |
| * **All 15 rows** of the webXray publication table verified against source text — the reviewer was asked for five and did fifteen. | * **All 15 rows** of the webXray publication table verified against source text — the reviewer was asked for five and did fifteen. |
| | * Every figure on both content pages independently re-derived from a live re-run of all six scripts, including the inter-rater kappa, whose invocation the reviewer had to reconstruct because it was not in the brief. Both published code snippets (''owner_lookup.py'' and ''resolve()'') **executed against the cached JSON** and their output matched the page character for character. |
| | * Three further mutations of ''report_ownership_resolution.mjs'' by the reviewer, including a re-creation of this sitting's own denominator bug — all caught, none vacuous. |
| * Every repository, licence, URL, version, dependency and acquisition claim on all three pages re-fetched and **holding to the day**, including the 2020-06-24 Disconnect relicensing commits, PolyForm Strict still having no SPDX id, and ''lxml''/''psycopg2-binary'' wheels still stopping at CPython 3.9 against a 2025-10-31 Python 3.9 EOL. | * Every repository, licence, URL, version, dependency and acquisition claim on all three pages re-fetched and **holding to the day**, including the 2020-06-24 Disconnect relicensing commits, PolyForm Strict still having no SPDX id, and ''lxml''/''psycopg2-binary'' wheels still stopping at CPython 3.9 against a 2025-10-31 Python 3.9 EOL. |
| | |
| | === Accepted, and the worst finding of the sitting: the LLM-adjudicator disclosure was dropped (generic) === |
| | |
| | [[provenance:programming:crawler:webxray]]'s 2026-09-05 reviewer log records, verbatim: //"The pages never say the adjudicators were language models … **ACCEPTED, blocking.** The content page now says 'by Sonnet sub-agents working to a published brief, single-rated'."// **The carve-out dropped that sentence**, and the new page said only "adjudicated one by one against primary sources — company newsrooms, SEC filings, or the domain's own legal documents". |
| | |
| | **Verified before accepting:** the clause is in the pre-split page text (''live_programming_crawler_webxray.txt''), and a ''grep'' of the new page for ''Sonnet'', ''sub-agent'' and ''language model'' returned **zero** hits. A reader deciding whether to cite 94.4% was being told, by omission, that a person adjudicated it. |
| | |
| | Restored in two places — beside the 28-row table and, for the first time, beside the **random-sample** table, which never carried it even before the split. No reviewer in three sittings had noticed the second gap. **A finding accepted as blocking can be undone by a later structural edit, and no guard on this wiki looks for that.** |
| | |
| | === Accepted: a p-value asserted without being computed (generic) === |
| | |
| | The page said: //"Disconnect's lead over webXray is a difference this sample can establish; **its lead over Tracker Radar is not**, and neither is Tracker Radar's over webXray."// Two p-values were published (0.014, 0.82). The **Disconnect-versus-Tracker-Radar** pair was never computed — the webXray provenance log shows the original reviewer supplied only the other two, and the sentence generalised from their absence. |
| | |
| | **Verified:** Fisher's exact re-implemented from scratch over the eligible raw counts reproduces the two published values to three decimals (0.0137, 0.820) and gives **p = 0.0248** for the untested pair. The sentence was false by the page's own test, directly under the short answer's headline comparison. |
| | |
| | Rewritten as a three-row table with all three p-values and a **Bonferroni threshold of 0.0167** for three tests on one sample — under which 0.014 survives and 0.025 does not, so the recommendation stands but for a stated reason rather than an invented one. The page now says in its own text that an earlier version asserted this without computing it. |
| | |
| | **This is the failure mode to remember: an absence of evidence in a reviewer's report was read as evidence of absence.** Nothing in the three focused briefs would have caught it — the figures pass checks the page against the script, and this number was in neither. |
| | |
| | === Accepted: the estimator is post-stratified, and the page described it as unweighted (generic) === |
| | |
| | //"domain-level — … Every entry weighs the same."// It does not: ''owner_random_sample.py'' computes ''R = Σ_h (N_h/N)·p_h'' over the 24/12/12/12 quartile allocation. That is why 94.4% ≠ 39/42 = 92.9% and 69.9% ≠ 35/49 = 71.4% — **and why the Fisher paragraph's raw counts did not match the table above it**, which a reader dividing them would have read as an error on the page. Corrected, with the raw counts now stated beside the weighted ones. |
| | |
| | === Accepted: three arithmetic slips the author's own "arithmetic audit" missed (generic) === |
| | |
| | ^ Said ^ Is ^ |
| | | "A third of the sample could not be settled" | 42 of 180 = **23%**; the per-list shares in the same bullet are 18 / 22 / 30% | |
| | | "the intervals are ±13 percentage points at best" | "at best" is Disconnect's **±6.6**; ±13.8 is the worst. Now "±7 to ±14" | |
| | | "Two of the three lists change weekly" | the page's own table says Tracker Radar regenerates **monthly** | |
| | |
| | The author's audit table below claims "all consistent; one error found". **That was wrong, and it is left standing above with this correction beside it** rather than quietly rewritten — an audit that reports a clean result it did not earn is worse than no audit. |
| | |
| | === Accepted: overstatements and structure (generic) === |
| | |
| | ^ Finding ^ Action ^ |
| | | The short answer headlines the two metrics under which the recommendation looks best, while the body argues two //other// metrics matter more (encounter-weighted accuracy, where the frozen list tops the table; weighted coverage, where the live lists near-tie) | short answer now states this in three sentences and says why the recommendation survives it | |
| | | "read the encounter-weighted column as an ordering rather than as a number" — all three intervals overlap and no pairwise test is run | now says it supports **neither**, and why it is nonetheless the quantity that matters | |
| | | webXray's inter-rater kappa is **+0.027 on 12 rows** — chance — and the page stated it without drawing the implication | one sentence added: its 69.9% carries rater uncertainty on top of the sampling interval | |
| | | "rose to about 3.5% around 2020–2022 and has sat between 2.5% and 2.7% since" is a story about noise | verified: 2022 vs 2023 //p// = 0.41, pooled 2020–22 vs 2023–26 //p// = 0.11. Headline "It is not growing" kept, curve dropped | |
| | | The "29 of 525 verdicts changed, direction overwhelmingly favourable" discount sat two screens below the table it discounts | promoted to a ''%%<WRAP important>%%'' directly under the accuracy table | |
| | | "most papers should merge them and say in which order" — the page never said which order | now states it: Disconnect first for the name, Tracker Radar as fallback, record which key matched | |
| | | Wiki-internal QA on the content page (the schema-versus-sweep paragraph, the probe-width paragraph) | trimmed to pointers here; the two quote-splice footnotes were **kept**, because they defend a reader who greps the corpus and finds nothing | |
| | | Three sentences on [[Programming:Crawler:webXray]] describing the pre-split page | all three fixed | |
| | | No reading list for the stated reader | three papers, in order, added to the short answer | |
| | |
| | === Partially rejected (generic) === |
| | |
| | ^ Finding ^ Disposition ^ |
| | | Remove the Libert and Selmo quote-splice footnotes as wiki-internal QA | **Rejected.** A reader who checks either quote against this corpus finds nothing and concludes it was invented. The footnotes exist for them, not for us. The //other// items in that finding were accepted. | |
| | | "98 em-dashes, 26 'not X' contrasts, nearly every section ends on an aphorism — someone who did the work would let a few sections end on the number" | **Accepted as fair, not acted on this sitting.** It is a real observation about the register and it would take a prose pass, not an edit. Recorded so it is not rediscovered. | |
| |
| === Noted, not acted on === | === Noted, not acted on === |
| | The reviewer's Wayback CDX pull put ''timlib/webXray'''s last archived 200 at 2022-12-30 where the page says 2023-03-31 | **Left as published.** The reviewer attributed the gap to CDX collapse-window settings and did not claim the page was wrong. It is a bound either way and both bounds support the same conclusion. Flagged here so a future sitting can settle it rather than rediscover it. | | | The reviewer's Wayback CDX pull put ''timlib/webXray'''s last archived 200 at 2022-12-30 where the page says 2023-03-31 | **Left as published.** The reviewer attributed the gap to CDX collapse-window settings and did not claim the page was wrong. It is a bound either way and both bounds support the same conclusion. Flagged here so a future sitting can settle it rather than rediscover it. | |
| | ''libert2015_invisible'' and ''karaj2018whotracksme'' could not be quote-checked — neither paper is in the corpus | **Correct and expected.** Neither is quoted; both are cited only as identifiers. | | | ''libert2015_invisible'' and ''karaj2018whotracksme'' could not be quote-checked — neither paper is in the corpus | **Correct and expected.** Neither is quoted; both are cited only as identifiers. | |
| | | The figures reviewer could not verify section H's claim that [[Programming:Crawler]] was already corrected, having no access to that page's history | **Fair, and the claim stands.** Revisions ''1786953266'' and ''1788636934'' were read from ''node scripts/dw.mjs history programming:crawler'' and the live page text quoted in section H. | |
| | | It could not verify who produced "rater 2" in the inter-rater work, taking the label from the script's own output | **A real limit of that measurement, and it is not this page's to fix.** Recorded on [[provenance:programming:crawler:webxray:random_sample]] where the draw was made. | |
| | | The Sánchez-Rola 2021-versus-2022 venue-year discrepancy | **Left as published**, with the page's existing italic note that the corpus files it under 2022 while Crossref and the paper's header say 2021. | |
| |
| === Still owed === | === Still owed === |
| |
| <WRAP todo> | <WRAP todo> |
| * The **figures-versus-script** pass did not return. Its brief is the recurring defect class on this wiki and it is the one pass whose absence most matters here — although the author's own checks (below) cover its core: all four inherited scripts re-run, the 28-row table and the full ''domain_owners.json'' schema table re-derived, and four mutations of the new script all caught. | * **A finding accepted as //blocking// was silently reversed by a later structural edit**, and nothing detected it for six days except a reviewer with no checklist. There is no guard on this wiki that re-checks accepted findings against a rewritten page. The cheapest version would be a list of blocking findings per page, with the sentence each one put there, checked as a string. |
| * The **generic (Fable)** pass was never started, so nothing has read these pages looking for what the checklists were not looking for. | * **The prose register was flagged and not fixed**: 98 em-dashes in 8,700 words, and most sections closing on an aphorism rather than on the number. A prose pass, not an edit. |
| * Both should be run before this page is treated as reviewed. | * ''report_webxray.mjs'''s section Z is a **hand-maintained ALLOW list of constants** and that is what let it go stale. It should be derived from ''owner_dbs.py'''s output rather than retyped, or checked against it by a guard that throws. Not done this sitting: it needs the two scripts to share a format, which is a change to both. |
| | * The same buffered-output defect may exist in other ''report_*.mjs'' scripts on this wiki. Only ''report_webxray.mjs'' and ''report_ownership_resolution.mjs'' were checked. |
| </WRAP> | </WRAP> |
| |
| |
| ^ Check ^ Result ^ | ^ Check ^ Result ^ |
| | All four published scripts re-run against pinned inputs | ''report_webxray.mjs'' and ''owner_random_sample.py'' **byte-identical** to their committed output; ''owner_dbs.py'' and ''owner_selfname_census.py'' reproduce every figure quoted (section B) | | | All published scripts re-run against pinned inputs | they **reproduce their committed output** — which, as C and I both show, is not evidence the output is //right//: byte-identity blessed a wrong denominator for three and a half weeks and five wrong constants for longer. A reproduction record is not a correctness record. | |
| | ''owner_adjudication.py --table'' | reproduces the 28-row table exactly: 1/18/4/1/4, 8/12/6/2/0, 26/0/2/0/0, and the three error rows (''1rx.io'', ''jsdelivr.net'', ''stackadapt.com'') | | | ''owner_adjudication.py --table'' | reproduces the 28-row table exactly: 1/18/4/1/4, 8/12/6/2/0, 26/0/2/0/0, and the three error rows (''1rx.io'', ''jsdelivr.net'', ''stackadapt.com'') | |
| | ''domain_owners.json'' schema table on [[Programming:Crawler:webXray]], every cell | reproduces: 319/827 parent_id, depths 508/211/80/24/2/2, 761 uses, 803 platforms, 826 country, 104 trade_groups, 591 policy URLs, 132 GDPR, 4 CCPA, 13 opt-out, 34 crunchbase_id, 52 health-segment, 263 notes, 275 aliases, 69 languages, 2,175 of 3,215 | | | ''domain_owners.json'' schema table on [[Programming:Crawler:webXray]], every cell | reproduces: 319/827 parent_id, depths 508/211/80/24/2/2, 761 uses, 803 platforms, 826 country, 104 trade_groups, 591 policy URLs, 132 GDPR, 4 CCPA, 13 opt-out, 34 crunchbase_id, 52 health-segment, 263 notes, 275 aliases, 69 languages, 2,175 of 3,215 | |
| | Table cells containing a pipe | one found in this page's own draft: a nowiki-wrapped ''%%[[a|b]]%%'' literal in a table cell. A **parsed** link's pipe is safe in a cell (verified in the rendered DOM); a nowiki-wrapped one is not, because the cell splits before the nowiki is honoured. Rewritten as prose, and the A.12 regex table was moved into a code block for the same reason. | | | Table cells containing a pipe | one found in this page's own draft: a nowiki-wrapped ''%%[[a|b]]%%'' literal in a table cell. A **parsed** link's pipe is safe in a cell (verified in the rendered DOM); a nowiki-wrapped one is not, because the cell splits before the nowiki is honoured. Rewritten as prose, and the A.12 regex table was moved into a code block for the same reason. | |
| | Full-text corpus quality | 5,855 of 5,859 renderings present, 0 empty, **90 carrying a NUL byte** — see A1b | | | Full-text corpus quality | 5,855 of 5,859 renderings present, 0 empty, **90 carrying a NUL byte** — see A1b | |
| | |
| | ===== L. The second pass over the residue, 2026-09-11 ===== |
| | |
| | The 2026-09-05 sample drew 180 times over 175 distinct domains and could |
| | not adjudicate **40 of them** (22.9%), 42 draws. Every accuracy rate it |
| | produced was therefore conditional on the entry being adjudicable, the |
| | exclusion rate rose toward the prevalence tail, and it was worst — 30% — for |
| | Disconnect, the list [[Design:Ownership resolution|the content page]] |
| | recommends. Nothing inside that sample could test whether the excluded rows |
| | were systematically worse. This pass re-adjudicated **exactly those 40 rows**, |
| | changing nothing else, against three routes the first pass did not take. |
| | |
| | ==== L.1 What was done, and in what order ==== |
| | |
| | ^ Step ^ Command ^ What it produced ^ |
| | | Build the worksheet | ''python3 -'' over ''out/owner_sample.json'' + ''out/adj_rows_scored.json'' | ''out/tail40.json'' — the 40 domains with each list's claim, the residue membership per list, and the 2026-09-05 note saying why that pass gave up | |
| | | Mechanical evidence | ''bash scripts/owner_tail_probe.sh out/tail40.json out/tail_probe'' | ''out/tail_probe.txt'' (2,471 lines, 2m 29s, 6-way parallel) | |
| | | Adjudication | 5 Sonnet sub-agents × 8 domains, round-robin over the prevalence order so every batch spans the range | ''out/tail_adj/result1..5.json'' | |
| | | Gate | ''python3 scripts/owner_tail_merge.py --sample out/owner_sample.json --base out/adj_rows_scored.json --tail out/tail40.json --dir out/tail_adj --out out/adj_rows_tail.json'' | ''out/adj_rows_tail.json'', **0 problems** | |
| | | Citation check | ''python3 scripts/owner_verify_sources.py --rows out/tail_rows_only.json --cache out/tail_verify_cache --out out/tail_verify.json'' | 3 defects in the checker itself — see L.5 | |
| | | Hand corrections | ''python3 scripts/owner_tail_corrections.py --rows out/adj_rows_tail.json --out out/adj_rows_tail_final.json'' | 6 rows: resource ×3, keep ×2, rescore ×1 | |
| | | Re-estimate | ''python3 scripts/owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_tail_final.json --table --wiki'' | ''out/owner_random_sample-tail-output.txt'' | |
| | | What changed | ''python3 scripts/report_tail_pass.py …'' | ''out/report_tail_pass-output.txt'' | |
| | |
| | **The 2026-09-05 output file is kept, not overwritten.** ''out/owner_random_sample-output.txt'' is the //before//; ''out/owner_random_sample-tail-output.txt'' is what the page's figures are now checked against, and ''out/owner_random_sample-tail.diff'' is the 338-line diff between them. |
| | |
| | <WRAP tip> |
| | **Reproducing the //before// is a trap worth recording.** ''out/adj_rows.json'' and ''out/adj_rows_final.json'' both still carry ''self-named'' verdicts, and ''owner_random_sample.py'' exits fatally on them. The committed 2026-09-05 output is reproduced byte-identically **only** by ''--rows out/adj_rows_scored.json --wiki'' — the ''--wiki'' matters, because sections F and G exist only under it. |
| | </WRAP> |
| | |
| | ==== L.2 The three routes, and which one paid ==== |
| | |
| | ^ Route ^ What it is ^ Rows it settled ^ |
| | | ''register-by-number'' | a national company register searched by **company/VAT/register number** rather than by name — the first pass failed on strings like "Admiral", "Collective" and "Globo", which are unsearchable | 4 | |
| | | ''rdap-history'' | the **registrar's own port-43 WHOIS**, not RDAP. ''rdap.org'' returns a thin registry record with no registrant for ''.com''/''.net''; the registrar's server returns it un-redacted **when the registrant has not bought privacy protection**, which is a per-registration fact and not a per-registrar one -- ''whois.tucows.com'' returns a real organisation for some domains and ''Contact Privacy Inc. Customer 0168237798'' for ''cdnbasket.net''. Also the registration and last-changed **events**, which bound a claim even when the organisation is redacted | 9 | |
| | | ''archived-legal'' | a Wayback capture of the domain's **own legal page**, fetched with the ''id_'' suffix so the Archive's banner is not in the bytes | 2 | |
| | | ''live-source'' | a live document the first pass did not reach — usually because it looked for a page naming the //domain// and this pass looked for the //entity//, or because the page is on a subdomain | 13 | |
| | |
| | **These counts are after the hand corrections.** They differ from the |
| | ''owner_tail_merge.py'' output published in the appendix, which ran before them: |
| | that run reports live-source 12 and rdap-history 10, because the ''i.ua'' |
| | correction moved one row from ''rdap-history'' to ''live-source''. Nothing else |
| | moved. The largest single route is ''live-source'' -- a live document the first |
| | pass did not reach, usually because it looked for a page naming the //domain// |
| | where this pass looked for the //entity//. |
| | |
| | The registrar hop is nonetheless the cheapest thing to add to any future pass: |
| | it is one extra socket per domain, and it settled rows RDAP alone could not. |
| | It produced |
| | ''Applied Technologies Internet SAS'' for ''at-o.net'', ''Conversant, Inc.'' for the |
| | three ValueClick-style sync domains, ''Acoustic, L.P.'' for ''pages02.net'', |
| | ''Leven Labs, Inc.'' for both Admiral domains and ''Google LLC'' for |
| | ''blogblog.com'' — none of which RDAP shows. This container has no ''whois(1)'' |
| | and no ''apt'', so ''scripts/whois43.py'' speaks the protocol directly: IANA |
| | referral, TLD server, then the registrar's server when the registry is thin. |
| | |
| | ==== L.3 The sourcing bar was widened, and by how much ==== |
| | |
| | Three source kinds are new in this pass and every row records which it used: |
| | |
| | ^ Source kind ^ New? ^ Rows ^ What it is worth ^ |
| | | ''domain-register'' | **yes** | 9 | the registry's record of who holds the name, contractually required to be accurate but **asserted by the registrant and validated by nobody**. Weaker than a company register | |
| | | ''legal-doc'' | no | 8 | the domain's own live privacy policy, terms, imprint or legal-entity footer — the 2026-09-05 bar | |
| | | ''parent-site'' | no | 4 | the acquirer's or parent's own site naming the brand or domain as theirs — the 2026-09-05 bar | |
| | | ''register'' | no | 3 | a national company register record, or an **OV/EV** certificate's validated ''O ='' field — the 2026-09-05 bar | |
| | | ''archived-legal-doc'' | **yes** | 2 | the domain's own legal document read at a date it existed. Establishes the operator **at the capture date**, so it needs registry continuity or a live source about the entity to become a claim about today | |
| | | ''filing'' | no | 1 | an SEC or other regulator's filing — the 2026-09-05 bar | |
| | | ''newsroom'' | no | 1 | the company's own press release — the 2026-09-05 bar | |
| | |
| | So **17 of the 28 recovered rows clear the original bar** and 11 rest on a |
| | kind the first pass did not use. ''tls-san'' — another organisation's |
| | certificate on this host — was defined in the brief as corroboration only and |
| | is the source of record for 0 rows. |
| | |
| | <WRAP important> |
| | **This pass produced its own counter-example to its weakest source kind, and |
| | it is kept rather than smoothed away.** ''i.ua'''s registry record |
| | (''whois://whois.ua/i.ua'') names **Digital Ventures LLC**. The portal's own |
| | user agreement (''help.i.ua/agreement/'') names a **different** company as its |
| | administration: ТОВ «КЕПРЕЙТ ПАРТНЕРС», Ukrainian register code 33500955. |
| | **On that domain the registrant of record is not the operator.** The row was |
| | re-sourced to the legal document, and the finding is why |
| | ''report_tail_pass.py'' carries section E3: a sensitivity run that drops every |
| | recovered row resting on an //uncorroborated// registrant organisation. Two |
| | remain, and dropping both moves webXray +0.0, Tracker Radar −0.6 and |
| | Disconnect +0.0 percentage points. |
| | </WRAP> |
| | |
| | ==== L.4 Every recovered row, with its route and its source ==== |
| | |
| | ^ Domain ^ In the residue of ^ Owner settled on ^ Route ^ Source kind ^ Citation re-fetched? ^ |
| | | ''spot.im'' | Tracker Radar | Open Web Technologies Ltd. (OpenWeb) | live-source | ''parent-site'' | OK | |
| | | ''company-target.com'' | webXray | Demandbase, Inc. | live-source | ''parent-site'' | OK | |
| | | ''adgrx.com'' | webXray | AdGear Technologies, Inc. ("AdGear", trading as Samsung Ads; wholly-ow | live-source | ''legal-doc'' | **FETCHFAIL** | |
| | | ''app-us1.com'' | Tracker Radar | ActiveCampaign, LLC (ActiveCampaign) | live-source | ''domain-register'' | OK | |
| | | ''govx.com'' | Disconnect | GovX, Inc. | register-by-number | ''filing'' | OK | |
| | | ''opti-digital.com'' | Disconnect | Opti Digital SAS (2 Rue des Cortalets, 66400 Céret, France) | live-source | ''legal-doc'' | OK | |
| | | ''ksearchnet.com'' | Disconnect | Klevu Oy (operating subsidiary of Athos Commerce) | live-source | ''register'' | OK | |
| | | ''kameleoon.io'' | Disconnect | Kameleoon SAS (Kameleoon) | register-by-number | ''legal-doc'' | OK | |
| | | ''gssprt.jp'' | Disconnect | Geniee, Inc. | rdap-history | ''domain-register'' | OK | |
| | | ''acint.net'' | Tracker Radar | Poshibalov Evgeny Vasilyevich, operating the self-titled project 'Acin | rdap-history | ''domain-register'' | OK | |
| | | ''yceml.net'' | webXray | Conversant, Inc. (operating brand Epsilon; ultimate parent Publicis Gr | rdap-history | ''domain-register'' | OK | |
| | | ''travelpayouts.com'' | Tracker Radar | Go Travel Un Limited (Hong Kong; trading as Travelpayouts) | archived-legal | ''archived-legal-doc'' | OK | |
| | | ''blogblog.com'' | webXray | Google LLC (Blogger) | rdap-history | ''domain-register'' | OK | |
| | | ''at-o.net'' | Disconnect | Applied Technologies Internet SAS (AT Internet), controlled by Piano S | register-by-number | ''register'' | OK | |
| | | ''cnevids.com'' | Tracker Radar | Condé Nast Entertainment (Advance Publications) | live-source | ''legal-doc'' | OK | |
| | | ''pages02.net'' | Disconnect | Acoustic, L.P. | rdap-history | ''domain-register'' | OK | |
| | | ''trustpilot.net'' | Tracker Radar | Trustpilot A/S (Pilestraede 58, 5th floor, DK-1112 Copenhagen K, Denma | live-source | ''legal-doc'' | OK | |
| | | ''awltovhc.com'' | webXray | Epsilon (d/b/a 'Epsilon PeopleCloud Digital Media Solutions', formerly | rdap-history | ''newsroom'' | OK | |
| | | ''lduhtrp.net'' | webXray | Conversant, Inc. (Epsilon / Publicis Groupe) | rdap-history | ''domain-register'' | OK | |
| | | ''wishabi.com'' | webXray | Flipp Corp. | live-source | ''legal-doc'' | OK | |
| | | ''sa-as.com'' | Disconnect | FoundryCo, Inc. | rdap-history | ''domain-register'' | OK | |
| | | ''cratecamera.com'' | Tracker Radar | Leven Labs, Inc. (DBA Admiral) | rdap-history | ''domain-register'' | OK | |
| | | ''globo.com'' | Disconnect | Globo Comunicação e Participações S.A. (CNPJ 27.865.757/0001-02) | live-source | ''legal-doc'' | OK | |
| | | ''offshoregeology.com'' | Disconnect | Admiral (Leven Labs, Inc.) | live-source | ''parent-site'' | OK | |
| | | ''km0trk.com'' | Disconnect | Good On You Pty Ltd (Good On You) | live-source | ''parent-site'' | OK | |
| | | ''cjponyparts.com'' | Tracker Radar | CJ Pony Parts, Inc. | archived-legal | ''archived-legal-doc'' | OK | |
| | | ''cedscdn.it'' | Tracker Radar | CED Digital & Servizi S.r.l. (Caltagirone Editore group) | register-by-number | ''register'' | OK | |
| | | ''i.ua'' | Disconnect | ТОВ «КЕПРЕЙТ ПАРТНЕРС» (LLC Keprait Partners), Ukrainian register code | live-source | ''legal-doc'' | OK | |
| | |
| | The one non-OK row is ''adgrx.com'': ''samsungads.ca'' serves an **expired |
| | certificate**, so ''curl'' refuses it and the checker never sees a body. Fetched |
| | by hand with ''--insecure'': HTTP 200, 46,160 bytes, and the quoted row is |
| | byte-verbatim in it. The checker was deliberately **not** given an |
| | ''--insecure'' retry — an ownership citation whose host identity cannot be |
| | validated should surface, not be swallowed. |
| | |
| | ==== L.5 Three defects the citation check had, found by these rows ==== |
| | |
| | ''owner_verify_sources.py'' was written for the 2026-09-05 rows and this pass |
| | cited kinds of evidence it had never seen. Each defect would have reported a |
| | **correct citation as a fabrication**, and each fix carries a control: |
| | |
| | ^ Defect ^ Found on ^ Fix ^ Control ^ |
| | | No ''whois://'' scheme, so every registry citation FETCHFAILed | 9 rows | a port-43 branch calling ''whois43.ask'' against the **named server**, not re-resolved through IANA, so the row is checked against the record it cites | the 9 rows now verify OK | |
| | | ''body.decode("utf8", "replace")'' turns every byte of a windows-1251 page into U+FFFD, so a Cyrillic quote can never match | ''help.i.ua/agreement/'' | a ''decode()'' that sniffs the charset the document declares, from the bytes rather than the header, because the cache holds the body alone | the quote is found; **the same quote with one letter changed is not**. The normaliser had already been fixed once for this class of bug, one layer later | |
| | | A rate-limit stub cached as evidence, giving a permanent false NOTFOUND | ''sa-as.com'', ''blogblog.com'' | refuse to return or cache a WHOIS answer under 400 bytes or one that does not name the queried domain; one retry 20 s later | both verify OK on the retry, and the guard was seen to fire before the retry was added | |
| | |
| | Final tally over the 40 tail rows: **FETCHFAIL=1**, **NOSOURCE=12**, **OK=27**. The 12 NOSOURCE are the rows still unresolved, which have no citation by definition. |
| | |
| | ==== L.6 Hand corrections ==== |
| | |
| | Six rows a machine flagged and a human then re-checked. ''keep'' means the |
| | citation holds and the checker or the transport was at fault; ''resource'' |
| | means the claim holds and the row cited the wrong document for it; |
| | ''rescore'' means the verdict was wrong on the brief's own rules. |
| | |
| | ^ Domain ^ Action ^ Why ^ |
| | | ''app-us1.com'' | ''resource'' | The cited page is a 404 whose only evidence is a <link> tag, which the quote checker normalises to the empty string and reports as NOQUOTE -- so the row's only citation was one the checker cannot see, on a page that does not exist. Re-issued the registrar WHOIS query live (whois.markmonitor.com, port 43): the registrant organisation is un-redacted and names ActiveCampaign, LLC. The verdict does not change; the evidence under it does, from a 404 page to the registry record. Rate effect: none. | |
| | | ''blogblog.com'' | ''resource'' | The row's source URL was prose -- 'whois://blogblog.com (registrar WHOIS, whois.markmonitor.com)' -- which no client can dereference, so it FETCHFAILed. Rewritten in the whois://<server>/<domain> form the checker parses and re-queried live: 'Registrant Organization: Google LLC'. Same record, same quote, a URL that resolves. Rate effect: none. | |
| | | ''ksearchnet.com'' | ''resource'' | The row cites an OV certificate's validated O= field -- which the brief accepts as register-grade -- but gave the https:// URL of the host, which now returns HTTP 404, so the checker fetched a 404 body and looked for a certificate subject in it. Repointed to the tls:// form the checker handles. Handshake redone 2026-09-11: subject=C=FI, ST=Uusimaa, O=Klevu Oy, CN=*.ksearchnet.com, issuer Sectigo Public Server Authentication CA OV R36. Rate effect: none. | |
| | | ''i.ua'' | ''rescore'' | Two things were wrong. (1) The row rested on the WHOIS registrant, 'Digital Ventures LLC'. The portal's own user agreement names a different company as its administration -- ТОВ «КЕПРЕЙТ ПАРТНЕРС», register code 33500955 -- so on this domain the registrant of record is NOT the operator. That is the single most important finding about the domain-register source kind this pass added, and it is kept in the residue notes rather than smoothed away. (2) The adjudicator scored Disconnect's entry 'I.UA' as error because the registrant's name differs from it. But the brief scores a trading brand for the same business as current, and the operator's own agreement calls the property 'порталу I.UA' -- the portal I.UA. error means 'never the owner at any time', which this is not. Rescored current. Rate effect: moves Disconnect UP, which is the self-serving direction, so the alternative reading is published beside it and the sensitivity run reports what happens without it. | |
| | | ''adgrx.com'' | ''keep'' | FETCHFAIL 'HTTP 000' is the TLS layer, not the citation: samsungads.ca serves an expired certificate, so curl refuses it and the checker never sees a body. Re-fetched by hand with --insecure on 2026-09-11: HTTP 200, 46,160 bytes, and the quoted row 'adgrx.com</span></td><td><span style="font-weight: 400;">ADGRX_UID</span>' is byte-verbatim in it. The checker is deliberately NOT given an --insecure retry: an ownership citation whose host identity cannot be validated should surface, not be swallowed. Same call the 2026-09-11 inter-rater pass made on its own expired-cert row. | |
| | | ''sa-as.com'' | ''keep'' | NOTFOUND was a cached rate-limit stub, not a bad citation. whois.markmonitor.com answers the fourth rapid query with a record that has no registrant block, and the checker cached it. Re-queried 25 seconds later: 3,357 bytes, 'Registrant Organization: FoundryCo, Inc.' present. owner_verify_sources.py now refuses to cache a whois answer under 400 bytes or one that does not name the queried domain, and blogblog.com hit the same stub. The row still rests on an UNCORROBORATED registrant organisation and is counted as such. | |
| | |
| | **Only one verdict changed**, ''i.ua'', and it moves Disconnect **up**, which is |
| | the self-serving direction. The alternative reading is that "I.UA" names no |
| | company at all and the row is an ''error''; under it Disconnect's domain-level |
| | ''current'' would be lower still than the 89.2% now published, so the published |
| | figure is the **more** favourable of the two readings and not the less. |
| | |
| | ==== L.7 What is still unresolved, and every route tried ==== |
| | |
| | **12 distinct domains of the 175**, down from 40. These are not rows where |
| | the register was not tried. Each note below is the adjudicator's own account |
| | of what each of the three routes returned, **in full and not truncated** -- an |
| | earlier draft cut this column at 420 characters mid-word, which made "every |
| | route tried" a claim a reader could not check. |
| | |
| | **Two of the twelve are adjudicator limits rather than evidence limits**, and |
| | saying so matters because they are the two a person could still close. |
| | ''hqseek.com'' has a live site: it redirects to an adult domain and the |
| | adjudicator declined to fetch further, so the row is unresolved because a |
| | model stopped, not because the evidence is gone -- and its note records that |
| | Tracker Radar's claimed owner matches no name the domain ever surfaced, which |
| | would be an ''error'' rather than an ''unknown'' if anyone read the pages. |
| | ''stripst.com'' is unresolved because Stripchat's legal pages return HTTP 406 |
| | to a non-browser client, which is a transport failure, not an absence of |
| | documents. The other ten are genuinely evidence-exhausted. |
| | |
| | ^ Domain ^ In the residue of ^ What each list claims ^ Why it is still unresolved ^ |
| | | ''1rx.io'' | webXray | wx: Blinkx / TR: RhythmOne / DC: Nexxen | register-by-number: no company/VAT number available anywhere for 'Blinkx'/'RhythmOne'/'Nexxen' tied to this specific domain, so nothing to look up. rdap-history: RDAP has no data for the .io TLD via rdap.org; registry WHOIS (whois.nic.io) refers to GoDaddy, and the registrant is fully REDACTED (Domains By Proxy, LLC) with no organisation name, created 2015-05-28. archived-legal: root domain 1rx.io has zero Wayback captures ever (checked cdx with and without wildcards); only the ad-serving subdomain a-ams.1rx.io was archived, and only as RTB delivery JS calls, never a privacy/legal page. Also checked SEC EDGAR full-text search for the literal string '1rx.io' (Nexxen/Tremor International is Nasdaq-listed) -- 0 hits. No primary source anywhere names this domain, so it stays unresolved, same as the first pass. | |
| | | ''agkn.com'' | webXray, Disconnect | wx: Neustar Marketing / TR: TransUnion LLC / DC: TransUnion | Register-by-number: SEC EDGAR full-text search for the exact phrase "agkn.com" across all filings returned 0 hits; "AdAdvisor" appears only in two old NEUSTAR INC (CIK 1265888) filings from before the 2021 TransUnion acquisition, nothing from TransUnion itself. RDAP/WHOIS history: registrant is fully privacy-proxied (Brandsight Privacy Customer, PO Box, Boise ID) with no organization field populated, at either GoDaddy or the registrar's own WHOIS; only the 2005 creation date is usable and it merely predates the whole ownership chain rather than confirming any link in it. Archived legal pages: Wayback shows a 2016 privacy.html and cookie-sync URLs branded "Neustar AdAdvisor" through 2021, but nothing after, and I could not fetch a current TransUnion page (transunion.com/privacy/media-digital-marketing-solutions, transunion.com/privacy/neustar) to bridge that gap -- both returned HTTP 403 (Cloudflare/Akamai bot wall) to curl and to WebFetch alike, so no live source could be confirmed. Leaving unresolved rather than guessing from the secondary-reporting chain. | |
| | | ''marphezis.com'' | Tracker Radar | TR: Online Media Solutions Ltd. dba Brightcom | register-by-number: no identifier available for 'Online Media Solutions Ltd. dba Brightcom' tied to this domain specifically. rdap-history: RDAP/registry WHOIS registrant is fully REDACTED (GoDaddy/Domains By Proxy pattern), registered 2015-07-14, last changed 2026-07-15 (routine renewal, not evidence of transfer). archived-legal: fetched the only 200-status legal-adjacent capture found -- it is a GoDaddy domain-parking iframe (mcc.godaddy.com/park/...) from 2016, i.e. the domain was parked/lapsed, not operated by anyone; no privacy/terms page was ever archived. Also checked brightcom.com's own privacy/legal pages (403/404, no mention possible) and SEC EDGAR full-text search for 'marphezis' (0 hits, though Brightcom is TASE-listed, not SEC, so this is weak). Nothing ties the domain to Brightcom or any other real operator; stays unresolved. | |
| | | ''cdnbasket.net'' | Tracker Radar, Disconnect | TR: Bounce Exchange / DC: cdnbasket.net | All three routes came back empty. Register-by-number: no identifying company/VAT number found anywhere for this domain or for Bounce Exchange/Wunderkind. RDAP/WHOIS history: registrant is privacy-proxied today (Contact Privacy Inc., Tucows), last changed 2026-08-15, with no un-redacted historical record available. Archived legal pages: the Wayback CDX index has zero captures of cdnbasket.net at any URL, ever. bounceexchange.com does 302 to wunderkind.co, and Wunderkind's own privacy policy (fetched, quoted above) confirms 'Wunderkind Corporation' as a real live entity, but nothing there or in its cookie policy names cdnbasket.net, so the tie to Bounce Exchange/Wunderkind stays an unconfirmed lead, not a resolution. | |
| | | ''mapixl.com'' | Disconnect | DC: MarketingArchitects | All three routes tried and none produced an identifier for the actual operator, let alone one naming 'MarketingArchitects'. register-by-number: no imprint/legal page exists anywhere to pull a company number from. rdap-history: re-queried whois.godaddy.com by socket myself this session -- registrant is 'Domains By Proxy, LLC', an explicit privacy proxy, which the brief excludes as a domain-register source; DNS is Cloudflare-fronted (104.21.x/172.67.x, no MX, TXT is an opaque verification hash) with no organizational signal. archived-legal: Wayback CDX for mapixl.com shows only redirect/revisit captures back to 2019; the one distinct body I could fetch (20230420115444id_) turned out to be a Microsoft Azure AD sign-in page, unrelated to any ad-tech company and not a legal page. Live fetch returns a Cloudflare JS-challenge page (HTTP 403, title 'Attention Required! %%|%% Cloudflare'). No route ties this domain to MarketingArchitects or to any other named entity; left unresolved as instructed. | |
| | | ''htplayground.com'' | Disconnect | DC: htplayground.com | register-by-number: Disconnect's own entry is just the domain string, so there is no candidate company name to get an identifier for. rdap-history: rdap.org has no RDAP service for this registrar; registry WHOIS is thin, and the registrar-side WHOIS (whois.registrar.amazon) shows a proxy registrant ('c/o whoisproxy.com', 604 Cameron Street, Alexandria VA -- a known privacy-proxy mail-drop address), no real organisation. archived-legal: the domain has real Wayback history, but it is a personal phpBB forum from 2007-2008 ('H.T Playground', self-described as a hangout for Vietnamese Catholic youth-group members, TNTT/Huynh Truong) -- not a company, and a CDX search across the whole path space found zero privacy/legal/terms/about captures at any point in the domain's history. Domain is currently fully dead (no TLS handshake, no HTTP response). No route produced a real company; unresolved, same as the first pass. | |
| | | ''contentabc.com'' | Tracker Radar | TR: Aylo / DC: ContentABC | Register-by-number: no imprint, VAT, or company number for either candidate ('Aylo'/Ethical Capital Partners or a literal 'ContentABC') is attached to this domain anywhere I could find, so there is no number to look up. RDAP/WHOIS history: registrant is fully proxied via 'Whois Privacy (enumDNS dba)' in Luxembourg through EuroDNS S.A.; no organization ever disclosed; creation date 2009 does not narrow the candidates. Archived legal pages: the mechanical probe's Wayback CDX shows zero captures for legal pages, root, or the URL inventory. contentabc.com itself does not resolve from this sandbox (HTTP 000), and a web search for "contentabc.com" together with Aylo/MindGeek returned no corroborating primary source. Disconnect's 'ContentABC' is just the domain label capitalised with no independent evidence behind it. | |
| | | ''stat-track.com'' | Disconnect | DC: StackTrack | All three routes were tried. Register-by-number: Disconnect's 'StackTrack' is not a findable real company, and a GitHub-issue claim of Moosend ownership could not be verified -- Moosend's own privacy, cookie and terms pages (all fetched) never mention stat-track.com. RDAP/WHOIS history: rdap.verisign.com (queried live, quoted above) returns only a registrar (MarkMonitor) entity with no registrant object at all -- full redaction, domain re-registered 2016-02-02. Archived legal pages: Wayback's CDX index only has captures from 2002-2011 of a self-hosted Prosper202 affiliate-tracking install, which entirely predates the 2016 re-registration and cannot speak to who holds the name now; nothing has been captured since. | |
| | | ''mmstat.com'' | webXray | wx: Alimama / TR: Alibaba Group / DC: AlibabaGroup | Register-by-number: tried China's official ICP/beian registry at beian.miit.gov.cn directly -- it returned HTTP 521 behind a JS/cookie challenge I could not solve with curl. A third-party ICP lookup aggregator (icplishi.com; not an accepted source, same category as a WHOIS aggregator) suggests the beian filer is an 'Alibaba (China) ... Co., Ltd.' entity, but this is an unverified lead, not admissible evidence, so it is not used as a verdict basis. RDAP/WHOIS history: 'Alibaba Cloud Computing (Beijing) Co., Ltd.' in the WHOIS record is the REGISTRAR (whois.verisign-grs.com and grs-whois.hichina.com both confirm this), not a Registrant Organization -- no registrant org line is present at all, only province 'zhe jiang' and country CN. Archived legal pages: Wayback shows only sparse root captures from 2004-2016 (mostly 404 after 2016) and zero legal-page captures. Also tried mmstat.com live (HTTP 000, no connection) and Alibaba Group's/Alibaba.com's own live privacy pages (rule.alibaba.com/rule/detail/2034.htm, alibabagroup.com/en-US/privacy-policy) via curl -- neither mentions mmstat.com. | |
| | | ''collective-media.net'' | webXray | wx: Collective / TR: Collective, Inc. / DC: Collective | Tried all three routes. Register-by-number: SEC EDGAR full-text search for '"Collective, Inc." advertising' returns 424 hits but none for the ad-network Collective, Inc. (it was VC-backed/private, never an SEC filer) -- no identifier to look up. RDAP/WHOIS history: re-queried whois.godaddy.com this session; Registrant Organization is 'Domains By Proxy, LLC', a proxy, not acceptable per the domain-register rule. Archived legal pages: the CDX inventory has no privacy/terms/about capture; the one 'root page' capture that returns 200 is contaminated with Internet Archive's own Petabox/search-portal HTML rather than the actual site (an IA artifact), so it establishes nothing. webXray/TR/Disconnect's 'Collective' claim (matching the once-real ad network Collective, Inc.) could not be confirmed or refuted for who holds the domain today; stays unresolved. | |
| | | ''hqseek.com'' | Tracker Radar | TR: Michal Vodrazka | All three routes tried. register-by-number: no imprint or identifiable number anywhere; the domain redirects to an adult site (hqporn.pics) which per content policy I did not fetch further. rdap-history: RDAP has no JSON endpoint for this domain; the two-hop WHOIS in the probe shows only registrar DNC Holdings/DirectNIC and registrant 'Jewella Privacy LLC' (a privacy service), no unredacted organization. archived-legal: fetched the earliest available capture with content (2004-04-04, an adult-directory page even then) and its meta tags read 'copyright: Miguel Bain' / 'author: Miguel Bain' -- a real named individual, but a DIFFERENT name from Tracker Radar's claimed 'Michal Vodrazka', and there is a 20+ year gap with a privacy-proxied registrant in between, so this cannot be bridged to a verdict about today. Flagging the tension: TR's specific personal-name claim does not match the only name this domain's own pages have ever surfaced. | |
| | | ''stripst.com'' | Disconnect | DC: Stripchat | Register-by-number: no imprint or company number is available anywhere for stripst.com, and nothing on the domain or Stripchat's reachable pages names an operating legal entity, so there is no number to look up. RDAP/WHOIS history: registrant is fully proxied ('Withheld For Privacy LLC', Delaware) via NameCheap; the mechanical probe's RDAP lookup also failed; TLS is a domain-validated Google Trust Services cert with no O= field, so no organization there either. Archived legal pages: the mechanical probe confirms zero Wayback captures of stripst.com itself (root, legal, and inventory all empty). I additionally tried Stripchat's own live /privacy, /terms and /legal pages hoping to find a parent-site mention of stripst.com, but all three returned HTTP 406 (bot-blocked) to curl; stripst.com itself, cdn.stripst.com, and www.stripst.com all return HTTP 000 (no connection) from this sandbox. Disconnect's 'Stripchat' claim is plausible (third-party scan data and CT-log subdomain names like cdn.stripst.com are consistent with Stripchat infrastructure) but remains unverified against a primary source. | |
| | |
| | Two obstacles are worth naming for anyone attempting this again: |
| | ''mmstat.com'' would be settled by China's ICP registry at ''beian.miit.gov.cn'', |
| | which serves a JavaScript challenge no fetch here could pass; ''agkn.com'' by |
| | TransUnion's own pages, which return 403 to everything that is not a browser |
| | session. **The remaining residue is a lower bound on what harder sourcing can |
| | reach, not a claim that these domains have no owner.** |
| | |
| | ==== L.8 What the pass could not establish ==== |
| | |
| | * **Whether the 12 still-unresolved rows are worse than the rest is still unbounded**, and this pass makes the bound //narrower// rather than //tighter//: the rows it recovered are by construction the **easier end** of the residue, so the test in section B of ''report_tail_pass.py'' is a test of the recovered rows, not of the residue. It can show the recovered rows are worse, or fail to; it cannot say anything about what is left. ''report_tail_pass.py'' says so in its own docstring and the content page says so in prose. |
| | * **The recovered/existing comparison has almost no power.** 7, 9 and 12 recovered rows. A difference would have to be enormous to register, and none of the three //p//-values is interpretable as evidence of no difference. |
| | * **The adjudicators were again language models**, one rater per domain, working to ''out/tail_adj/INSTRUCTIONS_TAIL.md''. No inter-rater agreement was measured **for this pass** — the +0.400 kappa on the content page is the 2026-09-05 rows. Measuring it would need a second model over the same 40 and was not attempted this sitting. |
| | * **Three sub-agents could not re-issue a port-43 query themselves** (this sandbox's ''curl'' has no ''whois://'' support and ''bash'' has no ''/dev/tcp'') and relied on the probe's already-fetched WHOIS text, disclosing it per row. Every such citation was independently re-fetched by ''owner_verify_sources.py'' afterwards, which is what closes that gap. |
| | * **''cratecamera.com'' and ''sa-as.com'' rest on an uncorroborated registrant organisation** and nothing further could be found for either: Admiral publishes no allowlist of its own domains, and no Foundry page names ''sa-as.com''. They are in the sensitivity run for that reason. |
| | |
| | ==== L.9 Reviewers, and what each one was worth ==== |
| | All four told explicitly that the author's context may not be exhaustive, all |
| | handed the page text, the scripts, their unedited output and these notes. The |
| | three focused passes ran in parallel against a bundle cut at 19:21; the generic |
| | pass ran afterwards against the pages as the first three had left them. |
| | |
| | |
| | === Findings accepted === |
| | |
| | |
| | ^ Pass ^ Finding ^ What was done ^ |
| | | figures vs script | ''added 14 rows to webXray, 15 to Tracker Radar'' — the recovered counts are **7 / 9 / 12**. 14 and 15 match no quantity in the data | **Accepted, and it is the author's own fabrication.** Corrected. | |
| | | figures vs script | the same sentence mixes conventions: ''9 of Disconnect's 12 were current … against 41 of its previous 42''. 41/42 is current+granularity; against a current-only numerator the comparable figure is **39 of 42** | Accepted; rewritten to name the convention. | |
| | | figures vs script / citations / generic | both guards assert a correct figure is **present** and neither asserts a superseded one is **absent**, so the headline box could carry the old rates with both exiting 0 | **Accepted and closed with code.** ''check_tail_figures.py'' gained section G; three mutations that reintroduce a superseded rate were added to the harness. | |
| | | figures vs script | the ''whois://'' retry runs on a short response but returns on the first raised **exception**, contradicting its own comment | Accepted; fixed, and the failure path exercised by hand. | |
| | | citations | ''adj_rows_tail_final.json'''s ''i.ua'' row still carried the adjudicator's superseded "error" reasoning beside a ''current'' verdict | Accepted; note rewritten, superseded text kept, marked as superseded. | |
| | | citations | ''offshoregeology.com'''s note flags a WHOIS line the adjudicator could not re-fetch; this sandbox can | Accepted; gap closed in the note, and the reviewer reproduced it independently. | |
| | | external currency | **Disconnect's ''entities.json'' has not changed since 2026-08-07**; the 2026-09-05 commit the page cites touched ''services.json'' | **Accepted, verified independently before acting**: ''commits?path=entities.json'' → ''ab6ff5a3a8'', 2026-08-07; repo HEAD ''4b592c288a'', 2026-09-05; the three raw files are byte-identical (412,191 bytes, same MD5). Both places on the content page corrected, with the query in a footnote. | |
| | | external currency | the RDAP-vs-registrar claim is stated as a general rule; it holds only where the registrant has not bought privacy, and that is per-registration, not per-registrar | **Accepted, reproduced**: ''whois.tucows.com'' returns ''Contact Privacy Inc. Customer 0168237798'' for ''cdnbasket.net'' while returning real organisations for others. §L.2 qualified, and the generator too. | |
| | |
| | |
| | === The generic pass, which had no checklist and found the most === |
| | |
| | |
| | It ran after the three focused ones, against the pages as they had left them, |
| | and it returned 15 findings. **Fourteen were accepted.** Two of them changed |
| | what the page claims, and both were things all three focused passes and the |
| | author's own site-wide sweep had read past. |
| | |
| | | # | Finding | What was done | |
| | | 1 | **The overturned headline is a fact about one metric and the page never said which.** All three pairwise tests were published on ''current'' only. On ''current+granularity'' — which the page itself says is right when the unit is "which company" — both Disconnect comparisons clear Bonferroni, before *and* after, so the second pass overturns nothing there. Worse: ''report_tail_pass.py'' tested ''current+granularity'' in section B and ''current''-only in E2, each the choice that made its own claim mildest, and disclosed neither | **Accepted; the most consequential finding of the sitting.** Reproduced independently before acting: 52/54 vs 44/56 → *p* = 0.008, 52/54 vs 43/56 → *p* = 0.004; before, 0.010 and 0.004. Sections B and E2 now print **both** metrics and say why; the Fisher table on the page carries both; the recommendation and the short answer name the metric each claim belongs to | |
| | | 2 | **"All four errors were found by the second pass" is false.** ''elfsight.com'' was Tracker Radar's one ''error'' before it | Accepted. Three are new. Corrected on the content page and on ''provenance:programming:crawler:webxray'' | |
| | | 3 | The short answer's "no longer clears" implies Disconnect-vs-Tracker-Radar was once significant. It never was — 0.025 before, against a threshold of 0.0167 | Accepted; rewritten to say it never cleared it | |
| | | 4 | Disconnect's only ''error'', ''km0trk.com'', is a **scoring decision on a bare-label entry** presented as the same kind of failure as a law-firm attribution — and the rule that separates it from ''i.ua'', scored the other way, is nowhere on the page. The remaining Disconnect residue is enriched for that class, which bears on the worst-case bound | Accepted in both halves. The rule is now stated (is the label a brand the operator's own documents use for the property?), with the admission that a reasonable person would score it the other way. The residue enrichment is verified from the §L.7 table — **3 of Disconnect's 6 remaining rows**: ''cdnbasket.net'' and ''htplayground.com'' are the bare domain string, ''stat-track.com'''s "StackTrack" is not a findable company — and said on the page next to the bound | |
| | | 5 | **The published sensitivity run covers 2 of the 11 rows that rest on the new bar**, and the ''i.ua'' alternative reading that the published correction log promises "the sensitivity run reports" was never computed | **Accepted.** E3 now has three runs: the original 2-row one, the **same-bar** run that drops all 11 (webXray 69.2%, Tracker Radar 72.1%, Disconnect 89.0% — the result does not depend on the widened bar), and the ''i.ua'' alternative (Disconnect 88.6%). All three are on the page and all three are asserted by the figure guard | |
| | | 6 | "Indistinguishable for the other two" is exactly the interpretation §L.8 says the p-values cannot bear | Accepted; the summary now says nothing here establishes that the tail was worse for any list, and names the metric dependence | |
| | | 7 | The residue is described as evidence-exhausted; two rows are **adjudicator limits**, not evidence limits, and every "why it is still unresolved" cell was **cut at 420 characters mid-word**, so "every route tried" was not checkable | Accepted in both halves. ''hqseek.com'' (adjudicator declined a live adult redirect on content policy, and its note records a possible ''error'' nobody ran down) and ''stripst.com'' (HTTP 406 to every non-browser fetch) are now named as limits of this pass. The truncation is removed from the generator, so §L.7 carries the notes in full | |
| | | 8 | The new section never says **who adjudicated the second pass** | Accepted. §I of this page records dropping that disclosure as the worst finding of the previous sitting, so this is a repeat. The content page now says: Sonnet sub-agents, one rater per domain, no inter-rater agreement measured for this pass | |
| | | 9 | **The largest single movement of the pass is absent from the content page**: Tracker Radar encounter-weighted 68.6% → 74.3%, almost all of it one row (''spot.im'', prevalence 0.011) — the column the page calls "the number a paper's attribution error depends on" | Accepted; a row added to the before/after table and a sentence to the prose | |
| | | 10 | "29 of the 525 verdicts were changed" predates this sitting's own ''i.ua'' rescore | Accepted; 30 now, split by date | |
| | | 11 | Stale limit bullet on ''provenance:programming:crawler:webxray'': "n is 42–49 per list … 69.9 vs 73.7" | Accepted. Now 54–56 and 69.2 vs 73.9, with the Fisher *p*. **The sweep could not see it because neither figure carries a ''%''** — recorded in the bullet itself | |
| | | 12 | §L.2's "the registrar hop did most of the work" disagrees with the ''owner_tail_merge.py'' output published two sections below (9/13 against 10/12) | Accepted; the difference is the ''i.ua'' correction moving one row's route, and §L.2 now says its counts are post-correction and the appendix output is not | |
| | | 13 | Two published scripts print different 95% intervals for the same estimate, under a claim of "imported, not reimplemented" | Accepted. The intervals are **removed** from ''report_tail_pass.py'''s output rather than reconciled: its bootstrap draws from a shared generator, so an identically seeded re-run legitimately differs. The estimator's own output remains the only source for intervals, and the script now says so | |
| | | 14 | Three prose misstatements: "changed the answers more than it changed the rows" (28 of 40 rows changed); "narrower rather than tighter" (synonyms); "the highest and by the widest margin" (unclear) | **Two accepted, one rejected.** The first is rewritten to the actual quantity (23% of draws → 7.8%); the second is rewritten. The third is left: in a bullet that has just given both rates, "highest and by the widest margin" reads plainly, and rewording it costs more than it buys | |
| | | 15 | ''report_tail_pass.py'''s docstring shows a pre-corrections input file, so copying it reproduces a Disconnect with two ''error''s | Accepted; docstring fixed to the file the published run used | |
| | |
| | **What this pass cost and what it bought.** It was the only one of the four to |
| | question the *choice of metric* rather than the arithmetic within one, and that |
| | question changed the page's headline claim from "the second pass overturned |
| | Disconnect's lead" to "it overturned a legal-entity-level lead over a list this |
| | page calls historical, and cost it nothing at the company level". The three |
| | focused passes checked every number against the script and found the script's |
| | own metric switch invisible, because each number was right for the metric its |
| | section used. **A checklist cannot find a framing defect**; this is the |
| | strongest evidence so far that the generic slot earns its place. |
| | |
| | |
| | === Findings recorded as already-fixed (stale bundle) === |
| | |
| | |
| | Three of the four passes independently reported that the content page's |
| | ''%%<WRAP important>%%'' "short answer" box still carried **94.4% / 73.7% / 93.9%**. |
| | It did when their bundle was cut at 19:21. A site-wide sweep |
| | (''scripts/sweep_moved_figures.py'') had found and fixed it at 19:28, along with |
| | three more the first patch missed. **The finding was right and the bundle was |
| | stale** — the same trap this wiki has recorded before. Two of the four passes |
| | also named the ''%%<WRAP todo>%%'' that still asked for the thing this sitting did; |
| | that one was **not** yet fixed and has been. |
| | |
| | |
| | === A second sweep, after the generic pass's fixes were published === |
| | |
| | |
| | ''sweep_moved_figures.py'' was re-run over a **fresh export of all 182 pages** |
| | taken after publishing, with five pairs added for figures that carry no ''%'' — |
| | the class the generic pass showed the sweep was blind to (''42–49''→''54–56'', |
| | ''69.9 vs 73.7''→''69.2 vs 73.9'', ''29 of the 525''→''30 of the 525'', |
| | ''All four were found'', ''9 of 13''→''10 of 12''). |
| | |
| | **69 suspect lines, 68 legitimate and one real.** The content page's |
| | methodology bullet still said **"29 of the 525 verdicts were changed"**: the |
| | page carried that figure **twice**, round four fixed the copy in the section it |
| | was editing, and ''check_tail_figures.py'' could not see the other because it |
| | asserts a figure is *present* and a correct copy was. The other 68 are |
| | before/after columns, the published mutation harnesses' own output, the |
| | 2026-09-05 estimator run this family deliberately preserves as the "before", |
| | and one coincidental match on an unrelated rater-agreement figure. |
| | |
| | Closed with code rather than with an edit: the guard now derives the total from |
| | ''owner_tail_corrections-output.txt'''s own ''actions: ... rescore=N'' line plus the |
| | first sitting's 29, asserts both that the right value is present and that the |
| | superseded one is absent, and the mutation harness reverts **one** copy to prove |
| | it bites. Control: run against the pre-fix export, it fails on exactly that |
| | line. |
| | |
| | **This is the same shape as the defect three reviewers found earlier in the |
| | sitting** — a presence check blessing a page with one stale copy — and it |
| | recurred inside the fix for it. The harness header now states the limit plainly |
| | and points at the sweep as the tool that covers it. |
| | |
| | |
| | === A third sweep, and the last two stale figures === |
| | |
| | |
| | Re-run once more over a fresh export after publishing the guard fix. **68 hits, |
| | all legitimate except two**, both on ''provenance:programming:crawler:webxray'' |
| | and both in the //judgement calls// section written by the 2026-09-05 sitting: |
| | |
| | * "webXray at 69.9% domain-level and 93.9% encounter-weighted" — stated in the present tense about figures that are now 69.2% and 93.8%; |
| | * "93.9% encounter-weighted is a flattering number … and Disconnect is better on the measured axis anyway" — the second clause is now **metric-dependent**, which is the finding the generic pass produced two sections above. |
| | |
| | Both were **dated rather than refreshed**: a record of a judgement made on a |
| | particular day should keep the figures it was made on. Each now carries the |
| | 2026-09-11 value beside the 2026-09-05 one, and the "better on the measured |
| | axis" claim names both metrics and both p-values. |
| | |
| | The remaining 66 were read and are all one of: a //before// column, a |
| | struck-through open question quoting its own superseded text, a reviewer-log |
| | entry quoting the old page, the published mutation harnesses' own output, a |
| | ''-'' line in the committed unified diff, the 2026-09-05 estimator run that |
| | ''provenance:programming:crawler:webxray:random_sample'' exists to preserve, and |
| | one coincidental match of an unrelated inter-rater figure (76.5%). |
| | |
| | **Three sweeps were needed and each found something the one before did not**, |
| | because each round of edits moved figures the previous pair list did not name. |
| | The pair list is now 28 entries and is committed at ''out/moved_figures.json''; |
| | the next sitting should extend it rather than rebuild it. |
| | |
| | |
| | === Nothing found in === |
| | |
| | |
| | Fisher's exact (independently reimplemented: 0.031 / 0.083 / 0.831, matching); |
| | the eligibility rule (read against the estimator's, equivalent, and asserted at |
| | runtime); the worst-case convention; the raw-count arithmetic; the source-kind |
| | split (9 / 2 / 17, recomputed from the rows); the reproducibility of every |
| | committed output; citekeys (22, all resolving once against a freshly fetched |
| | bibliography, none added); **all 28 recovered citations re-fetched and verified |
| | verbatim by a second party**; the three ''error'' verdicts, each re-derived from a |
| | primary source; the ''i.ua'' override, judged substantively right by an |
| | independent read of the surrounding agreement text. |
| |
| ===== J. scripts/report_ownership_resolution.mjs, in full ===== | ===== J. scripts/report_ownership_resolution.mjs, in full ===== |
| ['Agreement between pairs (612 / 464 / 1,538 and the "neither" columns)', 'owner_dbs.py --cache out/webxray/cache', '2026-08-17'], | ['Agreement between pairs (612 / 464 / 1,538 and the "neither" columns)', 'owner_dbs.py --cache out/webxray/cache', '2026-08-17'], |
| ['The 28-row hand adjudication of high-prevalence disagreements', 'owner_adjudication.py --table', '2026-08-17'], | ['The 28-row hand adjudication of high-prevalence disagreements', 'owner_adjudication.py --table', '2026-08-17'], |
| ['Accuracy rates (69.9 / 73.7 / 94.4%, the encounter-weighted column, the CIs)', 'owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_scored.json', '2026-09-05'], | ['Accuracy rates (69.2 / 73.9 / 89.2%, the encounter-weighted column, the CIs)', 'owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_tail_final.json', '2026-09-05 draw, 2026-09-11 second pass'], |
| | ['What the second pass over the 40 unadjudicable rows changed', 'owner_tail_probe.sh | owner_tail_merge.py | owner_tail_corrections.py | report_tail_pass.py', '2026-09-11'], |
| ['Coverage counts inside the random-sample section (664 / 5,566 / 2,264 of 32,337)', 'owner_sample.py --cache out/owner_cache', '2026-09-05'], | ['Coverage counts inside the random-sample section (664 / 5,566 / 2,264 of 32,337)', 'owner_sample.py --cache out/owner_cache', '2026-09-05'], |
| ['Self-named entity shares (0.8% / 0.7% / 3.2%)', 'owner_selfname_census.py', '2026-09-05'], | ['Self-named entity shares (0.8% / 0.7% / 3.2%)', 'owner_selfname_census.py', '2026-09-05'], |
| that a refresh of this script is never mistaken for a refresh of the page. | that a refresh of this script is never mistaken for a refresh of the page. |
| |
| Figure family Script Snapshot it is pinned to | Figure family Script Snapshot it is pinned to |
| ---------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- ------------------------ | ---------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- --------------------------------------- |
| List shape (827 / 19,148 / 1,887 owners; 3,215 / 38,368 / 7,850 domains) owner_dbs.py --cache out/webxray/cache 2026-08-17 | List shape (827 / 19,148 / 1,887 owners; 3,215 / 38,368 / 7,850 domains) owner_dbs.py --cache out/webxray/cache 2026-08-17 |
| Coverage census (669 / 5,581 / 2,268 of 32,369; the prevalence weights; the rank slices) owner_dbs.py --cache out/webxray/cache 2026-08-17 | Coverage census (669 / 5,581 / 2,268 of 32,369; the prevalence weights; the rank slices) owner_dbs.py --cache out/webxray/cache 2026-08-17 |
| Agreement between pairs (612 / 464 / 1,538 and the "neither" columns) owner_dbs.py --cache out/webxray/cache 2026-08-17 | Agreement between pairs (612 / 464 / 1,538 and the "neither" columns) owner_dbs.py --cache out/webxray/cache 2026-08-17 |
| The 28-row hand adjudication of high-prevalence disagreements owner_adjudication.py --table 2026-08-17 | The 28-row hand adjudication of high-prevalence disagreements owner_adjudication.py --table 2026-08-17 |
| Accuracy rates (69.9 / 73.7 / 94.4%, the encounter-weighted column, the CIs) owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_scored.json 2026-09-05 | Accuracy rates (69.2 / 73.9 / 89.2%, the encounter-weighted column, the CIs) owner_random_sample.py --sample out/owner_sample.json --rows out/adj_rows_tail_final.json 2026-09-05 draw, 2026-09-11 second pass |
| Coverage counts inside the random-sample section (664 / 5,566 / 2,264 of 32,337) owner_sample.py --cache out/owner_cache 2026-09-05 | What the second pass over the 40 unadjudicable rows changed owner_tail_probe.sh | owner_tail_merge.py | owner_tail_corrections.py | report_tail_pass.py 2026-09-11 |
| Self-named entity shares (0.8% / 0.7% / 3.2%) owner_selfname_census.py 2026-09-05 | Coverage counts inside the random-sample section (664 / 5,566 / 2,264 of 32,337) owner_sample.py --cache out/owner_cache 2026-09-05 |
| Inter-rater kappa (+0.400, +0.680) owner_irr_kappa.py 2026-09-11 | Self-named entity shares (0.8% / 0.7% / 3.2%) owner_selfname_census.py 2026-09-05 |
| Repository state, licences, Wayback dates hand checks + wayback_webxray.sh 2026-08-17 / 2026-09-05 | Inter-rater kappa (+0.400, +0.680) owner_irr_kappa.py 2026-09-11 |
| | Repository state, licences, Wayback dates hand checks + wayback_webxray.sh 2026-08-17 / 2026-09-05 |
| |
| Two of the three lists change weekly. Re-run before citing. | Two of the three lists change weekly. Re-run before citing. |
| * [[provenance:programming:crawler:webxray]] — the live-list scripts, the fold residues, the Wayback log, the 2026-08-17 and 2026-09-05 run tables. | * [[provenance:programming:crawler:webxray]] — the live-list scripts, the fold residues, the Wayback log, the 2026-08-17 and 2026-09-05 run tables. |
| * [[provenance:programming:crawler:webxray:random_sample]] — the 175-row adjudication, the estimator, the inter-rater draw and kappa. | * [[provenance:programming:crawler:webxray:random_sample]] — the 175-row adjudication, the estimator, the inter-rater draw and kappa. |
| | * [[provenance:programming:crawler:webxray:residue_pass]] — the 2026-09-11 second pass over the residue in full: its probe, its brief, its merge gate, its corrections, its report, its guard, its mutation harness and every unedited output, including the 40-domain probe log and the diff between the two estimates. |
| * [[Literature:Corpus]] — corpus-level selection and extraction caveats. | * [[Literature:Corpus]] — corpus-level selection and extraction caveats. |
| |