# 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 = 2*1.96*se (RE) -> PASS - tau2=0 -> RE==FE -> PASS - I2 in [0,100] -> PASS - Q 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