1# Verification checks (P4)23- Clean re-run: deleted results.json/forecasts.csv/table1.csv/figure1.png, re-ran analysis.py, `cmp` of results.json → IDENTICAL.45| check | ok | detail |6|---|---|---|7| forecasts.csv has 80 rows, 10 per (model,horizon) | True | |8| vintage_used == origin_date for all rows | True | |9| target = last(V)+h and target month not present in vintage V | True | |10| 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 |11| actuals match first_release.csv | True | |12| table1 matches results.json | True | |13| RMSE >= MAE for all models | True | |14| rel_improvement identity | True | |15| DM LRV positive | True | |16| DM sign consistent with RMSE ordering | True | |17| conclusion codes consistent with RMSE and p<0.05 | True | |18| n_analysed = 20 = n_raw pairs - removed (exclusions.csv) | True | |19| magnitudes plausible: all RMSE in (0.3, 3) pp | True | |20| naive forecast = yoy_first_release of last(V) when last(V) first released in V (check 2026-07-31 origin) | True | |21| revision mean = mean |revision_h1_targets| | True | |22