Verification checks (P4)
- Clean re-run (deleted outputs, ran twice): results.json byte-identical -> PASS
- numpy lstsq reproduces effect_estimate -> PASS
- numpy lstsq reproduces skill coef -> PASS
- model_metric = sqrt(mean e^2) -> PASS
- CIs contain estimates -> PASS
- CI = est +/- 1.96 se -> PASS
- SE positive; RMSEs positive -> PASS
- model_metric <= baseline_metric (nested OLS same sample) -> PASS
- 1200 - removed = n_analysed -> PASS
- conclusion consistent with CI -> PASS
- table1 main row == results -> PASS
- omitted variable bias sign: skill coef<0 and corr(skill,hours)>0 imply naive<adjusted -> PASS
- OVB identity naive = b1 + b2*delta -> PASS