# Reproducibility report — WP38 - **Pipeline:** `Makefile` targets `ingest clean match validate features models robust tables figures paper`; `WP38_LABEL=model` reruns the label-dependent targets into `data/processed_model/`, `experiments_model/`, `paper/tables_model/`, `paper/figures_model/`. - **Determinism:** seed 20261101 for every permutation, bootstrap and sample; outputs hashed in `logs/manifest.json`; every step appends to `logs/run_ledger.jsonl`. - **Snapshot identity:** `config/settings.yaml` holds the sha256 of the raw snapshot; `src/ingest/load_snapshot.py` asserts it before reading. - **LLM dependence:** category audit (claude-opus-5-5 + gpt-5.5), match validation (same), classifier training labels (claude-sonnet-5-5), embeddings (text-embedding-3-small). All labels/embeddings are cached (`data/processed/*.csv`, `data/interim/listing_embeddings.npy`); the pipeline runs without API keys once they exist. Costs and token counts per run are in the ledger. - **External data:** `src/ingest/external.py` rebuilds `data/external/regions_external.csv` from the manifest URLs with checksums; large GeoPackages and downloads are not committed (`data/external/dl/`, `data/external/geo/`). - **Tests:** `make test` (7 invariants: monotone sample flow, price-sample subset, one representative per (store, title), no sibling duplicates, canonical regions, store/listing count consistency, cross-store matches only). - **Paper:** `cd paper && latexmk -pdf main.tex`; tables and figures are generated files and are never edited by hand.