# Cleanup rules and limitations

Self-initiated demonstration · Synthetic data

## Reproducible result
40 source rows → 30 reviewed records. 10 duplicate rows consolidated; 8 records require review; 113 logged changes. These counts come from the same pure transformation used by the interactive tool.

## Rules
1. Preserve input and stable source IDs.
2. Trim surrounding spaces and collapse repeated whitespace.
3. Apply title case to synthetic company and region labels; lowercase synthetic email strings. Real brand casing would require a separate agreed dictionary.
4. Convert year-first numeric dates, named English months and unambiguous slash dates to ISO YYYY-MM-DD only after calendar validation.
5. Preserve ambiguous dates such as 03/04/2026 and invalid dates such as 2026-02-30; flag them for review.
6. Consolidate only exact normalized company + email matches. Missing or malformed email identities are not grouped automatically.
7. Keep the first region/date when duplicate values conflict and preserve the conflicting value in a visible issue and change log. Combine distinct notes. Do not fill missing fields from assumptions.
8. Record every normalized value, duplicate relationship and conflict decision. Reconcile each source ID to exactly one output record.

## Limits
No fuzzy matching, deliverability check, external source verification or live CRM update occurs. The sample has 40 source rows and intentionally introduced issues. Browser edits affect only local demonstration state. Formula-leading values are escaped in CSV output to reduce spreadsheet formula injection.

## Reproduction
Run node scripts/generate-demo-artifacts.mjs with the repository's supported Node version. Its exports use src/lib/demo-data.ts, the same transformation used by the browser studio.
