| 1 |
Clean re-run (deleted results.json/forecasts.csv, re-ran analysis.py): byte-identical outputs |
PASS |
| 2 |
Independent ridge implementation (augmented least squares, separate code) vs script forecasts, 60 origins |
PASS (max abs diff 4.7e-11) |
| 3 |
Leakage test: replace all data dated > t with random noise (×100), recompute ridge per origin |
PASS (max forecast change 0) |
| 4 |
Naive = ip_growth_t; mean = mean(ip_growth 1992-04..t); actual = ip_growth_{t+1} |
PASS |
| 5 |
target_date = origin_date + 1 month; 180 rows, 60 per model |
PASS |
| 6 |
n_analysed = 413 training rows at last origin (1992-03..2026-07) = 417 − 2 − 2 per exclusions.csv |
PASS |
| 7 |
rel improvements equal 1 − RMSE ratio; RMSE ≥ MAE > 0 for all models |
PASS |
| 8 |
Chronology first_origin 2021-09-01 < last_origin 2026-08-01; last target 2026-09-01 exists in data |
PASS |
| 9 |
Magnitudes: ridge RMSE (0.561) between mean (0.544) and naive (0.883) baselines; plausible for monthly IP growth |
PASS |
| 10 |
Gate run (see phases.json P4) |
see receipt |