docs(holdout): document the shipped system honestly; remove vestigial split (#259)#320
Conversation
… split (#259) Closes out the #259 verification audit's minimal PR: 1. Rewrite docs/held-out.md around the shipped mechanism (synthbench.private_holdout + server-side rehydrated recompute in process-submission + verification_badge): per-dataset private fractions (20/30/40%), unsalted SHA-256 on base_dataset:key, both-halves submission requirement, canonical answer key in gated R2 / maintainer caches only, Worker path allowlist. 2. Fix overstated privacy claims: holdout *membership* is publicly computable (unsalted hash in public code, is_holdout flags in run artifacts) — what is withheld is the answer key. Corrected in PrivateHoldoutSection.astro (drops the false "we do not publish which questions" claim, fixes the stale 80/20 framing) and add the upstream-reconstructability caveat: source surveys are publicly downloadable, so the holdout is a fabrication/overfitting deterrent, not cryptographic secrecy. 3. Remove the vestigial seed-based split system: datasets/split.py, its tests, the `synthbench run --held-out` flag + SYNTHBENCH_HELD_OUT_AUTH gate, and the never-accurate HeldOutValidationSection methodology section. Nothing server-side invoked it, and its partition contradicted the shipped hash split (25% seeded vs 30% hash-based on globalopinionqa). The reserved sps_held_out / held_out_badge leaderboard fields are kept but re-documented as unpopulated, pending the re-eval-cron decision. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dataset change detectedThis PR touches Before this PR can merge:
The Touched files: |
|
Applying |
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Gate note for the record: the anti-self-approval check fired because the |
Implements the "minimal closing PR" from the verification audit on #259 (see the last comment there). Three changes:
1.
docs/held-out.mdrewritten around the shipped systemThe doc previously described the vestigial seed-based
datasets/split.pysystem. It now documents what actually ships:synthbench.private_holdout(unsalted SHA-256 onbase_dataset:key, per-dataset private fractions 20/30/40% by dataset size), the both-halves submission requirement, the server-side canonical-rehydrate recompute in process-submission, theverification_badge, and where the answer key lives (gated R2 origin + credentialed maintainer caches; the data-proxy Worker allowlists onlyrun//config//question/, sohuman-distributions/*is unroutable).2. Honest privacy framing
PrivateHoldoutSection.astrono longer claims "We do not publish which questions land in the private subset" — membership is publicly computable (the hash is public code; run artifacts carryis_holdoutflags). The corrected framing: what is withheld is the private subset's answer key, Kaggle-style.docs/held-out.md: source surveys are publicly downloadable and the adapters rebuild the full distributions, so the holdout is a fabrication detector and casual-overfitting deterrent, not cryptographic secrecy; a genuinely un-memorizable holdout requires newly fielded data (separate scope).3. Vestigial
datasets/split.pysystem removedNothing server-side invoked it, and its partition contradicted the shipped split (25% seeded vs 30% hash-based on globalopinionqa). Removed:
src/synthbench/datasets/split.py+tests/datasets/test_split.pysynthbench run --held-outflag, itsSYNTHBENCH_HELD_OUT_AUTHgate, and the runner-side public/held-out key filter incli.pyHeldOutValidationSection.astro(documented the removed system plus a periodic re-eval worker that never existed)pyproject.toml/leaderboard_pr.pyre-pointed atprivate_holdoutThe reserved
sps_held_out/held_out_badgeleaderboard schema fields and their render plumbing are kept but re-documented as unpopulated/reserved, since the re-eval question is still open.Deliberately NOT done (open design decisions, per the audit)
Verification
pytest -q: 1086 passed, 28 skipped./scripts/format-check.sh: cleannpm run build(28 pages) +npm run check(0 errors, 0 warnings) passRefs #259.
🤖 Generated with Claude Code