Checks (P4)
- Clean re-run: results.json byte-identical, analytic.csv & exclusions.csv identical: PASS (re-verified after the CSV format fix: two clean runs give identical md5 for all three outputs; results.json unchanged)
- rows_analytic==n_analysed: PASS
- growth+missing==309: PASS
- ledger_identity: PASS
- submeans_weighted: PASS
- recompute_growth: PASS
- hand_2022_06: PASS
- hand_2014_06_mixed: PASS
- hand_2016_07: PASS
- vintage_rule: PASS
- max/min_in_range: initially FAIL (analytic.csv written with 10 significant digits vs 10 decimals in results.json; diff 2e-10). Fixed by writing CSV with %.10f; re-check PASS (exact equality)
- 2025-10_absent: PASS
- dates_in_window: PASS
- magnitudes_plausible: PASS
Notes: no SEs/CIs are produced (deterministic computation on published data), so CI-containment checks are not applicable. Baseline = 2001-2013 mean (2.361%); full-window mean 2.574% lies between the two sub-period means as required.