[object Object]

← back to All Designerwallcoverings

coverage: resolvability gate — only ENABLE live-capable vendors whose display SKUs actually align with the catalog (drops PS Removable/Nina/Hygge false-enables); 4 genuinely-usable

803861adca95541c9033cf87fa449fb19e7bb859 · 2026-07-07 09:32:26 -0700 · Steve

Files touched

Diff

commit 803861adca95541c9033cf87fa449fb19e7bb859
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Jul 7 09:32:26 2026 -0700

    coverage: resolvability gate — only ENABLE live-capable vendors whose display SKUs actually align with the catalog (drops PS Removable/Nina/Hygge false-enables); 4 genuinely-usable
---
 data/live-stock-coverage.json | 92 +++++++++++++++++++++++++++----------------
 scripts/build-coverage.js     | 32 ++++++++++++++-
 2 files changed, 89 insertions(+), 35 deletions(-)

diff --git a/data/live-stock-coverage.json b/data/live-stock-coverage.json
index a03c611..f465e9c 100644
--- a/data/live-stock-coverage.json
+++ b/data/live-stock-coverage.json
@@ -1,5 +1,5 @@
 {
-  "generated_at": "2026-07-07T16:22:59.582Z",
+  "generated_at": "2026-07-07T16:31:39.711Z",
   "generator": "scripts/build-coverage.js",
   "total_display_vendors": 254,
   "counts": {
@@ -8,7 +8,7 @@
     "PORTAL_NO_CREDS": 30,
     "QUOTE_ONLY": 35,
     "NO_STOCK": 172,
-    "live_capable": 13
+    "live_capable": 4
   },
   "vendors": {
     "1838 Wallcoverings": {
@@ -20,7 +20,9 @@
       "backing": "1838 Wallcoverings",
       "match": "exact",
       "products": 481,
-      "active": 465
+      "active": 465,
+      "resolvable_active": 460,
+      "resolvable_pct": 99
     },
     "420 Studios": {
       "tier": "NO_STOCK",
@@ -332,14 +334,16 @@
     },
     "Carlisle & Co. Walls": {
       "tier": "PUBLIC_STOCK",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "shopify-public",
-      "reason": "public Shopify storefront stock (.js feed)",
+      "reason": "adapter wired (shopify-public) but display SKUs don't align with the carlisle_catalog catalog (0 of 0 active resolvable) — needs SKU remap",
       "catalog_table": "carlisle_catalog",
       "backing": "Carlisle & Co",
       "match": "suffix-strip",
       "products": 441,
-      "active": 0
+      "active": 0,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "Caroline Cecil Textiles": {
       "tier": "NO_STOCK",
@@ -1256,14 +1260,16 @@
     },
     "Hygge & West": {
       "tier": "PUBLIC_STOCK",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "shopify-public",
-      "reason": "public Shopify storefront stock (.js feed)",
+      "reason": "adapter wired (shopify-public) but display SKUs don't align with the hygge_catalog catalog (0 of 10 active resolvable) — needs SKU remap",
       "catalog_table": "hygge_catalog",
       "backing": "Hygge & West",
       "match": "exact",
       "products": 11,
-      "active": 10
+      "active": 10,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "IKSEL": {
       "tier": "QUOTE_ONLY",
@@ -1575,14 +1581,16 @@
     },
     "Malibu": {
       "tier": "PORTAL_CREDS",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "wallquest",
-      "reason": "WallQuest trade portal (creds on file)",
+      "reason": "adapter wired (wallquest) but display SKUs don't align with the wallquest_catalog catalog (1 of 3 active resolvable) — needs SKU remap",
       "catalog_table": "wallquest_catalog",
       "backing": null,
       "match": "unmatched",
       "products": 3,
-      "active": 3
+      "active": 3,
+      "resolvable_active": 1,
+      "resolvable_pct": 33
     },
     "Malibu Wallpaper": {
       "tier": "PORTAL_CREDS",
@@ -1593,18 +1601,22 @@
       "backing": "Malibu Wallpaper",
       "match": "exact",
       "products": 4031,
-      "active": 2596
+      "active": 2596,
+      "resolvable_active": 2172,
+      "resolvable_pct": 84
     },
     "Malibu Walls": {
       "tier": "PORTAL_CREDS",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "wallquest",
-      "reason": "WallQuest trade portal (creds on file)",
+      "reason": "adapter wired (wallquest) but display SKUs don't align with the wallquest_catalog catalog (0 of 1 active resolvable) — needs SKU remap",
       "catalog_table": "wallquest_catalog",
       "backing": null,
       "match": "unmatched",
       "products": 119,
-      "active": 1
+      "active": 1,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "Manuel Canovas": {
       "tier": "QUOTE_ONLY",
@@ -1806,36 +1818,42 @@
     },
     "Nina Campbell": {
       "tier": "PUBLIC_STOCK",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "shopify-public",
-      "reason": "public Shopify storefront stock (.js feed)",
+      "reason": "adapter wired (shopify-public) but display SKUs don't align with the nina_campbell_catalog catalog (8 of 551 active resolvable) — needs SKU remap",
       "catalog_table": "nina_campbell_catalog",
       "backing": "Nina Campbell",
       "match": "exact",
       "products": 791,
-      "active": 551
+      "active": 551,
+      "resolvable_active": 8,
+      "resolvable_pct": 1
     },
     "Nina Campbell Wallcoverings": {
       "tier": "PUBLIC_STOCK",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "shopify-public",
-      "reason": "public Shopify storefront stock (.js feed)",
+      "reason": "adapter wired (shopify-public) but display SKUs don't align with the nina_campbell_catalog catalog (0 of 0 active resolvable) — needs SKU remap",
       "catalog_table": "nina_campbell_catalog",
       "backing": "Nina Campbell",
       "match": "suffix-strip",
       "products": 111,
-      "active": 0
+      "active": 0,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "NLXL": {
       "tier": "PUBLIC_STOCK",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "shopify-public",
-      "reason": "public Shopify storefront stock (.js feed)",
+      "reason": "adapter wired (shopify-public) but display SKUs don't align with the nlxl_catalog catalog (0 of 9 active resolvable) — needs SKU remap",
       "catalog_table": "nlxl_catalog",
       "backing": "NLXL",
       "match": "exact",
       "products": 10,
-      "active": 9
+      "active": 9,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "Nobilis": {
       "tier": "QUOTE_ONLY",
@@ -2092,14 +2110,16 @@
     },
     "PS Removable Wallpaper": {
       "tier": "PORTAL_CREDS",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "wallquest",
-      "reason": "WallQuest trade portal (creds on file)",
+      "reason": "adapter wired (wallquest) but display SKUs don't align with the wallquest_catalog catalog (0 of 736 active resolvable) — needs SKU remap",
       "catalog_table": "wallquest_catalog",
       "backing": null,
       "match": "unmatched",
       "products": 737,
-      "active": 736
+      "active": 736,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "Quadrille": {
       "tier": "QUOTE_ONLY",
@@ -2231,7 +2251,9 @@
       "backing": "Romo",
       "match": "exact",
       "products": 568,
-      "active": 521
+      "active": 521,
+      "resolvable_active": 502,
+      "resolvable_pct": 96
     },
     "Ronald Redding": {
       "tier": "NO_STOCK",
@@ -2264,7 +2286,9 @@
       "backing": "Sancar",
       "match": "exact",
       "products": 42,
-      "active": 42
+      "active": 42,
+      "resolvable_active": 42,
+      "resolvable_pct": 100
     },
     "Sandberg": {
       "tier": "NO_STOCK",
@@ -2488,14 +2512,16 @@
     },
     "Studio Printworks": {
       "tier": "PUBLIC_STOCK",
-      "live_capable": true,
+      "live_capable": false,
       "adapter": "shopify-public",
-      "reason": "public Shopify storefront stock (.js feed)",
+      "reason": "adapter wired (shopify-public) but display SKUs don't align with the studio_printworks_catalog catalog (0 of 0 active resolvable) — needs SKU remap",
       "catalog_table": "studio_printworks_catalog",
       "backing": "Studio Printworks",
       "match": "exact",
       "products": 1,
-      "active": 0
+      "active": 0,
+      "resolvable_active": 0,
+      "resolvable_pct": 0
     },
     "SUGARBOO": {
       "tier": "NO_STOCK",
diff --git a/scripts/build-coverage.js b/scripts/build-coverage.js
index 8ce7486..1e61904 100644
--- a/scripts/build-coverage.js
+++ b/scripts/build-coverage.js
@@ -182,19 +182,47 @@ async function main() {
       reason: 'no live stock source identified for this line' };
   }
 
+  // How many of a vendor's ACTIVE display SKUs actually resolve to a product_url in its backing
+  // catalog (matched by dw_sku OR mfr_sku). A wired adapter is USELESS — and would burn a metered
+  // session per click only to miss — if the grid's SKUs don't align with the catalog's SKUs.
+  async function resolvableCount(vendor, tbl) {
+    if (!tbl || !/^[a-z0-9_]+$/.test(tbl) || tbl === 'vendor_catalog') return { active: 0, resolvable: 0 };
+    try {
+      const { rows } = await pool.query(
+        `SELECT count(*) FILTER (WHERE upper(s.status)='ACTIVE')::int AS active,
+                count(*) FILTER (WHERE upper(s.status)='ACTIVE' AND EXISTS (
+                   SELECT 1 FROM "${tbl}" c
+                    WHERE (upper(c.dw_sku)=upper(s.dw_sku) OR upper(coalesce(c.mfr_sku,''))=upper(coalesce(s.mfr_sku,'')))
+                      AND c.product_url IS NOT NULL AND c.product_url <> ''))::int AS resolvable
+           FROM shopify_products s WHERE s.vendor = $1`, [vendor]);
+      return rows[0];
+    } catch { return { active: 0, resolvable: 0 }; }
+  }
+
   const vendors = {};
   const counts = { PORTAL_CREDS: 0, PUBLIC_STOCK: 0, PORTAL_NO_CREDS: 0, QUOTE_ONLY: 0, NO_STOCK: 0, live_capable: 0 };
   for (const dv of displayVendors) {
     const { row: backing, method } = resolve(dv.vendor);
     const c = classify(dv.vendor, backing, method);
-    vendors[dv.vendor] = {
+    const entry = {
       tier: c.tier, live_capable: c.live_capable, adapter: c.adapter || null, reason: c.reason,
       catalog_table: c.catalog_table || (backing && backing.catalog_table) || null,
       backing: backing ? backing.vendor_name : null, match: method,
       products: dv.total, active: dv.active,
     };
+    // Resolvability gate: only ENABLE a wired vendor whose display SKUs actually align with its catalog.
+    if (entry.live_capable && entry.adapter) {
+      const { active, resolvable } = await resolvableCount(dv.vendor, entry.catalog_table);
+      entry.resolvable_active = resolvable;
+      entry.resolvable_pct = active ? Math.round((resolvable / active) * 100) : 0;
+      if (!(resolvable >= 5 && entry.resolvable_pct >= 20)) {
+        entry.live_capable = false;
+        entry.reason = `adapter wired (${entry.adapter}) but display SKUs don't align with the ${entry.catalog_table} catalog (${resolvable} of ${active} active resolvable) — needs SKU remap`;
+      }
+    }
+    vendors[dv.vendor] = entry;
     counts[c.tier] = (counts[c.tier] || 0) + 1;
-    if (c.live_capable) counts.live_capable += 1;
+    if (entry.live_capable) counts.live_capable += 1;
   }
 
   const out = {

← af39b75 live-stock adapter framework: generalized per-vendor registr  ·  back to All Designerwallcoverings  ·  adapters: shared grid-SKU→catalog resolver (bridge via shopi 5d8857a →