# Verification checks (P4) — 2026-10-30 - Determinism: deleted results.json & forecasts.csv, re-ran analysis.py; SHA-256 of both files identical to previous run. PASS - Information rule: analysis.py slices data to quarters <= origin before any estimation/selection and asserts it; snaive source quarter (target−4Q) <= origin verified for all 120 snaive rows. PASS - 240 rows; 40 origins per (horizon, model); target = origin + h quarters. PASS - snaive forecast equals y(target−4Q); `actual` equals data. PASS - No NaN forecasts. PASS - loss_diff_se_h4 > 0; hac_lags_h4 = 4 >= 3; dm_stat = mean/se; p in [0,1]. PASS - Identity: loss_diff_mean_h4 = rmse_snaive_h4² − rmse_model_h4² (to 1e-9). PASS - MAE <= RMSE for all model×horizon. PASS - n_input_rows = 127/381; n_analysed = 122 (126 inflation obs − 4 after last origin). PASS - Magnitudes: RMSEs 2.2–2.9 pp vs unconditional sd of target 2.39 pp — plausible given 2020–22 volatility. - Note (not a failure): DM inference is sensitive to HAC lag choice — Bartlett L=3 p=0.197, L=4 (primary, fixed before results) p=0.146, rectangular L=3 p=0.114, Bartlett L=8 p=0.024 (see sensitivity_dm_h4). Reported in report.