# Verification checks (P4) - Clean re-run: deleted results.json/forecasts.csv/table1.csv/figure1.png, re-ran analysis.py; results.json byte-identical, CSVs identical: PASS - 80 rows, unique (origin,horizon,model): PASS - vintage_used <= origin_date: PASS (all rows use the vintage dated at the origin). origin_date < target_date: FAIL for the 40 h=1 rows — NOT a leakage: by the TASK.md definition target = last(V)+1 and target_date is the first day of that month, which always lies before (or in the month of) the month-end origin because RSAFS is published with a 1–2 month lag. The correct real-time condition, target month > last(V) (target not yet published in vintage V), holds for all 80 rows. This is a conflict between the gate's generic rule and the task's own definition; kept as specified, reported in report.md. - actuals match first_release: PASS - all RMSE>0 and RMSE>=MAE: PASS - rel improvement identity: PASS - DM LRV positive: PASS - DM sign consistent with RMSE ordering: PASS - p-value in [0,1] and code consistent: PASS - exclusion ledger: 20-0=n_analysed: PASS - sanity: naive h=1 forecast at origin 2025-10-31 (4.878354) equals the first-release YoY of 2025-08, released in that vintage: PASS - first_origin last(V) for all 80 rows (real-time condition): PASS