1# Verification checks (P4, 2026-10-30)23Reproducibility: deleted out/results.json, table1.csv, figure1.png, exclusions.csv; re-ran `~/wp29/venv/bin/python out/analysis.py`; byte-identical results.json (cmp) and identical table1.csv/figure1.png md5 on first run; repeated after adding sensitivity keys: results.json byte-identical (cmp). Script verifies SHA-256 of every source against data/README.md and asserts every printed number it uses against the source line (printed to stdout).45Independent recomputation and consistency (all PASS):6- FE estimate recomputed independently from (θ, SE) of S1, S4: matches fe_estimate.7- Q recomputed (0.3237 < df=1) → τ²=0, I²=0, RE = FE: consistent.8- All SEs positive; FE and RE CIs contain their estimates; CI width = 3.92·SE.9- pooled_significant_5pct consistent with RE CI (−0.396, 0.020 → includes 0 → false).10- pooled_pct_change_re = 100(exp(re)−1).11- k_extracted=5, k_harmonised=4 (non-null θ), k_pooled=2 (poolable flags) consistent.12- poolable ⇒ SE non-null; not harmonisable ⇒ θ null; reason_if_not non-null iff not poolable.13- Pooled θ lies within the range of poolable θ; |RE − baseline unweighted mean| < 0.05.14- Signs: S1, S3, S4 θ<0 (faster with AI), S2 θ>0 (slower) — match the printed directions.15- Exclusion ledger: 5 − (0+1+2) = 2 = k_pooled.16- table1.csv: 5 rows × 12 columns.17- Heterogeneity label follows the I² rule.18- Sensitivities (in results.json): S1 SE from CI → FE −0.1891 [−0.3954, 0.0172]; S4 θ from time ratio → FE −0.1897 [−0.3992, 0.0198]; conclusion unchanged.19- Information rules: no number outside the extracts used; S2 CI (figure-only) and S3 SE (stars only) set to null.20