Verification checks
- Rerun of analysis.py from clean state reproduces results.json byte-identically: PASS (diff empty)
- se_iid>0, se_cluster>0: PASS (0.282, 0.729)
- CI contains tau_hat: PASS (-0.513 < 0.961 < 2.436)
- CI symmetric around tau_hat with t(39) quantile: PASS
- p_value<0.05 ⇔ CI excludes 0: PASS (p=0.195, CI includes 0, significant=false)
- Counts: n_analysed 1000 = n_raw 1000 − 0 excluded; 40 schools × 25 = 1000; 20 treated schools: PASS
- tau_hat equals difference of school-mean averages (balanced design): PASS (cross-check computed in script)
- se_cluster / se_iid = 2.584 ≈ sqrt(1+(25−1)·ICC)=sqrt(6.64)=2.577: PASS (Moulton consistency)
- se_cluster (CR1) close to school-means Welch SE 0.738; school-means pooled t p=0.201 — same decision: PASS
- Magnitude vs baseline: iid baseline would reject (p=0.0007); cluster SE does not — documented, expected under ICC≈0.23.