1# Verification checks (P4) — 2026-10-302All checks were run with an inline Python script against out/results.json, out/forecasts.csv and data/.3- PASS reproducibility: deleted outputs, ran analysis.py twice, and `cmp` showed results.json and forecasts.csv byte-identical.4- PASS forecasts.csv has 32 rows; no missing actuals.5- PASS target_date = train_last_date + h quarters for all rows.6- PASS train_last_date < origin_date; the first-release vintage date of every actual is later than the origin (no look-ahead).7- PASS actual = first_release_value of target quarter.8- PASS naive forecast = train_last_value, and train_last_value = last value in the origin's vintage file (not the current vintage).9- PASS RMSE ≥ MAE > 0 for every model/horizon.10- PASS independent recomputation of naive RMSE h1/h2, relative improvements, and mean abs revision.11- PASS exclusion ledger: 314 − (151+1+3) = 159 = n_analysed = n_train of ar1 at last origin.12- PASS magnitudes: the model RMSEs (1.48, 1.40) are below the naive RMSEs (2.01, 2.27); every value is in plausible pp-SAAR units. The AR(1) coefficients are stable across origins (phi ≈ 0.335–0.343).13- Note: the code does not import current_vintage.csv before the revision step, and the model never uses it (checked by reading the code).14