1# Verification checks (P4)23| # | check | outcome |4|---|---|---|5| 1 | Clean re-run: deleted results.json/table1.csv/figure1.png, re-ran analysis.py, `cmp` against the previous results.json | IDENTICAL (byte-for-byte) |6| 2 | Input SHA-256 values match data/README.md | pass (5/5 sources) |7| 3 | k_harmonised (4) = number of non-null harmonised_estimate | pass |8| 4 | k_pooled (2) = number of poolable items; poolable ⇒ SE > 0 | pass |9| 5 | Not harmonisable ⇒ null estimate and a non-empty reason (S5) | pass |10| 6 | FE and RE 95% CIs contain their estimates; fe_se, re_se > 0 | pass |11| 7 | τ² = 0 ⇒ RE = FE | pass (Q = 0.324 < df = 1) |12| 8 | I² = max(0,(Q−df)/Q)·100 = 0 → "low" | pass |13| 9 | pooled_pct_change_re = 100(exp(re)−1) | pass (−17.15%) |14| 10 | pooled_significant_5pct matches the CI (CI [−0.396, 0.020] includes 0 → false) | pass |15| 11 | Pooled θ lies between the two study estimates (−0.24, −0.118); magnitude vs baseline unweighted mean of poolable θ (−0.179) | pass (−0.188) |16| 12 | Exclusion ledger: 5 → 5 → 4 → 2 = k_pooled; n_before − n_removed = n_after on each row | pass |17| 13 | table1.csv has 5 rows with the 12 required columns | pass |18| 14 | Printed values reproduced verbatim (script parses them from source lines and prints the lines; S1 has an assert) | pass |19| 15 | Hand cross-checks: S1 SE from CI 0.1378, from p 0.1398 vs printed 0.14; S3 ratio −29.81% vs printed −29.79%; S4 ratio −11.25% vs printed 11.1% | small discrepancies, all recorded in data_issues; none changes a conclusion |20| 16 | Sensitivity (S1 SE from CI): RE −0.189 [−0.395, 0.017] | same conclusion |21