# Demonstration — QC Report & Change Log

**Catalog Rescue · Controlled demonstration · Test environment**

This is the QC report for the fictional demonstration described on the
Process & Proof page. All data is invented for the test — no real products,
brands, suppliers or client data appear in these files.

- Input: `demo-before.csv` — the defective supplier file
- Output: `demo-after.csv` — the repaired Shopify CSV
- Counting method and definitions: `README.md`

---

## 1. Result

**Zero unresolved validation errors.**

No structural or technical defects remain in the output file. Four source-data
exceptions remain open — documented in section 4, not silently fixed.

## 2. Reconciliation

| Measure | In | Out |
|---|---|---|
| Products | 21 | 21 |
| Data rows | 88 | 88 |
| SKU entries (one per variant row) | 88 | 88 |
| SKU values populated | 87 | 87 |
| SKU values blank (missing in source) | 1 | 1 |

The 88 figure is the total number of SKU entries across all variants of the
21 products. It is not a count of unique SKU values: one value appears on two
products (Exception E-4).

## 3. Checks performed

1. Header names and column order against Shopify's specification.
2. SKU uniqueness across the entire file — not a sample of it.
3. Price and compare-at fields: numeric, correctly placed, consistently formatted.
4. Variant structure: every variant row attached to its product, options consistent.
5. Handles: one product, one handle; no accidental merges or splits.
6. Image URLs: present where the source provides them, well-formed.
7. Encoding: clean UTF-8 throughout.
8. Reconciliation: product and SKU-entry counts in versus out (section 2).

## 4. Exceptions — source-data problems left for the catalog owner's decision

| # | Item | What is wrong | What was done |
|---|---|---|---|
| E-1 | Canvas Tote Bag — Olive | The source file states no SKU for this variant. | SKU left blank. Never invented. |
| E-2 | Yoga Mat 6 mm — Teal | Price given as the words "about twenty" — no reliable value can be read from it. | Price left blank rather than guessed. |
| E-3 | Wool Blend Scarf — Camel | Image reference is a local file path on the supplier's computer (`C:\Users\supplier\photos\…`), not a web URL. | Reference removed and reported; no image substituted. |
| E-4 | `TEE-WHT-M` | The same SKU appears on two different products: Classic Cotton T-Shirt (White, M) and Cotton Bath Towel (White, Bath). | Flagged on both records. **Neither identifier was changed** — changing an identifier is the owner's decision (approved unresolved item). |

## 5. Change log — what the repair changed, and why

1. **Headers mapped** from the supplier's column names to Shopify's:
   `prod_name → Title`, `description → Body (HTML)`, `category → Type`,
   `opt1/opt2 name+val → Option1/Option2 Name+Value`, `sku → Variant SKU`,
   `price → Variant Price`, `stock → Variant Inventory Qty`,
   `weight_g → Variant Grams`, `img_url → Image Src`. Handles generated from
   product titles; one handle per product.
2. **Detached variant rows reattached** — two Classic Cotton T-Shirt variants
   (Navy, L and Navy, XL) appeared in the source after the jeans rows with the
   product name blank. They were matched to their product by SKU and product
   reference and reattached. No values were altered.
3. **Decimal-comma price converted** — Merino Wool Sweater (L): `89,95` → `89.95`.
   The conversion was unambiguous, so it was made and is recorded here.
4. **Image URL scheme corrected** — LED Desk Lamp (Black): `htp://…` → `https://…`.
   Well-formedness repair only; the address itself was not changed.
5. **Encoding repaired** — Scented Soy Candle, scent shown in the source as
   `CafÃ© CrÃ¨me` (double-encoded text) restored to `Café Crème`.
6. **Prices normalised** — all readable prices written as plain numbers with
   two decimals, in the price column only.
7. **Not changed** — the duplicate SKU `TEE-WHT-M` (E-4), the missing SKU
   (E-1) and the unreadable price (E-2) were deliberately left exactly as the
   source had them, and are reported in section 4 instead.

## 6. What this report does not claim

The result is the outcome of this one controlled test on fictional data. It
shows the repair and QC process and how exceptions are handled; it is not a
guarantee for any other file.
