# Data audit (P1) File: `data/firms.csv`, SHA-256 `34aa682e59ef64cfc56931ea33bb809797cd53eca83edfe370c31aeaa8e8b7df` (matches bundle.json). - 1200 rows (header excluded), 4 columns: firm_id (int64, 1001–2200, all unique), skill_index (float, standardised, mean -0.001, sd 0.99, range -3.83..2.96, measured pre-programme), training_hours (float, hours/employee in programme year, mean 19.9, sd 8.2, range -7.585..51.77), productivity_growth (float, % change in following year, mean 7.08, sd 4.02, range -4.04..19.39). - No dates in file (timing only via variable definitions: skill pre, hours during, growth after → no availability violation; skill_index is a valid pre-treatment control). - Missing values: 0 in every column. Duplicate rows: 0. Duplicate firm_id: 0. - **Anomaly:** 12 rows with training_hours < 0 (impossible). All have low skill_index (-3.0..-1.0). Decision: exclude from main analysis (exclusion ledger step 3); sensitivity on all 1200 rows reported. - Negative productivity growth values are plausible (productivity can fall) → kept. - Correlations (all rows): skill–hours 0.694, skill–growth -0.787, hours–growth -0.277 → strong confounding by skill_index expected. - No input violates the information-availability rules.