# Verification checks (P4) - Clean re-run: results.json and forecasts.csv byte-identical: PASS - 32 forecast rows: PASS - target = train_last + 3h months: PASS - train_last_date < origin_date: PASS - actual first-release vintage date > origin (true out-of-sample): PASS - naive forecast == train_last_value: PASS - exclusion ledger sums: 314 - removed == n_analysed: PASS - RMSE >= MAE >0 all: PASS - rel improvement identity: PASS - revision stat recomputed independently: PASS - first_origin < last_origin: PASS - last vintage value of its last quarter equals its first release (sanity: 4.3): PASS - Magnitudes: RMSEs 1.4-2.3 pp, comparable to the typical size of GDP growth surprises; model RMSE below naive at both horizons, consistent with naive being noisy for a weakly persistent series (AR coef ~0.34). - Information rule: script loads each vintage only within its own origin loop; current_vintage.csv only used for the revision statistic (code inspection).