# Data audit - File: data/firms.csv, SHA-256 34aa682e59ef64cfc56931ea33bb809797cd53eca83edfe370c31aeaa8e8b7df (matches bundle.json) - 1200 rows (header excluded), 4 columns: firm_id int, skill_index float (standardised; mean -0.0015, range -3.83..2.96), training_hours float (hours/employee; range -7.585..51.77, mean 19.95), productivity_growth float (% change; range -4.04..19.39, mean 7.08). - There are no dates (the timing is described in TASK.md: skill_index is measured the year before, training happens in the programme year, growth is measured the year after). - No missing values. No duplicate rows. firm_id values are unique (1001..2200). - **Anomaly:** 12 rows have training_hours < 0, which is physically impossible. They all have low skill (skill_index between -3.0 and -1.0). Decision: exclude them from the main analysis (recorded in exclusions.csv) and report the full-sample estimate as a sensitivity check. - Only 4 values are exact integers, so there is no heaping. A few values appear twice, which is consistent with rounding to 3 decimals. - Correlations: skill vs hours = 0.69, skill vs growth = -0.79, hours vs growth = -0.28. This is strong confounding by skill. - No input breaks the availability rules.