Training Corpus Diagnostics is a small public toolkit and reproducibility package for measuring corpus-level structure before training. The first calibrated release accompanies the paper “Lens Effects: Structured Geometry in Training Corpora.”
The release contains the retained 14-corpus panel, cached embeddings, paper-facing result JSON, stability artifacts, figures, and scripts for verifying, recomputing, substituting, and submitting corpus diagnostics.
Zenodo DOI for release v0.1.2: 10.5281/zenodo.20722420. Concept DOI for all versions: 10.5281/zenodo.20720130.
Publication notes for the first public preprint, arXiv positioning, endorsement packet, and DOI handoff live in PUBLISHING.md.
From the repo root:
python scripts/verify_release_artifacts.pyExpected result:
[done] release artifact verification passed
This verifier checks committed paper-facing values. It does not download models, rebuild embeddings, or rerun the long bootstrap.
paper/: manuscript and appendix snapshots.data/corpus_manifest.json: retained 14-corpus panel manifest.data/chunks/: retained 2048-chunk samples.data/embeddings/: cached GTE c768 embeddings aligned row-for-row with chunks.results/final_matrix/: paper-facing metrics, sweeps, mixtures, and continuous embedding sensitivity.stability/: bootstrap, leave-one-out, same-corpus split, and semantic-k summaries.figures/: rendered manuscript figures in PNG, PDF, and SVG.paper/lens_effects_preprint.pdf: formatted LaTeX preprint PDF.paper/latex/: LaTeX manuscript source and local build output.paper/arxiv/: self-contained arXiv source bundle.configs/: public source recipes and local-source templates.scripts/: artifact builder, matrix runner, mixture runner, verifier, figure generator, scorecard packager, and scorecard validator.scorecard/: public registry and submission process for additional corpora.
Run the verifier:
python scripts/verify_release_artifacts.pyInspect the retained data:
data/README.mddata/chunk_length_summary.mddata/upstream_dataset_provenance.mdrelease_integrity_manifest.json
Recompute the matrix from retained chunks and cached embeddings:
python scripts/run_corpus_matrix.py \
--manifest data/corpus_manifest.json \
--out-dir recomputedThe matrix runner writes:
corpus_matrix.jsonfamily_summary.jsonstandalone_summary.jsondirectional_lexical_sensitivity.jsonsummary.md
The GPT-2 half of textual recomputation uses a pinned Hugging Face revision. See environment/tokenizer_dependency.md for cache/network details.
Copy configs/example_local_sources.json and edit it for your data. Local JSONL and text-glob sources are supported; Hugging Face streaming sources are supported through the public builder.
Build chunks:
python scripts/build_corpus_artifacts.py build-chunks \
--sources my_sources.json \
--out-root my_scorecard_runBuild embeddings:
python scripts/build_corpus_artifacts.py build-embeddings \
--manifest my_scorecard_run/corpus_manifest.generated.json \
--out-root my_scorecard_run \
--model-name Alibaba-NLP/gte-base-en-v1.5Run the matrix:
python scripts/run_corpus_matrix.py \
--manifest my_scorecard_run/corpus_manifest.generated.json \
--out-dir my_scorecard_run/matrixFor a single new corpus, include it in a manifest alongside reference corpora with role: "candidate" and stage_role: "unlabeled". Candidate pairs are written as candidate_pair rows and are excluded from the retained broad/targeted family summaries.
Package a scorecard submission:
python scripts/package_scorecard_submission.py \
--manifest my_scorecard_run/corpus_manifest.generated.json \
--matrix-dir my_scorecard_run/matrix \
--labels my_new_corpus \
--source-config my_sources.json \
--artifact-url https://example.org/my_new_corpus_scorecard_submission.zip \
--artifact-sha256 <sha256-of-zip> \
--out-dir my_new_corpus_scorecard_submission \
--zipOpen a pull request that adds the generated scorecard_entry.json under scorecard/registry/entries/<label>.json and updates scorecard/registry/index.json. Do not commit full chunks or embeddings for new scorecard submissions; host the full bundle externally and record its SHA-256 digest.
Validate before opening the PR:
python scripts/validate_scorecard_submission.py --registry scorecard/registrySee scorecard/README.md and CONTRIBUTING.md for status tiers and agent review criteria.
To pull a fresh randomized sample from the public 14-corpus recipe:
python scripts/build_corpus_artifacts.py build-chunks \
--sources configs/paper_panel_sources_randomized_2048.json \
--out-root reproduced_dataThen embed:
python scripts/build_corpus_artifacts.py build-embeddings \
--manifest reproduced_data/corpus_manifest.generated.json \
--out-root reproduced_data \
--model-name Alibaba-NLP/gte-base-en-v1.5 \
--batch-size 16 \
--max-length 512Then recompute:
python scripts/run_corpus_matrix.py \
--manifest reproduced_data/corpus_manifest.generated.json \
--out-dir reproduced_matrixThe retained builder keeps chunks up to 768 characters and discards chunks shorter than max(64, chunk_chars // 4), which is 192 characters under the paper setting. The matched budget is 2048 retained chunks per corpus, not an exactly equal total-character budget.
Exact equality to the retained sample should only be expected when upstream dataset revisions, source access behavior, shuffle implementation, and sampling parameters match the release recipe.
Semantic cluster-count stability:
python scripts/run_semantic_k_stability.py \
--manifest data/corpus_manifest.json \
--out-dir stabilityDirected post-training mixture panel:
python scripts/run_mixture_panel.py \
--manifest data/corpus_manifest.json \
--out-dir results/final_matrix/mixturesBootstrap, leave-one-out, and same-corpus split stability:
python scripts/run_bootstrap_hardening.py \
--manifest data/corpus_manifest.json \
--scorecard-dir results/final_matrix/recomputed \
--out-dir stability \
--bootstrap-semantic-mode fixedContinuous embedding ceiling sensitivity:
python scripts/run_continuous_embedding_sensitivity.py \
--manifest data/corpus_manifest.json \
--corpus-matrix results/final_matrix/recomputed/corpus_matrix.json \
--out-json results/final_matrix/continuous_embedding_sensitivity.json \
--out-md results/final_matrix/continuous_embedding_sensitivity.mdRegenerate figures:
python scripts/make_figures.pyBuild the formatted LaTeX preprint PDF:
python scripts/build_preprint_pdf.pyThe release preserves the paper's matched-sample corpus panel and measurement design. The scripts support artifact verification, panel substitution, corpus diagnostics, and scorecard submissions. They do not make downstream causal claims.
Important metric convention: compression, spectral top1, and spectral top5 family comparisons use standalone-derived absolute pairwise differences. Do not use signed directional family means for those quantities.