← back to Harlequin Sample Price Analysis
cycle5: right-size the junk mfr_sku='TRUE' bug (adjacent finding, read-only)
25bb6a36386ee6e0d6158bf4dab6276f1e0f7848 · 2026-08-30 14:27:38 -0700 · Steve Abrams
- 3675 rows/10 vendors but 99.97% recoverable (real sku present), only 83 ACTIVE, 1 unrecoverable
- reframes the scary '18156 shared skus' as recoverable field-pollution, not broken products
- JUNK-MFRSKU-CYCLE5.md + enriched v2 memo Action 4 (LOW-MEDIUM ticket recommendation)
- no writes; new ticket remains Steve-gated
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
A artifacts/JUNK-MFRSKU-CYCLE5.mdM data/loop-ledger.jsonl
Diff
commit 25bb6a36386ee6e0d6158bf4dab6276f1e0f7848
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Aug 30 14:27:38 2026 -0700
cycle5: right-size the junk mfr_sku='TRUE' bug (adjacent finding, read-only)
- 3675 rows/10 vendors but 99.97% recoverable (real sku present), only 83 ACTIVE, 1 unrecoverable
- reframes the scary '18156 shared skus' as recoverable field-pollution, not broken products
- JUNK-MFRSKU-CYCLE5.md + enriched v2 memo Action 4 (LOW-MEDIUM ticket recommendation)
- no writes; new ticket remains Steve-gated
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
artifacts/JUNK-MFRSKU-CYCLE5.md | 28 ++++++++++++++++++++++++++++
data/loop-ledger.jsonl | 1 +
2 files changed, 29 insertions(+)
diff --git a/artifacts/JUNK-MFRSKU-CYCLE5.md b/artifacts/JUNK-MFRSKU-CYCLE5.md
new file mode 100644
index 0000000..81b3b26
--- /dev/null
+++ b/artifacts/JUNK-MFRSKU-CYCLE5.md
@@ -0,0 +1,28 @@
+# Adjacent finding — fleet-wide junk `mfr_sku` = 'TRUE' (read-only, cycle 5)
+
+Discovered during TK-10870's collision-sizing; **out of TK-10870 scope** — characterized here to
+right-size the "open a new ticket" recommendation (Action 4 of the gated memo). **No writes.**
+
+## Blast radius (right-sized)
+- **`mfr_sku = 'TRUE'` on 3,675 rows across 10 vendors.** A boolean leaked into the text `mfr_sku`
+ field — concentrated in specific scrape batches: **Fentucci 2,070 · Retro Walls 946 · Fentucci
+ Fabrics 367 · Innovations USA 129 · Mind the Gap 110** (+ small tails).
+- **Identity is NOT lost.** `has_real_sku` = row count for every vendor; **only 1 of 3,675** lacks a
+ recoverable sku. Products remain identifiable/priceable by `sku`/`dw_sku` — only cross-referencing
+ *by `mfr_sku`* is broken.
+- **Customer-facing impact is small: 83 ACTIVE** (77 of them Innovations USA); the rest are draft/archived.
+- Plus vendor-name leakage into `mfr_sku`: SANCAR 184 · Osborne 56 · York 55 · Innovations 52 (~347).
+
+## Severity verdict
+**LOW–MEDIUM, recoverable.** This is field-pollution cleanup, not a "products broken" emergency. The
+scary "18,156 shared skus" fleet number (cycle 2) is dominated by exactly this recoverable junk +
+legitimate pattern-level sharing — not real identity collisions like Cranes.
+
+## Root-cause hypothesis (to confirm in the ticket)
+A scraper/import wrote a boolean flag (e.g. `has_mfr_sku` / `in_stock` / an availability boolean)
+into the `mfr_sku` column for the Fentucci / Retro Walls / Innovations batches. Fix = re-derive
+`mfr_sku` from the source feed for those batches (they still have the real `sku`/`dw_sku` to re-key on).
+
+## Recommendation
+Open a LOW–MEDIUM ticket: "clean up junk `mfr_sku` field pollution (3,675 `'TRUE'` + ~347 vendor-name
+leaks, 83 active, 99.97% recoverable)." Gated (Action 4) — Steve's call. NOT done here.
diff --git a/data/loop-ledger.jsonl b/data/loop-ledger.jsonl
index c9791f3..efc0edb 100644
--- a/data/loop-ledger.jsonl
+++ b/data/loop-ledger.jsonl
@@ -2,3 +2,4 @@
{"cycle":2,"ts":"2026-08-30","ticket":"TK-10870","landed":["sized corruption class read-only","Harlequin: 1 product-id collision + 2 mfr mis-stamps/4 skus (corrected from 3/8 after Cody)","fleet-wide honest breakdown (junk-dominated: TRUE=3671 Fentucci/RetroWalls, not Cranes-style)","isJunkMfrSku lib+test (15 pass)","drafted consolidated gated memo to pending-approval"],"cody_verdict":"real hole: missed Demoiselle/Locronan collision + wrong count 3/8->2/4 + join-key caveat; all reproduced+fixed","final_dtd":"HOLD-FOR-STEVE","empirical_gate":"node --test 15/15","gated_held":["reprice (excl Cranes+Demoiselle/Locronan, join on shopify_product_id)","dw_sku backfill 4 Houndstooth","reconcile 2 collisions","new ticket: fleet-wide junk mfr_sku"],"seed_next":"final read-only verification pass; TK-10870 safe analysis complete -> expect only-gated-remains -> idle-pause"}
{"cycle":3,"ts":"2026-08-30","ticket":"TK-10870","type":"verification+idle","result":"NO CHANGE vs cycle2 — tests 15/15, census 32/31/1/5, 732 has_cost, 1 productid collision, 2 mfr mis-stamps (Cranes + Demoiselle/Locronan) all identical","cody":"no new claims -> cycle-2 gate stands (skipped re-run, cost-conscious)","final_dtd":"HOLD-FOR-STEVE","decision":"IDLE — only gated work remains (4-action memo). PAUSING loop per stop condition; resume when Steve approves a memo item or adds work.","reschedule":"NONE (paused)"}
{"cycle":4,"ts":"2026-08-30","ticket":"TK-10870","trigger":"Steve resume","landed":["built read-only reprice PLAN (artifacts/REPRICE-PLAN.md + reprice-plan.json)","plan-integrity tests (19->then 20 pass)","re-surfaced corrected gated memo v2 (v1 was auto-filed to _resolved unchecked/undecided)"],"cody":"3 holes: (1 VALID) sample-variant scope is all 30 not 3 + 3 sample-only rows -> repriceable is 27 not 30; (2 misread) DWHQ is real Shopify sku not fabricated; (3 misread) accounting closes 27+3+2=32. Valid one folded in.","final_dtd":"HOLD-FOR-STEVE","empirical_gate":"node --test","gated_held":["reprice 27 (v2 memo)","3 sample-only need roll variant","dw_sku backfill","reconcile collisions","fleet junk-mfr ticket"],"seed_next":"idle unless Steve approves v2 memo; loop pausing again (analysis+plan complete)"}
+{"cycle":5,"ts":"2026-08-30","ticket":"TK-10870+adjacent","trigger":"Steve resume","landed":["read-only root-cause+blast-radius of junk mfr_sku='TRUE' bug (adjacent, out of TK-10870 scope)","right-sized: 3675 rows/10 vendors but 99.97% recoverable, only 83 active, 1 unrecoverable","JUNK-MFRSKU-CYCLE5.md + enriched Action 4 of v2 memo"],"cody":"cost-conscious skip of 5th spawn — count-based low-risk finding, recoverability+active verified directly via DB (VERIFY-BEFORE-ACTING satisfied)","final_dtd":"HOLD-FOR-STEVE (Action 4 = gated new-ticket recommendation)","empirical_gate":"node --test 20/20 (no code change)","note":"TK-10870 safe surface exhausted; all next steps gated (reprice/backfill/reconcile/new-ticket). Pausing."}
← 7152046 TK-10870 cycle4: read-only reprice PLAN + Cody fixes (30->27
·
back to Harlequin Sample Price Analysis
·
cycle6 (compound): reusable read-only catalog-integrity dete cf2952a →