# CSV change review: filled example and blank worksheet Companion guide: /learn/preview-csv-import-changes All products, notes and prices below are fictional. This static pack contains no importer, live records or execution result. `PATCH`, `CREATE`, blank-cell handling and batch holds are proposed rules for this exercise, not Overskill defaults. Prices use invented USD cents. An empty string means no text; it is not an assertion about SQL NULL. ## Files and how to use them 1. [Download the existing catalog](csv-change-existing.csv): five records and five fields, including internal notes. 2. [Download the original change file](csv-change-incoming.csv): six proposed operations. 3. Compare each operation with the current record, using the policy below. Make your decisions before opening the answer key. 4. [Download the row review](csv-change-row-review.csv) to check each original row and the separate repeated-target variant. 5. [Download the corrected change file](csv-change-corrected.csv) and [its projected catalog](csv-change-expected.csv). The projection is an expected result, not saved app data. 6. [Download the repeated-target variant](csv-change-repeated-target.csv). Test this file separately against the original five-record snapshot. The CSVs are UTF-8 with one header row. Keep prices as integer cents and preserve SKU text. This exercise supplies already-clean data; it does not establish how a real importer parses a file. ## Filled policy | Question | Decision for this example | | --- | --- | | What is one target? | One exact SKU in the saved five-record snapshot | | Which updates are allowed? | `PATCH` may change only `price_cents` and `note`; its name cell must be empty | | What does an empty patch price mean? | Keep the existing price; it does not become zero | | What does `keep` mean for a note? | Incoming note must be empty; preserve the current note | | What does `set` mean? | A nonblank supplied note replaces the current note | | What does `clear` mean? | Incoming note must be empty; intentionally replace the current note with an empty string | | What is required for `CREATE`? | An absent SKU, nonblank name, nonnegative integer price, and note action `set` or `clear` | | What happens to `internal_note`? | It is not an incoming column. Retain every existing value; a new record starts with an empty internal note | | What if a SKU is missing from the incoming file? | Retain that target record unchanged | | What if a patch target does not exist? | Hold; never convert it into a create | | What if the action is DELETE? | Hold; deletion is not supported in this exercise | | What if a target SKU appears twice? | Hold every row for that SKU, even if the values agree; no first/last-row winner | | What if incoming columns or intent do not match this policy? | Hold and review. Do not silently write extra fields or resolve contradictory instructions | | What if any row is held? | Hold the entire proposed change. Do not silently apply the other rows | | What if the target snapshot changes? | Discard this plan and compare again with a fresh authorized snapshot | These are decision requirements. They do not prove transaction atomicity, permission enforcement, repeat-load safety or rollback in any app. ## Starting snapshot | SKU | Name | Price cents | Note | Internal note, absent from incoming columns | | --- | --- | --- | --- | --- | | P01 | Clip pack | 500 | Box of 10 | Count packs each Friday | | P02 | Paper roll | 1200 | White | Stockroom shelf B | | P03 | Ink bottle | 900 | Blue | Keep upright | | P04 | Display stand | 2500 | Countertop | Inspect feet before packing | | P05 | Label sheet | 800 | Matte | Count sheets in tens | ## Original six-row answer key | Row | Proposed action | Classification | Exact result or hold reason | | --- | --- | --- | --- | | R01 | PATCH P01, price 550, keep note | Update | Price 500 → 550; other four fields retained | | R02 | PATCH P02, blank price, clear note | Update | Price stays 1200; note White → empty; name/internal note retained | | R03 | PATCH P03, price 900, keep note | Unchanged | All five fields retained | | R04 | CREATE P06, Pocket notebook, 650, Pocket size | Create | One proposed new record; new internal note empty | | R05 | PATCH missing P99 | Hold | No target exists; do not create it | | R06 | DELETE P05 | Hold | Deletion is outside the policy; retain P05 | **Reconciliation:** 6 input rows = 2 proposed updates + 1 proposed create + 1 unchanged + 2 held. **Batch decision: hold.** Zero writes occur. All five starting records, including P01's price 500 and P02's note White, remain unchanged while held. ## Corrected-file exclusions This is a separately identified file containing R01–R04. Keep the original file and this exclusion record; do not overwrite the evidence. | Excluded row | Decision and next action | | --- | --- | | R05 | P99's identity is unresolved. An authorized operator must establish the intended target before preparing another proposal; do not invent P99. | | R06 | No deletion is permitted in this workflow. Retain P05; do not disguise deletion as an empty update. | The corrected file has 4 rows = 2 updates + 1 create + 1 unchanged. It proposes three record changes and the complete six-record result below. It remains **eligible for a separately authorized test only**, not approved for live use. | SKU | Name | Projected price cents | Projected note | Projected internal note | | --- | --- | --- | --- | --- | | P01 | Clip pack | 550 | Box of 10 | Count packs each Friday | | P02 | Paper roll | 1200 | Empty string | Stockroom shelf B | | P03 | Ink bottle | 900 | Blue | Keep upright | | P04 | Display stand | 2500 | Countertop | Inspect feet before packing | | P05 | Label sheet | 800 | Matte | Count sheets in tens | | P06 | Pocket notebook | 650 | Pocket size | Empty string | P03, P04 and P05 are unchanged. P04 was omitted from the change file; P05's deletion was rejected. Every original internal note survives exactly. P06's empty internal note is the stated creation default, not a value supplied by the incoming file. ## Repeated-target variant The separate two-row file contains D01: P01 → 550 and D02: P01 → 560. Both rows are held because they name the same exact target. The original catalog remains five unchanged records, with P01 at 500. If both prices were 550, the answer would still be **hold both**. The operator must prepare a new file with one unambiguous operation per target. Do not keep the first row, take the last row or treat matching values as permission to guess. ## Additional checks and expected answers | Proposed variation | Expected answer | | --- | --- | | PATCH includes a new name for P01 | Hold; name is protected in this update policy | | CREATE P06 with a blank price | Hold; missing is not zero | | CREATE P06 with explicit price 0 and valid other fields | A known zero is valid under this fictional nonnegative-price rule | | CREATE P01 | Hold; that SKU already exists | | Clear a note while also supplying nonblank note text | Hold contradictory intent | | Add an incoming internal_note column | Hold the file's mapping; that field is not authorized for import | | Reorder the two repeated-target rows | Still hold both | | Review against a newer target snapshot | Old plan is invalid; compare again | ## Blank review for your own test Do not put real confidential records into this public example. Use a small fictional or suitably authorized test dataset. A missing answer below is **unknown**, not a safe default. | Evidence to record | Your answer | | --- | --- | | Task and authorized reviewer | | | Target snapshot name, capture time and scope | | | Incoming file name, byte hash and row count | | | What proves the snapshot is current and authorized? | | | Exact matching key | | | Allowed actions and update fields | | | Blank value and explicit clear rules | | | Truly unmapped target fields to retain | | | Omitted-target policy | | | Repeated-target policy | | | Held-row policy for the complete batch | | | Actual supported loading method and its evidence | | | Changed-source invalidation rule | | | Source row / target | Current value | Proposed value | Retained fields | Classification and reason | Actual test result | | --- | --- | --- | --- | --- | --- | | | | | | | Untested | | | | | | | Untested | | | | | | | Untested | | Final decision | Record the basis | | --- | --- | | Hold / eligible for authorized test / stop | | | Account for every input row | | | Expected complete target count and retained IDs | | | Exact exclusions and unresolved owner/action | | | Who may read files, internal notes and plan exports? | | | Which permissions and saved values were actually tested? | Untested until observed | Do not mark a test passed from a matching total alone. Compare changed cells, every retained field and the original records after a held attempt. Check actual saved results after reload only in an authorized test app. If the required loading behavior is unknown or unsupported, stop before a real import. ## Filled Overskill brief inputs Open /learn#brief-builder. These are example input values, not an imported file or a verified capability: **Who is it for?** Authorized catalog operators reviewing fictional price changes. **What should they finish?** Compare a saved five-record catalog with the supplied change file and produce a preview-only before/after plan with explicit holds. Do not write to a live catalog. **What information should the app save?** Fictional snapshots, source row IDs, exact SKUs, price/note changes, retained internal notes and hold reasons. PATCH only price/note; blank patch price keeps its value; notes require keep/set/clear. CREATE needs a new SKU, name and known price. Hold the whole file for unknown patch targets, deletion, repeated SKUs or extra incoming fields. Retain omitted records and every existing internal note. Deny anonymous and unassigned users access to raw files, records, internal notes and plan exports on the server. Test these read denials. No live Apply action, messages or payments. Choose the appropriate access boundary. A workspace selection alone does not prove operator-only permission; preserve and test the more specific read restrictions above. Review the generated read-only brief, edit its input fields, then select **Start build**. Copy brief is secondary. Supply the fictional files separately after the app exists; the link imports nothing. Normal account access and credits apply. Actual loading instructions live at /help/articles/importing-data-into-your-app; this worksheet's patch rules are not native importer behavior.