Verification checks (P4)
- Clean re-run (deleted results.json/forecasts.csv, ran twice): byte-identical outputs — PASS
- ledger has 144 rows: PASS
- 36 unique origins, 2023-07-01..2026-06-01: PASS
- target = origin + h months: PASS
- naive = last non-missing obs <= origin: PASS
- actuals match data: PASS
- n_evaluated = 36 - missing targets: PASS
- RMSE >= MAE > 0: PASS
- rel_improvement recomputed: PASS
- exclusion ledger sums: 945 - removed = n_analysed: PASS
- h3 error >= h1 error (plausible magnitudes): PASS
- model forecasts within 0.2pp of naive (consistent with near-zero AR coefs): PASS
- first_origin < last_origin: PASS
- Information rule: each origin's estimation uses
s.loc[:t]only (code inspection); targets strictly after origins (checked above) — PASS