Verification checks (P4)
- Clean re-run (outputs deleted, analysis.py re-run): results.json and forecasts.csv byte-identical: PASS
- Leakage test: all values after 2024-12-01 set to 9.9 in a temp copy; forecasts for origins <= 2024-12-01 identical, later ones change: PASS
- 144 ledger rows: PASS
- unique (origin,h,model): PASS
- target=origin+h months: PASS
- actuals match data: PASS
- n_eval = non-missing actuals: PASS
- naive = last obs <= origin: PASS
- rmse/mae naive h1 recomputed from ledger: PASS
- rmse/mae model h1 recomputed from ledger: PASS
- rel_improvement h1 identity: PASS
- rmse/mae naive h3 recomputed from ledger: PASS
- rmse/mae model h3 recomputed from ledger: PASS
- rel_improvement h3 identity: PASS
- RMSE>=MAE>0: PASS
- exclusion ledger: 945-1-3=941=n_analysed: PASS
- first_origin<last_origin; last target 2026-09 within data: PASS
- naive RMSE h3 > h1 (plausible magnitude): PASS
- Descriptive: UNRATE min 3.5 / max 4.5 over 2023-07..2026-09 (non-missing): computed, cited in report Uncertainty.