← back to Harlequin Sample Price Analysis
artifacts/JOB1-JOB2-REPORT.md
93 lines
# TK-10981 — junk mfr_sku cleanup + fleet cost-gap deep-dive (report)
vp-dw-commerce · 2026-08-31 · READS $0 (local dw_unified mirror, `host=/tmp`). Zero writes fired.
Codex second-opinion folded in (see "Codex caveat" below). No live scrapes. No fabrication.
---
## JOB 1 — junk `mfr_sku = 'TRUE'` (3,675 rows, 10 vendors)
### Confirmed blast radius (matches the cycle-5 memo)
| vendor | rows | ACTIVE | catalog table | dw_sku joins catalog? |
|---|---:|---:|---|---|
| Fentucci | 2,070 | 1 | fentucci/tokiwa | **NO (0)** |
| Retro Walls | 946 | 1 | *(none exists)* | **NO** |
| Fentucci Fabrics | 367 | 0 | — | **NO** |
| Innovations USA | 129 | 77 | innovations_catalog | **YES (90/129)** |
| Mind the Gap | 110 | 0 | mindthegap_catalog | **NO (0)** |
| DW Home | 41 | 1 | *(house label)* | n/a |
| Designer Wallcoverings | 5 | 1 | *(house label)* | n/a |
| Designers Guild / Phillipe Romano / DW Bespoke | 7 | 3 | mixed | NO |
**83 ACTIVE total (77 Innovations + 6 others). Identity intact — every row keeps a real `sku`/`dw_sku`.**
### Root cause (confirmed, not guessed)
The affected products are a **legacy import generation** whose `dw_sku` scheme (Fentucci `DWPA-*`,
Retro Walls `DWH-*`, Mind the Gap `MIND-2020*`) **no longer exists in any current vendor catalog** —
each catalog was re-scraped onto a new `dw_sku` scheme (Fentucci is now `DWNAT-*`/`DWFN-*`, Mind the
Gap `DWMG-*`). So there is **no authoritative source to re-key against** for 3,490 of the 3,675 rows.
A boolean (`has_mfr_sku`/availability flag) leaked into `mfr_sku` during those old scrapes.
### Innovations USA — the one joinable vendor, but the catalog is HALF-CORRUPTED
90 of 129 join `innovations_catalog` on `dw_sku`. The catalog's own `mfr_sku` splits into TWO classes:
- **REAL codes** — `SOA-008`, `VEC-008`, `LAT-04`, `GRD-010` (uppercase pattern-prefix + digits). **13 rows. ALL ARCHIVED.**
- **CORRUPTED codes** — `atra-8`, `ctor-4`, `tley-1` = the *tail* of the pattern name (sum**ATRA**,
ve**CTOR**, mo**TLEY**) with a lowercase suffix — a scraper truncation bug. **The 48 ACTIVE rows all map to these.**
**Decision:** back-filling the 48 ACTIVE rows from a corrupted source **= propagating a scraper bug =
fabrication → NOT ALLOWED.** Only the 13 real-shaped codes are candidates → **`JOB1-innovations-realcode-backfill.csv`** (gated).
> **Codex caveat (folded in):** the 13 uppercase codes come from the *same compromised scrape* as the
> corrupted ones, so their shape is **not proof** of correctness. Since Steve's rule forbids a live
> re-scrape to corroborate against the original vendor page, the 13 are **SHAPE-ONLY-corroborated**.
> Recommendation in the memo: **HOLD the 13 pending an authoritative Innovations catalog re-scrape**;
> they are ARCHIVED (zero customer-facing urgency) so there is no reason to risk a wrong write now.
### What is genuinely blocked / left as-is
- **3,490 rows** (Fentucci, Retro Walls, Fentucci Fabrics, Mind the Gap, DW-house): **no authoritative
source** → left as-is. `NULL`-out is disallowed by rule, so the `'TRUE'` value stays until a real
mfr_sku is known (a future re-scrape/re-key project, out of scope here).
- **48 ACTIVE Innovations**: source corrupted → left as-is.
---
## JOB 2 — fleet cost-gap deep-dive (ACTIVE + `cost_price` NULL/0)
Raw count: **67,203 ACTIVE no-cost.** Separated into real margin-risk vs by-design:
| class | rows | verdict |
|---|---:|---|
| **has dw_sku — *potential* sync-gap** | 21,403 | **mostly illusory** — see below |
| private-label umbrella (Phillipe Romano / LA Fabrics) | 13,749 | quote-only by design |
| genuine-unknown (no dw_sku key at all) | 13,054 | not recoverable (no key) |
| contract/commercial (Koroseal, Carnegie, Wolf Gordon, Maharam, Designtex, Knoll) | 11,281 | quote-only by design |
| flagged quote-only in registry (`do_not_price`/`display_prices=false`) | 5,778 | by design |
| DW house-label | 1,938 | no external cost |
### The "21,403 sync-gap" is almost entirely NOT recoverable
I tested the **actual** join: ACTIVE no-cost products → each cost-bearing catalog (on `dw_sku`, cost
via `price_trade`/`your_cost`/`net_cost`). Result across 13 cost-bearing catalogs (brunschwig, maharam,
harlequin, kravet, newwall, osborne, thibaut, scalamandre, wolf_gordon, romo, lee_jofa, graham_brown, rebelwalls):
**True recoverable sync-gap = ~102 rows total:** **Kravet 100 · Harlequin 1 · Graham Brown 1.**
Same root cause as JOB 1: the catalogs carry cost, but they're keyed on a **newer `dw_sku` generation**
than the live ACTIVE no-cost products (which mostly have a NULL/empty `dw_sku` — Thibaut 1,555/1,633
have no dw_sku; Jeffrey Stevens 1,317/1,334; LA Fabrics 305/305). No key ⇒ nothing to sync.
### The real remediation target (gated)
**`JOB2-kravet-syncgap.csv` — 100 ACTIVE Kravet products**, `cost_price` NULL → backfill from
`kravet_catalog.price_trade` (wholesale, $60.85–$481.95, verified 1:1 on dw_sku). Kravet is MAP-priced;
this fills the **cost** field only (retail already MAP-floored) so margin math stops running blind.
Harlequin + Graham Brown (1 each) ride along.
**Bottom line: the fleet's ~67k no-cost ACTIVE is ~99.85% by-design or un-keyable; genuine
recoverable margin-risk is ~102 rows.** The scary raw number is not a margin emergency.
---
## Artifacts
- `artifacts/JOB1-innovations-realcode-backfill.csv` — 13 rows (SHAPE-ONLY, recommend HOLD)
- `artifacts/JOB2-kravet-syncgap.csv` — 100 rows (clean, high-confidence)
- Gated memos: `~/.claude/yolo-queue/pending-approval/TK-10981-{job1,job2}-*.md`