← back to Ticket System
TK-10002 Phase-2b: apply 3 true-duplicate merges (archives landed; redirects blocked on scope)
8ccef83212c323ac1ac8ff8c54efe0a578a82aa7 · 2026-07-28 16:37:04 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
A tk10002-phase2b/APPLY-RESULTS.md
Diff
commit 8ccef83212c323ac1ac8ff8c54efe0a578a82aa7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue Jul 28 16:37:04 2026 -0700
TK-10002 Phase-2b: apply 3 true-duplicate merges (archives landed; redirects blocked on scope)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
tk10002-phase2b/APPLY-RESULTS.md | 90 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/tk10002-phase2b/APPLY-RESULTS.md b/tk10002-phase2b/APPLY-RESULTS.md
new file mode 100644
index 00000000..b265d29a
--- /dev/null
+++ b/tk10002-phase2b/APPLY-RESULTS.md
@@ -0,0 +1,90 @@
+# TK-10002 Phase-2b — APPLY RESULTS (3 true-duplicate merges)
+
+**Ticket:** TK-10002-dw-duplicate-active-products-hunt-yolo · **Agent:** vp-dw-commerce
+**Date applied:** 2026-07-28 · **Store:** `designer-laboratory-sandbox.myshopify.com` (LIVE prod) · API `2024-10`
+**Authorization:** Steve chose "Execute the 3 merges" in-session 2026-07-28. Scope = EXACTLY the 3 AUTO-MERGE groups in PLAN.md (commit `af440a2`). Nothing else touched.
+**Source of truth:** `PLAN.md` (commit `af440a2`). Order: PostgreSQL mirror BEFORE Shopify per standing rule.
+**Cost:** `$0 (local)` — PG mirror writes (local socket) + read-only + Shopify GraphQL mutations (free-tier, $0). No metered/paid-model calls.
+
+---
+
+## Pre-apply gating (all 3 groups)
+
+### Live re-verify (read-only GraphQL, no drift vs af440a2)
+All 6 products (3 survivors + 3 archive-candidates) were still ACTIVE-ACTIVE, still identical-product duplicates (same title, same dw_sku, same variant SKUs, all with images). PASS — no group drifted, none skipped.
+
+### Open-order confirm (READ-ONLY)
+- FM MCP tools were **not exposed** to this session (same as the read-only scoping agent noted in PLAN Section 4).
+- Live Shopify Orders API was **not usable**: `SHOPIFY_ADMIN_TOKEN` (…75b9) lacks `read_orders` (ACCESS_DENIED on the `orders` field).
+- Fell back to the PLAN Section-4 local-mirror check: scanned `dw_unified.digital_sample_orders` (`dig_skus` text[] + `product_titles`) for `DIG-740017 | DWC-Arte-40323 | DWK-30522` and the three titles → **0 matches**.
+- Structural fact (PLAN §4): both twins in each group carry the **same** variant SKUs, so any order line points to the SKU string, not a product id → archiving the twin **cannot orphan an order line** (the SKU still resolves via the surviving product). Exposure = **structurally 0**.
+- Verdict: **0 open-order exposure** in all local caches; UNVERIFIED against live FM (tools/scope unavailable) but structurally non-blocking. No group held.
+
+---
+
+## Per-group results
+
+### Group 1 — `DIG-740017` — DW Bespoke Studio — "Happy Days Revivial 1970's" — APPLIED ✅
+| role | product gid | handle | status before → after |
+|---|---|---|---|
+| SURVIVOR (untouched) | `gid://shopify/Product/6900076249139` | `happy-days-revivial-authentic-1970s-reproduction-vintage-wallcoverings` | ACTIVE → **ACTIVE** |
+| ARCHIVED | `gid://shopify/Product/7582541578291` | `happy-days-revivial-authentic-1970s-reproduction-vintage-wallpapers` | ACTIVE → **ARCHIVED** |
+- Shared variant SKUs: `DIG-740017-SAMPLE` ($4.25), `DIG-740017` ($199.00). Archive twin used banned word "wallpapers" in handle (reinforced archiving it).
+- Mirror: `UPDATE 1` (status=ARCHIVED). Shopify `productUpdate` status=ARCHIVED, userErrors=[].
+- **Redirect: NOT CREATED** — `urlRedirectCreate` denied (token lacks `write_online_store_navigation`). See "Redirects blocked" below.
+
+### Group 2 — `DWC-Arte-40323-Sample` — Arte International — "Fringe Double Jute Contemporary Wallcovering" — APPLIED ✅
+| role | product gid | handle | status before → after |
+|---|---|---|---|
+| SURVIVOR (untouched) | `gid://shopify/Product/4348475899955` | `fringe-double-jute-contemporary-wallpaper-5` | ACTIVE → **ACTIVE** |
+| ARCHIVED | `gid://shopify/Product/4348476653619` | `fringe-double-jute-contemporary-wallpaper-6` | ACTIVE → **ARCHIVED** |
+- Shared variant SKUs: `DWC-Arte-40323` ($4.25), `DWC-Arte-40323-Sample` ($4.25). Identical title + dw_sku.
+- Mirror: `UPDATE 1`. Shopify `productUpdate` status=ARCHIVED, userErrors=[].
+- **Redirect: NOT CREATED** — same scope denial.
+- NOTE (out of scope, deferred): the survivor's ROLL variant `DWC-Arte-40323` is priced at the $4.25 sample price (below-cost/GMC risk). This is the SEPARATE Arte $4.25-leak pass Steve deferred — NOT touched here.
+
+### Group 3 — `DWK-30522` — Koroseal — "Happenstance Curiosity - Steel Blue Commercial Wallcovering" — APPLIED ✅
+| role | product gid | handle | status before → after |
+|---|---|---|---|
+| SURVIVOR (untouched) | `gid://shopify/Product/7584916308019` | `dwk-30522-koroseal-koroseal-type-2-vinyl-hp21-08-happenstance-amethyst` | ACTIVE → **ACTIVE** |
+| ARCHIVED | `gid://shopify/Product/7632318464051` | `dwk-30522-koroseal-koroseal-type-2-vinyl-hp21-08-happenstance-curiosity` | ACTIVE → **ARCHIVED** |
+- Single shared variant SKU: `DWK-30522` ($4.25, Koroseal quote-only grandfathered). Identical title + dw_sku, mfr `HP21-08`.
+- Survivor kept on created_at (older = `-amethyst` slug) per PLAN; cosmetic slug-preference note only, no ambiguity.
+- Mirror: `UPDATE 1`. Shopify `productUpdate` status=ARCHIVED, userErrors=[].
+- **Redirect: NOT CREATED** — same scope denial.
+
+---
+
+## Redirects — BLOCKED (needs Steve)
+
+All 3 `urlRedirectCreate` calls returned `ACCESS_DENIED` — **required scope `write_online_store_navigation` is not on `SHOPIFY_ADMIN_TOKEN` (…75b9)** (a products-only token). I did NOT hunt other fleet tokens for the scope (classifier-gated credential-exploration, correctly). The 3 redirects Steve approved therefore remain **pending a token/scope decision**:
+
+1. `/products/happy-days-revivial-authentic-1970s-reproduction-vintage-wallpapers` → `/products/happy-days-revivial-authentic-1970s-reproduction-vintage-wallcoverings`
+2. `/products/fringe-double-jute-contemporary-wallpaper-6` → `/products/fringe-double-jute-contemporary-wallpaper-5`
+3. `/products/dwk-30522-koroseal-koroseal-type-2-vinyl-hp21-08-happenstance-curiosity` → `/products/dwk-30522-koroseal-koroseal-type-2-vinyl-hp21-08-happenstance-amethyst`
+
+Fix options for Steve: (a) add `write_online_store_navigation` scope to the DW admin app (admin.shopify.com/store/designer-laboratory-sandbox → Apps → Develop apps → Configuration → Edit scopes → Save → Update the token), then re-run just the 3 redirects; or (b) point me at a fleet token that already carries the scope. Redirect memo dropped to `~/.claude/yolo-queue/pending-approval/`.
+
+**Impact of missing redirects:** the archived handles now 404 for any inbound link/bookmark until a redirect exists. Low but non-zero SEO/UX cost; the archive itself (the merge) is complete and correct.
+
+---
+
+## Final verified state (Shopify authoritative + mirror, both confirmed)
+```
+s1 ACTIVE happy-days-revivial-...-wallcoverings (survivor, untouched)
+a1 ARCHIVED happy-days-revivial-...-wallpapers (archived)
+s2 ACTIVE fringe-double-jute-contemporary-wallpaper-5 (survivor, untouched)
+a2 ARCHIVED fringe-double-jute-contemporary-wallpaper-6 (archived)
+s3 ACTIVE dwk-30522-...-happenstance-amethyst (survivor, untouched)
+a3 ARCHIVED dwk-30522-...-happenstance-curiosity (archived)
+```
+Mirror `dw_unified.shopify_products.status` matches (3 survivors ACTIVE, 3 archived).
+
+## Remaining Phase-2b (all still gated/deferred — NOT actioned)
+- 32 re-SKU false-collision groups (PLAN Section 2)
+- 112 null-Sample PR merge project (incl. the 3 `PRW-650xx-Sample` groups)
+- 65 FAA policy
+- Arte `$4.25` roll-price leak (separate approved-later pass)
+- partial unique index on `variant_sku`
+
+Ticket stays `doing`.
← af440a28 TK-10002 Phase-2b: same-vendor merge plan (3 true dupes to a
·
back to Ticket System
·
TK-10002 Phase-2b: 3 redirects created (content token), merg c4d1da65 →