| 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 |