Verification checks (P4)
- Clean re-run: results.json byte-identical: PASS; analytic.csv & exclusions.csv md5 identical: PASS
- analytic rows == n_analysed: PASS
- n_firms: PASS
- no rating col: PASS
- cols: PASS
- ledger arithmetic: PASS
- ledger chain: PASS
- ledger start/end: PASS
- raw-removed=analysed: PASS
- se>0: PASS
- CI contains beta: PASS
- r2 in [0,1]: PASS
- default_rate matches: PASS
- no year 2022 (outcome unknown): PASS
- no dup firm-year: PASS
- no NaN: PASS
- numpy beta matches: PASS
- manual CR1 SE matches: PASS
- LPM beta plausible magnitude vs baseline rate: PASS
- Note: cluster SE uses statsmodels CR1 small-sample correction G/(G-1)*(N-1)/(N-K), replicated manually.