1# Verification checks (P4)2| check | outcome |3|---|---|4| Clean re-run (deleted outputs, re-ran analysis.py): results.json and forecasts.csv byte-identical | PASS |5| forecasts.csv has 192 rows, 48 per (model, horizon) | PASS |6| last_target_date_used <= origin−2 months for all rows | PASS |7| last_predictor_date_used <= origin−1 month for model rows; empty for naive | PASS |8| target_date = origin + h months | PASS |9| actual equals gdp_yoy of target month in data | PASS |10| naive forecast equals gdp_yoy(t−2) | PASS |11| exclusion ledger: 345 − 35 removed = 310 = n_analysed | PASS |12| RMSE ≥ MAE > 0 for all four error pairs | PASS |13| rel_improvement = 1 − rmse_model/rmse_naive | PASS |14| In-script assertions (48 origins, info cut-offs, 48 errors per series) | PASS |15| Magnitudes: model RMSE within ~10–20% of naive; naive h3 > naive h1 as expected | PASS |16