# Clean one month of freelance income and expenses Platform example. The 50 rows in [input.csv](input.csv) are synthetic, use USD only and describe October 2026. Suggested Bot: Mosaic. ## Request Please clean my exported ledger, summarize the categories and tell me which records still need my attention. Keep the original row references. Provide a CSV I can continue using, not just a screenshot of totals. ## Agreed rules 1. `source_row` identifies the original input row. `transaction_id` identifies a transaction. Remove a repeated transaction only when its ID and every other input field except `source_row` agree. Equal amounts or merchants alone are not duplicate evidence. 2. Normalize dates to YYYY-MM-DD. The input explicitly uses ISO dates, YYYY/MM/DD and US MM/DD/YYYY. Do not guess an unknown date format. 3. Amounts are signed USD cash movements: client receipts are positive, expenses negative, client refunds negative and supplier refunds positive. Preserve the signs. 4. Use the transaction type to separate income from expenses. A `client_refund` reduces income; an `expense_refund` reduces the associated expense category. All input amounts already include any applicable fees or taxes; do not add an adjustment. 5. Approved merchant mapping: Draft Cloud → Software; Paper Supply → Supplies; City Transit → Travel; Desk Rooms → Workspace; Launch Ads → Marketing; Payment Service → Fees. Client receipts and client refunds → Client income. Trim and normalize category labels and use this mapping to fill missing categories. 6. The card entry `CARD PURCHASE 7Q` has no known category. Keep it as Pending review and include its USD 17.50 outflow in the total. Ask the publisher to identify it. 7. Retain genuine repeat purchases under different transaction IDs. No transfers or foreign currency entries are present in this fixture. ## Deliverables and acceptance - [Cleaned records](cleaned.csv), [category summary](summary.csv) and [row-level exceptions](exceptions.csv). - [A short report](result.md) with counts, income, net expenses, net movement and the unresolved item. - Every one of the 50 original rows is linked either to a cleaned record or to a duplicate decision. - The expected row count and independent control totals are in [reference.json](reference.json). They are verification controls, not inputs to the cleanup. - This is a record-cleaning example, not an accepted customer bookkeeping engagement.