| Clean re-run (deleted outputs, re-ran analysis.py): results.json and forecasts.csv byte-identical |
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 months |
PASS |
| actual equals gdp_yoy of target month in data |
PASS |
| naive forecast equals gdp_yoy(t−2) |
PASS |
| exclusion ledger: 345 − 35 removed = 310 = n_analysed |
PASS |
| RMSE ≥ MAE > 0 for all four error pairs |
PASS |
| rel_improvement = 1 − rmse_model/rmse_naive |
PASS |
| In-script assertions (48 origins, info cut-offs, 48 errors per series) |
PASS |
| Magnitudes: model RMSE within ~10–20% of naive; naive h3 > naive h1 as expected |
PASS |