| Clean re-run (deleted results.json, exclusions.csv; reran analysis.py) gives byte-identical results.json |
PASS |
| beta_ci_low < beta_hat < beta_ci_high |
PASS |
| se_ols > 0, se_cluster > 0 |
PASS |
| n_input_rows − Σ n_removed (exclusions.csv) = n_analysed (2000 − 0 = 2000) |
PASS |
| n_clusters × 40 obs/firm = n_analysed (balanced panel) |
PASS |
| CI symmetric about beta_hat (t-based) |
PASS |
| Independent cross-check vs statsmodels OLS (params, nonrobust SE, cluster SE) — agree to ~1e-16 |
PASS |
| Magnitude vs baseline: se_cluster / se_ols ≈ 3.03; plausible given ~53% of residual variance and ~45% of x variance are between-firm (both components clustered → Moulton inflation) |
PASS (plausible) |
| data/panel.csv SHA-256 unchanged after runs |
PASS |