# Verification checks (P4) 1. Clean re-run: deleted results.json/forecasts.csv/exclusions.csv, re-ran analysis.py; results.json byte-identical to previous run — PASS. 2. Independent ridge implementation (augmented least squares, separately built features) at origins 2021-09, 2023-06, 2026-08: max |diff| 3.9e-11 — PASS. 3. Leakage test: multiplying all data dated > t by 7 and adding 100 leaves ridge forecasts unchanged (diff 0.0) at the 3 origins — PASS. 4. Naive forecasts equal ip_growth at origin; actuals equal ip_growth at target month — PASS. 5. forecasts.csv: 180 rows, 60 per model; target_date > origin_date for all rows — PASS. 6. RMSE ≥ MAE > 0 for each model; rel_improvement identities hold — PASS. 7. n_analysed = 413 = 417 − 2 − 2 (exclusion ledger sums) — PASS. 8. 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. 9. Gate run — see phases.json P4.