1# WP37 — reproducible pipeline (run from the project root; requires the authorised snapshot in data/raw/)2PY := .venv/bin/python3.PHONY: all env ingest panel match validate phase1 phase4 phase5 robust tables figures paper test clean45all: ingest panel match validate phase4 phase5 robust tables figures paper67env:8 uv venv --python 3.12 .venv && uv pip install --python $(PY) -e .910ingest:11 $(PY) -m src.ingestion.load_snapshot && $(PY) -m src.ingestion.statcan1213panel:14 $(PY) -m src.cleaning.retailers && $(PY) -m src.cleaning.build_panel1516match:17 $(PY) -m src.matching.calibrate_thresholds && $(PY) -m src.matching.match_products && $(PY) -m src.matching.recall_gtin1819validate: # LLM second annotation requires ANTHROPIC_API_KEY in .env; operator labels are kept in the CSV20 $(PY) -m src.matching.validation_report && $(PY) -m src.cleaning.coverage && $(PY) -m src.reports.phase1_audit2122phase4:23 $(PY) -m src.econometrics.build_matched_panel && $(PY) -m src.econometrics.model_a_dispersion && $(PY) -m src.econometrics.model_b_promotions \24 && $(PY) -m src.econometrics.model_c_spillovers && $(PY) -m src.indices.price_indices && $(PY) -m src.indices.basket_optimization && $(PY) -m src.forecasting.rolling_forecast2526phase5:27 $(PY) -m src.indices.qgpai2829robust:30 $(PY) -m src.econometrics.robustness3132tables figures:33 $(PY) -m src.reports.make_tables && $(PY) -m src.reports.make_figures3435paper:36 cd paper && latexmk -pdf -interaction=nonstopmode main.tex3738test:39 $(PY) -m pytest -q4041clean:42 cd paper && latexmk -C43