Data audit
- data/firm_panel.csv SHA-256 a1f1af88b1ab05900155991f2468cce09695af978923e5bc3ef9c28d45683b6f (matches bundle.json); 2140 data rows, 7 columns.
- data/README.md SHA-256 26573e982ab6ca9e7f90d2b89bd2878aa6a670f90da21496bff787b59216b9a2.
- Schema: firm_id str (F001–F300, 300 firms, all match ^F\d{3}$), year int 2016–2022, leverage [0.02, 0.95], cash_ratio [0.0046, 0.7406], log_sales [1.29, 8.88], rating_2025 A/B/C/D (constant within firm), default_next 0/1 or empty.
- Missing: only default_next, 307 rows = all origin-2022 rows (300 unique after dedup + 7 duplicate copies). Outcome not observed at data cut: exclude, do not impute.
- Duplicates: 40 rows are exact duplicates of another row (same firm_id-year, identical values) -> assembly error; keep one copy. After dedup: 2100 rows = 300 firms x 7 years, balanced.
- Leakage: rating_2025 known only in 2025, built from realised defaults through 2022 and sample-average leverage. Empirically A/B/C ratings have 0% default, D 22.7% -> strong outcome leakage. Excluded from predictors and from analytic.csv.
- Other observations (not errors, kept): 94 rows with leverage + cash_ratio > 1 (possible accounting-wise: cash is an asset, debt a liability); some firms default in multiple years (outcome defined per year; synthetic panel keeps firms after default) — noted as a limitation.
- No other availability violations: leverage, cash_ratio, log_sales known end of t.