← back to Dw Activation Debug TK11314
Fix draft readiness reads and add fail-closed vision diagnostics and repair reporting
8a7469e167540515d79b7b3903ab81dd54bbd85c · 2026-09-09 09:57:06 -0700 · Steve Abrams
Files touched
M .gitignoreA lib/activation-result.jsA lib/live-product-fields.jsA lib/readiness-repairs.jsM lib/settlement-gate.jsA lib/vision-http.jsM rotate-activate.jsA scripts/build-repair-report.jsA scripts/capture-readiness.jsA scripts/diagnose-vision-project.jsA scripts/replay-readiness.jsA scripts/verify-live-boundary.jsA test/activation-result.test.jsA test/live-product-fields.test.jsA test/readiness-repairs.test.jsA test/vision-http.test.jsA verification/REVIEW.mdM verification/e2e-proof.jsonA verification/live-boundary.jsonA verification/readiness-replay.json
Diff
commit 8a7469e167540515d79b7b3903ab81dd54bbd85c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Sep 9 09:57:06 2026 -0700
Fix draft readiness reads and add fail-closed vision diagnostics and repair reporting
---
.gitignore | 3 +
lib/activation-result.js | 8 +
lib/live-product-fields.js | 61 +
lib/readiness-repairs.js | 51 +
lib/settlement-gate.js | 59 +-
lib/vision-http.js | 53 +
rotate-activate.js | 74 +-
scripts/build-repair-report.js | 23 +
scripts/capture-readiness.js | 56 +
scripts/diagnose-vision-project.js | 41 +
scripts/replay-readiness.js | 49 +
scripts/verify-live-boundary.js | 63 +
test/activation-result.test.js | 15 +
test/live-product-fields.test.js | 55 +
test/readiness-repairs.test.js | 21 +
test/vision-http.test.js | 69 +
verification/REVIEW.md | 44 +
verification/e2e-proof.json | 100 +-
verification/live-boundary.json | 826 ++++++
verification/readiness-replay.json | 5104 ++++++++++++++++++++++++++++++++++++
20 files changed, 6692 insertions(+), 83 deletions(-)
diff --git a/.gitignore b/.gitignore
index a9645f7..851699e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,6 @@ dist/
build/
out/*.jsonl
out/activation-ledger-*.json
+out/current-readiness-repairs.json*
+verification/live-products*.json
+verification/readiness-repairs*.json
diff --git a/lib/activation-result.js b/lib/activation-result.js
new file mode 100644
index 0000000..d8c93d3
--- /dev/null
+++ b/lib/activation-result.js
@@ -0,0 +1,8 @@
+'use strict';
+function confirmedActivation(response, productId) {
+ const update = response?.json?.data?.productUpdate;
+ return response?.status === 200 && !response.json.errors?.length &&
+ Array.isArray(update?.userErrors) && update.userErrors.length === 0 &&
+ update.product?.id === productId && update.product.status === 'ACTIVE';
+}
+module.exports = { confirmedActivation };
diff --git a/lib/live-product-fields.js b/lib/live-product-fields.js
new file mode 100644
index 0000000..9c9ef60
--- /dev/null
+++ b/lib/live-product-fields.js
@@ -0,0 +1,61 @@
+'use strict';
+
+// Explicit catalog namespaces only. Never infer a width from a title, price,
+// description, or an unrelated shipping/package dimension.
+const WIDTH_NAMESPACES = ['global', 'custom', 'dwc', 'specs', 'carnegie'];
+function field(nodes, namespace, key) {
+ return (nodes || []).find(m => m.namespace === namespace && m.key === key &&
+ typeof m.value === 'string' && m.value.trim())?.value.trim() || '';
+}
+function widthFromLive(product) {
+ const nodes = product.metafields?.nodes || [];
+ for (const namespace of WIDTH_NAMESPACES) {
+ if (namespace === 'carnegie' && String(product.vendor).toLowerCase() !== 'carnegie') continue;
+ const value = field(nodes, namespace, 'width');
+ if (value) return { value, source: `${namespace}.width` };
+ }
+ return { value: '', source: null };
+}
+function canonicalProduct(product, dwSku, vendor) {
+ const nodes = product.metafields?.nodes || [];
+ const get = (namespace, key) => field(nodes, namespace, key);
+ const images = (product.images?.nodes || []).map(image => image.url);
+ const specs = {
+ width: widthFromLive(product).value,
+ length: get('global', 'length'), repeat: get('global', 'repeat'),
+ material: get('global', 'material') || get('custom', 'material') || get('specs', 'material'),
+ unitOfMeasure: get('global', 'unit_of_measure'),
+ };
+ return { title: product.title, dwSku: dwSku || '', vendor, tags: product.tags || [],
+ descriptionHtml: product.descriptionHtml || '', specs, vendorSpecs: specs,
+ images, vendorImages: images,
+ variants: (product.variants?.nodes || []).map(v => ({ sku: v.sku, title: v.title })),
+ };
+}
+async function completeLiveProduct(product, query) {
+ const result = { ...product };
+ for (const connection of ['variants', 'metafields']) {
+ let page = result[connection];
+ const nodes = [...(page?.nodes || [])];
+ const cursors = new Set();
+ while (page?.pageInfo?.hasNextPage) {
+ const cursor = page.pageInfo.endCursor;
+ if (!cursor || cursors.has(cursor) || cursors.size >= 100)
+ throw new Error(`Cannot safely paginate ${connection}`);
+ cursors.add(cursor);
+ const fields = connection === 'variants' ? 'price sku title' : 'namespace key value';
+ const response = await query(`query($id:ID!,$cursor:String!){product(id:$id){id
+ ${connection}(first:100,after:$cursor){nodes{${fields}} pageInfo{hasNextPage endCursor}}
+ }}`, { id: product.id, cursor });
+ const next = response.json?.data?.product;
+ if (response.status !== 200 || response.json?.errors?.length || next?.id !== product.id ||
+ !Array.isArray(next[connection]?.nodes) || typeof next[connection]?.pageInfo?.hasNextPage !== 'boolean')
+ throw new Error(`Incomplete Shopify ${connection} response`);
+ page = next[connection];
+ nodes.push(...page.nodes);
+ }
+ result[connection] = { ...page, nodes };
+ }
+ return result;
+}
+module.exports = { WIDTH_NAMESPACES, widthFromLive, canonicalProduct, completeLiveProduct };
diff --git a/lib/readiness-repairs.js b/lib/readiness-repairs.js
new file mode 100644
index 0000000..c8cf311
--- /dev/null
+++ b/lib/readiness-repairs.js
@@ -0,0 +1,51 @@
+'use strict';
+function repairType(reason) {
+ if (/missing spec.*width/.test(reason)) return 'restore-width-metafield';
+ if (/mfr-sku/.test(reason)) return 'verify-manufacturer-code';
+ if (/description/.test(reason)) return 'repair-description';
+ if (/sample.variant/.test(reason)) return 'restore-sample-variant';
+ if (/price|sellable/.test(reason)) return 'verify-sellable-price';
+ if (/no product image/.test(reason)) return 'restore-product-image';
+ if (/private-label-leak/.test(reason)) return 'correct-private-label';
+ if (/banned word/.test(reason)) return 'correct-title';
+ return 'review-readiness';
+}
+function buildRepairReport(decisions, { generatedAt = new Date().toISOString(), complete = true } = {}) {
+ const latest = new Map();
+ for (const row of decisions) {
+ if (!row.shopify_id) continue;
+ const previous = latest.get(row.shopify_id);
+ if (!previous || String(row.ts) >= String(previous.ts)) latest.set(row.shopify_id, row);
+ }
+ const items = [];
+ const counts = {};
+ for (const row of latest.values()) {
+ if (!['skip-gate', 'skip-read-error', 'activate-error', 'settlement-hold', 'settlement-block'].includes(row.action)) continue;
+ const groups = new Map();
+ for (const reason of row.reasons || []) {
+ const type = repairType(reason);
+ if (!groups.has(type)) groups.set(type, []);
+ groups.get(type).push(reason);
+ }
+ if (row.action === 'settlement-hold') groups.set('retry-image-review', [row.settlement?.reason || 'unknown']);
+ if (row.action === 'settlement-block') groups.set('settlement-block-review', [row.settlement?.reason || 'unknown']);
+ if (row.action === 'activate-error') groups.set('verify-activation-result', ['Shopify did not confirm ACTIVE']);
+ for (const [type, reasons] of groups) {
+ counts[type] = (counts[type] || 0) + 1;
+ items.push({ id: `${row.shopify_id}:${type}`, shopify_id: row.shopify_id,
+ dw_sku: row.dw_sku, vendor: row.vendor, title: row.title,
+ observed_at: row.ts, created_at: row.ts, type, reasons: [...new Set(reasons)],
+ source: 'rotation-live-check', width_source: row.width_source || null,
+ diagnostics: row.settlement?.diagnostics || null,
+ requires: type === 'retry-image-review' ? 'provider-recovery-and-fresh-review' : 'verified-source-and-live-recheck',
+ apply_authorized: false,
+ });
+ }
+ }
+ return { schema_version: 1, generated_at: generatedAt, scan_complete: complete,
+ scope: 'Products observed in this activation run; not the entire draft catalog',
+ mode: 'review-only', products_observed: latest.size,
+ products_needing_attention: new Set(items.map(item => item.shopify_id)).size,
+ counts, items };
+}
+module.exports = { buildRepairReport, repairType };
diff --git a/lib/settlement-gate.js b/lib/settlement-gate.js
index dbc2d11..03702b0 100644
--- a/lib/settlement-gate.js
+++ b/lib/settlement-gate.js
@@ -43,6 +43,7 @@ const os = require('os');
const path = require('path');
const https = require('https');
const { execFileSync } = require('child_process');
+const { requestVision, errorDetails, cooldownMs } = require('./vision-http.js');
// ── texture material lexicon (auto-pass tier) ────────────────────────────────
// Prompt-specified plain-texture set. A product is a candidate auto-pass only if
@@ -114,12 +115,20 @@ class SettlementGate {
this.visionCalls = 0;
this.visionCostTotal = 0;
this.autoPassCount = 0;
+ this.visionRetryAt = 0;
+ this.lastVisionError = null;
+ this.visionHttpAttempts = 0;
+ this.visionThrottledSkips = 0;
}
lockStatus() { return { ok: this.lockOk, msg: this.lockMsg }; }
stats() {
return { visionCalls: this.visionCalls, visionCostTotal: this.visionCostTotal,
- autoPassCount: this.autoPassCount };
+ autoPassCount: this.autoPassCount, visionHttpAttempts: this.visionHttpAttempts,
+ visionThrottledSkips: this.visionThrottledSkips,
+ visionKeysConfigured: this.geminiKeys?.length || 0,
+ retryAt: this.visionRetryAt ? new Date(this.visionRetryAt).toISOString() : null,
+ lastVisionError: this.lastVisionError };
}
// Cheap auto-pass test: solid texture material + NO motif keyword in title.
@@ -151,17 +160,26 @@ class SettlementGate {
// Iterates over available keys, falling through a 429 / quota-cap to the next.
// Returns { ok:true, partA, partB, acceptable } or { ok:false, why }.
async visionDetect(b64, mime) {
+ if (Date.now() < this.visionRetryAt) {
+ this.visionThrottledSkips++;
+ return { ok: false, why: 'vision-rate-limit-cooldown', details: this.lastVisionError };
+ }
const keys = this.geminiKeys && this.geminiKeys.length ? this.geminiKeys
: (this.geminiKey ? [this.geminiKey] : []);
if (!keys.length) return { ok: false, why: 'no-gemini-key' };
let last = { ok: false, why: 'no-attempt' };
for (const key of keys) {
+ this.visionHttpAttempts++;
const r = await this._visionCall(b64, mime, key);
- if (r.ok) return r;
+ if (r.ok) { this.visionRetryAt = 0; this.lastVisionError = null; return r; }
last = r;
// only fall through on rate/quota; a hard error (parse) shouldn't loop keys.
if (!/^vision-http-429$/.test(r.why || '')) break;
}
+ if (last.why === 'vision-http-429') {
+ this.lastVisionError = last.details || { httpStatus: 429 };
+ this.visionRetryAt = Date.now() + cooldownMs(this.lastVisionError);
+ }
return last;
}
@@ -185,30 +203,20 @@ class SettlementGate {
] }],
generationConfig: { temperature: 0, responseMimeType: 'application/json' },
};
- const data = JSON.stringify(body);
- const res = await new Promise((resolve) => {
- const req = https.request({
- host: 'generativelanguage.googleapis.com',
- path: `/v1beta/models/gemini-2.5-flash:generateContent?key=${key}`,
- method: 'POST',
- headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data) },
- }, (r) => { let d = ''; r.on('data', (c) => d += c);
- r.on('end', () => resolve({ status: r.statusCode, body: d })); });
- req.on('error', (e) => resolve({ status: 0, err: e.message }));
- req.write(data); req.end();
- });
- if (res.status !== 200) return { ok: false, why: `vision-http-${res.status}` };
+ const res = await requestVision(body, key);
+ if (res.status !== 200) return { ok: false, why: `vision-http-${res.status}`,
+ details: errorDetails(res, this.geminiKeys || [key]) };
let j;
- try { j = JSON.parse(res.body); } catch { return { ok: false, why: 'vision-parse' }; }
+ try { j = JSON.parse(res.body); } catch { return { ok: false, why: 'vision-parse', billable: true }; }
let obj;
try { obj = JSON.parse(j.candidates?.[0]?.content?.parts?.[0]?.text || '{}'); }
- catch { return { ok: false, why: 'verdict-parse' }; }
+ catch { return { ok: false, why: 'verdict-parse', billable: true }; }
// require the 5 expected keys — a partial answer is UNKNOWN (fail-closed).
const keys = ['a1_directional_foliage', 'a2_open_space', 'a3_multiple_ink_colors',
'partB_element', 'acceptable_element'];
- if (!keys.every((k) => typeof obj[k] === 'boolean')) return { ok: false, why: 'incomplete-verdict', obj };
+ if (!keys.every((k) => typeof obj[k] === 'boolean')) return { ok: false, why: 'incomplete-verdict', obj, billable: true };
const partA = obj.a1_directional_foliage && obj.a2_open_space && obj.a3_multiple_ink_colors;
- return { ok: true, partA, partB: obj.partB_element, acceptable: obj.acceptable_element, raw: obj };
+ return { ok: true, partA, partB: obj.partB_element, acceptable: obj.acceptable_element, raw: obj, billable: true };
}
// Apply the BINDING verdict rule to the vision booleans.
@@ -246,6 +254,13 @@ class SettlementGate {
return rec;
}
+ // A provider outage is an operational hold, never a legal BLOCK or PASS.
+ // Stop retrying every draft (and downloading every image) until cooldown.
+ if (Date.now() < this.visionRetryAt) {
+ this.visionThrottledSkips++;
+ return { verdict: 'HELD', tier: 'vision', reason: 'vision-rate-limit-cooldown',
+ diagnostics: this.lastVisionError, retryAt: new Date(this.visionRetryAt).toISOString(), cost: 0 };
+ }
const b64 = await this.fetchImageB64(imageUrl);
if (!b64) {
// No image to check → cannot clear settlement → HELD (fail-closed). (The
@@ -258,7 +273,7 @@ class SettlementGate {
const mime = /\.png(\?|$)/i.test(imageUrl || '') ? 'image/png' : 'image/jpeg';
const v = await this.visionDetect(b64, mime);
this.visionCalls++;
- const cost = logVisionCost();
+ const cost = (v.ok || v.billable) ? logVisionCost() : 0;
this.visionCostTotal += cost;
if (!v.ok) {
@@ -266,7 +281,9 @@ class SettlementGate {
appendOrchestrator({ ts: new Date().toISOString().slice(0, 10), skus: dw_sku || shopify_id,
pattern: title, verdict: 'NEEDS REVIEW', reason: 'vision-' + (v.why || 'error'),
source: 'dw-rotation-activator' });
- return { verdict: 'HELD', tier: 'vision', reason: 'vision-' + (v.why || 'error'), cost };
+ return { verdict: 'HELD', tier: 'vision', reason: v.why || 'vision-error',
+ diagnostics: v.details || null,
+ retryAt: this.visionRetryAt ? new Date(this.visionRetryAt).toISOString() : null, cost };
}
const dec = this.verdictFromVision(v);
diff --git a/lib/vision-http.js b/lib/vision-http.js
new file mode 100644
index 0000000..8b25361
--- /dev/null
+++ b/lib/vision-http.js
@@ -0,0 +1,53 @@
+'use strict';
+const https = require('node:https');
+
+function redact(value, secrets = []) {
+ let text = String(value || '');
+ for (const secret of secrets.filter(Boolean)) text = text.split(secret).join('[REDACTED]');
+ return text.replace(/AIza[\w-]{20,}/g, '[REDACTED]')
+ .replace(/Help Token:\s*\S+/gi, 'Help Token: [REDACTED]')
+ .replace(/([?&]key=)[^&\s"']+/gi, '$1[REDACTED]').slice(0, 800);
+}
+function errorDetails(response, secrets = []) {
+ let error = {};
+ try { error = JSON.parse(response.body || '{}').error || {}; } catch {}
+ const details = Array.isArray(error.details) ? error.details : [];
+ const retry = details.find(d => /RetryInfo$/.test(d['@type'] || ''))?.retryDelay;
+ const retrySeconds = typeof retry === 'string' && /^\d+(?:\.\d+)?s$/.test(retry)
+ ? Number(retry.slice(0, -1)) : 0;
+ const header = response.headers?.['retry-after'];
+ const headerMs = /^\d+(?:\.\d+)?$/.test(String(header || '')) ? Number(header) * 1000 : 0;
+ const quota = details.filter(d => /QuotaFailure$/.test(d['@type'] || ''))
+ .flatMap(d => Array.isArray(d.violations) ? d.violations : [])
+ .map(v => ({ metric: redact(v.quotaMetric, secrets), id: redact(v.quotaId, secrets),
+ value: redact(v.quotaValue, secrets) }));
+ return { httpStatus: response.status, status: redact(error.status, secrets),
+ message: redact(error.message || response.err || '', secrets), quota,
+ retryAfterMs: Math.min(86400000, Math.max(0, retrySeconds * 1000, headerMs)) };
+}
+function cooldownMs(error) {
+ const dailyOrSpend = /perday|per.day|monthly|spend|billing|budget/i.test(
+ `${error.message || ''} ${JSON.stringify(error.quota || [])}`);
+ return Math.max(dailyOrSpend ? 3600000 : 60000, error.retryAfterMs || 0);
+}
+function requestVision(body, key, { timeoutMs = 30000, request = https.request } = {}) {
+ const data = JSON.stringify(body);
+ return new Promise(resolve => {
+ let finished = false;
+ const finish = result => { if (!finished) { finished = true; resolve(result); } };
+ const req = request({ host: 'generativelanguage.googleapis.com',
+ path: '/v1beta/models/gemini-2.5-flash:generateContent', method: 'POST',
+ headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data),
+ 'x-goog-api-key': key },
+ }, response => {
+ let body = '';
+ response.on('data', chunk => { body += chunk; });
+ response.on('error', error => finish({ status: 0, err: error.message }));
+ response.on('end', () => finish({ status: response.statusCode, body, headers: response.headers }));
+ });
+ req.setTimeout(timeoutMs, () => req.destroy(new Error('vision-request-timeout')));
+ req.on('error', error => finish({ status: 0, err: error.message }));
+ req.end(data);
+ });
+}
+module.exports = { redact, errorDetails, cooldownMs, requestVision };
diff --git a/rotate-activate.js b/rotate-activate.js
index c19eea9..9c3db9b 100644
--- a/rotate-activate.js
+++ b/rotate-activate.js
@@ -45,6 +45,9 @@ const { ROTATION_ORDER_SQL } = require('./lib/rotation-order.js');
const { SettlementGate } = require('./lib/settlement-gate.js');
const { fiveFieldExtra } = require('./lib/five-field-extra.js');
const { mfrGate } = require('./lib/mfr-gate.js');
+const { canonicalProduct, widthFromLive, completeLiveProduct } = require('./lib/live-product-fields.js');
+const { buildRepairReport } = require('./lib/readiness-repairs.js');
+const { confirmedActivation } = require('./lib/activation-result.js');
const { reusedMfrSet, stagingColorFor } = require('./lib/mfr-gate-resolve.js');
// Canonical showroom-vendor primitive (list + logic live in fix-live-board/config). Showroom-only
// vendors are addressable-not-discoverable: never rotate them into the New Arrivals discoverability
@@ -66,6 +69,12 @@ const API = '2024-10';
const OUTDIR = path.join(__dirname, 'out');
const TODAY = new Date().toISOString().slice(0, 10);
const AUDIT = path.join(OUTDIR, `rotation-activations-${TODAY}.jsonl`);
+const REPAIR_REPORT = path.join(OUTDIR, 'current-readiness-repairs.json');
+const runDecisions = [];
+function recordDecision(record) {
+ fs.appendFileSync(AUDIT, JSON.stringify(record) + '\n');
+ runDecisions.push(record);
+}
// Daily activation ledger — its OWN lane (activation is not a variant-create, so it
// must not debit budget.cjs). Simple date-stamped counter file.
const LEDGER = path.join(OUTDIR, `activation-ledger-${TODAY}.json`);
@@ -159,8 +168,8 @@ function loadQueue() {
const STATUS_Q = `query($ids:[ID!]!){nodes(ids:$ids){... on Product{
id status title vendor descriptionHtml tags
images(first:50){nodes{url}}
- variants(first:20){nodes{price sku}}
- metafields(first:80){nodes{namespace key value}}
+ variants(first:20){nodes{price sku title} pageInfo{hasNextPage endCursor}}
+ metafields(first:80){nodes{namespace key value} pageInfo{hasNextPage endCursor}}
}}}`;
const mfVal = (mfs, ns, key) => { const m = (mfs || []).find((x) => x.namespace === ns && x.key === key); return m ? m.value : ''; };
const ACTIVATE = `mutation($id:ID!){productUpdate(input:{id:$id,status:ACTIVE}){product{id status} userErrors{field message}}}`;
@@ -196,25 +205,7 @@ function pidToGid(shopify_id) {
// Build the validate-before-activate shape from the LIVE product node and re-run
// the SINGLE canonical gate. This is the "re-verify 5-field gate live" step.
function gateFromLive(n, dwSku, vendor) {
- const mfs = n.metafields?.nodes || [];
- const liveImgs = (n.images?.nodes || []).map((x) => x.url);
- const width = mfVal(mfs, 'global', 'width') || mfVal(mfs, 'custom', 'width');
- const material = mfVal(mfs, 'global', 'material') || mfVal(mfs, 'custom', 'material') || mfVal(mfs, 'specs', 'material');
- const specs = {
- width, length: mfVal(mfs, 'global', 'length'), repeat: mfVal(mfs, 'global', 'repeat'),
- material, unitOfMeasure: mfVal(mfs, 'global', 'unit_of_measure') || '',
- };
- return validateBeforeActivate({
- title: n.title, dwSku: dwSku || '', vendor, tags: n.tags || [],
- descriptionHtml: n.descriptionHtml || '',
- specs,
- // vendorSpecs mirrors specs: we treat what's present on the live product as the
- // provided set (we're not blocking on a spec the vendor genuinely lacks; width
- // stays hard-required inside the validator).
- vendorSpecs: specs,
- images: liveImgs, vendorImages: liveImgs,
- variants: (n.variants?.nodes || []).map((v) => ({ sku: v.sku })),
- });
+ return validateBeforeActivate(canonicalProduct(n, dwSku, vendor));
}
// Extra "5-field" invariants the prompt calls out explicitly, layered on top of
@@ -305,9 +296,12 @@ function leakGuard(title, vendor) {
const batch = queue.slice(i, i + 50);
const byGid = new Map(batch.map((q) => [pidToGid(q.shopify_id), q]));
const r = await gqlRetry(STATUS_Q, { ids: [...byGid.keys()] });
- for (const n of (r.json?.data?.nodes || [])) {
+ if (r.status !== 200 || r.json?.errors?.length || !Array.isArray(r.json?.data?.nodes))
+ throw new Error('Shopify product batch read failed; activation stopped');
+ for (const initialNode of r.json.data.nodes) {
if (activated >= cap) break;
- if (!n) continue;
+ if (!initialNode) continue;
+ let n = initialNode;
const q = byGid.get(n.id);
scanned++;
if (n.status === 'ACTIVE') { alreadyActive++; continue; }
@@ -318,10 +312,17 @@ function leakGuard(title, vendor) {
// a showroom line must never receive. Leave the product DRAFT for its own showroom flow. TK-11186.
if (isShowroomVendor(q && q.vendor)) {
skipped++;
- fs.appendFileSync(AUDIT, JSON.stringify({ ts: new Date().toISOString(), shopify_id: n.id, vendor: q && q.vendor, dw_sku: q && q.dw_sku, action: 'skip-showroom-vendor' }) + '\n');
+ recordDecision({ ts: new Date().toISOString(), shopify_id: n.id, vendor: q && q.vendor, dw_sku: q && q.dw_sku, action: 'skip-showroom-vendor' });
continue;
}
+ try { n = await completeLiveProduct(n, gqlRetry); }
+ catch (error) {
+ skipped++;
+ recordDecision({ ts: new Date().toISOString(), shopify_id: n.id, vendor: q?.vendor,
+ dw_sku: q?.dw_sku, action: 'skip-read-error', reasons: [error.message] });
+ continue;
+ }
const gate = gateFromLive(n, q && q.dw_sku, q && q.vendor);
const extra = fiveFieldExtra(n);
const leak = leakGuard(n.title, q && q.vendor);
@@ -338,7 +339,7 @@ function leakGuard(title, vendor) {
if (!mfr.ok) mfrBlocked++;
const rec = { ts: new Date().toISOString(), shopify_id: n.id, vendor: q && q.vendor,
dw_sku: q && q.dw_sku, mat_tier: q && q.mat_tier, rr: q && q.rr,
- title: n.title, passes, mfr_code: mfrCode,
+ title: n.title, passes, mfr_code: mfrCode, width_source: widthFromLive(n).source,
reasons: [...(gate.ok ? [] : gate.reasons), ...(extra.ok ? [] : extra.reasons),
...(leak.ok ? [] : [leak.reason]), ...(mfr.ok ? [] : mfr.reasons)] };
@@ -351,7 +352,7 @@ function leakGuard(title, vendor) {
if (!DRY && !mfr.ok && gate.ok && extra.ok && leak.ok) {
try { await gqlRetry(TAGS_ADD, { id: n.id, tags: ['Needs-MfrSKU'] }); } catch (_) {}
}
- fs.appendFileSync(AUDIT, JSON.stringify({ ...rec, action: 'skip-gate' }) + '\n');
+ recordDecision({ ...rec, action: 'skip-gate' });
continue;
}
@@ -363,31 +364,33 @@ function leakGuard(title, vendor) {
shopify_id: n.id, title: n.title, vendor: q && q.vendor, dw_sku: q && q.dw_sku,
material: materialFromNode(n), imageUrl: primaryImageUrl(n),
});
- rec.settlement = { verdict: sv.verdict, tier: sv.tier, reason: sv.reason, cost: sv.cost };
+ rec.settlement = { verdict: sv.verdict, tier: sv.tier, reason: sv.reason, cost: sv.cost,
+ diagnostics: sv.diagnostics || null, retryAt: sv.retryAt || null };
if (sv.verdict !== 'PASS') {
if (sv.verdict === 'BLOCK') settlementBlocked++; else settlementHeld++;
skipped++;
// hold + skip. In COMMIT mode set the metafield so the hold is durable on
// the product; in DRY mode we only record it (no writes).
if (!DRY) { try { await setSettlementHold(n.id, sv.verdict, sv.reason); } catch (_) {} }
- fs.appendFileSync(AUDIT, JSON.stringify({ ...rec,
- action: sv.verdict === 'BLOCK' ? 'settlement-block' : 'settlement-hold' }) + '\n');
+ recordDecision({ ...rec,
+ action: sv.verdict === 'BLOCK' ? 'settlement-block' : 'settlement-hold' });
continue;
}
if (DRY) {
projection.push(rec);
activated++; // count projected activations toward the cap so the dry-run shows the real next-N
- fs.appendFileSync(AUDIT, JSON.stringify({ ...rec, action: 'dryrun-would-activate' }) + '\n');
+ recordDecision({ ...rec, action: 'dryrun-would-activate' });
continue;
}
// COMMIT: flip → ACTIVE, add 'New Arrival', publish to channels (ex-Google).
const ar = await gqlRetry(ACTIVATE, { id: n.id });
const aue = ar.json?.data?.productUpdate?.userErrors;
- if (aue && aue.length) {
+ if (!confirmedActivation(ar, n.id)) {
skipped++;
- fs.appendFileSync(AUDIT, JSON.stringify({ ...rec, action: 'activate-error', errors: aue }) + '\n');
+ recordDecision({ ...rec, action: 'activate-error',
+ errors: aue?.length ? aue : (ar.json?.errors || ['Shopify did not confirm ACTIVE']), httpStatus: ar.status });
continue;
}
activated++;
@@ -400,7 +403,7 @@ function leakGuard(title, vendor) {
if (!pub) console.log(` ⚠ ${q && q.dw_sku} ACTIVE but publish failed: ${JSON.stringify(p.errors || p.why).slice(0, 120)}`);
} catch (e) { console.log(` ⚠ ${q && q.dw_sku} publish error: ${String(e.message).slice(0, 120)}`); }
if (pub) published++;
- fs.appendFileSync(AUDIT, JSON.stringify({ ...rec, action: 'activated', published: pub, tag: 'New Arrival' }) + '\n');
+ recordDecision({ ...rec, action: 'activated', published: pub, tag: 'New Arrival' });
if (activated % 25 === 0) process.stdout.write(`\r activated ${activated}/${cap}…`);
await sleep(350);
}
@@ -408,10 +411,15 @@ function leakGuard(title, vendor) {
}
const sstat = settlement.stats();
+ const report = buildRepairReport(runDecisions, { complete: scanned >= queue.length });
+ fs.writeFileSync(REPAIR_REPORT + '.tmp', JSON.stringify(report, null, 2) + '\n');
+ fs.renameSync(REPAIR_REPORT + '.tmp', REPAIR_REPORT);
+ console.log(`current readiness repairs: ${report.products_needing_attention} products; report=${REPAIR_REPORT}`);
console.log(`\n=== ROTATION ACTIVATOR ${DRY ? 'DRY-RUN' : 'RUN'} DONE ===`);
console.log(`scanned=${scanned} ${DRY ? 'would-activate' : 'activated'}=${activated} published=${published} skipped(gate-fail)=${skipped} alreadyActive=${alreadyActive}`);
console.log(`mfr-gate: blocked ${mfrBlocked} product(s) for blank/reused/fabricated mfr provenance`);
console.log(`settlement: auto-pass-textures=${sstat.autoPassCount} vision-calls=${sstat.visionCalls} blocked=${settlementBlocked} held=${settlementHeld}`);
+ console.log(`settlement service: configured-keys=${sstat.visionKeysConfigured} attempts=${sstat.visionHttpAttempts} cooldown-skips=${sstat.visionThrottledSkips} retryAt=${sstat.retryAt || 'none'} lastError=${JSON.stringify(sstat.lastVisionError)}`);
console.log(`settlement cost: textures $0 (local) + vision ${sstat.visionCalls} calls = $${sstat.visionCostTotal.toFixed(5)} (Gemini 2.5-flash; ~$0.0006/img)`);
if (!DRY) console.log(`daily activation ledger: ${ledgerUsed()}/${DAILY_ACTIVATION_CAP}`);
console.log(`audit → ${AUDIT}`);
diff --git a/scripts/build-repair-report.js b/scripts/build-repair-report.js
new file mode 100644
index 0000000..9a0876f
--- /dev/null
+++ b/scripts/build-repair-report.js
@@ -0,0 +1,23 @@
+#!/usr/bin/env node
+'use strict';
+const fs = require('node:fs');
+const path = require('node:path');
+const { buildRepairReport } = require('../lib/readiness-repairs.js');
+const args = process.argv.slice(2);
+const value = name => args[args.indexOf(name) + 1];
+for (const required of ['--audit', '--since', '--until', '--output']) {
+ if (!args.includes(required) || !value(required)) throw new Error(`Required: ${required}`);
+}
+const since = value('--since'), until = value('--until');
+if (!Number.isFinite(Date.parse(since)) || !Number.isFinite(Date.parse(until)) || since >= until)
+ throw new Error('Invalid explicit scan interval');
+const rows = fs.readFileSync(value('--audit'), 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line))
+ .filter(row => row.ts >= since && row.ts < until);
+if (!rows.length) throw new Error('No decisions found in the requested interval');
+const report = buildRepairReport(rows, { complete: false });
+report.source_audit = path.resolve(value('--audit'));
+report.observation_interval = { since, until };
+fs.mkdirSync(path.dirname(value('--output')), { recursive: true });
+fs.writeFileSync(value('--output'), JSON.stringify(report, null, 2) + '\n');
+console.log(JSON.stringify({ products: report.products_observed, attention: report.products_needing_attention,
+ counts: report.counts, output: value('--output') }));
diff --git a/scripts/capture-readiness.js b/scripts/capture-readiness.js
new file mode 100644
index 0000000..c21c366
--- /dev/null
+++ b/scripts/capture-readiness.js
@@ -0,0 +1,56 @@
+#!/usr/bin/env node
+'use strict';
+// READ-ONLY: this command contains a single GraphQL query, no mutations or vision calls.
+const fs = require('node:fs');
+const path = require('node:path');
+const os = require('node:os');
+const args = process.argv.slice(2);
+const value = name => args[args.indexOf(name) + 1];
+for (const flag of ['--audit', '--since', '--until', '--output'])
+ if (!args.includes(flag) || !value(flag)) throw new Error(`Required: ${flag}`);
+const env = fs.readFileSync(path.join(os.homedir(), 'Projects/secrets-manager/.env'), 'utf8');
+const token = (env.match(/^SHOPIFY_ADMIN_TOKEN=(.*)$/m) || [])[1]?.trim().replace(/^['"]|['"]$/g, '');
+if (!token) throw new Error('Missing Shopify credential');
+const query = `query($ids:[ID!]!){nodes(ids:$ids){... on Product{
+ id title vendor status descriptionHtml tags updatedAt
+ images(first:1){nodes{url}}
+ variants(first:100){nodes{sku title price} pageInfo{hasNextPage}}
+ metafields(first:100){nodes{namespace key value} pageInfo{hasNextPage}}
+}}}`;
+async function main() {
+ const rows = fs.readFileSync(value('--audit'), 'utf8').trim().split('\n').map(line => JSON.parse(line))
+ .filter(r => r.ts >= value('--since') && r.ts < value('--until'));
+ const ids = [...new Set(rows.map(r => r.shopify_id).filter(Boolean))];
+ if (!ids.length) throw new Error('No product IDs in explicit interval');
+ const products = []; const costs = []; let batchSize = 10;
+ for (let index = 0; index < ids.length;) {
+ const batch = ids.slice(index, index + batchSize);
+ const response = await fetch('https://designer-laboratory-sandbox.myshopify.com/admin/api/2026-07/graphql.json', {
+ method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+ body: JSON.stringify({ query, variables: { ids: batch } }), signal: AbortSignal.timeout(30000),
+ });
+ const data = await response.json();
+ if (data.errors?.some(e => e.extensions?.code === 'MAX_COST_EXCEEDED') && batchSize > 1) {
+ batchSize = Math.max(1, Math.floor(batchSize / 2)); continue;
+ }
+ if (!response.ok || data.errors || !Array.isArray(data.data?.nodes))
+ throw new Error(`Shopify read failed HTTP${response.status}: ${JSON.stringify(data.errors || []).slice(0, 300)}`);
+ costs.push(data.extensions?.cost);
+ products.push(...data.data.nodes);
+ index += batch.length;
+ if (index % 100 === 0 || index === ids.length) console.log(`Captured ${index}/${ids.length}`);
+ const budget = data.extensions?.cost?.throttleStatus;
+ const cost = data.extensions?.cost?.requestedQueryCost || 0;
+ if (budget && budget.currentlyAvailable < cost && budget.restoreRate > 0)
+ await new Promise(resolve => setTimeout(resolve, Math.min(30000, 1000 * (cost - budget.currentlyAvailable) / budget.restoreRate + 100)));
+ }
+ const result = { captured_at: new Date().toISOString(), source: 'Shopify Admin GraphQL GET-equivalent query',
+ mutations: 0, vision_calls: 0, source_audit: value('--audit'), since: value('--since'), until: value('--until'),
+ products, cost_summary: { requests: costs.length } };
+ fs.mkdirSync(path.dirname(value('--output')), { recursive: true });
+ fs.writeFileSync(value('--output'), JSON.stringify(result, null, 2) + '\n');
+ console.log(JSON.stringify({ output: value('--output'), products: products.filter(Boolean).length,
+ missing: products.filter(p => !p).length,
+ incomplete: products.filter(p => p?.variants?.pageInfo?.hasNextPage || p?.metafields?.pageInfo?.hasNextPage).length }));
+}
+main().catch(error => { console.error(error.message); process.exitCode = 1; });
diff --git a/scripts/diagnose-vision-project.js b/scripts/diagnose-vision-project.js
new file mode 100644
index 0000000..f06836f
--- /dev/null
+++ b/scripts/diagnose-vision-project.js
@@ -0,0 +1,41 @@
+#!/usr/bin/env node
+'use strict';
+// Existing Google Cloud credentials; metadata and quota reads only. No generation,
+// credential writes, billing changes, quota changes, or full keys in output.
+const fs = require('node:fs');
+const os = require('node:os');
+const path = require('node:path');
+const { execFileSync } = require('node:child_process');
+const { redact } = require('../lib/vision-http');
+const account = process.argv[2];
+if (!account) throw new Error('Usage: diagnose-vision-project.js <existing-gcloud-account>');
+const env = fs.readFileSync(path.join(os.homedir(), 'Projects/secrets-manager/.env'), 'utf8');
+const aliases = ['GEMINI_API_KEY', 'GEMINI_API_KEY_WALLCO'];
+const keys = aliases.map(alias => (env.match(new RegExp(`^${alias}=(.*)$`, 'm')) || [])[1]?.trim().replace(/^['"]|['"]$/g, ''));
+async function main() {
+ const token = execFileSync('gcloud', ['auth', 'print-access-token', `--account=${account}`], { encoding: 'utf8', stdio: ['ignore','pipe','pipe'] }).trim();
+ async function read(url) {
+ const response = await fetch(url, { headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(30000) });
+ return { http: response.status, data: await response.json() };
+ }
+ for (let i = 0; i < keys.length; i++) {
+ if (!keys[i]) { console.log(JSON.stringify({ alias: aliases[i], missing: true })); continue; }
+ const modelResponse = await fetch('https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash', {
+ headers: { 'x-goog-api-key': keys[i] }, signal: AbortSignal.timeout(30000),
+ });
+ const model = await modelResponse.json();
+ console.log(JSON.stringify({ alias: aliases[i], nonbillable_model_lookup_http: modelResponse.status,
+ model: model.name || null, error: redact(model.error?.message, keys) }));
+ const lookup = await read(`https://apikeys.googleapis.com/v2/keys:lookupKey?keyString=${encodeURIComponent(keys[i])}`);
+ if (lookup.http !== 200) { console.log(JSON.stringify({ alias: aliases[i], http: lookup.http, error: redact(lookup.data.error?.message, keys) })); continue; }
+ const parent = lookup.data.parent;
+ const project = parent?.match(/^projects\/(\d+)/)?.[1];
+ const info = await read(`https://cloudresourcemanager.googleapis.com/v1/projects/${project}`);
+ const quota = await read(`https://serviceusage.googleapis.com/v1beta1/projects/${project}/services/generativelanguage.googleapis.com/consumerQuotaMetrics?view=FULL`);
+ const metrics = (quota.data.metrics || []).filter(metric => /generate|content|spend|bill/i.test(JSON.stringify(metric)));
+ console.log(JSON.stringify({ alias: aliases[i], projectNumber: project, projectId: info.data.projectId,
+ projectName: info.data.name, metadataHttp: info.http, quotaHttp: quota.http,
+ quotaError: redact(quota.data.error?.message, keys), metrics }));
+ }
+}
+main().catch(error => { console.error(redact(error.message, keys)); process.exitCode = 1; });
diff --git a/scripts/replay-readiness.js b/scripts/replay-readiness.js
new file mode 100644
index 0000000..b935981
--- /dev/null
+++ b/scripts/replay-readiness.js
@@ -0,0 +1,49 @@
+#!/usr/bin/env node
+'use strict';
+const fs = require('node:fs');
+const path = require('node:path');
+const { canonicalProduct, widthFromLive } = require('../lib/live-product-fields');
+const { fiveFieldExtra } = require('../lib/five-field-extra');
+const [snapshotPath, beforeModule, afterModule, output] = process.argv.slice(2);
+if (!output) throw new Error('Usage: replay-readiness.js <snapshot> <old-validator> <new-validator> <output>');
+const snapshot = JSON.parse(fs.readFileSync(snapshotPath));
+const beforeValidator = require(path.resolve(beforeModule));
+const afterValidator = require(path.resolve(afterModule));
+const counts = { products: snapshot.products.length, width_rejections_removed: 0,
+ description_rejections_removed: 0, old_canonical_and_extra_pass: 0, new_canonical_and_extra_pass: 0,
+ variant_pagination_needed: 0, metafield_pagination_needed: 0 };
+const changed = [];
+const vendors = {};
+for (const product of snapshot.products) {
+ if (!product || product.variants?.pageInfo?.hasNextPage || product.metafields?.pageInfo?.hasNextPage)
+ throw new Error('Snapshot contains missing or incomplete products');
+ const shape = canonicalProduct(product, product.variants.nodes[0]?.sku, product.vendor);
+ const first = { ...product, variants: { nodes: product.variants.nodes.slice(0, 20) },
+ metafields: { nodes: product.metafields.nodes.slice(0, 80) } };
+ const oldShape = canonicalProduct(first, shape.dwSku, product.vendor);
+ const get = ns => first.metafields.nodes.find(m => m.namespace === ns && m.key === 'width')?.value || '';
+ oldShape.specs.width = get('global') || get('custom');
+ oldShape.variants = first.variants.nodes.map(v => ({ sku: v.sku }));
+ const before = beforeValidator.validateBeforeActivate(oldShape);
+ const after = afterValidator.validateBeforeActivate(shape);
+ const oldExtra = fiveFieldExtra(first), extra = fiveFieldExtra(product);
+ const widthRemoved = before.reasons.includes('missing spec(s): width') && !after.reasons.includes('missing spec(s): width');
+ const descRemoved = before.reasons.some(r => /legal\/disclaimer/.test(r)) && !after.reasons.some(r => /legal\/disclaimer/.test(r));
+ if (widthRemoved) counts.width_rejections_removed++;
+ if (descRemoved) counts.description_rejections_removed++;
+ if (before.ok && oldExtra.ok) counts.old_canonical_and_extra_pass++;
+ if (after.ok && extra.ok) counts.new_canonical_and_extra_pass++;
+ if (product.variants.nodes.length > 20) counts.variant_pagination_needed++;
+ if (product.metafields.nodes.length > 80) counts.metafield_pagination_needed++;
+ if (JSON.stringify(before.reasons) !== JSON.stringify(after.reasons) || JSON.stringify(oldExtra.reasons) !== JSON.stringify(extra.reasons)) {
+ vendors[product.vendor] = (vendors[product.vendor] || 0) + 1;
+ changed.push({ id: product.id, vendor: product.vendor, title: product.title,
+ width_source: widthFromLive(product).source, before: before.reasons, after: after.reasons,
+ extra_before: oldExtra.reasons, extra_after: extra.reasons });
+ }
+}
+const report = { captured_at: snapshot.captured_at,
+ scope: 'Canonical readiness and price/sample checks only. Manufacturer provenance, private-label, showroom, settlement and publication gates still apply.',
+ ...counts, vendors, changed_products: changed };
+fs.writeFileSync(output, JSON.stringify(report, null, 2) + '\n');
+console.log(JSON.stringify({ ...counts, changed_products: changed.length, vendors, output }));
diff --git a/scripts/verify-live-boundary.js b/scripts/verify-live-boundary.js
new file mode 100644
index 0000000..1e22216
--- /dev/null
+++ b/scripts/verify-live-boundary.js
@@ -0,0 +1,63 @@
+#!/usr/bin/env node
+'use strict';
+const fs = require('node:fs');
+const path = require('node:path');
+const os = require('node:os');
+const assert = require('node:assert/strict');
+const { completeLiveProduct, canonicalProduct, widthFromLive } = require('../lib/live-product-fields');
+const env = fs.readFileSync(path.join(os.homedir(), 'Projects/secrets-manager/.env'), 'utf8');
+const token = (env.match(/^SHOPIFY_ADMIN_TOKEN=(.*)$/m) || [])[1]?.trim().replace(/^['"]|['"]$/g, '');
+const source = fs.readFileSync(path.join(__dirname, '..', 'rotate-activate.js'), 'utf8');
+const query = source.match(/const STATUS_Q = `([\s\S]+?)`;/)?.[1];
+if (!query) throw new Error('Actual runtime query not found');
+const snapshot = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
+const validator = require(path.resolve(process.argv[3]));
+const output = process.argv[4];
+let requests = 0;
+const costs = [];
+async function read(query, variables) {
+ assert.match(query, /^query\(/); assert.doesNotMatch(query, /\bmutation\b/);
+ requests++;
+ const response = await fetch('https://designer-laboratory-sandbox.myshopify.com/admin/api/2026-07/graphql.json', {
+ method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+ body: JSON.stringify({ query, variables }), signal: AbortSignal.timeout(30000),
+ });
+ const json = await response.json();
+ if (json.extensions?.cost) costs.push(json.extensions.cost.requestedQueryCost);
+ return { status: response.status, json };
+}
+async function main() {
+ const special = snapshot.products.filter(p => p.variants.nodes.length > 20 || p.metafields.nodes.length > 80 ||
+ ['7867560886323','7923565461555','7896454332467','7944491794483'].some(id => p.id.endsWith('/'+id)));
+ const ids = [...new Set([...special, ...snapshot.products].map(p => p.id))].slice(0, 50);
+ const first = await read(query, { ids });
+ assert.equal(first.status, 200); assert.equal(first.json.errors, undefined, JSON.stringify(first.json.errors));
+ assert.equal(first.json.data.nodes.length, ids.length);
+ const products = [];
+ for (const initial of first.json.data.nodes) {
+ const complete = await completeLiveProduct(initial, read);
+ assert.equal(complete.variants.pageInfo.hasNextPage, false);
+ assert.equal(complete.metafields.pageInfo.hasNextPage, false);
+ const result = validator.validateBeforeActivate(canonicalProduct(complete, '', complete.vendor));
+ products.push({ id: complete.id, status: complete.status, vendor: complete.vendor,
+ variants_before: initial.variants.nodes.length, variants_after: complete.variants.nodes.length,
+ metafields_before: initial.metafields.nodes.length, metafields_after: complete.metafields.nodes.length,
+ width: widthFromLive(complete), reasons: result.reasons });
+ }
+ const designtex = products.find(p => p.id.endsWith('/7867560886323'));
+ assert.ok(!designtex.reasons.some(r => /legal\/disclaimer/.test(r)));
+ const carnegie = products.find(p => p.id.endsWith('/7923565461555'));
+ assert.equal(carnegie.width.source, 'dwc.width');
+ const fischbacher = products.find(p => p.id.endsWith('/7896454332467'));
+ assert.ok(fischbacher.reasons.includes('empty description'));
+ assert.ok(products.every(p => p.status === 'DRAFT'));
+ const report = { timestamp: new Date().toISOString(), verdict: 'PASS',
+ scope: 'Actual runtime Shopify batch query + real pagination + corrected validator; no activation or vision call',
+ requests, requested_query_costs: costs, graphql_mutations: 0, vision_calls: 0, products };
+ fs.writeFileSync(output, JSON.stringify(report, null, 2) + '\n');
+ console.log(JSON.stringify({ verdict: report.verdict, products: products.length, requests,
+ paginated_variants: products.filter(p => p.variants_after > p.variants_before).length,
+ paginated_metafields: products.filter(p => p.metafields_after > p.metafields_before).length,
+ max_query_cost: Math.max(...costs), output }));
+}
+main().catch(error => { console.error(error.message); process.exitCode = 1; });
diff --git a/test/activation-result.test.js b/test/activation-result.test.js
new file mode 100644
index 0000000..e2a00a1
--- /dev/null
+++ b/test/activation-result.test.js
@@ -0,0 +1,15 @@
+'use strict';
+const test = require('node:test');
+const assert = require('node:assert/strict');
+const { confirmedActivation } = require('../lib/activation-result');
+const ok = { status: 200, json: { data: { productUpdate: { product: { id: 'gid://shopify/Product/1', status: 'ACTIVE' }, userErrors: [] } } } };
+test('only a confirmed ACTIVE result for the requested product counts', () => {
+ assert.equal(confirmedActivation(ok, 'gid://shopify/Product/1'), true);
+ assert.equal(confirmedActivation(ok, 'gid://shopify/Product/2'), false);
+});
+test('HTTP, GraphQL, user errors and incomplete replies never count as activations', () => {
+ for (const response of [{ status: 429 }, { status: 200, json: { errors: [{ message: 'throttled' }] } },
+ { status: 200, json: {} }, { ...ok, status: 500 },
+ { status: 200, json: { data: { productUpdate: { userErrors: [{ message: 'blocked' }] } } } }])
+ assert.equal(confirmedActivation(response, 'gid://shopify/Product/1'), false);
+});
diff --git a/test/live-product-fields.test.js b/test/live-product-fields.test.js
new file mode 100644
index 0000000..ce69c8d
--- /dev/null
+++ b/test/live-product-fields.test.js
@@ -0,0 +1,55 @@
+'use strict';
+const test = require('node:test');
+const assert = require('node:assert/strict');
+const { widthFromLive, canonicalProduct, completeLiveProduct } = require('../lib/live-product-fields');
+const node = (fields, vendor = 'Carnegie') => ({ vendor, metafields: { nodes: fields } });
+test('verified Carnegie width is recognized with provenance', () => {
+ assert.deepEqual(widthFromLive(node([{ namespace: 'dwc', key: 'width', value: '54" (137 cm)' }])),
+ { value: '54" (137 cm)', source: 'dwc.width' });
+});
+test('canonical namespace order stays stable and blanks fall through', () => {
+ assert.deepEqual(widthFromLive(node([
+ { namespace: 'dwc', key: 'width', value: '54' },
+ { namespace: 'global', key: 'width', value: ' ' },
+ { namespace: 'custom', key: 'width', value: ' 52 cm ' },
+ ])), { value: '52 cm', source: 'custom.width' });
+});
+test('package dimensions, other vendors, and descriptions cannot invent width', () => {
+ const p = node([{ namespace: 'custom', key: 'package_width', value: '4 in' },
+ { namespace: 'untrusted', key: 'width', value: '54' },
+ { namespace: 'carnegie', key: 'width', value: '54' }], 'Other');
+ p.descriptionHtml = '<p>Width: 54 Inches</p>';
+ assert.deepEqual(widthFromLive(p), { value: '', source: null });
+});
+test('canonical adapter preserves sample title and required fields', () => {
+ const p = { ...node([{ namespace: 'specs', key: 'width', value: '54 inches' }]),
+ images: { nodes: [{ url: 'https://example.test/swatch.jpg' }] },
+ variants: { nodes: [{ sku: 'X', title: 'Sample' }] } };
+ const converted = canonicalProduct(p, 'DW-X', 'Carnegie');
+ assert.equal(converted.specs.width, '54 inches');
+ assert.equal(converted.variants[0].title, 'Sample');
+ assert.equal(converted.dwSku, 'DW-X');
+});
+test('sample and width beyond the first pages are fetched before validation', async () => {
+ const p = { id: 'gid://shopify/Product/1', vendor: 'Carnegie',
+ variants: { nodes: [{ sku: 'DW-1', price: '10' }], pageInfo: { hasNextPage: true, endCursor: 'v1' } },
+ metafields: { nodes: [], pageInfo: { hasNextPage: true, endCursor: 'm1' } } };
+ const calls = [];
+ const fetched = await completeLiveProduct(p, async (query, variables) => {
+ calls.push(variables.cursor);
+ const connection = query.includes('variants(') ? 'variants' : 'metafields';
+ return { status: 200, json: { data: { product: { id: p.id,
+ [connection]: { nodes: connection === 'variants' ? [{ sku: 'DW-1-Sample', price: '4.25' }]
+ : [{ namespace: 'dwc', key: 'width', value: '54 inches' }], pageInfo: { hasNextPage: false } },
+ } } } };
+ });
+ assert.deepEqual(calls, ['v1', 'm1']);
+ assert.equal(fetched.variants.nodes.length, 2);
+ assert.equal(widthFromLive(fetched).value, '54 inches');
+ assert.equal(p.variants.nodes.length, 1);
+});
+test('pagination errors and repeated cursors fail closed', async () => {
+ const p = { id: '1', variants: { nodes: [], pageInfo: { hasNextPage: true, endCursor: 'v1' } } };
+ await assert.rejects(completeLiveProduct(p, async () => ({ status: 429 })), /Incomplete Shopify/);
+ await assert.rejects(completeLiveProduct(p, async () => ({ status: 200, json: { data: { product: p } } })), /Cannot safely paginate/);
+});
diff --git a/test/readiness-repairs.test.js b/test/readiness-repairs.test.js
new file mode 100644
index 0000000..ccb80e7
--- /dev/null
+++ b/test/readiness-repairs.test.js
@@ -0,0 +1,21 @@
+'use strict';
+const test = require('node:test');
+const assert = require('node:assert/strict');
+const { buildRepairReport } = require('../lib/readiness-repairs');
+const row = { shopify_id: 'gid://shopify/Product/1', dw_sku: 'DW-1', ts: '2026-09-09T15:25:00Z',
+ action: 'skip-gate', reasons: ['missing sample variant', 'no-sample-variant', 'missing spec(s): width'] };
+test('duplicate sample rules become one repair; retries are idempotent', () => {
+ const report = buildRepairReport([row, row]);
+ assert.equal(report.items.length, 2);
+ assert.equal(report.counts['restore-sample-variant'], 1);
+ assert.equal(report.products_needing_attention, 1);
+ assert.ok(report.items.every(x => x.apply_authorized === false && x.created_at));
+});
+test('resolved latest result removes earlier failure', () => {
+ assert.equal(buildRepairReport([row, { ...row, ts: '2026-09-09T16:25:00Z', action: 'activated' }]).items.length, 0);
+});
+test('provider error stays operational; prohibited design stays blocked', () => {
+ const hold = { ...row, action: 'settlement-hold', reasons: [], settlement: { reason: 'vision-http-429' } };
+ assert.equal(buildRepairReport([hold]).items[0].type, 'retry-image-review');
+ assert.equal(buildRepairReport([{ ...hold, action: 'settlement-block' }]).items[0].type, 'settlement-block-review');
+});
diff --git a/test/vision-http.test.js b/test/vision-http.test.js
new file mode 100644
index 0000000..84a459a
--- /dev/null
+++ b/test/vision-http.test.js
@@ -0,0 +1,69 @@
+'use strict';
+const test = require('node:test');
+const assert = require('node:assert/strict');
+const { EventEmitter } = require('node:events');
+const { errorDetails, cooldownMs, requestVision } = require('../lib/vision-http');
+const { SettlementGate } = require('../lib/settlement-gate');
+const gate = () => Object.assign(Object.create(SettlementGate.prototype), {
+ lockOk: true, geminiKeys: ['test-key-one', 'test-key-two'], visionRetryAt: 0,
+ visionHttpAttempts: 0, visionThrottledSkips: 0, lastVisionError: null,
+});
+test('upstream quota details and retry delay retained with secrets redacted', () => {
+ const details = errorDetails({ status: 429, body: JSON.stringify({ error: {
+ status: 'RESOURCE_EXHAUSTED', message: 'quota exhausted key=secret-one https://api.test/?key=secret-two',
+ details: [{ '@type': 'type.googleapis.com/google.rpc.RetryInfo', retryDelay: '70s' },
+ { '@type': 'type.googleapis.com/google.rpc.QuotaFailure', violations: [{ quotaId: 'RequestsPerDay', quotaValue: '20' }] }],
+ } }) }, ['secret-one', 'secret-two']);
+ assert.equal(details.retryAfterMs, 70000);
+ assert.equal(details.quota[0].value, '20');
+ assert.ok(!JSON.stringify(details).includes('secret-'));
+ assert.equal(cooldownMs(details), 3600000);
+});
+test('429 across existing keys opens circuit; later drafts stay HELD without downloads', async () => {
+ const g = gate(); let calls = 0, downloads = 0;
+ g._visionCall = async () => { calls++; return { ok: false, why: 'vision-http-429', details: { httpStatus: 429 } }; };
+ g.fetchImageB64 = async () => { downloads++; return 'bytes'; };
+ assert.equal((await g.visionDetect('bytes', 'image/jpeg')).ok, false);
+ const result = await g.evaluate({ title: 'Tropical Birds', material: 'paper', imageUrl: 'https://example.test/p.jpg' });
+ assert.equal(result.verdict, 'HELD'); assert.equal(result.cost, 0);
+ assert.equal(calls, 2); assert.equal(downloads, 0);
+ assert.equal(result.reason, 'vision-rate-limit-cooldown');
+});
+test('cooldown expiration retries service; no fail-open during outage', async () => {
+ const g = gate(); g.visionRetryAt = Date.now() - 1;
+ g._visionCall = async () => ({ ok: true, partA: true, partB: true });
+ const v = await g.visionDetect('bytes', 'image/jpeg');
+ assert.equal(g.verdictFromVision(v).verdict, 'BLOCK');
+ assert.equal(g.visionRetryAt, 0);
+});
+test('authentication and malformed response errors never fall through as PASS', async () => {
+ for (const why of ['vision-http-401', 'vision-http-403', 'vision-parse', 'incomplete-verdict']) {
+ const g = gate(); let calls = 0;
+ g._visionCall = async () => { calls++; return { ok: false, why }; };
+ assert.equal((await g.visionDetect('x', 'image/jpeg')).ok, false);
+ assert.equal(calls, 1);
+ }
+});
+test('HTTP request uses header auth and propagates response details', async () => {
+ let options;
+ const request = (opts, callback) => {
+ options = opts;
+ const req = new EventEmitter(); req.setTimeout = () => {};
+ req.end = () => { const res = new EventEmitter(); res.statusCode = 429; res.headers = { 'retry-after': '90' };
+ callback(res); res.emit('data', '{"error":{"status":"RESOURCE_EXHAUSTED"}}'); res.emit('end'); };
+ return req;
+ };
+ const response = await requestVision({}, 'fake-secret', { request });
+ assert.ok(!options.path.includes('fake-secret')); assert.equal(options.headers['x-goog-api-key'], 'fake-secret');
+ assert.equal(errorDetails(response).retryAfterMs, 90000);
+});
+test('timeout resolves as an unavailable service rather than hanging', async () => {
+ const request = () => {
+ const req = new EventEmitter(); let timeout;
+ req.setTimeout = (_, callback) => { timeout = callback; };
+ req.destroy = error => req.emit('error', error);
+ req.end = () => timeout(); return req;
+ };
+ const response = await requestVision({}, 'fake-secret', { request });
+ assert.equal(response.status, 0); assert.equal(response.err, 'vision-request-timeout');
+});
diff --git a/verification/REVIEW.md b/verification/REVIEW.md
new file mode 100644
index 0000000..b7fc35f
--- /dev/null
+++ b/verification/REVIEW.md
@@ -0,0 +1,44 @@
+# TK-11314 — DW activation repair review
+
+The code fixes are verified in isolated branches. They are **not deployed**. No product was activated or edited, no canonical database was changed, and no Gemini generation call or billing change was made.
+
+## Verified findings and changes
+
+- The 08:25–08:31 PDT run examined 1,860 drafts: 1,591 failed product checks and 269 passed product checks but encountered image-review HTTP 429.
+- A fresh read of all 1,860 products confirms 45 false width flags and 251 false legal-description flags. The width adapter now recognizes explicit `dwc.width` / `specs.width` fields and the Carnegie-specific namespace only for Carnegie. Package dimensions and descriptions cannot supply inferred widths.
+- The description validator narrowly exempts the exact material claim “without Prop 65 Phthalates”; actual disclaimers, empty/placeholder copy, missing images, missing samples, missing widths and internal-product guards remain enforced.
+- Twelve products have more than 20 variants and four have more than 80 metafields. The runtime now reads remaining pages before checking them. Failed or looping pagination leaves the product unverified.
+- The image client retains sanitized error details and retry information, uses header authentication, bounds request time, and opens a fail-closed cooldown after configured keys receive 429. An unavailable image service returns HELD. It does not establish that the design is prohibited, and it never permits activation.
+- Shopify must explicitly return ACTIVE for the requested product before the activation count/ledger increases. HTTP errors and incomplete GraphQL replies cannot count as successful activations.
+- Each run produces `out/current-readiness-repairs.json`, with one record per product/repair type, timestamps, source, reasons and `apply_authorized:false`. This is a review report, **not an automatic catalog updater**.
+- The old variant repair worker keyed completion by SKU alone. Completion is now keyed by Shopify product ID and repair type. The 20,034-row snapshot has 17,445 matching completed results and 2,589 unmatched entries. **All 2,589 have blank DW SKUs**; they are identity problems, not publish-ready products. Forty-one overlap the current activation cohort, and none of those 41 currently lack a sample. The existing no-resolvable-SKU guard stays intact.
+
+The canonical/price/sample replay improves from 343 to 637 passing products. These are **not activation predictions**: manufacturer provenance, private-label, showroom/internal, reintroduction, settlement, publication and live-state checks still apply. The 43 Carnegie products whose widths were corrected still have the separately observed manufacturer-placeholder block.
+
+## Verification
+
+- 34 activation tests, four canonical validator tests, seven repair-progress/executor tests: **45 passed**.
+- All 1,860 products fetched using read-only Shopify queries, with no missing or truncated snapshots.
+- Exact patched runtime batch query + real pagination verified against 50 live DRAFT products: 17 requests, 12 variant pagination cases and four metafield pagination cases; maximum requested query cost 27. Real Designtex/Carnegie fixtures pass the corrected checks; incomplete Fischbacher remains blocked.
+- Repair progress reconciled against the actual database worklist and persisted audit. Dry executor-flow tests leave the audit unchanged and never request a live budget.
+- Reintroduction, duplicate/age and never-activate vendor guard script passed unchanged.
+- DTD: Codex CLI and Qwen selected A (2/2 valid votes; 2/6 available), mandatory adversarial review KEEP. Claude disabled by zero-cost policy; Grok/Kimi/Muse unavailable. This technical decision does not authorize publishing.
+
+Evidence: `e2e-proof.json`, `live-boundary.json`, `readiness-replay.json`; retained untracked snapshots `live-products-20260909.json` and `readiness-repairs-20260909.json`. Repair-worker evidence is in `~/Projects/dw-repair-debug-TK11314/verification/e2e-proof.json`.
+
+## Image service remains unresolved
+
+The configured primary key successfully reads Gemini 2.5 Flash model metadata (HTTP 200). Its project lookup returns HTTP 403 with both saved working Google logins. The saved `info@designerwallcoverings.com` gcloud login needs reauthentication. The optional `GEMINI_API_KEY_WALLCO` fallback is absent from the master environment. No key was copied, rotated, or restored.
+
+Old activation logs discarded the error body, so the exact generation limit cannot be established from those logs. The new diagnostics will distinguish quota metrics and retry delays when a permitted generation request runs. A model-metadata read does not prove generation is available. Google documents 429 handling and retry guidance in its [Gemini troubleshooting guide](https://ai.google.dev/gemini-api/docs/troubleshooting).
+
+## Proposed production rollout — approval required
+
+1. Verify original source files have not drifted from the base versions; preserve unrelated runtime data, dirty submodules and concurrent changes.
+2. Acquire the existing rotation and field-repair `.drain.lock` locks only when the real workers are idle. Do not clear another worker's lock or alter any launchd schedule.
+3. Save exact before-file snapshots and apply only the reviewed runtime/test changes from the three branches. Deploy the canonical validator and dependent activation modules as one coordinated release.
+4. Re-run syntax, regression and reintroduction guards against the installed files; confirm the observed candidates remain DRAFT until the explicitly approved canary.
+5. Run a one-product canary only with publish approval and successful existing settlement checks. Verify Shopify ACTIVE, intended channel publication, exclusions and ledger delta against independent live reads. A provider error remains HELD. No source values may be invented to force a pass.
+6. Release the locks to the existing 21-per-hour / 500-per-day activation schedule after the canary passes. Monitor activation, hold and repair reports. Existing pricing, sample, manufacturer, internal/showroom, private-label and settlement requirements remain in force.
+
+Rollback: retain the locks, restore only the saved source files, run syntax/guard checks, and release the locks. Restoring source does **not** undo an already published product; any canary product rollback requires its separately recorded before-state and explicit authorization. No force reset, broad checkout, database restoration, credential change or billing increase is part of this rollout.
diff --git a/verification/e2e-proof.json b/verification/e2e-proof.json
index 94399bd..456ecc9 100644
--- a/verification/e2e-proof.json
+++ b/verification/e2e-proof.json
@@ -1,45 +1,87 @@
{
- "intent": "Use one fail-closed five-field invariant check in every local product activation lane before any ACTIVE mutation.",
- "risk_tier": "R1 isolated code; live Shopify activation is R4 and was intentionally not invoked",
- "environment": "local macOS workspace; zero-network tests",
- "timestamp": "2026-08-29T04:43:00Z",
- "ticket": "TK-10947-unify-five-field-activation-checks-acros",
- "precondition": "rotate-activate.js had the full extra invariant set; cmo-activate.js and mdc-activate.js duplicated only sample/tag checks.",
+ "ticket": "TK-11314",
+ "timestamp": "2026-09-09T16:55:10.185732+00:00",
+ "environment": "Isolated Mac worktrees; live Shopify read-only snapshots; local dw_unified SELECTs",
+ "cleanup": "Retained local evidence and worktrees. No production code, product, credential, billing, schedule, or canonical database changes.",
+ "intent": "Correct false readiness failures, classify current repairs, and contain vision throttling without bypassing publication gates.",
+ "risk_tier": "R3 read-only external integration; production deployment is R4 and pending approval",
+ "build": {
+ "branch": "fix/tk11314-activation-readiness",
+ "base_commit": "37bb28a94f2acdb258c5dd4dbb15aed2be83890e"
+ },
+ "verdict": "PARTIAL: code and read paths verified; provider recovery and deployment unverified",
+ "baseline": {
+ "run": "2026-09-09T15:25:00Z/15:32:00Z",
+ "products": 1860,
+ "data_gate_rejects": 1591,
+ "vision_429_holds": 269
+ },
+ "commands": [
+ "node --test test/*.test.js",
+ "scripts/capture-readiness.js (1860 live products)",
+ "scripts/verify-live-boundary.js (actual runtime query + pagination)",
+ "scripts/replay-readiness.js (old/new canonical checks)",
+ "scripts/build-repair-report.js",
+ "scripts/diagnose-vision-project.js (nonbillable model/project reads)",
+ "bash ~/Projects/dw-activation-calendar/scripts/check-reintro-guard.sh"
+ ],
"checks": [
{
+ "check": "34 activation tests",
+ "verdict": "PASS",
+ "evidence": "test/*.test.js; width provenance, pagination, price/sample/mfr negative controls, HTTP/auth/error/timeout/circuit tests, confirmed activation response, repair report idempotency"
+ },
+ {
+ "check": "1860 live Shopify captures",
"verdict": "PASS",
- "boundary": "pure validation",
- "command": "node --test test/five-field-extra.test.js",
- "assertions": "7/7 pass: normal pass, missing sample rejection, strict finite-decimal prices, explicit invalid array-shape holds, tag rejection, normalized quote-only exemption boundaries"
+ "evidence": "verification/live-products-20260909.json; 1860 present, no incomplete connections, zero mutations or vision calls"
},
{
+ "check": "Actual runtime Shopify boundary",
"verdict": "PASS",
- "boundary": "script parse",
- "command": "node --check rotate-activate.js; node --check cmo-activate.js; node --check mdc-activate.js",
- "assertions": "all three activation entry points parse"
+ "evidence": "verification/live-boundary.json;50 DRAFT products,17 HTTP queries,12 variant and4 metafield pagination cases;max query cost27"
},
{
+ "check": "False rejection replay",
"verdict": "PASS",
- "boundary": "activation mutation ordering",
- "command": "zero-network source assertion over all three entry points",
- "assertions": "shared fiveFieldExtra call precedes a fail-closed continue, which precedes the ACTIVE mutation"
+ "evidence": "verification/readiness-replay.json;45 width and251 legal-description false flags removed. Other gates still apply."
},
{
+ "check": "Current rejection report",
"verdict": "PASS",
- "boundary": "working-tree hygiene",
- "command": "git diff --check",
- "assertions": "no whitespace errors"
+ "evidence": "verification/readiness-repairs-20260909.json;review-only,per-product/type identities,observed timestamp,source,apply_authorized=false"
+ },
+ {
+ "check": "Existing re-introduction and never-activate guards",
+ "verdict": "PASS",
+ "evidence": "check-reintro-guard.sh all checks passed; unchanged source rules"
+ },
+ {
+ "check": "Provider model/auth read",
+ "verdict": "PASS",
+ "evidence": "GET models/gemini-2.5-flash HTTP200 for configured primary key; no generation call"
+ },
+ {
+ "check": "Provider generation/quota recovery",
+ "verdict": "SKIP",
+ "evidence": "No generation test or paid call. Project lookupHTTP403 using both saved working Google logins; info account reauthentication required. Fallback GEMINI_API_KEY_WALLCO absent from master env."
+ },
+ {
+ "check": "Production activation and source-data repair",
+ "verdict": "SKIP",
+ "evidence": "No deployment, activation, source guessing, bulk product changes, or settlement bypass. Requires explicit production/publishing approval."
}
],
- "negative_checks": [
- "missing sample",
- "missing, blank, zero, malformed, negative, suffixed, and non-finite sellable price",
- "non-array variants.nodes and tags shapes",
- "string tags cannot trigger count or quote-only exemptions",
- "fewer than two tags",
- "quote-only product without sample"
- ],
- "side_effects": "none; no Shopify/Gmail/network call, no service restart, no deploy, no scheduled-job change",
- "cleanup": "not required; tests create no retained state",
- "verdict": "PASS for the local pre-activation decision boundary"
+ "source_sha256": {
+ "rotate-activate.js": "45c73d7c50a65d35781b0b5234a4f5d24223e18f7141c2985439d3cd32754275",
+ "lib/activation-result.js": "594a1c7a7ae5bee340a501f8bbd0b879b18920c6a84ec67a267048caa02fbeff",
+ "lib/five-field-extra.js": "775e0298b3cf124eecd0aff6aed13690de4996f64e105cb259e3800fe0ce81ae",
+ "lib/live-product-fields.js": "b7640b0ea741ffc6186e54f2f5d1dea351c902c6ab1e1418eb3c9328d1b0385b",
+ "lib/mfr-gate-resolve.js": "50a4818ed7e338a331f0325b347123ed0b8980b3a7e9bd01e081f9cfde83ebc6",
+ "lib/mfr-gate.js": "53f98e2a8514571122456d2ebee47e5b8454ea471effb8271414802c01210c79",
+ "lib/readiness-repairs.js": "4d5d9e12cf28a2ca49d51f7b965a8f72c421e0b57abec05a5d4d47fc46a222df",
+ "lib/rotation-order.js": "dfa82240d2213c30ff5df13479e637eaf4c9dcfd6d6b723c280357be00145d32",
+ "lib/settlement-gate.js": "2d0e8cfd7968a768e54234c8a945f5801871478f67b070f424411ecd35caa6e6",
+ "lib/vision-http.js": "461c473b190b7bfa0d9ad766612d3176ea96f587c2292415fdcdc02a52212f32"
+ }
}
diff --git a/verification/live-boundary.json b/verification/live-boundary.json
new file mode 100644
index 0000000..81f1412
--- /dev/null
+++ b/verification/live-boundary.json
@@ -0,0 +1,826 @@
+{
+ "timestamp": "2026-09-09T16:48:53.127Z",
+ "verdict": "PASS",
+ "scope": "Actual runtime Shopify batch query + real pagination + corrected validator; no activation or vision call",
+ "requests": 17,
+ "requested_query_costs": [
+ 27,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12
+ ],
+ "graphql_mutations": 0,
+ "vision_calls": 0,
+ "products": [
+ {
+ "id": "gid://shopify/Product/7923565461555",
+ "status": "DRAFT",
+ "vendor": "Carnegie",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 55,
+ "metafields_after": 55,
+ "width": {
+ "value": "54\" (137 cm)",
+ "source": "dwc.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7896454332467",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 4,
+ "variants_after": 4,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7867560886323",
+ "status": "DRAFT",
+ "vendor": "Designtex",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 17,
+ "metafields_after": 17,
+ "width": {
+ "value": "54 Inches",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7944491794483",
+ "status": "DRAFT",
+ "vendor": "Harlequin",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 0,
+ "metafields_after": 0,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664585080883",
+ "status": "DRAFT",
+ "vendor": "Fentucci",
+ "variants_before": 20,
+ "variants_after": 40,
+ "metafields_before": 0,
+ "metafields_after": 0,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "no product image"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896416845875",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 30,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896408391731",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 35,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896427364403",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 25,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896438800435",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 29,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "no product image",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896387321907",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 25,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896452628531",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 47,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7552687145011",
+ "status": "DRAFT",
+ "vendor": "Thibaut",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 80,
+ "metafields_after": 81,
+ "width": {
+ "value": "27\" x 4.5yds",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7552688160819",
+ "status": "DRAFT",
+ "vendor": "Thibaut",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 80,
+ "metafields_after": 82,
+ "width": {
+ "value": "27\" x 4.5yds",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7552688488499",
+ "status": "DRAFT",
+ "vendor": "Thibaut",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 80,
+ "metafields_after": 81,
+ "width": {
+ "value": "27\" x 4.5yds",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7552712704051",
+ "status": "DRAFT",
+ "vendor": "Thibaut",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 80,
+ "metafields_after": 81,
+ "width": {
+ "value": "27\" x 4.5yds",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7896430379059",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 21,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896441716787",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 22,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896389189683",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 30,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896441847859",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 60,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "no product image",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7896456200243",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 20,
+ "variants_after": 39,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "no product image",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664490610739",
+ "status": "DRAFT",
+ "vendor": "DW Bespoke Studio",
+ "variants_before": 16,
+ "variants_after": 16,
+ "metafields_before": 25,
+ "metafields_after": 25,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7948441550899",
+ "status": "DRAFT",
+ "vendor": "Fentucci",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 13,
+ "metafields_after": 13,
+ "width": {
+ "value": "36\" Wide (trim to 34\")",
+ "source": "global.width"
+ },
+ "reasons": [
+ "no product image"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7799066066995",
+ "status": "DRAFT",
+ "vendor": "Graduate Collection UK",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 78,
+ "metafields_after": 78,
+ "width": {
+ "value": "52cm (20.47\")",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7902339956787",
+ "status": "DRAFT",
+ "vendor": "Greenland",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 11,
+ "metafields_after": 11,
+ "width": {
+ "value": "91.5 cm/36''",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7519945523251",
+ "status": "DRAFT",
+ "vendor": "Koroseal",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 72,
+ "metafields_after": 72,
+ "width": {
+ "value": "36.2 in. (92 cm.)",
+ "source": "global.width"
+ },
+ "reasons": [
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7875193438259",
+ "status": "DRAFT",
+ "vendor": "Malibu Wallpaper",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 19,
+ "metafields_after": 19,
+ "width": {
+ "value": "54 Inches",
+ "source": "global.width"
+ },
+ "reasons": [
+ "no product image"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7876833411123",
+ "status": "DRAFT",
+ "vendor": "Newwall",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 15,
+ "metafields_after": 15,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7796246511667",
+ "status": "DRAFT",
+ "vendor": "Phillipe Romano",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 47,
+ "metafields_after": 47,
+ "width": {
+ "value": "54 in (137.16 cm)",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7664930455603",
+ "status": "DRAFT",
+ "vendor": "Ralph Lauren",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 61,
+ "metafields_after": 61,
+ "width": {
+ "value": "52.25 in",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7896894603315",
+ "status": "DRAFT",
+ "vendor": "Rebel Walls",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 16,
+ "metafields_after": 16,
+ "width": {
+ "value": "19.7 in / 0.5 m",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7911519977523",
+ "status": "DRAFT",
+ "vendor": "Romo",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 0,
+ "metafields_after": 0,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7832784764979",
+ "status": "DRAFT",
+ "vendor": "Scalamandre",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 19,
+ "metafields_after": 19,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7548495069235",
+ "status": "DRAFT",
+ "vendor": "Steve Abrams Studios",
+ "variants_before": 4,
+ "variants_after": 4,
+ "metafields_before": 23,
+ "metafields_after": 23,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7552732594227",
+ "status": "DRAFT",
+ "vendor": "Thibaut",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 64,
+ "metafields_after": 64,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7864785993779",
+ "status": "DRAFT",
+ "vendor": "Wolf Gordon",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 22,
+ "metafields_after": 22,
+ "width": {
+ "value": "54.00\"",
+ "source": "global.width"
+ },
+ "reasons": [
+ "no product image"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923565559859",
+ "status": "DRAFT",
+ "vendor": "Carnegie",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 55,
+ "metafields_after": 55,
+ "width": {
+ "value": "54\" (137 cm)",
+ "source": "dwc.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7896452530227",
+ "status": "DRAFT",
+ "vendor": "Christian Fischbacher",
+ "variants_before": 4,
+ "variants_after": 4,
+ "metafields_before": 6,
+ "metafields_after": 6,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width",
+ "empty description",
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7867560919091",
+ "status": "DRAFT",
+ "vendor": "Designtex",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 17,
+ "metafields_after": 17,
+ "width": {
+ "value": "54 Inches",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7582548066355",
+ "status": "DRAFT",
+ "vendor": "DW Bespoke Studio",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 37,
+ "metafields_after": 37,
+ "width": {
+ "value": "24\"",
+ "source": "global.width"
+ },
+ "reasons": [
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7948443582515",
+ "status": "DRAFT",
+ "vendor": "Fentucci",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 13,
+ "metafields_after": 13,
+ "width": {
+ "value": "36\" Wide (trim to 34\")",
+ "source": "global.width"
+ },
+ "reasons": [
+ "no product image"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7902340055091",
+ "status": "DRAFT",
+ "vendor": "Greenland",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 11,
+ "metafields_after": 11,
+ "width": {
+ "value": "91.5 cm/36''",
+ "source": "custom.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7943214694451",
+ "status": "DRAFT",
+ "vendor": "Harlequin",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 0,
+ "metafields_after": 0,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7519945588787",
+ "status": "DRAFT",
+ "vendor": "Koroseal",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 73,
+ "metafields_after": 73,
+ "width": {
+ "value": "36.2 in. (92 cm.)",
+ "source": "global.width"
+ },
+ "reasons": [
+ "missing sample variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7876272390195",
+ "status": "DRAFT",
+ "vendor": "Malibu Wallpaper",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 19,
+ "metafields_after": 19,
+ "width": {
+ "value": "54 Inches",
+ "source": "global.width"
+ },
+ "reasons": [
+ "no product image"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7876849532979",
+ "status": "DRAFT",
+ "vendor": "Newwall",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 15,
+ "metafields_after": 15,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7796252606515",
+ "status": "DRAFT",
+ "vendor": "Phillipe Romano",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 60,
+ "metafields_after": 60,
+ "width": {
+ "value": "54In",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7664930750515",
+ "status": "DRAFT",
+ "vendor": "Ralph Lauren",
+ "variants_before": 1,
+ "variants_after": 1,
+ "metafields_before": 61,
+ "metafields_after": 61,
+ "width": {
+ "value": "59 in",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7896894636083",
+ "status": "DRAFT",
+ "vendor": "Rebel Walls",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 16,
+ "metafields_after": 16,
+ "width": {
+ "value": "19.7 in / 0.5 m",
+ "source": "global.width"
+ },
+ "reasons": []
+ },
+ {
+ "id": "gid://shopify/Product/7911508738099",
+ "status": "DRAFT",
+ "vendor": "Romo",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 0,
+ "metafields_after": 0,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7552736067635",
+ "status": "DRAFT",
+ "vendor": "Thibaut",
+ "variants_before": 2,
+ "variants_after": 2,
+ "metafields_before": 51,
+ "metafields_after": 51,
+ "width": {
+ "value": "",
+ "source": null
+ },
+ "reasons": [
+ "missing spec(s): width"
+ ]
+ }
+ ]
+}
diff --git a/verification/readiness-replay.json b/verification/readiness-replay.json
new file mode 100644
index 0000000..92b58db
--- /dev/null
+++ b/verification/readiness-replay.json
@@ -0,0 +1,5104 @@
+{
+ "captured_at": "2026-09-09T16:39:45.399Z",
+ "scope": "Canonical readiness and price/sample checks only. Manufacturer provenance, private-label, showroom, settlement and publication gates still apply.",
+ "products": 1860,
+ "width_rejections_removed": 45,
+ "description_rejections_removed": 251,
+ "old_canonical_and_extra_pass": 343,
+ "new_canonical_and_extra_pass": 637,
+ "variant_pagination_needed": 12,
+ "metafield_pagination_needed": 4,
+ "vendors": {
+ "Carnegie": 43,
+ "Designtex": 251,
+ "Phillipe Romano": 2,
+ "Ralph Lauren": 29,
+ "Steve Abrams Studios": 1,
+ "Koroseal": 1,
+ "Arte International": 2,
+ "Matthew Williamson": 57
+ },
+ "changed_products": [
+ {
+ "id": "gid://shopify/Product/7923565461555",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 21 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867560886323",
+ "vendor": "Designtex",
+ "title": "Cork, Dove Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7796246511667",
+ "vendor": "Phillipe Romano",
+ "title": "Andros - Dune Vegan Leather | Phillipe Romano",
+ "width_source": "custom.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-is-sample-leak-4.25"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-is-sample-leak-4.25"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930455603",
+ "vendor": "Ralph Lauren",
+ "title": "Dropcloth Velvet Indigo - Navy Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7548495069235",
+ "vendor": "Steve Abrams Studios",
+ "title": "Framed Art with cigs",
+ "width_source": null,
+ "before": [
+ "missing spec(s): width",
+ "missing sample variant"
+ ],
+ "after": [
+ "missing spec(s): width"
+ ],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923565559859",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 22 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867560919091",
+ "vendor": "Designtex",
+ "title": "Cork, Metallic Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7796252606515",
+ "vendor": "Phillipe Romano",
+ "title": "Alessio - Cream Linen Wallcoverings Fabric | Phillipe Romano",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-is-sample-leak-4.25"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-is-sample-leak-4.25"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930750515",
+ "vendor": "Ralph Lauren",
+ "title": "Dry Goods Weave Blue - Gray Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923565723699",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 23 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867586576435",
+ "vendor": "Designtex",
+ "title": "Cork, Taupe Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7664930881587",
+ "vendor": "Ralph Lauren",
+ "title": "Aged Velvet Dungarees - Steel Blue Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923566084147",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 26 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867586674739",
+ "vendor": "Designtex",
+ "title": "Cork, Grotto Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7584924106803",
+ "vendor": "Koroseal",
+ "title": "Sandscape Tuxedo - Light Gray Commercial Wallcovering | Koroseal",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-is-sample-leak-4.25"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-is-sample-leak-4.25"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923566247987",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 27 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867586707507",
+ "vendor": "Designtex",
+ "title": "Cork, Planet Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923566379059",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 29 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867618132019",
+ "vendor": "Designtex",
+ "title": "Cork, Neolith Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923566542899",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 37 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867618164787",
+ "vendor": "Designtex",
+ "title": "Cork, Polished Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923566772275",
+ "vendor": "Carnegie",
+ "title": "Carnegie Alpine 39 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867618197555",
+ "vendor": "Designtex",
+ "title": "Cork, Coin Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923580567603",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Halo 10 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867673870387",
+ "vendor": "Designtex",
+ "title": "Cork, Tawny Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923580698675",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Halo 11 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867673935923",
+ "vendor": "Designtex",
+ "title": "Cork, Fawn Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923580829747",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Halo 12 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867674001459",
+ "vendor": "Designtex",
+ "title": "Cork, Ivory Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923581026355",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Halo 13 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867722137651",
+ "vendor": "Designtex",
+ "title": "Cork, Gilded Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923581288499",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Halo 15 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867722170419",
+ "vendor": "Designtex",
+ "title": "Cork, Sage Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7923581943859",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Halo 17 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867722235955",
+ "vendor": "Designtex",
+ "title": "Cork, Verdant Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869010935859",
+ "vendor": "Designtex",
+ "title": "Highland, Linen Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876272291891",
+ "vendor": "Designtex",
+ "title": "August, Lemongrass Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876647125043",
+ "vendor": "Designtex",
+ "title": "Ash, Reed Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877278105651",
+ "vendor": "Designtex",
+ "title": "Alex, Silk Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879309393971",
+ "vendor": "Designtex",
+ "title": "Abbott, Rivergrass Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7813698060339",
+ "vendor": "Arte International",
+ "title": "Poona Cream Wallcovering | Arte International",
+ "width_source": "specs.width",
+ "before": [
+ "missing spec(s): width",
+ "no product image",
+ "missing sample variant"
+ ],
+ "after": [
+ "no product image",
+ "missing sample variant"
+ ],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674087475",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 203 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7866912407603",
+ "vendor": "Designtex",
+ "title": "Pebble, Pine Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896496177203",
+ "vendor": "Matthew Williamson",
+ "title": "Pegasus 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930095155",
+ "vendor": "Ralph Lauren",
+ "title": "Impasto Floral Denim - Light Blue Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7813808455731",
+ "vendor": "Arte International",
+ "title": "Abydos Biscuit Wallcovering | Arte International",
+ "width_source": "specs.width",
+ "before": [
+ "missing spec(s): width",
+ "no product image",
+ "missing sample variant"
+ ],
+ "after": [
+ "no product image",
+ "missing sample variant"
+ ],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674185779",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 204 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7866927054899",
+ "vendor": "Designtex",
+ "title": "Pebble, Primp Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503124019",
+ "vendor": "Matthew Williamson",
+ "title": "Ananas 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930127923",
+ "vendor": "Ralph Lauren",
+ "title": "Carraro Twill Chambray - Light Gray Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674415155",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 206 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867297529907",
+ "vendor": "Designtex",
+ "title": "Thatch, Salt Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503189555",
+ "vendor": "Matthew Williamson",
+ "title": "Ananas 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930160691",
+ "vendor": "Ralph Lauren",
+ "title": "Leonor Weathered Floral Vintage Blue - Beige Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674546227",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 207 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867297693747",
+ "vendor": "Designtex",
+ "title": "Thatch, Barley Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503222323",
+ "vendor": "Matthew Williamson",
+ "title": "Esparto 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930193459",
+ "vendor": "Ralph Lauren",
+ "title": "Alain Stripe Vintage Blue - Beige Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674677299",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 209 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867297824819",
+ "vendor": "Designtex",
+ "title": "Thatch, Quartz Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503287859",
+ "vendor": "Matthew Williamson",
+ "title": "Esparto 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930226227",
+ "vendor": "Ralph Lauren",
+ "title": "Billancourt Embroidery Bone China - Off-White Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674775603",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 210 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867403337779",
+ "vendor": "Designtex",
+ "title": "Thatch, Zebra Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503353395",
+ "vendor": "Matthew Williamson",
+ "title": "Esparto 06 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930258995",
+ "vendor": "Ralph Lauren",
+ "title": "Millard Herringbone Chambray - Light Blue Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923674906675",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 229 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867403436083",
+ "vendor": "Designtex",
+ "title": "Thatch, Sand Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503418931",
+ "vendor": "Matthew Williamson",
+ "title": "Esparto 07 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930291763",
+ "vendor": "Ralph Lauren",
+ "title": "Flint Hill Stripe Blue - White Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923675267123",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 253 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867463172147",
+ "vendor": "Designtex",
+ "title": "Thatch, Tabby Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503451699",
+ "vendor": "Matthew Williamson",
+ "title": "Esparto 09 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930324531",
+ "vendor": "Ralph Lauren",
+ "title": "Barberry Damask Chambray - White Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923675398195",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 254 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7867463434291",
+ "vendor": "Designtex",
+ "title": "Thatch, Indigo Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896503517235",
+ "vendor": "Matthew Williamson",
+ "title": "Celestia 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930357299",
+ "vendor": "Ralph Lauren",
+ "title": "Ambleside Embroidery White - Off-White Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923675988019",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 258 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7868941959219",
+ "vendor": "Designtex",
+ "title": "Rosendale, Sky Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896498995251",
+ "vendor": "Matthew Williamson",
+ "title": "Celestial Dragon 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930390067",
+ "vendor": "Ralph Lauren",
+ "title": "Leonor Weathered Floral Pale Blue - Beige Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923676151859",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 259 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869010968627",
+ "vendor": "Designtex",
+ "title": "Highland, Camel Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499060787",
+ "vendor": "Matthew Williamson",
+ "title": "Celestial Dragon 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930422835",
+ "vendor": "Ralph Lauren",
+ "title": "Ambleside Embroidery Denim - Steel Blue Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923676250163",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 260 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869226057779",
+ "vendor": "Designtex",
+ "title": "Highland, Bluestone Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499126323",
+ "vendor": "Matthew Williamson",
+ "title": "Dragonfly Dance 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930488371",
+ "vendor": "Ralph Lauren",
+ "title": "Beaton Floral Overdyed Indigo - Navy Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923676315699",
+ "vendor": "Carnegie",
+ "title": "Carnegie Porto 261 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869226123315",
+ "vendor": "Designtex",
+ "title": "Highland, Spa Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499159091",
+ "vendor": "Matthew Williamson",
+ "title": "Dragonfly Dance 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930521139",
+ "vendor": "Ralph Lauren",
+ "title": "Workwear Twill Medium Blue - Denim Blue Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713114163",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 1 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869226156083",
+ "vendor": "Designtex",
+ "title": "Highland, Silverleaf Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499224627",
+ "vendor": "Matthew Williamson",
+ "title": "Dragonfly Dance 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930553907",
+ "vendor": "Ralph Lauren",
+ "title": "New Creek Indigo - Navy Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713507379",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 13 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869255352371",
+ "vendor": "Designtex",
+ "title": "Highland, Snow Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499355699",
+ "vendor": "Matthew Williamson",
+ "title": "Dragonfly Dance 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930586675",
+ "vendor": "Ralph Lauren",
+ "title": "Chiaroscuro Damask Blue - Navy Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713572915",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 15 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869255385139",
+ "vendor": "Designtex",
+ "title": "Highland, Ecru Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499486771",
+ "vendor": "Matthew Williamson",
+ "title": "Kairi 06 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930619443",
+ "vendor": "Ralph Lauren",
+ "title": "Main Lodge Rug Bohemian Blue Fabric Multi - Dark Brown Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713146931",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 2 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869255417907",
+ "vendor": "Designtex",
+ "title": "Highland, Quartz Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499585075",
+ "vendor": "Matthew Williamson",
+ "title": "Latania 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930652211",
+ "vendor": "Ralph Lauren",
+ "title": "Canyon Stripe Overdyed Blue - Charcoal Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713671219",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 20 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869372596275",
+ "vendor": "Designtex",
+ "title": "Highland, Alum Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499650611",
+ "vendor": "Matthew Williamson",
+ "title": "Latania 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930684979",
+ "vendor": "Ralph Lauren",
+ "title": "Barberry Damask Overdyed Indigo - Dark Blue Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713736755",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 23 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869372727347",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Snow Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499716147",
+ "vendor": "Matthew Williamson",
+ "title": "Latania 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930717747",
+ "vendor": "Ralph Lauren",
+ "title": "Barouche Damask Indigo - Navy Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713179699",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 3 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869372760115",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Sand Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499748915",
+ "vendor": "Matthew Williamson",
+ "title": "Latania 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930783283",
+ "vendor": "Ralph Lauren",
+ "title": "Callais Floral Cyanotype - Dark Gray Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713245235",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 5 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869441572915",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Rose Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499814451",
+ "vendor": "Matthew Williamson",
+ "title": "Providencia 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930816051",
+ "vendor": "Ralph Lauren",
+ "title": "Miners Canvas Dungarees - Denim Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713310771",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 7 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869441671219",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Sky Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499879987",
+ "vendor": "Matthew Williamson",
+ "title": "Nevis 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930848819",
+ "vendor": "Ralph Lauren",
+ "title": "Campernelle Embroidery Shade Garden Fabric Multi | Ralph Lauren Fabrics",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923713376307",
+ "vendor": "Carnegie",
+ "title": "Carnegie Prato 9 Fabric",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869441769523",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Lichen Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896499945523",
+ "vendor": "Matthew Williamson",
+ "title": "Nevis 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930914355",
+ "vendor": "Ralph Lauren",
+ "title": "Workwear Twill Dark Blue - Dark Navy Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923551830067",
+ "vendor": "Carnegie",
+ "title": "Carnegie Glacier 1 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869469425715",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Forest Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500011059",
+ "vendor": "Matthew Williamson",
+ "title": "Nevis 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930947123",
+ "vendor": "Ralph Lauren",
+ "title": "Climbing Rose Damask Dusk - Taupe Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923552256051",
+ "vendor": "Carnegie",
+ "title": "Carnegie Glacier 5 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869469458483",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Copper Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500043827",
+ "vendor": "Matthew Williamson",
+ "title": "Mustique 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664930979891",
+ "vendor": "Ralph Lauren",
+ "title": "Burgao Sheer Champagne - Beige Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923578241075",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Vapor 21 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869469491251",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Ice Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896496242739",
+ "vendor": "Matthew Williamson",
+ "title": "Tyger Tyger 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7664931012659",
+ "vendor": "Ralph Lauren",
+ "title": "Burgao Sheer Twilight - Pale Green Fabric | Ralph Lauren",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ],
+ "extra_after": [
+ "no-sample-variant",
+ "sellable-price-not-gt-0"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923578372147",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Vapor 22 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869767254067",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Steel Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500109363",
+ "vendor": "Matthew Williamson",
+ "title": "Danzon 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923578798131",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Vapor 26 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869767286835",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Nickel Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500174899",
+ "vendor": "Matthew Williamson",
+ "title": "Danzon 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7923578961971",
+ "vendor": "Carnegie",
+ "title": "Carnegie Loop Vapor 27 Wallcovering",
+ "width_source": "dwc.width",
+ "before": [
+ "missing spec(s): width"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7869767319603",
+ "vendor": "Designtex",
+ "title": "Stone Ridge, Pewter Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500437043",
+ "vendor": "Matthew Williamson",
+ "title": "Turquino 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869824041011",
+ "vendor": "Designtex",
+ "title": "Arrange, Paper Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500699187",
+ "vendor": "Matthew Williamson",
+ "title": "Turquino 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869824073779",
+ "vendor": "Designtex",
+ "title": "Arrange, Oat Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896496308275",
+ "vendor": "Matthew Williamson",
+ "title": "Tyger Tyger 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869824106547",
+ "vendor": "Designtex",
+ "title": "Arrange, Penny Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896500961331",
+ "vendor": "Matthew Williamson",
+ "title": "Turquino 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869867393075",
+ "vendor": "Designtex",
+ "title": "Arrange, Marine Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501157939",
+ "vendor": "Matthew Williamson",
+ "title": "Turquino 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869867425843",
+ "vendor": "Designtex",
+ "title": "Arrange, Twilight Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501223475",
+ "vendor": "Matthew Williamson",
+ "title": "Leopardo 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869867458611",
+ "vendor": "Designtex",
+ "title": "Arrange, Ice Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501289011",
+ "vendor": "Matthew Williamson",
+ "title": "Leopardo 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869893574707",
+ "vendor": "Designtex",
+ "title": "Arrange, Concrete Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501321779",
+ "vendor": "Matthew Williamson",
+ "title": "Leopardo 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869893607475",
+ "vendor": "Designtex",
+ "title": "Arrange, Gravel Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501387315",
+ "vendor": "Matthew Williamson",
+ "title": "Leopardo 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7869893640243",
+ "vendor": "Designtex",
+ "title": "Arrange, Steel Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896498929715",
+ "vendor": "Matthew Williamson",
+ "title": "Tyger Tyger 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870797971507",
+ "vendor": "Designtex",
+ "title": "Dune, Waikiki Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501780531",
+ "vendor": "Matthew Williamson",
+ "title": "Azari 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870798004275",
+ "vendor": "Designtex",
+ "title": "Dune, Negril Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501846067",
+ "vendor": "Matthew Williamson",
+ "title": "Azari 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870798037043",
+ "vendor": "Designtex",
+ "title": "Dune, Maya Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501878835",
+ "vendor": "Matthew Williamson",
+ "title": "Azari 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870849777715",
+ "vendor": "Designtex",
+ "title": "Dune, Pacifica Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896501944371",
+ "vendor": "Matthew Williamson",
+ "title": "Azari 06 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870849843251",
+ "vendor": "Designtex",
+ "title": "Dune, Deep Sea Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502009907",
+ "vendor": "Matthew Williamson",
+ "title": "Aravali 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870849876019",
+ "vendor": "Designtex",
+ "title": "Dune, Penitas Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502075443",
+ "vendor": "Matthew Williamson",
+ "title": "Makrana 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870933991475",
+ "vendor": "Designtex",
+ "title": "Dune, Jeju Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502140979",
+ "vendor": "Matthew Williamson",
+ "title": "Makrana 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870934024243",
+ "vendor": "Designtex",
+ "title": "Dune, Perissa Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502206515",
+ "vendor": "Matthew Williamson",
+ "title": "Makrana 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7870934057011",
+ "vendor": "Designtex",
+ "title": "Dune, Kaimu Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502272051",
+ "vendor": "Matthew Williamson",
+ "title": "Jali Trellis 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871410864179",
+ "vendor": "Designtex",
+ "title": "Nico, Lucine Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502337587",
+ "vendor": "Matthew Williamson",
+ "title": "Orangery Lace 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871660097587",
+ "vendor": "Designtex",
+ "title": "Nico, Powder Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502403123",
+ "vendor": "Matthew Williamson",
+ "title": "Orangery Lace 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871660195891",
+ "vendor": "Designtex",
+ "title": "Nico, Trail Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502468659",
+ "vendor": "Matthew Williamson",
+ "title": "Orangery Lace 03 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871660294195",
+ "vendor": "Designtex",
+ "title": "Nico, Ray Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502534195",
+ "vendor": "Matthew Williamson",
+ "title": "Orangery Lace 04 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871872860211",
+ "vendor": "Designtex",
+ "title": "Nico, Seaglass Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502566963",
+ "vendor": "Matthew Williamson",
+ "title": "Sirius 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871872892979",
+ "vendor": "Designtex",
+ "title": "Nico, Ravine Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502632499",
+ "vendor": "Matthew Williamson",
+ "title": "Adornado 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871872925747",
+ "vendor": "Designtex",
+ "title": "Nico, Pond Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502698035",
+ "vendor": "Matthew Williamson",
+ "title": "Adornado 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871941312563",
+ "vendor": "Designtex",
+ "title": "Nico, Pacific Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502763571",
+ "vendor": "Matthew Williamson",
+ "title": "Adornado 05 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871941345331",
+ "vendor": "Designtex",
+ "title": "Nico, Dusk Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502796339",
+ "vendor": "Matthew Williamson",
+ "title": "Coralino 01 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871941410867",
+ "vendor": "Designtex",
+ "title": "Nico, Mountain Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7896502894643",
+ "vendor": "Matthew Williamson",
+ "title": "Coralino 02 | Matthew Williamson",
+ "width_source": "global.width",
+ "before": [
+ "missing sample variant"
+ ],
+ "after": [],
+ "extra_before": [
+ "no-sample-variant"
+ ],
+ "extra_after": [
+ "no-sample-variant"
+ ]
+ },
+ {
+ "id": "gid://shopify/Product/7871976865843",
+ "vendor": "Designtex",
+ "title": "Nico, Cliff Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7871976931379",
+ "vendor": "Designtex",
+ "title": "Nico, Storm Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872283246643",
+ "vendor": "Designtex",
+ "title": "Timo, Cream Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872468418611",
+ "vendor": "Designtex",
+ "title": "Timo, Dune Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872468549683",
+ "vendor": "Designtex",
+ "title": "Timo, Beige Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872468647987",
+ "vendor": "Designtex",
+ "title": "Timo, Earth Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872915636275",
+ "vendor": "Designtex",
+ "title": "Timo, Freshwater Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872915800115",
+ "vendor": "Designtex",
+ "title": "Timo, Sail Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7872915931187",
+ "vendor": "Designtex",
+ "title": "Timo, Mauve Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873159430195",
+ "vendor": "Designtex",
+ "title": "Timo, Ginger Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873159528499",
+ "vendor": "Designtex",
+ "title": "Timo, Chalk Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873159594035",
+ "vendor": "Designtex",
+ "title": "Timo, Pearl Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873279328307",
+ "vendor": "Designtex",
+ "title": "Timo, Powder Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873279492147",
+ "vendor": "Designtex",
+ "title": "Timo, Dust Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873279688755",
+ "vendor": "Designtex",
+ "title": "Timo, Graphite Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873452113971",
+ "vendor": "Designtex",
+ "title": "Talula, Dew Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873452212275",
+ "vendor": "Designtex",
+ "title": "Talula, Feather Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873452310579",
+ "vendor": "Designtex",
+ "title": "Talula, Mist Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873687683123",
+ "vendor": "Designtex",
+ "title": "Talula, Deep Sea Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873687781427",
+ "vendor": "Designtex",
+ "title": "Talula, Talc Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873687912499",
+ "vendor": "Designtex",
+ "title": "Talula, Vapor Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873911914547",
+ "vendor": "Designtex",
+ "title": "Talula, Fog Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873911980083",
+ "vendor": "Designtex",
+ "title": "Talula, Celestial Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7873912045619",
+ "vendor": "Designtex",
+ "title": "Talula, Ash Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876091543603",
+ "vendor": "Designtex",
+ "title": "August, Nimbus Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876147183667",
+ "vendor": "Designtex",
+ "title": "August, Oyster Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876147216435",
+ "vendor": "Designtex",
+ "title": "August, Glow Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876193910835",
+ "vendor": "Designtex",
+ "title": "August, Taupe Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876193943603",
+ "vendor": "Designtex",
+ "title": "August, Black Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876206002227",
+ "vendor": "Designtex",
+ "title": "August, Golden Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876206034995",
+ "vendor": "Designtex",
+ "title": "August, Petal Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876228644915",
+ "vendor": "Designtex",
+ "title": "August, Stratus Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876228677683",
+ "vendor": "Designtex",
+ "title": "August, Bluebird Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876312105011",
+ "vendor": "Designtex",
+ "title": "August, Thyme Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876312137779",
+ "vendor": "Designtex",
+ "title": "August, Evergreen Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876351361075",
+ "vendor": "Designtex",
+ "title": "August, Sage Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876351426611",
+ "vendor": "Designtex",
+ "title": "August, Plum Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876405002291",
+ "vendor": "Designtex",
+ "title": "August, Pumpkin Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876405035059",
+ "vendor": "Designtex",
+ "title": "August, Pigeon Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876422533171",
+ "vendor": "Designtex",
+ "title": "Aubrey, White Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876422598707",
+ "vendor": "Designtex",
+ "title": "Aubrey, Quarry Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876449828915",
+ "vendor": "Designtex",
+ "title": "Aubrey, Quicksand Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876449992755",
+ "vendor": "Designtex",
+ "title": "Aubrey, Coal Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876474044467",
+ "vendor": "Designtex",
+ "title": "Aubrey, Basket Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876474110003",
+ "vendor": "Designtex",
+ "title": "Aubrey, Rose Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876503306291",
+ "vendor": "Designtex",
+ "title": "Aubrey, Skylight Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876503339059",
+ "vendor": "Designtex",
+ "title": "Aubrey, Shore Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876562157619",
+ "vendor": "Designtex",
+ "title": "Aubrey, Seaside Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876562190387",
+ "vendor": "Designtex",
+ "title": "Aubrey, Satsuma Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876574969907",
+ "vendor": "Designtex",
+ "title": "Aubrey, Moon Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876575002675",
+ "vendor": "Designtex",
+ "title": "Aubrey, Dock Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876586471475",
+ "vendor": "Designtex",
+ "title": "Ash, Ivory Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876586537011",
+ "vendor": "Designtex",
+ "title": "Ash, Shell Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876599939123",
+ "vendor": "Designtex",
+ "title": "Ash, Rose Gold Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876599971891",
+ "vendor": "Designtex",
+ "title": "Ash, Tan Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876647092275",
+ "vendor": "Designtex",
+ "title": "Ash, Pigeon Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876666556467",
+ "vendor": "Designtex",
+ "title": "Ash, Fountain Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876666589235",
+ "vendor": "Designtex",
+ "title": "Ash, Tiber Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876691722291",
+ "vendor": "Designtex",
+ "title": "Ash, Moss Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876691755059",
+ "vendor": "Designtex",
+ "title": "Ash, Light Gray Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876773806131",
+ "vendor": "Designtex",
+ "title": "Ash, Shade Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876773871667",
+ "vendor": "Designtex",
+ "title": "Ash, Inkblot Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876799004723",
+ "vendor": "Designtex",
+ "title": "Ari, Frost Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876799037491",
+ "vendor": "Designtex",
+ "title": "Ari, Buff Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876819648563",
+ "vendor": "Designtex",
+ "title": "Ari, Highland Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876819681331",
+ "vendor": "Designtex",
+ "title": "Ari, Plateau Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876833280051",
+ "vendor": "Designtex",
+ "title": "Ari, Glow Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876833312819",
+ "vendor": "Designtex",
+ "title": "Ari, River Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876849467443",
+ "vendor": "Designtex",
+ "title": "Ari, Ocean Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876849500211",
+ "vendor": "Designtex",
+ "title": "Ari, Plum Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876867063859",
+ "vendor": "Designtex",
+ "title": "Ari, Anchor Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876867096627",
+ "vendor": "Designtex",
+ "title": "Ari, Mirror Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876886724659",
+ "vendor": "Designtex",
+ "title": "Ari, Creek Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876886757427",
+ "vendor": "Designtex",
+ "title": "Ari, Burnish Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876896423987",
+ "vendor": "Designtex",
+ "title": "Anitra, Sand Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876896456755",
+ "vendor": "Designtex",
+ "title": "Anitra, Birch Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876913561651",
+ "vendor": "Designtex",
+ "title": "Anitra, Mink Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7876913594419",
+ "vendor": "Designtex",
+ "title": "Anitra, Dijon Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877124751411",
+ "vendor": "Designtex",
+ "title": "Anitra, Rain Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877124784179",
+ "vendor": "Designtex",
+ "title": "Anitra, Surf Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877148475443",
+ "vendor": "Designtex",
+ "title": "Anitra, Indigo Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877148508211",
+ "vendor": "Designtex",
+ "title": "Anitra, Tamarind Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877161877555",
+ "vendor": "Designtex",
+ "title": "Anitra, Ivory Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877161910323",
+ "vendor": "Designtex",
+ "title": "Anitra, Fossil Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877196087347",
+ "vendor": "Designtex",
+ "title": "Anitra, Rhino Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877196120115",
+ "vendor": "Designtex",
+ "title": "Anitra, Thunder Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877232721971",
+ "vendor": "Designtex",
+ "title": "Alex, Bone Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877232754739",
+ "vendor": "Designtex",
+ "title": "Alex, Wafer Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877278302259",
+ "vendor": "Designtex",
+ "title": "Alex, Twig Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877337350195",
+ "vendor": "Designtex",
+ "title": "Alex, Spice Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877337382963",
+ "vendor": "Designtex",
+ "title": "Alex, Fawn Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877367922739",
+ "vendor": "Designtex",
+ "title": "Alex, Night Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877367955507",
+ "vendor": "Designtex",
+ "title": "Alex, Husk Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877379719219",
+ "vendor": "Designtex",
+ "title": "Alex, Sumac Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877379751987",
+ "vendor": "Designtex",
+ "title": "Alex, Slate Blue Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877491818547",
+ "vendor": "Designtex",
+ "title": "Alex, Seaside Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877491949619",
+ "vendor": "Designtex",
+ "title": "Alex, Planet Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877634588723",
+ "vendor": "Designtex",
+ "title": "Alex, Thyme Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877634752563",
+ "vendor": "Designtex",
+ "title": "Alex, Ivory Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877685936179",
+ "vendor": "Designtex",
+ "title": "Alex, Iron Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877685968947",
+ "vendor": "Designtex",
+ "title": "Alex, Elephant Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877831917619",
+ "vendor": "Designtex",
+ "title": "Aiden, Ivory Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877832015923",
+ "vendor": "Designtex",
+ "title": "Aiden, Bronzite Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877967052851",
+ "vendor": "Designtex",
+ "title": "Aiden, Opal Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7877967085619",
+ "vendor": "Designtex",
+ "title": "Aiden, Sodalite Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878034882611",
+ "vendor": "Designtex",
+ "title": "Aiden, Jasper Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878034948147",
+ "vendor": "Designtex",
+ "title": "Aiden, White Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878099697715",
+ "vendor": "Designtex",
+ "title": "Aiden, Quartz Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878099730483",
+ "vendor": "Designtex",
+ "title": "Aiden, Dolomite Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878132957235",
+ "vendor": "Designtex",
+ "title": "Aiden, Hematite Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878133088307",
+ "vendor": "Designtex",
+ "title": "Adrian, Glow Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878154879027",
+ "vendor": "Designtex",
+ "title": "Adrian, Golden Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878154944563",
+ "vendor": "Designtex",
+ "title": "Adrian, Sky Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878219890739",
+ "vendor": "Designtex",
+ "title": "Adrian, Dusk Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878219956275",
+ "vendor": "Designtex",
+ "title": "Adrian, Ivory Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878264913971",
+ "vendor": "Designtex",
+ "title": "Adrian, Fog Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878264946739",
+ "vendor": "Designtex",
+ "title": "Adrian, Concrete Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878349914163",
+ "vendor": "Designtex",
+ "title": "Adrian, Stone Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878349946931",
+ "vendor": "Designtex",
+ "title": "Adrian, Slate Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878399918131",
+ "vendor": "Designtex",
+ "title": "Addison, Tatami Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878399950899",
+ "vendor": "Designtex",
+ "title": "Addison, Mineral Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878837927987",
+ "vendor": "Designtex",
+ "title": "Addison, Boulder Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878837993523",
+ "vendor": "Designtex",
+ "title": "Addison, Copper Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878948651059",
+ "vendor": "Designtex",
+ "title": "Addison, Golden Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878948683827",
+ "vendor": "Designtex",
+ "title": "Addison, Champagne Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878982139955",
+ "vendor": "Designtex",
+ "title": "Addison, White Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7878982238259",
+ "vendor": "Designtex",
+ "title": "Addison, Haze Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879121895475",
+ "vendor": "Designtex",
+ "title": "Addison, Mirage Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879121928243",
+ "vendor": "Designtex",
+ "title": "Addison, Steel Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879196278835",
+ "vendor": "Designtex",
+ "title": "Addison, Elephant Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879196311603",
+ "vendor": "Designtex",
+ "title": "Addison, Kohl Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879251230771",
+ "vendor": "Designtex",
+ "title": "Abbott, Creme Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879251263539",
+ "vendor": "Designtex",
+ "title": "Abbott, Oyster Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879309361203",
+ "vendor": "Designtex",
+ "title": "Abbott, Pewter Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879391969331",
+ "vendor": "Designtex",
+ "title": "Abbott, Mist Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879392002099",
+ "vendor": "Designtex",
+ "title": "Abbott, Adriatic Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879408091187",
+ "vendor": "Designtex",
+ "title": "Abbott, Rose Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879408123955",
+ "vendor": "Designtex",
+ "title": "Abbott, Prune Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879443284019",
+ "vendor": "Designtex",
+ "title": "Abbott, Pearl Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879443316787",
+ "vendor": "Designtex",
+ "title": "Abbott, Dove Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879470055475",
+ "vendor": "Designtex",
+ "title": "Abbott, Shadow Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879470088243",
+ "vendor": "Designtex",
+ "title": "Abbott, Sumi Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879542210611",
+ "vendor": "Designtex",
+ "title": "Pediment, Creme Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879542243379",
+ "vendor": "Designtex",
+ "title": "Pediment, Ecru Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879654506547",
+ "vendor": "Designtex",
+ "title": "Pediment, Flax Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879654539315",
+ "vendor": "Designtex",
+ "title": "Pediment, Fawn Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879668858931",
+ "vendor": "Designtex",
+ "title": "Pediment, Loam Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879668891699",
+ "vendor": "Designtex",
+ "title": "Pediment, Otter Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879691468851",
+ "vendor": "Designtex",
+ "title": "Pediment, Mushroom Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879691501619",
+ "vendor": "Designtex",
+ "title": "Pediment, Turquoise Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879794950195",
+ "vendor": "Designtex",
+ "title": "Pediment, Denim Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879794982963",
+ "vendor": "Designtex",
+ "title": "Pediment, White Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879809335347",
+ "vendor": "Designtex",
+ "title": "Pediment, Cloud Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879809368115",
+ "vendor": "Designtex",
+ "title": "Pediment, Concrete Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879841808435",
+ "vendor": "Designtex",
+ "title": "Cambric, Diatomite Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879841939507",
+ "vendor": "Designtex",
+ "title": "Cambric, Marble Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879858487347",
+ "vendor": "Designtex",
+ "title": "Cambric, Limestone Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879858520115",
+ "vendor": "Designtex",
+ "title": "Cambric, Clay Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879888830515",
+ "vendor": "Designtex",
+ "title": "Cambric, Basalt Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879888896051",
+ "vendor": "Designtex",
+ "title": "Cambric, Dolostone Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879901511731",
+ "vendor": "Designtex",
+ "title": "Cambric, Shale Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879901544499",
+ "vendor": "Designtex",
+ "title": "Cambric, Pumice Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879932772403",
+ "vendor": "Designtex",
+ "title": "Cambric, Chalk Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879932805171",
+ "vendor": "Designtex",
+ "title": "Cambric, Charcoal Gray Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879979073587",
+ "vendor": "Designtex",
+ "title": "Tocca, Bone Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7879979204659",
+ "vendor": "Designtex",
+ "title": "Tocca, Wax Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880010137651",
+ "vendor": "Designtex",
+ "title": "Tocca, Oat Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880010235955",
+ "vendor": "Designtex",
+ "title": "Tocca, Antique Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880022097971",
+ "vendor": "Designtex",
+ "title": "Tocca, Earth Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880022130739",
+ "vendor": "Designtex",
+ "title": "Tocca, Stratus Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880062926899",
+ "vendor": "Designtex",
+ "title": "Tocca, Current Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880337326131",
+ "vendor": "Designtex",
+ "title": "Tocca, Ash Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880337457203",
+ "vendor": "Designtex",
+ "title": "Tocca, Basmati Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880478588979",
+ "vendor": "Designtex",
+ "title": "Tocca, Fog Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ },
+ {
+ "id": "gid://shopify/Product/7880478687283",
+ "vendor": "Designtex",
+ "title": "Tocca, Pebble Wallcoverings | Designtex",
+ "width_source": "global.width",
+ "before": [
+ "description is legal/disclaimer boilerplate, not product copy"
+ ],
+ "after": [],
+ "extra_before": [],
+ "extra_after": []
+ }
+ ]
+}
← 37bb28a TK-11186 Step D prep: rotation-activator skips showroom vend
·
back to Dw Activation Debug TK11314
·
Record reversible source rollout rehearsal and approval boun 39b3dd0 →