Verification checks (P4)
- Clean re-run: deleted results.json/forecasts.csv/exclusions.csv, re-ran analysis.py; results.json byte-identical to previous run — PASS.
- Independent ridge implementation (augmented least squares, separately built features) at origins 2021-09, 2023-06, 2026-08: max |diff| 3.9e-11 — PASS.
- Leakage test: multiplying all data dated > t by 7 and adding 100 leaves ridge forecasts unchanged (diff 0.0) at the 3 origins — PASS.
- Naive forecasts equal ip_growth at origin; actuals equal ip_growth at target month — PASS.
- forecasts.csv: 180 rows, 60 per model; target_date > origin_date for all rows — PASS.
- RMSE ≥ MAE > 0 for each model; rel_improvement identities hold — PASS.
- n_analysed = 413 = 417 − 2 − 2 (exclusion ledger sums) — PASS.
- Magnitudes: RMSE of mean (0.544) and ridge (0.561) much below naive (0.883), consistent with ip_growth being noisy with weak persistence post-2021 — plausible.
- Gate run — see phases.json P4.