Checks (P4)
- Clean re-run of out/analysis.py (results.json, table1.csv, figure1.png deleted first) → results.json byte-identical (cmp). PASS
- CI contains estimate: naive [-0.1624, -0.1080] ∋ -0.1352; effect [0.2336, 0.2708] ∋ 0.2522. PASS
- SEs positive (effect_se 0.00948, HC1). RMSEs positive; model_metric 1.977 < baseline_metric 3.861 (nested model, must be ≤). PASS
- Omitted-variable-bias identity: effect + skill_coef × cov(h,s)/var(h) = -0.135190 = naive_estimate (agrees to 1e-15). PASS
- Counts: n_input_rows 1200, 0 excluded, n_analysed 1200; exclusions.csv sums. PASS
- Conclusion code: effect_ci_low > 0 → positive_effect. PASS
- Sensitivity: excluding negative-hours rows 0.2535; adding skill² 0.2523 (skill² p=0.81). Main estimate robust. PASS
- Units: pp per hour for slopes, pp for RMSE, pp per index unit for skill coef. PASS