← 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
M data/live-stock-coverage.jsonM scripts/build-coverage.js
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 →