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