# Verification checks (P4) | check | outcome | |---|---| | 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 |