# Data audit (P1) - File: data/firms.csv, SHA-256 34aa682e59ef64cfc56931ea33bb809797cd53eca83edfe370c31aeaa8e8b7df (matches bundle.json) - 1200 data rows, 4 columns: firm_id (int, 1001–2200, unique), skill_index (float, standardised, mean -0.001, sd 0.99, range -3.83..2.96), training_hours (float, hours/employee, mean 19.95, sd 8.24, range -7.585..51.77), productivity_growth (float, %, mean 7.08, sd 4.02, range -4.04..19.39). - Missing values: none. Duplicate rows: 0. Duplicate firm_id: 0. A few repeated values per column (max count 2) — consistent with rounding, not an anomaly. - **Anomaly**: 12 rows with training_hours < 0 (min -7.585). Hours of training cannot be negative; all 12 have low skill_index (-3.0..-1.0). Handling: excluded from main estimate (exclusions.csv); sensitivity analysis including them reported. No zero values. - Correlations: corr(skill, training)=0.69, corr(skill, growth)=-0.79, corr(training, growth)=-0.28 → strong confounding by skill_index expected to bias the unadjusted slope downward. - Information availability: skill_index measured before programme (pre-treatment) → legitimate control. No violating inputs.