1# Verification checks (P4)2| check | outcome |3|---|---|4| Clean re-run (deleted results.json, forecasts.csv, exclusions.csv; re-ran analysis.py) gives byte-identical results.json and forecasts.csv | PASS |5| forecasts.csv has 192 rows, 48 per (model, horizon) | PASS |6| target_date = origin_date + horizon months for all rows | PASS |7| last_target_date_used ≤ origin − 2 months for all rows | PASS |8| last_predictor_date_used ≤ origin − 1 month for model rows; empty for naive | PASS |9| actual equals data gdp_yoy of target month | PASS |10| naive forecast equals gdp_yoy(t−2) | PASS |11| MAE ≤ RMSE for each model/horizon | PASS |12| rel_improvement = 1 − rmse_model/rmse_naive (diff ≤ 4e-7, rounding) | PASS |13| exclusions: n_before − n_after = n_removed; 345 − Σremoved = n_analysed (h1: 310) and n_analysed_h3 (306) | PASS |14| last_target_date_available = 2026-02-01, last_predictor_date_available = 2026-03-01 for origin 2026-04-01 | PASS |15| Magnitudes: model RMSE within ~10–25% of naive, plausible; last-origin coefficients plausible (AR coef 0.66–0.82) | PASS |16