User Tools

Site Tools


provenance:design:ownership_resolution

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
provenance:design:ownership_resolution [2026/09/11 22:43] – Section L.9: record the post-publication sweep, the one real drift it found (a second copy of '29 of the 525'), and the guard change that closes it. Authored by Claude karel.kubicek.claudeprovenance:design:ownership_resolution [2026/09/17 07:23] (current) – Markup rendering sweep: wrap escapes, CLI flag typography, and heading quotes. Authored by Claude. karel.kubicek.claude
Line 208: Line 208:
  
 ^ Script ^ Invocation ^ Result ^ ^ Script ^ Invocation ^ Result ^
-| ''report_webxray.mjs'' | ''node scripts/report_webxray.mjs --quotes'' | **byte-identical** to the committed ''report_webxray-output.txt'' before the fix in section C; regenerated after it | +| ''report_webxray.mjs'' | ''node scripts/report_webxray.mjs %%--quotes%%'' | **byte-identical** to the committed ''report_webxray-output.txt'' before the fix in section C; regenerated after it | 
-| ''owner_dbs.py'' | ''python3 scripts/owner_dbs.py --cache out/webxray/cache --disagreements 25'' | reproduces the 2026-08-17 frame exactly: 32,369 domains; 669 / 5,581 / 2,268; 58.6% / 84.3% / 80.5%; 15,651 merged rows; 19 non-hostname rows dropped; 6,941 ICANN and 3,290 PRIVATE rules; 782 of 827 owner names untouched by the fold, 16 of the 45 changed losing a legal suffix | +| ''owner_dbs.py'' | ''python3 scripts/owner_dbs.py %%--cache%% out/webxray/cache %%--disagreements%% 25'' | reproduces the 2026-08-17 frame exactly: 32,369 domains; 669 / 5,581 / 2,268; 58.6% / 84.3% / 80.5%; 15,651 merged rows; 19 non-hostname rows dropped; 6,941 ICANN and 3,290 PRIVATE rules; 782 of 827 owner names untouched by the fold, 16 of the 45 changed losing a legal suffix | 
-| ''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_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 | | ''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 |
Line 500: Line 500:
 ^ Check ^ Result ^ ^ Check ^ Result ^
 | 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. | | 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 |
 | Mutation test of ''report_ownership_resolution.mjs'' | **four mutations, four failures**. Swapping tight/loose on Disconnect → "tight (700) > loose (74)". Making ''loose'' disjoint from ''tight'' at equal size → "23 tight hits are not in the loose set" — the containment guard catches what a size comparison alone would miss. Injecting a fake union member → cross-check throws. Replacing the crawled intersection with the full union → cross-check throws. No guard is vacuous. | | Mutation test of ''report_ownership_resolution.mjs'' | **four mutations, four failures**. Swapping tight/loose on Disconnect → "tight (700) > loose (74)". Making ''loose'' disjoint from ''tight'' at equal size → "23 tight hits are not in the loose set" — the containment guard catches what a size comparison alone would miss. Injecting a fake union member → cross-check throws. Replacing the crawled intersection with the full union → cross-check throws. No guard is vacuous. |
Line 526: Line 526:
 | 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) | | 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'' | | 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** | +| 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 | +| 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 | +| 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'' |+| 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'' | | What changed | ''python3 scripts/report_tail_pass.py …'' | ''out/report_tail_pass-output.txt'' |
  
Line 535: Line 535:
  
 <WRAP tip> <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.+**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> </WRAP>
  
Line 630: Line 630:
 The one non-OK row is ''adgrx.com'': ''samsungads.ca'' serves an **expired 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 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+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 byte-verbatim in it. The checker was deliberately **not** given an
-''--insecure'' retry — an ownership citation whose host identity cannot be+''%%--insecure%%'' retry — an ownership citation whose host identity cannot be
 validated should surface, not be swallowed. validated should surface, not be swallowed.
  
Line 816: Line 816:
 recurred inside the fix for it. The harness header now states the limit plainly 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. 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.
  
  
Line 1372: Line 1400:
  
 <bibtex bibliography></bibtex> <bibtex bibliography></bibtex>
 +
 +===== Markup sweep, 2026-09-17 =====
 +
 +Mechanical rendering repair only: a fresh live raw/XHTML export of 188 pages was checked with ''check_wrap.mjs'' and ''check_typography.mjs''. Affected plugin tags, CLI flags and heading markup were repaired; no figures or substantive prose were changed. The resulting source and rendered DOM were re-checked after saving.
  
provenance/design/ownership_resolution.1789166599.txt.gz · Last modified: by karel.kubicek.claude