P4 verification checks (2026-10-30)
Determinism: deleted results.json/table1.csv/figure1.png/exclusions.csv, re-ran out/analysis.py; results.json byte-identical (cmp), table1.csv identical md5. PASS.
Assertions inside analysis.py (all passed at runtime): every quarter 1959Q4–2019Q4 has exactly 3 monthly UNRATE values; 241 merged quarters with regular spacing; 240 regression quarters from 1960-01-01 to 2019-10-01; n_sub1+n_sub2=n.
Post-hoc checks (all PASS):
- all required results.json keys present
- n_sub1+n_sub2 = n_analysed = 240; n_sub1=96, n_sub2=144; sample dates 1960-01-01/2019-10-01
- effect_se > 0; CI contains estimate; CI half-width = 1.96·SE
- model_metric < baseline_metric; 1−(model/baseline)² equals R² (identity)
- conclusion code consistent with CI (upper bound < 0 → negative_effect)
- stability_conclusion consistent with chow_p_value < 0.05
- Chow df = (2, 236); F ≥ 0, p in [0,1]
- exclusion ledger: n_before − n_removed = n_after for every step; final n = 240
- n_input_rows = 319 / 945 match
wc -lminus header - table1 has header + 3 rows with required columns; full-sample slope = effect_estimate
- magnitude: β ≈ −0.26 is in the conventional range for q/q (non-annualised) growth
- HAC SE (0.036) > classical SE (0.020), consistent with positive residual autocorrelation
- No date after 2019-10-01 enters any estimate (window filter + assertion on max date) Figure inspected visually: two subperiod clouds, two fitted lines, labels correct.