| Clean re-run (deleted results.json, forecasts.csv, exclusions.csv; re-ran analysis.py) gives byte-identical results.json and forecasts.csv |
PASS |
| forecasts.csv has 192 rows, 48 per (model, horizon) |
PASS |
| target_date = origin_date + horizon months for all rows |
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 |
| actual equals data gdp_yoy of target month |
PASS |
| naive forecast equals gdp_yoy(t−2) |
PASS |
| MAE ≤ RMSE for each model/horizon |
PASS |
| rel_improvement = 1 − rmse_model/rmse_naive (diff ≤ 4e-7, rounding) |
PASS |
| exclusions: n_before − n_after = n_removed; 345 − Σremoved = n_analysed (h1: 310) and n_analysed_h3 (306) |
PASS |
| last_target_date_available = 2026-02-01, last_predictor_date_available = 2026-03-01 for origin 2026-04-01 |
PASS |
| Magnitudes: model RMSE within ~10–25% of naive, plausible; last-origin coefficients plausible (AR coef 0.66–0.82) |
PASS |