# Verification checks (P4) | # | check | outcome | |---|---|---| | 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) | | 2 | Input SHA-256 values match data/README.md | pass (5/5 sources) | | 3 | k_harmonised (4) = number of non-null harmonised_estimate | pass | | 4 | k_pooled (2) = number of poolable items; poolable ⇒ SE > 0 | pass | | 5 | Not harmonisable ⇒ null estimate and a non-empty reason (S5) | pass | | 6 | FE and RE 95% CIs contain their estimates; fe_se, re_se > 0 | pass | | 7 | τ² = 0 ⇒ RE = FE | pass (Q = 0.324 < df = 1) | | 8 | I² = max(0,(Q−df)/Q)·100 = 0 → "low" | pass | | 9 | pooled_pct_change_re = 100(exp(re)−1) | pass (−17.15%) | | 10 | pooled_significant_5pct matches the CI (CI [−0.396, 0.020] includes 0 → false) | pass | | 11 | Pooled θ lies between the two study estimates (−0.24, −0.118); magnitude vs baseline unweighted mean of poolable θ (−0.179) | pass (−0.188) | | 12 | Exclusion ledger: 5 → 5 → 4 → 2 = k_pooled; n_before − n_removed = n_after on each row | pass | | 13 | table1.csv has 5 rows with the 12 required columns | pass | | 14 | Printed values reproduced verbatim (script parses them from source lines and prints the lines; S1 has an assert) | pass | | 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 | | 16 | Sensitivity (S1 SE from CI): RE −0.189 [−0.395, 0.017] | same conclusion |