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).