The priority order is deliberate: establish trustworthy evaluation and a strong retrieval floor before investing in larger models.
Phase 0 โ Ground truth and infrastructure
[x] P0 Download the current train.parquet release from Kaggle.
[x] P0 Record file size, SHA-256, Kaggle metadata and download timestamp in manifests/.
[x] P0 Inspect the actual training schema, row groups, library counts and identity counts.
[x] P0 Add a low-RAM data access path using PyArrow row-group streaming and selected columns.
[x] P0 Create a pinned RDKit 2026.03.3 environment for scorer-compatible identity matching.
[x] P0 Implement tautomer-canonicalized InChIKey14 identity logic in src/identity.py.
[x] P0 Add scorer unit tests for tautomer equivalence, stereochemistry, invalid SMILES and rank cutoff.
[x] P0 Implement all ten advertised adduct mass conversions and round-trip tests.
[x] P0 Freeze molecule-grouped validation manifests for library, database-only and novelty-proxy regimes. Scorer-compatible five-fold manifest plus strict PubChem structure-only and scaffold-disjoint proxy manifests with frozen leakage rules are complete; operational exclusion checks belong to Phase 1 evaluation.
[x] P1 Add a reproducible experiment configuration format under configs/.
Resource constraint: the local development host has approximately 11 GiB RAM. Full-data operations must stream or use bounded artifacts; do not load the entire training table into pandas.
Gate G0: CLOSED under the documented bounded-external-audit scope. PubChem results are proxies, not claims about the full hidden-test novelty distribution.
Phase 1 โ Spectral retrieval baseline
[x] P0 Build a streaming Parquet reader and compact peak-array representation.
[x] P0 Implement precursor/adduct to neutral-mass filtering.
[x] P0 Build an indexed reference search over training spectra. Disk-backed float32 arrays built from all 2,539,608 rows; 2,160,035 valid spectra indexed.
[x] P0 Aggregate evidence across all spectra for each molecule_id. The local writer scored 1,213 spectra and aggregates maximum identity evidence across 400 molecules.
[x] P0 Deduplicate candidates by scorer-compatible identity. Candidate pools are keyed by scorer identity14 before ranking.
[x] P0 Generate and validate a first local submission file. submissions/phase1-retrieval-molecule.csv passes the 400-ID sample contract with 1โ25 candidates per row.
Prevent spectral/structure leakage in local validation
Deterministic 5-fold manifest validated: 275,810 groups and 2,539,608 rows; fold assignment is group-exclusive
Use fold 0 as initial validation; keep novelty labels separate
2026-09-16
G0 data/infrastructure gate
Confirm reproducible Phase 0 inputs and assumptions
All eight gate checks passed; config and split hashes recorded in manifests/phase0-gate.json
Close data/infrastructure work; proceed to retrieval baseline
2026-09-16
Phase 0 audit
Verify that validation grouping uses scorer identity
Failed: 12/100 sampled normalized SMILES differed between stored and scorer-derived InChIKey14; full probe hit pathological tautomer enumeration
Reopen G0; rebuild identity-safe split before retrieval evaluation
2026-09-16
Phase 0 corrective audit
Verify corrected scorer-identity split and reproducibility gate
Passed: 8 tests; compilation passed; 2,539,608 rows and 274,288 scorer groups validated; cache/checkpoint agree; full G0 gate passed; 100-row identity probe had 0 invalid structures
Proceed to retrieval baseline; retain external novelty regimes as pending
2026-09-16
Phase 1 retrieval baseline
Build a low-memory, identity-safe spectral retrieval floor
Index built over all 2,539,608 rows; 2,160,035 valid spectra; fold-0 mask excludes all 503,842 held-out rows; molecule-level fixture submission has 400/400 covered molecules and passes schema/count checks
Keep baseline; run grouped MRR/Top-1/Recall evaluation before closing G1
Blockers and decisions
Current blocker: database-only and novelty-proxy validation labels require an external structure/scaffold audit; known-library regime is ready.
Do not start: large model training before G0 scorer, split and data-manifest gates pass.
Do not submit: until the first local output passes scorer-compatible validation and offline packaging checks.