# Verification checks (P4) - Clean re-run: deleted results.json/forecasts.csv/table1.csv/figure1.png, re-ran analysis.py, `cmp` of results.json → IDENTICAL. | check | ok | detail | |---|---|---| | forecasts.csv has 80 rows, 10 per (model,horizon) | True | | | vintage_used == origin_date for all rows | True | | | target = last(V)+h and target month not present in vintage V | True | | | origin_date < target_date (gate rule) | False | 40 rows fail, all h=1: {1}; structural, target month-start precedes month-end origin because last(V) lags origin | | actuals match first_release.csv | True | | | table1 matches results.json | True | | | RMSE >= MAE for all models | True | | | rel_improvement identity | True | | | DM LRV positive | True | | | DM sign consistent with RMSE ordering | True | | | conclusion codes consistent with RMSE and p<0.05 | True | | | n_analysed = 20 = n_raw pairs - removed (exclusions.csv) | True | | | magnitudes plausible: all RMSE in (0.3, 3) pp | True | | | naive forecast = yoy_first_release of last(V) when last(V) first released in V (check 2026-07-31 origin) | True | | | revision mean = mean |revision_h1_targets| | True | |