1# Verification checks (P4)23Run on 2026-10-30. Script: out/state/verify.py (independent re-implementation, positional slicing of raw data ≤ t).45| check | outcome |6|---|---|7| forecasts.csv has 180 rows, 60 per model, horizon=1, target=origin+1 month, origins 2021-09-01..2026-08-01 | PASS |8| independent re-implementation (numpy, raw data sliced to ≤ t, explicit inverse) reproduces all ridge/mean/naive forecasts and actuals | PASS (max abs diff 4.96e-11) |9| RMSE/MAE recomputed from forecasts.csv equal results.json (tol 1e-9; CSV has 10 decimals) | PASS (first attempt used 1e-12 tolerance and failed only because of CSV rounding; tolerance corrected) |10| RMSEs positive, RMSE ≥ MAE for each model | PASS |11| rel_improvement identities 1 − rmse_ridge/rmse_base | PASS |12| exclusion ledger: 417 − 2 − 2 = 413 = n_analysed; first-origin training rows 354 (1992-03..2021-08) | PASS |13| Leakage test: all values dated after 2023-06 replaced by 999 in a temp copy; forecasts for origins ≤ 2023-06 unchanged (max diff 0.0), later origins changed | PASS |14| Clean re-run (deleted outputs, re-ran analysis.py): results.json and forecasts.csv byte-identical | PASS |15| Chronology first_origin < last_origin; all training label dates ≤ origin (assert in analysis.py) | PASS |16| Magnitudes vs baseline: ridge RMSE 0.561 between mean 0.544 and naive 0.883; plausible for monthly IP growth (sd ≈ 1.04 full sample incl. COVID) | PASS |17