| Clean re-run (deleted outputs, ran twice) gives byte-identical results.json |
PASS (cmp identical) |
| Exclusion ledger: 1200 − 0 − 0 − 12 = 1188 = n_analysed |
PASS |
| n_input_rows firms.csv = 1200 = wc -l − 1 |
PASS |
| SEs positive (naive_se 0.0146, effect_se 0.0098, skill_index_se 0.078) |
PASS |
| CIs contain estimates (naive, effect) |
PASS |
| CI = est ± 1.96·SE (HC1, normal) |
PASS (0.2535 ± 0.0192 = [0.2343, 0.2728]) |
| RMSE positive; model_metric (1.98) < baseline_metric (3.86), expected since adjusted model nests unadjusted |
PASS |
| conclusion consistent with CI (lo>0 → positive_effect) |
PASS |
| Magnitude vs baseline: sign flip from −0.132 to +0.254 explained by positive skill–hours correlation and negative skill–growth coefficient (omitted-variable bias formula: bias = β_skill·cov(h,s)/var(h) < 0) |
PASS (consistent) |
| Robustness: skill² term (p=0.57) and hours×skill interaction (p=0.96) not significant; effect unchanged (0.2538, 0.2536) |
PASS |
| Sensitivity incl. 12 negative-hour rows: effect 0.2522 |
PASS (conclusion unchanged) |
| Information rules: only data/firms.csv read; control is pre-treatment |
PASS |
| OVB identity: effect + β_skill·cov(h,s)/var(h) = naive slope (−0.131698 both) |
PASS (exact to 1e-15) |