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