claude-opus-4-8
nano-gpt-data-curation — graded by the task's verifier against a measured baseline.
- backend
- modal
- variant
- claude claude-opus-4-8
- metric
- held-out multi-domain perplexity
- actions
- 82
- duration
- 1h 1m
- recorded
- 2026-08-04
run iddclm-nano-curation__gSSiCuY
Everything claude-opus-4-8 did on this task, in order.
download JSON ↗Let me update the mechanism and falsification sections to reflect the sharper seeded-sweep finding (balancing is now a large real effect, not neutral).
args
{
"replace_all": false,
"file_path": "/workspace/claim.md",
"old_string": " check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection ~370. The three points order top(370) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips).",
"new_string": " check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection 356.6. The three points order top(357) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips)."
}Edit result
The file /workspace/claim.md has been updated successfully. (file state is current in your context — no need to Read it back)
[metadata] {"filePath": "/workspace/claim.md", "oldString": " check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection ~370. The three points order top(370) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips).", "newString": " check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection 356.6. The three points order top(357) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips).", "originalFile": "# Claim: domain-classifier curation with register balancing beats random selection\n\n## Hypothesis\nUnder a fixed 12M-token training budget, selecting pool documents by their\n**resemblance to the disclosed multi-domain target** — scored with a bag-of-words\nlogistic-regression classifier trained to separate target text from random pool\ntext — and then **balancing the selected registers to the target's equal-parts\nmixture**, produces a 30M GPT with substantially lower held-out perplexity than a\nrandom selection of the same size. Concretely I predicted the classifier-selected\ncorpus would land well below the random baseline; measured on `multi_dev`:\n\n| selection (12M tokens) | dev held-out PPL |\n|-------------------------------------------------------|:----------------:|\n| bottom-scored anti-selection (falsification) | 1045.0 |\n| random pool (do-nothing baseline) | 462.5 |\n| classifier-ranked, prose-only (no QA balancing) | 400.4 |\n| **classifier-ranked + register-balanced (submitted)** | **356.6** |\n\n356.6 is **23% below** the random baseline. The submission is fully reproducible\nfrom `curate.py` at a fixed seed. A dev sweep over the QA token share isolates the\ntwo ingredients: **quality ranking** (random 462 → 400) and **register balancing**\n(400 → 357). The balancing sweep — qa_frac {0.00:400, 0.20:357, 0.25:370,\n0.28:364} — shows *including* technical-QA is a large, robust win over prose-only,\nwhile the exact fraction inside 0.20–0.28 is budget-tail noise; I take qa_frac=0.20\n(best, and my pool QA-detector under-counts prose-style Q&A, so 0.20 ≈ 25% true QA).\n\nThe positives are the dev target itself, recovered by GPT-2-decoding\n`multi_dev.npy` and de-normalizing the WikiText ` @-@ `/spaced-punctuation\nartifacts so the classifier keys on register/quality rather than a surface\ntokenization quirk absent from the raw pool.\n\n## Mechanism (predicts an observable *other* than the final perplexity)\nThe classifier assigns each document a scalar \"target-likeness\" score, and that\nscore is a **monotone predictor of a document's training value**. Two observables\nthat are *not* the final held-out perplexity:\n\n1. **Score-stratified training is monotone.** Train on the *lowest*-scored\n documents (same size, same quality gate) and the model should be **worse than\n random**, not merely less good than the top selection. Falsification-style\n check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection ~370. The three points order top(370) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips).\n2. **Composition shift.** The selected corpus is visibly a different population\n from the pool: near-zero navigation/boilerplate/near-duplicate fragments, and\n its register mix is engineered to ~25% technical-QA / ~75% prose+news to match\n the dev token mix I measured (wiki-style 25% / news+web 50% / QA 26%). The raw\n pool, by contrast, is ~2% QA and dominated by low-score web chrome.\n\n## Falsification\nThe hypothesis is falsified if **any** of these hold:\n- Training on the bottom-scored documents yields PPL **≤ 462.5** (random). Then the\n score does not track training value and the win was luck / a length artifact.\n- Matching the register mix to the equal-parts target **raises** held-out PPL\n versus the same-budget prose-only top-k (I observed it neutral on dev: 360.2\n balanced vs 361.6 prose-only — within run-to-run noise — so balancing is\n justified by the *disclosed spec*, not by a dev gain; a large regression would\n falsify the \"match the target mixture\" half of the claim).\n- The score→PPL relationship is non-monotone across bins (e.g. mid-scored beats\n top-scored), which would mean the classifier is selecting on something\n orthogonal to LM quality.\n\n## Transfer\nThe recipe needs only (a) a pool and (b) *some* positive examples of the target\ndistribution; it is independent of this task's specifics.\n- **Other targets / pools:** swap the positives (decoded dev here; elsewhere a\n handful of in-domain docs) and the same classifier re-ranks any raw corpus —\n the standard GPT-3 / DSIR quality-classifier pattern.\n- **Larger budgets / models:** the ranking is budget-agnostic; a bigger budget\n just consumes further down the same ordered list. The register-balancing\n interleave holds its target proportion across *any* prefix, so it composes with\n the packer's cut point at any budget.\n- **Known mixtures:** whenever the eval mixture is disclosed, the balancing step\n generalizes — split the pool by register and hold each register's share to the\n target, which is the loss-minimizing allocation for a known test mixture.\n- **Cheap:** the whole pipeline is numpy + a linear model on an H100 in minutes;\n no labels, no internet, fully reproducible from a fixed seed.\n", "structuredPatch": [{"oldStart": 38, "oldLines": 7, "newStart": 38, "newLines": 7, "lines": [" documents (same size, same quality gate) and the model should be **worse than", " random**, not merely less good than the top selection. Falsification-style", " check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and", "- top-selection ~370. The three points order top(370) < random(462) < bottom(1045),", "+ top-selection 356.6. The three points order top(357) < random(462) < bottom(1045),", " i.e. the score axis carries the causal signal — inverting it nearly triples", " perplexity, so the gain is not a length/dedup artifact shared by both tails", " (the bottom selection uses the *same* quality gate; only the score sign flips)."]}], "userModified": false, "replaceAll": false}encrypted chain-of-thought — recorded, not exposed
args
{
"replace_all": false,
"file_path": "/workspace/claim.md",
"old_string": "- Matching the register mix to the equal-parts target **raises** held-out PPL\n versus the same-budget prose-only top-k (I observed it neutral on dev: 360.2\n balanced vs 361.6 prose-only — within run-to-run noise — so balancing is\n justified by the *disclosed spec*, not by a dev gain; a large regression would\n falsify the \"match the target mixture\" half of the claim).",
"new_string": "- Adding the target's technical-QA register **raises** held-out PPL versus the\n same-budget prose-only top-k. Observed the opposite and strongly: prose-only 400\n vs QA-balanced 357 (−43 ppl). If a pure quality classifier that ignores register\n had matched the balanced mix, the \"match the target mixture\" half of the claim\n would be unsupported."
}Edit result
The file /workspace/claim.md has been updated successfully. (file state is current in your context — no need to Read it back)
[metadata] {"filePath": "/workspace/claim.md", "oldString": "- Matching the register mix to the equal-parts target **raises** held-out PPL\n versus the same-budget prose-only top-k (I observed it neutral on dev: 360.2\n balanced vs 361.6 prose-only — within run-to-run noise — so balancing is\n justified by the *disclosed spec*, not by a dev gain; a large regression would\n falsify the \"match the target mixture\" half of the claim).", "newString": "- Adding the target's technical-QA register **raises** held-out PPL versus the\n same-budget prose-only top-k. Observed the opposite and strongly: prose-only 400\n vs QA-balanced 357 (−43 ppl). If a pure quality classifier that ignores register\n had matched the balanced mix, the \"match the target mixture\" half of the claim\n would be unsupported.", "originalFile": "# Claim: domain-classifier curation with register balancing beats random selection\n\n## Hypothesis\nUnder a fixed 12M-token training budget, selecting pool documents by their\n**resemblance to the disclosed multi-domain target** — scored with a bag-of-words\nlogistic-regression classifier trained to separate target text from random pool\ntext — and then **balancing the selected registers to the target's equal-parts\nmixture**, produces a 30M GPT with substantially lower held-out perplexity than a\nrandom selection of the same size. Concretely I predicted the classifier-selected\ncorpus would land well below the random baseline; measured on `multi_dev`:\n\n| selection (12M tokens) | dev held-out PPL |\n|-------------------------------------------------------|:----------------:|\n| bottom-scored anti-selection (falsification) | 1045.0 |\n| random pool (do-nothing baseline) | 462.5 |\n| classifier-ranked, prose-only (no QA balancing) | 400.4 |\n| **classifier-ranked + register-balanced (submitted)** | **356.6** |\n\n356.6 is **23% below** the random baseline. The submission is fully reproducible\nfrom `curate.py` at a fixed seed. A dev sweep over the QA token share isolates the\ntwo ingredients: **quality ranking** (random 462 → 400) and **register balancing**\n(400 → 357). The balancing sweep — qa_frac {0.00:400, 0.20:357, 0.25:370,\n0.28:364} — shows *including* technical-QA is a large, robust win over prose-only,\nwhile the exact fraction inside 0.20–0.28 is budget-tail noise; I take qa_frac=0.20\n(best, and my pool QA-detector under-counts prose-style Q&A, so 0.20 ≈ 25% true QA).\n\nThe positives are the dev target itself, recovered by GPT-2-decoding\n`multi_dev.npy` and de-normalizing the WikiText ` @-@ `/spaced-punctuation\nartifacts so the classifier keys on register/quality rather than a surface\ntokenization quirk absent from the raw pool.\n\n## Mechanism (predicts an observable *other* than the final perplexity)\nThe classifier assigns each document a scalar \"target-likeness\" score, and that\nscore is a **monotone predictor of a document's training value**. Two observables\nthat are *not* the final held-out perplexity:\n\n1. **Score-stratified training is monotone.** Train on the *lowest*-scored\n documents (same size, same quality gate) and the model should be **worse than\n random**, not merely less good than the top selection. Falsification-style\n check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection 356.6. The three points order top(357) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips).\n2. **Composition shift.** The selected corpus is visibly a different population\n from the pool: near-zero navigation/boilerplate/near-duplicate fragments, and\n its register mix is engineered to ~25% technical-QA / ~75% prose+news to match\n the dev token mix I measured (wiki-style 25% / news+web 50% / QA 26%). The raw\n pool, by contrast, is ~2% QA and dominated by low-score web chrome.\n\n## Falsification\nThe hypothesis is falsified if **any** of these hold:\n- Training on the bottom-scored documents yields PPL **≤ 462.5** (random). Then the\n score does not track training value and the win was luck / a length artifact.\n- Matching the register mix to the equal-parts target **raises** held-out PPL\n versus the same-budget prose-only top-k (I observed it neutral on dev: 360.2\n balanced vs 361.6 prose-only — within run-to-run noise — so balancing is\n justified by the *disclosed spec*, not by a dev gain; a large regression would\n falsify the \"match the target mixture\" half of the claim).\n- The score→PPL relationship is non-monotone across bins (e.g. mid-scored beats\n top-scored), which would mean the classifier is selecting on something\n orthogonal to LM quality.\n\n## Transfer\nThe recipe needs only (a) a pool and (b) *some* positive examples of the target\ndistribution; it is independent of this task's specifics.\n- **Other targets / pools:** swap the positives (decoded dev here; elsewhere a\n handful of in-domain docs) and the same classifier re-ranks any raw corpus —\n the standard GPT-3 / DSIR quality-classifier pattern.\n- **Larger budgets / models:** the ranking is budget-agnostic; a bigger budget\n just consumes further down the same ordered list. The register-balancing\n interleave holds its target proportion across *any* prefix, so it composes with\n the packer's cut point at any budget.\n- **Known mixtures:** whenever the eval mixture is disclosed, the balancing step\n generalizes — split the pool by register and hold each register's share to the\n target, which is the loss-minimizing allocation for a known test mixture.\n- **Cheap:** the whole pipeline is numpy + a linear model on an H100 in minutes;\n no labels, no internet, fully reproducible from a fixed seed.\n", "structuredPatch": [{"oldStart": 52, "oldLines": 11, "newStart": 52, "newLines": 11, "lines": [" The hypothesis is falsified if **any** of these hold:", " - Training on the bottom-scored documents yields PPL **≤ 462.5** (random). Then the", " score does not track training value and the win was luck / a length artifact.", "-- Matching the register mix to the equal-parts target **raises** held-out PPL", "- versus the same-budget prose-only top-k (I observed it neutral on dev: 360.2", "- balanced vs 361.6 prose-only — within run-to-run noise — so balancing is", "- justified by the *disclosed spec*, not by a dev gain; a large regression would", "- falsify the \"match the target mixture\" half of the claim).", "+- Adding the target's technical-QA register **raises** held-out PPL versus the", "+ same-budget prose-only top-k. Observed the opposite and strongly: prose-only 400", "+ vs QA-balanced 357 (−43 ppl). If a pure quality classifier that ignores register", "+ had matched the balanced mix, the \"match the target mixture\" half of the claim", "+ would be unsupported.", " - The score→PPL relationship is non-monotone across bins (e.g. mid-scored beats", " top-scored), which would mean the classifier is selecting on something", " orthogonal to LM quality."]}], "userModified": false, "replaceAll": false}encrypted chain-of-thought — recorded, not exposed
args
{
"replace_all": false,
"file_path": "/workspace/claim.md",
"old_string": " its register mix is engineered to ~25% technical-QA / ~75% prose+news to match\n the dev token mix I measured (wiki-style 25% / news+web 50% / QA 26%). The raw\n pool, by contrast, is ~2% QA and dominated by low-score web chrome.",
"new_string": " its register mix is engineered to ~20% (detector-tagged) technical-QA / ~80%\n prose+news to match the dev token mix I measured (wiki-style 25% / news+web 50%\n / QA 26%). The raw pool, by contrast, is ~2% QA and dominated by low-score web\n chrome."
}Edit result
The file /workspace/claim.md has been updated successfully. (file state is current in your context — no need to Read it back)
[metadata] {"filePath": "/workspace/claim.md", "oldString": " its register mix is engineered to ~25% technical-QA / ~75% prose+news to match\n the dev token mix I measured (wiki-style 25% / news+web 50% / QA 26%). The raw\n pool, by contrast, is ~2% QA and dominated by low-score web chrome.", "newString": " its register mix is engineered to ~20% (detector-tagged) technical-QA / ~80%\n prose+news to match the dev token mix I measured (wiki-style 25% / news+web 50%\n / QA 26%). The raw pool, by contrast, is ~2% QA and dominated by low-score web\n chrome.", "originalFile": "# Claim: domain-classifier curation with register balancing beats random selection\n\n## Hypothesis\nUnder a fixed 12M-token training budget, selecting pool documents by their\n**resemblance to the disclosed multi-domain target** — scored with a bag-of-words\nlogistic-regression classifier trained to separate target text from random pool\ntext — and then **balancing the selected registers to the target's equal-parts\nmixture**, produces a 30M GPT with substantially lower held-out perplexity than a\nrandom selection of the same size. Concretely I predicted the classifier-selected\ncorpus would land well below the random baseline; measured on `multi_dev`:\n\n| selection (12M tokens) | dev held-out PPL |\n|-------------------------------------------------------|:----------------:|\n| bottom-scored anti-selection (falsification) | 1045.0 |\n| random pool (do-nothing baseline) | 462.5 |\n| classifier-ranked, prose-only (no QA balancing) | 400.4 |\n| **classifier-ranked + register-balanced (submitted)** | **356.6** |\n\n356.6 is **23% below** the random baseline. The submission is fully reproducible\nfrom `curate.py` at a fixed seed. A dev sweep over the QA token share isolates the\ntwo ingredients: **quality ranking** (random 462 → 400) and **register balancing**\n(400 → 357). The balancing sweep — qa_frac {0.00:400, 0.20:357, 0.25:370,\n0.28:364} — shows *including* technical-QA is a large, robust win over prose-only,\nwhile the exact fraction inside 0.20–0.28 is budget-tail noise; I take qa_frac=0.20\n(best, and my pool QA-detector under-counts prose-style Q&A, so 0.20 ≈ 25% true QA).\n\nThe positives are the dev target itself, recovered by GPT-2-decoding\n`multi_dev.npy` and de-normalizing the WikiText ` @-@ `/spaced-punctuation\nartifacts so the classifier keys on register/quality rather than a surface\ntokenization quirk absent from the raw pool.\n\n## Mechanism (predicts an observable *other* than the final perplexity)\nThe classifier assigns each document a scalar \"target-likeness\" score, and that\nscore is a **monotone predictor of a document's training value**. Two observables\nthat are *not* the final held-out perplexity:\n\n1. **Score-stratified training is monotone.** Train on the *lowest*-scored\n documents (same size, same quality gate) and the model should be **worse than\n random**, not merely less good than the top selection. Falsification-style\n check run here: bottom-scored selection → **PPL 1045** vs random 462.5 and\n top-selection 356.6. The three points order top(357) < random(462) < bottom(1045),\n i.e. the score axis carries the causal signal — inverting it nearly triples\n perplexity, so the gain is not a length/dedup artifact shared by both tails\n (the bottom selection uses the *same* quality gate; only the score sign flips).\n2. **Composition shift.** The selected corpus is visibly a different population\n from the pool: near-zero navigation/boilerplate/near-duplicate fragments, and\n its register mix is engineered to ~25% technical-QA / ~75% prose+news to match\n the dev token mix I measured (wiki-style 25% / news+web 50% / QA 26%). The raw\n pool, by contrast, is ~2% QA and dominated by low-score web chrome.\n\n## Falsification\nThe hypothesis is falsified if **any** of these hold:\n- Training on the bottom-scored documents yields PPL **≤ 462.5** (random). Then the\n score does not track training value and the win was luck / a length artifact.\n- Adding the target's technical-QA register **raises** held-out PPL versus the\n same-budget prose-only top-k. Observed the opposite and strongly: prose-only 400\n vs QA-balanced 357 (−43 ppl). If a pure quality classifier that ignores register\n had matched the balanced mix, the \"match the target mixture\" half of the claim\n would be unsupported.\n- The score→PPL relationship is non-monotone across bins (e.g. mid-scored beats\n top-scored), which would mean the classifier is selecting on something\n orthogonal to LM quality.\n\n## Transfer\nThe recipe needs only (a) a pool and (b) *some* positive examples of the target\ndistribution; it is independent of this task's specifics.\n- **Other targets / pools:** swap the positives (decoded dev here; elsewhere a\n handful of in-domain docs) and the same classifier re-ranks any raw corpus —\n the standard GPT-3 / DSIR quality-classifier pattern.\n- **Larger budgets / models:** the ranking is budget-agnostic; a bigger budget\n just consumes further down the same ordered list. The register-balancing\n interleave holds its target proportion across *any* prefix, so it composes with\n the packer's cut point at any budget.\n- **Known mixtures:** whenever the eval mixture is disclosed, the balancing step\n generalizes — split the pool by register and hold each register's share to the\n target, which is the loss-minimizing allocation for a known test mixture.\n- **Cheap:** the whole pipeline is numpy + a linear model on an H100 in minutes;\n no labels, no internet, fully reproducible from a fixed seed.\n", "structuredPatch": [{"oldStart": 44, "oldLines": 9, "newStart": 44, "newLines": 10, "lines": [" (the bottom selection uses the *same* quality gate; only the score sign flips).", " 2. **Composition shift.** The selected corpus is visibly a different population", " from the pool: near-zero navigation/boilerplate/near-duplicate fragments, and", "- its register mix is engineered to ~25% technical-QA / ~75% prose+news to match", "- the dev token mix I measured (wiki-style 25% / news+web 50% / QA 26%). The raw", "- pool, by contrast, is ~2% QA and dominated by low-score web chrome.", "+ its register mix is engineered to ~20% (detector-tagged) technical-QA / ~80%", "+ prose+news to match the dev token mix I measured (wiki-style 25% / news+web 50%", "+ / QA 26%). The raw pool, by contrast, is ~2% QA and dominated by low-score web", "+ chrome.", " ", " ## Falsification", " The hypothesis is falsified if **any** of these hold:"]}], "userModified": false, "replaceAll": false}The submission file is byte-identical to the candidate that scored 356.6, and the frozen training script is deterministic (seed 1337, fixed data), so a re-eval would return exactly 356.6 — I'll skip the redundant run. Let me do a final verification of all deliverables.
args
{
"command": "cd /workspace; echo \"=== deliverables present ===\"; ls -la submission/selection.json curate.py claim.md\necho; echo \"=== selection.json validity ===\"\npython3 -c \"\nimport json\ns=json.load(open('submission/selection.json'))\nassert isinstance(s,list) and all(isinstance(x,int) for x in s)\nassert len(s)==len(set(s)); assert min(s)>=0 and max(s)<182016\nprint(f'{len(s)} priority-ordered ids, unique, in [0,182016); first 5: {s[:5]}')\n\"\necho; echo \"=== curate.py imports cleanly ===\"\npython3 -c \"import ast; ast.parse(open('curate.py').read()); print('curate.py parses OK')\"\necho; echo \"=== claim.md sections ===\"\ngrep -E \"^## \" claim.md\necho REMAIN:; cat .timer/remaining_secs",
"description": "Final verification of all deliverables"
}Bash result
=== deliverables present ===
-rw-r--r-- 1 root root 5114 Aug 4 04:17 claim.md
-rw-r--r-- 1 root root 8758 Aug 4 04:17 curate.py
-rw-r--r-- 1 root root 192433 Aug 4 04:17 submission/selection.json
=== selection.json validity ===
27608 priority-ordered ids, unique, in [0,182016); first 5: [59703, 5347, 76107, 8524, 3196]
=== curate.py imports cleanly ===
curate.py parses OK
=== claim.md sections ===
## Hypothesis
## Mechanism (predicts an observable *other* than the final perplexity)
## Falsification
## Transfer
REMAIN:
2093
[stdout]
=== deliverables present ===
-rw-r--r-- 1 root root 5114 Aug 4 04:17 claim.md
-rw-r--r-- 1 root root 8758 Aug 4 04:17 curate.py
-rw-r--r-- 1 root root 192433 Aug 4 04:17 submission/selection.json
=== selection.json validity ===
27608 priority-ordered ids, unique, in [0,182016); first 5: [59703, 5347, 76107, 8524, 3196]
=== curate.py imports cleanly ===
curate.py parses OK
=== claim.md sections ===
## Hypothesis
## Mechanism (predicts an observable *other* than the final perplexity)
## Falsification
## Transfer
REMAIN:
2093
[metadata] {"noOutputExpected": false}All deliverables valid. I have ~35 min, so let me run one authoritative confirmation eval directly on the submitted file (rather than relying on the identical-candidate argument) to report a clean, faithful number.
args
{
"command": "cd /workspace; export TOKENIZERS_PARALLELISM=false\necho \"=== authoritative eval on submission/selection.json ===\"\nbash dev_eval.sh /workspace/submission/selection.json 2>&1 | grep -E \"HELDOUT_PPL|packed\"\necho REMAIN:; cat .timer/remaining_secs",
"description": "Authoritative final eval on submitted file",
"run_in_background": true
}Bash result
Command running in background with ID: bxzgi5fq9. Output is being written to: /tmp/claude-0/-workspace/ecb1feaa-77c8-46ab-b37a-9020f62d37d0/tasks/bxzgi5fq9.output. You will be notified when it completes. To check interim output, use Read on that file path.
Session cwd remains /workspace; directory changes made by the backgrounded command do not apply to subsequent commands.
[metadata] {"noOutputExpected": false, "backgroundTaskId": "bxzgi5fq9", "backgroundCwdHint": "Session cwd remains /workspace; directory changes made by the backgrounded command do not apply to subsequent commands."}encrypted chain-of-thought — recorded, not exposed
args
{
"command": "sleep 115; cat /tmp/claude-0/-workspace/ecb1feaa-77c8-46ab-b37a-9020f62d37d0/tasks/bxzgi5fq9.output 2>/dev/null | grep -E \"HELDOUT_PPL|packed\"; echo REMAIN:; cat /workspace/.timer/remaining_secs",
"description": "Get authoritative eval result"
}Bash result
packed 12000000 tokens from 27608 ids -> /tmp/dev_train.npy
HELDOUT_PPL 356.578 loss 5.8766 train_s 56 /tmp/dev_train.npy
REMAIN:
1963
[stdout]
packed 12000000 tokens from 27608 ids -> /tmp/dev_train.npy
HELDOUT_PPL 356.578 loss 5.8766 train_s 56 /tmp/dev_train.npy
REMAIN:
1963
[metadata] {"noOutputExpected": false}Authoritative eval on the submitted file confirms 356.578 — exactly matching the candidate. All deliverables are complete and consistent. Let me close out the task.
args
{
"taskId": "4",
"status": "completed"
}TaskUpdate result
Updated task #4 status
[metadata] {"success": true, "taskId": "4", "updatedFields": ["status"], "statusChange": {"from": "in_progress", "to": "completed"}}Done. All three deliverables are complete, validated, and mutually consistent.
Result
| Selection (12M-token budget) | Dev held-out PPL |
|---|---|
| Bottom-scored anti-selection (falsification) | 1045.0 |
| Random baseline (do-nothing reference) | 462.5 |
| Quality-ranked, prose-only (no register balancing) | 400.4 |
| Submitted: quality-ranked + register-balanced | 356.6 |
356.6 is 23% below the random baseline, confirmed by an authoritative eval on the exact submitted file.
Method (in curate.py)
- Recover the target as text: GPT-2-decode
multi_dev.npyand de-normalize the WikiText@-@/spaced-punctuation artifacts → ~2,700 positive examples of the disclosed domain. - Domain classifier: a bag-of-words (word uni+bigram) logistic regression, trained target-vs-random-pool in torch on the H100 (no sklearn available). Scores all 182k docs by target-likeness.
- Quality gates + dedup: keep 200–60k-char docs, drop near-duplicates.
- Register balancing: interleave two score-sorted streams to hold ~20% of the budget as technical-QA/code (the register a single classifier under-ranks), matching the target's equal-parts mixture across any budget prefix.
What the experiments established
- The classifier score is a causal, monotone predictor of training value: inverting it (bottom-scored docs, same quality gate) nearly triples perplexity (1045 vs 357) — the gain is not a length/dedup artifact.
- The win decomposes cleanly: quality ranking (462→400) + register balancing (400→357). A qa_frac sweep {0.00:400, 0.20:357, 0.25:370, 0.28:364} shows including QA is the large robust effect; the exact fraction is budget-tail noise, so I took the best-validated 0.20.
Deliverables
/workspace/submission/selection.json— 27,608 priority-ordered, unique, in-range ids (~20M tokens; fills the 12M budget with margin)./workspace/curate.py— reproducible end-to-end from the stated criterion (fixed seed;python3 curate.pyregenerates it)./workspace/claim.md— Hypothesis / Mechanism (predicts the score→PPL ordering, an observable other than final PPL) / Falsification / Transfer.
~33 min of budget remain, but the method is at its ceiling — further config tweaks land inside the 357–370 dev-noise band and would only overfit the dev set, so I'm stopping here rather than chase noise.