# Contract — F1-dev-01 **Question:** turn the synthetic firm cross-section `data/firms.csv` into a documented, analysis-ready dataset (one row per firm) and report basic aggregates. **Estimands:** (1) the number of distinct firm_id values; (2) the mean and median revenue in millions USD over firms with known revenue; (3) the mean employees over all distinct firms. These only make sense if (a) duplicated rows are true duplicates of one firm, (b) the `unit` column correctly gives each row's currency scale, and (c) missing revenue is simply excluded (complete-case analysis, no imputation). **Outputs:** out/results.json (task_id, n_unique_firms, n_missing_revenue, n_analysed, mean_revenue_musd, median_revenue_musd, mean_employees, mean_revenue_raw, feasibility, feasibility_reason, data_issues, n_input_rows, random_seed); out/analytic.csv (firm_id, sector, revenue_musd, employees; n_analysed rows); out/exclusions.csv (a ledger that chains from the raw row count to n_analysed); out/report.md; out/analysis.py; out/claims.json. **Information rules:** use only data/firms.csv; report revenue in millions USD everywhere; rows with missing revenue are excluded from revenue aggregates and listed in the ledger. **Invalidating conditions:** conflicting duplicates (same firm_id with different values), unknown units, or a ledger that fails to reconcile.