1# Reproducibility report — WP37 (2026-11-01)23## 1. Full re-run from the raw snapshot4After the manuscript was compiled, the entire pipeline was re-executed from the checksummed raw snapshot with5`make ingest panel match validate phase4 phase5 robust tables figures` (log: `logs/rerun/full_rerun.log`). The JSON summaries of6every model (`experiments/*.json`) were hashed before and after (`logs/rerun/before_sha256.txt`, `after_sha256.txt`):78| Summary | Changed keys (excluding NaN≠NaN artefacts) |9|---|---|10| modelA, modelB, modelC, modelD, modelE, robustness | 0 — byte-identical |11| modelF, qgpai | 0 numerical differences (only NaN fields compare unequal by definition) |1213Determinism holds: fixed seed 20261101 for the bootstrap, permutation placebo, basket sampling, LightGBM; DuckDB and pandas14operations are order-stable.1516One incident was found by the re-run and fixed: the `match` step regenerated the validation sample file and overwrote the17annotated labels (the file is in the git-ignored `data/processed/`). The sample itself is deterministic (identical 240 pairs); the18LLM annotation was re-run (same model, labels compared with the archived round-1 file), the operator labels were re-applied, the19matching step now refuses to overwrite an annotated sample, and the annotated CSVs are force-added to git.2021## 2. Independent recomputation (`src/audit/independent_recompute.py` → `reports/audit_recompute.json`)22A second implementation, using DuckDB SQL from the raw event log and statsmodels instead of the pipeline's pandas/pyfixest code,23reproduces the central statistics:2425| Quantity | Pipeline | Independent | Note |26|---|---|---|---|27| Weekly modal price (880 072 listing-weeks) | — | 99.98 % identical | residual: tie-breaking at equal durations |28| H1 median cross-banner log gap | 0.1542 | 0.1542 | 30 571 vs 30 042 group-weeks (SQL version does not drop unrealistic-price flags) |29| H1 cross-company median gap | 0.1825 | 0.1825 | |30| AR(1) of banner-pair gaps | 0.663 (0.014) | 0.669 (0.014) | pyfixest vs statsmodels cluster-robust OLS |31| Super C effect vs Metro | −0.100 (0.003) | −0.102 (0.004) | pairwise within-estimator on 35 430 obs |32| Maxi / Club Entrepôt / Provigo vs Metro | −0.184 / −0.136 / −0.043 | −0.248 / −0.177 / −0.053 | pairwise direct comparisons (n = 948 / 790 / 1 044) vs full two-way FE using all groups; same sign and ordering, magnitudes differ on these small direct subsamples |33| Promotion share (storefront, ≥ 8 weeks) | 0.0457 | 0.0458 | |34| Volatility ratio raw / reference | 1.922 | 1.915 | |35| Chained Jevons, storefront | +0.28 % (all listings) | +0.09 % (≥ 8-week listings) | different samples by construction |3637## 3. Source-count validation38`tests/test_outputs.py` ties the processed tables to the snapshot (124 579 listings, 50 760 active, 300 613 events), checks index39bases, basket monotonicity in K, forecast origins and QGPAI shape. 15 tests pass (`make test`).4041## 4. Environment42Python 3.12.x (uv), `requirements-lock.txt` (97 pinned packages; `pulp<3` required), TeX Live 2026 / latexmk 4.88, macOS 27.43Wall-clock for the full pipeline on an 18-core laptop: ≈ 10 minutes (Model A ≈ 3 min, Model F ≈ 2 min).4445## 5. Gates46| Gate | Status |47|---|---|48| Re-run identical | **pass** |49| Independent recomputation of central coefficients | **pass** (sign, order and magnitude for primary statistics; direct-pair banner effects differ in magnitude as expected) |50| Source counts | **pass** |51| Citation integrity | **pass** (75/75 resolved; `references.bib` generated) |52| Human adjudication of validation labels | **pending** (operator review only) |53| Publication-ready | **no** — working paper status; see `referee_1.md`, `referee_2.md`, `limitations.md` |54