| 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 |