Verification checks (P4)
- Clean re-run: deleted results.json/table1.csv/figure1.png, re-ran analysis.py; results.json and table1.csv byte-identical (cmp) -> PASS
- data/ SHA-256 unchanged after run -> PASS
- fe_ci_low<=fe_estimate<=fe_ci_high -> PASS
- re_ci_low<=re_estimate<=re_ci_high -> PASS
- fe_se>0 and re_se>0 -> PASS
- k_extracted==5 -> PASS
- k_harmonised == count non-null -> PASS
- k_pooled == count poolable -> PASS
- poolable implies se>0 and harmonisable -> PASS
- non-harmonisable has null estimate and reason -> PASS
- not poolable has reason -> PASS
- CI width = 21.96se (RE) -> PASS
- tau2=0 -> RE==FE -> PASS
- I2 in [0,100] -> PASS
- Q<df -> I2=0 and tau2=0 -> PASS
- het label consistent -> PASS
- significance flag consistent -> PASS
- pct change consistent -> PASS
- pooled between min/max of pooled thetas -> PASS
- pooled within 0.05 of unweighted baseline -> PASS
- S1 theta -> 1-exp = 21% as printed -> PASS
- S2 exp(theta)-1 = 0.19 -> PASS
- S3 exp(theta)-1 = -0.2979 -> PASS
- S4 SE reproduces p=0.471 -> PASS
- exclusion ledger rows sum -> PASS
- ledger: 5 - removed == k_pooled -> PASS
- table1 has 5 rows -> PASS
- n_input_rows matches wc -l -> PASS