# Verification checks (P4) | check | outcome | |---|---| | Clean re-run (deleted all outputs, re-ran analysis.py): results.json byte-identical, table1.csv hash identical | PASS | | naive CI contains naive_estimate | PASS | | effect CI contains effect_estimate | PASS | | effect_se, baseline_metric, model_metric > 0 | PASS | | Exclusion ledger: 1200 − 12 = 1188 = n_analysed | PASS | | CI half-width = 1.96 × SE (normal, HC1) | PASS | | conclusion code consistent with CI (low 0.234 > 0 → positive_effect) | PASS | | Omitted-variable-bias identity naive = effect + δ·γ (δ = slope of skill on hours) holds to 1e-16 | PASS | | model_metric (1.98) < baseline_metric (3.86): adjusted model nests unadjusted, so must be ≤ | PASS | | Magnitude: sign flips vs baseline; explained by hours–skill corr 0.68 and skill coef −4.6 (OVB) | PASS (explained) | | Robustness: effect 0.252–0.254 with negative-hours rows kept/censored, skill² and skill³ terms; conventional SE 0.00984 vs HC1 0.00981 | PASS | | data/ unchanged (SHA-256 matches bundle.json) | PASS |