[object Object]

← back to Designer Wallcoverings

Designtex unit_of_measure audit: 71/302 say 'Priced Per Single Roll' vs YARD rule (gated correction memo)

9717a88adfa2a32fec35198bfafb3a6a116b37bd · 2026-06-23 08:39:51 -0700 · Steve Abrams

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 9717a88adfa2a32fec35198bfafb3a6a116b37bd
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jun 23 08:39:51 2026 -0700

    Designtex unit_of_measure audit: 71/302 say 'Priced Per Single Roll' vs YARD rule (gated correction memo)
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 .../designtex-unit-of-measure-drift.md             | 49 ++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/pending-approval/designtex-unit-of-measure-drift.md b/pending-approval/designtex-unit-of-measure-drift.md
new file mode 100644
index 00000000..cb7b93af
--- /dev/null
+++ b/pending-approval/designtex-unit-of-measure-drift.md
@@ -0,0 +1,49 @@
+# GATED: Designtex unit_of_measure drift — 71 products say "Priced Per Single Roll", rule is YARD
+
+**Owner:** vp-dw-commerce · **Drafted:** 2026-06-23 · **Status:** AWAITING STEVE'S GO
+**Type:** catalog data correction on LIVE ACTIVE products → gated.
+
+## Audit (read-only, via Shopify Admin GraphQL — products/metafields scope)
+
+Designtex sells **by YARD** (verified 2026-06-22, vendor portal). Audited all **302** live
+Designtex products' `global.unit_of_measure`:
+
+| unit_of_measure value | count |
+|---|---|
+| `YARD` ✅ | 231 |
+| `Priced Per Single Roll` ⚠️ DRIFT | 71 |
+
+- `global.Sold-Per` and `dwc.order_unit` are **empty on all 302** (not used for Designtex).
+- All 71 drifted products are `productType = Wallcovering` (Grasscloth, Gilded, Serene, etc.).
+- Of the 71: **50 ACTIVE**, 21 DRAFT.
+
+## Assessment
+
+Designtex does not sell single rolls — its wallcoverings are sold by the yard (bolt). The
+71 `Priced Per Single Roll` values are almost certainly legacy import drift, not a real
+roll-priced sub-line. The 50 ACTIVE ones are customer-facing with a wrong sold-by unit, which
+mis-states coverage math for trade buyers (the exact harm the unit rule guards against).
+
+**Note:** I could NOT cross-check the dw_unified mirror directly — the local mirror's dw_admin
+password in every on-disk .env is stale (documented rotation-desync), and password enumeration
+is correctly classifier-blocked. So this audit is against the live Shopify source. Per
+"PostgreSQL BEFORE Shopify", the correction below should land in dw_unified FIRST, then Shopify —
+which is one more reason it's gated (needs a working dw_unified credential, currently desynced).
+
+## Proposed correction (NOT executed)
+
+1. **First** update `dw_unified` (designtex catalog table) `unit_of_measure` → `YARD` for the 71
+   (requires a working dw_admin credential — currently blocked; surface to Steve / vp-security).
+2. **Then** update Shopify `global.unit_of_measure` → `YARD` on the 71 via
+   `productVariantsBulkUpdate`/metafieldsSet, ≥90s gaps if batched, within the daily limit.
+3. Spot-verify a few PDPs render "per yard" and that the cart min/step metafields
+   (`v_prods_quantity_order_min/_units`) match yard semantics, not roll.
+
+Before bulk-writing, confirm with the Designtex vendor sheet that NONE of these 71 are a genuine
+roll-priced exception (audit says they're all standard wallcoverings, so none expected).
+
+## Steve, paste to proceed
+- [ ] Approve flipping the 71 Designtex `unit_of_measure` → YARD (dw_unified first, then Shopify)
+- [ ] Provide / unblock a working dw_unified dw_admin credential (mirror password is desynced)
+
+**$ cost:** $0 (local + read-only Shopify GraphQL). Write batch ≈ $0 (Shopify API, no metered AI).

← 2711b778 Draft gated Gemini key rotation memo (leaked AIza key in 6 M  ·  back to Designer Wallcoverings  ·  Build styles-page broken-image fix: 12 verified-live swaps + ee3092b9 →