Verification checks (P4)
- Clean re-run: deleted results.json/analytic.csv/exclusions.csv, re-ran analysis.py; byte-identical outputs (cmp) -> PASS
- analytic rows == n_analysed: PASS
- analytic firm_id unique: PASS
- no NaN revenue in analytic: PASS
- n_unique_firms - n_missing == n_analysed: PASS
- ledger n_before-n_removed==n_after: PASS
- ledger chained: PASS
- ledger starts at n_input_rows: PASS
- ledger ends at n_analysed: PASS
- n_raw - total removed == n_analysed: PASS
- mean recomputed from analytic.csv: PASS
- median recomputed from analytic.csv: PASS
- mean_employees independent recompute (groupby first): PASS
- baseline recompute: PASS
- independent musd mean (convert via groupby): PASS
- median <= mean (right-skewed, plausible): PASS
- se positive: PASS
- raw baseline >> cleaned mean (thousands rows inflate raw): PASS
- revenue_musd range plausible (max<1e4): PASS