1# Verification checks (P4), 2026-10-302| # | check | outcome |3|---|---|---|4| 1 | Clean re-run (deleted results.json, forecasts.csv, exclusions.csv) reproduces byte-identical SHA-256 of results.json and forecasts.csv | PASS |5| 2 | forecasts.csv: 180 rows, 60 per model, horizon=1, target_date = origin+1 month | PASS |6| 3 | `actual` equals data ip_growth at target month; naive equals ip_growth at origin | PASS |7| 4 | Independent ridge recomputation (augmented least squares, separate feature construction) at origins 2021-09, 2024-01, 2026-08 matches to <1e-8 | PASS |8| 5 | Expanding mean at 2021-09 recomputed independently | PASS |9| 6 | RMSE/MAE recomputed from forecasts.csv; MAE ≤ RMSE for all models | PASS |10| 7 | rel_improvement identities 1 − RMSE_ridge/RMSE_base hold | PASS |11| 8 | DM statistic signs agree with RMSE ordering | PASS |12| 9 | Exclusion ledger: 417 − 2 − 2 = 413 = n_analysed = training rows at last origin | PASS |13| 10 | Leakage test: multiplying all values dated > 2024-01 by 7 and adding 100 leaves every forecast at origins ≤ 2024-01 unchanged (later ones change) | PASS |14| 11 | Script asserts: no NaN in training X/y; last training row s satisfies s+1 ≤ t | PASS (asserts did not fire) |15| 12 | Magnitudes: RMSEs 0.54–0.88 %/month vs full-sample SD of ip_growth 1.04 (inflated by 2020); plausible | PASS |16