Verification checks (P4, 2026-10-30)
Reproducibility: 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).
Independent recomputation and consistency (all PASS):
- FE estimate recomputed independently from (θ, SE) of S1, S4: matches fe_estimate.
- Q recomputed (0.3237 < df=1) → τ²=0, I²=0, RE = FE: consistent.
- All SEs positive; FE and RE CIs contain their estimates; CI width = 3.92·SE.
- pooled_significant_5pct consistent with RE CI (−0.396, 0.020 → includes 0 → false).
- pooled_pct_change_re = 100(exp(re)−1).
- k_extracted=5, k_harmonised=4 (non-null θ), k_pooled=2 (poolable flags) consistent.
- poolable ⇒ SE non-null; not harmonisable ⇒ θ null; reason_if_not non-null iff not poolable.
- Pooled θ lies within the range of poolable θ; |RE − baseline unweighted mean| < 0.05.
- Signs: S1, S3, S4 θ<0 (faster with AI), S2 θ>0 (slower) — match the printed directions.
- Exclusion ledger: 5 − (0+1+2) = 2 = k_pooled.
- table1.csv: 5 rows × 12 columns.
- Heterogeneity label follows the I² rule.
- 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.
- Information rules: no number outside the extracts used; S2 CI (figure-only) and S3 SE (stars only) set to null.