Repository navigation
fix(comparison): retire the alpha holdout split, and probe every pinned source's availability and licence - #90
Merged
Conversation
…thdrawn image cutout-wordmark-aflac, one of the eight alpha holdout images, was deleted from Wikimedia Commons on 2026-08-25 as a copyright violation. The pin table now records it as withdrawn, so it is never fetched, and asking for the alpha holdout split throws before anything is fetched: scoring the other seven would be a new experiment under the old one's name, and the split has already informed the decisions §11.12 records. The entry and its declared split stay. A cached copy with no entry would fall through splitFor to tune and join every alpha tune sweep. Refs #83
…r reproducible §11.12's alpha holdout column, the per-metric figures under it, and the alpha_ac_fit verdict were all read from a split that is now retired, so nothing can re-run them. Say so where each is stated: §11.12 at the table, §11.3 where the adopted row and alpha_ac_fit lean on it, §11.11 where the tier-1 row inherits it, and §11.13's evidence column. §11.12's provenance note no longer tells a reviewer to re-run a command that now refuses. The column's unbound note in verify-experiments names the retirement and what would lift it. Refs #83
…d licence corpus:licenses --check compares the attribution file with the pin table, both in this repository, so it could not notice Commons deleting cutout-wordmark-aflac as a copyright violation. --probe asks Commons instead: every photographic, alpha and graphics pin must still exist at its pinned URL, and every licence the pin table records must still be the one Commons records. Withdrawn entries are skipped and listed. Exit 1 when a source no longer holds, 2 when Commons could not be asked. It needs the network and a third-party host, so it is not a CI gate. Refs #83
This was referenced Sep 25, 2026
…w §11.12's note §11.13 cited §11.11 for the −17.10% tune figure, which is §11.3's; §11.11 measures −11.95% at tier 1. Refs #83
…layout's holdout as the retired split
This was referenced Sep 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Wikimedia Commons deleted
cutout-wordmark-aflac, one of the eight alpha holdout images, on 2026-08-25 as a copyright violation (COM:CSD#F1). Its upload URL now returns 404, and the Commons deletion log records the deletion. This PR:spec/EXPERIMENTS.mdthat rests on the split as no longer reproducible.corpus:licenses --probe.--checkcompares two files in this repository, so it could not have noticed the deletion.--probeasks Commons.Closes #83
Changes, by path
tools/comparison/src/alpha-images.tswithdrawnfield toAlphaImageSpec, and sets it oncutout-wordmark-aflac. A withdrawn image is never fetched.ALPHA_HOLDOUT_RETIRED.ensureAlphaImages("holdout")throws it before fetching anything, somise run sweep v07-holdout-alpha --split holdoutnow fails with the reason, not aCorpusPinError.alphaImagesToFetch, whichensureAlphaImagescalls, so it can be tested without the network.tools/comparison/src/metric-selftest.ts: a new "alpha corpus selection" block. It asserts that the holdout split throws exactlyALPHA_HOLDOUT_RETIRED, that a withdrawn fixture pin is skipped both fortuneand with no split, that the shipped table never yieldscutout-wordmark-aflac, and thatsplitFor("cutout-wordmark-aflac")staysholdout. CI already runs it (ci-comparison.yml,metric-selftest.js).holdoutsplit on purpose. Without the entry, a cached copy (dev machines, CI's corpus cache) would fall throughsplitFortotuneand silently join every alpha tune sweep.spec/EXPERIMENTS.mdholdoutcolumn, and every figure below it from the alpha holdout, can no longer be reproduced, and why. The provenance note no longer tells a reviewer to re-run a command that now refuses. The per-metric figures and thealpha_ac_fitverdict are restated as results from the retired split. Table cells are unchanged, soverify:claimsstill binds the five places that quote −16.19%.alpha_ac_fit = falserest on tune evidence, and their holdout confirmation is gone.alpha_ac_fitrow are marked as from the retired split. The compact-tier row now splits its evidence: the opaque layout's ThumbHash result is on the photographic holdout, which still stands; the alpha compact layout (A 16 @ 3) cites −13.00% on tune, and its −9.49% holdout is marked as from the retired split.tools/comparison/src/verify-experiments.ts:UNBOUND_COLUMN_NOTES["11.12#1"]and the comment where the holdout binding used to be now name the retirement and what would lift it. No binding or count changes: 1040 cells, as before.tools/comparison/src/corpus-licenses.ts: new--probemode..mise.toml: documents--probeon thecorpus:licensestask and updates its description.Validation
At the pushed head, each run locally and exiting 0:
pnpm --prefix tools/comparison run format:check,lint,buildnode tools/comparison/dist/metric-selftest.jsnode tools/comparison/dist/verify-claims.js: 20 figures across 5 files.node tools/comparison/dist/verify-experiments.js --strict: 1040 cells, asEXPECTED_CELLSasserts.node tools/comparison/dist/verify-sweep-labels.jsnode tools/comparison/dist/corpus-licenses.js --checknode tools/comparison/dist/metric-reference-test.jsnode tools/comparison/dist/determinism-check.jsnode tools/comparison/dist/rd-gate.jspython3 spec/validate.py,./tools/ci/check-versions.shcargo test --manifest-path rust/Cargo.toml --features fullconvco check origin/master..HEADFocused checks:
node tools/comparison/dist/metric-selftest.jsprints fivePASSlines under "alpha corpus selection" and exits 0.mise run corpus:licenses --probepasses on the current tables: 86 sources, 39 licences, 1 withdrawn entry listed.withdrawnmark cleared and one photographic licence altered in memory. It exited 1 and named both:alpha/cutout-wordmark-aflac ... no longer exists on Commons, andnatural/chroma-black-and-white: Commons records "CC BY-SA 4.0" ..., the pin table "CC BY-NC 4.0".node tools/comparison/dist/verify-benchmark.jsexits 1, as on master. The cause is PERFORMANCE.md's deferredTBDtiming cells (#78). CI runs that step withcontinue-on-error, and this PR touches neither PERFORMANCE.md nor the perf baselines.Coverage gaps
--probe. It depends on the network and a third-party host. The negative check above ran once by hand and is not committed.alphaImagesToFetch, the selectionensureAlphaImagesdelegates to, not the fetch loop around it, which needs the network. The loop iterates the selection's result and adds no filtering of its own.compare --skip-harnesses) was not run locally: this checkout has notypescript/wasmbuild. The report does not callensureAlphaImages, and it only readsALPHA_IMAGES..mise.tomlchanges trigger (Android, C, C#, Go, JVM, Python, Swift, TypeScript, WASM) were not run locally. This PR's.mise.tomlchange is a comment and a task description.--probechecks licences only where a pin table records one, which is the photographic table. The alpha and graphics licences are in hand-written attribution files (comparison: generate the alpha and graphics attribution files from their pin tables, so corpus:licenses checks them #92).ensureHoldoutImages, not held in a table.Left for split issues
README.md,spec/README.md,spec/RATIONALE.md,rust/src/constants.rsandspec/constants.py, and registered inverify-claims.ts. The sweep config's description also still claims it. All of these were outside this lane's manifest. §6's reproduce line for the retired run is annotated by docs(spec): re-measure every EXPERIMENTS.md sweep at one commit, and correct what no longer holds #87.fixtures/alpha/LICENSES.mdstill attributes the deleted file as CC BY 4.0. Once the tables record licences,--probecan check all 86.Decisions taken
Taken: retire - the split refuses to run, and the claims resting on it are marked unreproducible. Tune evidence and committed tune results are unchanged.
Rejected: replace the image - that makes a new split and a new experiment, not a reproduction. The user's 2026-09-24 holdout answer ("declare the current holdout spent", then curate a fresh set that needs their sign-off on the image list) requires approval that a lane cannot obtain. Filed as comparison: a new sealed alpha holdout, replacing the split retired in #83 #93.
Reverses: drop the
split === "holdout"guard inensureAlphaImagesand pin a replacement entry inALPHA_IMAGES.Taken: they keep their pins and their
holdoutlabel, so they can only be scored through the refused split - no committed alpha tune result moves.Rejected: fold them into tune now - that changes the corpus of every committed alpha tune sweep (16 → 23 images) and invalidates §11.3's bound tables, which is a re-measure belonging with comparison: a new sealed alpha holdout, replacing the split retired in #83 #93 and comparison: a new sealed holdout (holdout2), with the spent one folded into tune #76, not a relabel.
Reverses: set
split: "tune"on those seven entries and re-record every alpha tune result.Taken: keep it with
withdrawnset, and never fetch it. The entry still records what the historical results scored.Rejected: delete the entry -
splitForfalls back totunefor unknown names, so a cached copy (CI restoresfixtures/alphafrom an actions cache) would silently join every alpha tune sweep.Reverses: remove the entry and add an explicit exclusion in
loadCorpus.corpus:licensesverify that each source is still available?Taken: yes, as an explicit
--probemode that checks availability for every Commons pin, and the licence wherever a pin table records one. It is documented as the check to run before a corpus-fetching sweep or a curation.Rejected: fold it into
--check, which CI runs - that makes a required check depend on a third-party host and its rate limits (the corpus cache inci-comparison.ymlexists to avoid exactly that).Reverses: add
node tools/comparison/dist/corpus-licenses.js --probeas a step inci-comparison.yml.Taken: a note under the table, with every cell left as measured -
verify:claimskeeps binding the five external quotes to the cell.Rejected: rewriting the
holdoutcells or header - that breaks theverify:claimsregistrations. The quoting files that would need to change with them are outside this manifest (docs: mark the −16.2% alpha figure as unreproducible wherever it is quoted outside EXPERIMENTS.md #91).Reverses: annotate the cells and update the five
verify-claims.tspatterns in docs: mark the −16.2% alpha figure as unreproducible wherever it is quoted outside EXPERIMENTS.md #91's change.Unresolved review notes
C1
§11.13's compact-tier row cited "on holdout (§11.12)" for the alpha compact layout (
A 16 @ 3), whose only holdout evidence is the retired alpha split's −9.49%. Repaired in8fe0add: the row now separates the opaque layout (photographic holdout, still standing) from the alpha layout (−13.00% on tune; −9.49% marked as the retired split).verify:experiments --strict(1040 cells) andverify:claimsstill pass.Resolved at: 8fe0add
V1
The holdout refusal and the withdrawn-pin skip had no committed test. Repaired in
90d41db: the selection is the purealphaImagesToFetch, andmetric-selftest.tsasserts both branches plus the shipped table's behaviour (see "Changes, by path"). The fetch loop's own network path is declared under "Coverage gaps".Resolved at: 90d41db