# Verification checks (P4) — 2026-10-30 | # | check | outcome | |---|---|---| | 1 | Clean re-run (deleted results.json, forecasts.csv, exclusions.csv) regenerates byte-identical results.json and forecasts.csv | PASS (cmp identical) | | 2 | forecasts.csv has 180 rows, 60 per model, horizon always 1 | PASS | | 3 | origin_date < target_date for every row; first_origin 2021-09-01 < last_origin 2026-08-01 | PASS | | 4 | Independent ridge implementation (augmented least squares, explicit loops) matches script forecasts | PASS (max abs diff 4.7e-11) | | 5 | Naive and expanding-mean baselines recomputed independently | PASS (max diff 0 / 5.0e-11). Note: a first attempt showed 1.8e-3 diff caused by an off-by-one bug in the *checker* (mean started 1992-05); corrected checker confirms the script. | | 6 | Leakage test: all data after 2024-01 multiplied by 3 and shifted by +7; forecasts for the 29 origins ≤ 2024-01 unchanged | PASS — no future information used, scaling stats recomputed per origin | | 7 | RMSE/MAE recomputed from forecasts.csv; RMSE ≥ MAE for each model; RMSE > 0 | PASS | | 8 | rel_improvement identities 1 − rmse_ridge/rmse_baseline | PASS | | 9 | Exclusion ledger: 417 − 2 − 2 = 413 = n_analysed (training rows at last origin) | PASS | | 10 | Magnitudes: RMSEs 0.54–0.88 %/month, comparable to sd of ip_growth excl. COVID; ridge between the two baselines | PASS (plausible) | | 11 | Input SHA-256 matches README / bundle.json | PASS |