| Clean re-run of out/analysis.py (deleted results.json, forecasts.csv, exclusions.csv) regenerates byte-identical results.json and forecasts.csv |
PASS |
| forecasts.csv has 192 rows, 48 per (model, horizon) |
PASS |
| last_target_date_used <= origin − 2 months for all rows |
PASS |
| last_predictor_date_used <= origin − 1 month for model rows; empty for naive |
PASS |
| target_date = origin + h for all rows |
PASS |
| actual equals data gdp_yoy of target month |
PASS |
| MAE <= RMSE for every model/horizon; RMSEs positive |
PASS |
| rel_improvement = 1 − rmse_model/rmse_naive |
PASS |
| Exclusion ledger: 345 − (12+7+3+25) = 298 = n_analysed (asserted in script) |
PASS |
| In-script asserts: plug-in values are the latest available obs (y at t−2, e at t−1) |
PASS |
| Magnitudes vs baseline: model RMSE 0.74/0.88 vs naive 0.81/1.14 pp — same order, plausible |
PASS |
| Sensitivity (no COVID exclusion) changes ranking of improvement across horizons (h1 0.027, h3 0.319) |
NOTED, reported in report |