← back to Dw Unbuyable Recovery Pilot
TK-11124: add per-yard $359 sellable variant to 18 sample-only DWVE Velvet Walls (Phillipe Romano) — now buyable, samples intact
e88e5d3013f9a845a00d5449f0d5dfd5e0492d3f · 2026-09-02 13:19:21 -0700 · Steve Abrams
Files touched
A tk11124-dwve-velvet/apply.mjsA tk11124-dwve-velvet/inspect.mjsA tk11124-dwve-velvet/out/inspect.jsonA tk11124-dwve-velvet/out/results-apply.jsonA tk11124-dwve-velvet/out/results-dryrun.jsonA tk11124-dwve-velvet/out/rollback.jsonlA tk11124-dwve-velvet/out/verify-final.jsonA tk11124-dwve-velvet/probe2.mjsA tk11124-dwve-velvet/rollback.mjsA tk11124-dwve-velvet/verify1.mjsA tk11124-dwve-velvet/verifyall.mjs
Diff
commit e88e5d3013f9a845a00d5449f0d5dfd5e0492d3f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Sep 2 13:19:21 2026 -0700
TK-11124: add per-yard $359 sellable variant to 18 sample-only DWVE Velvet Walls (Phillipe Romano) — now buyable, samples intact
---
tk11124-dwve-velvet/apply.mjs | 163 +++++
tk11124-dwve-velvet/inspect.mjs | 98 +++
tk11124-dwve-velvet/out/inspect.json | 1031 +++++++++++++++++++++++++++
tk11124-dwve-velvet/out/results-apply.json | 204 ++++++
tk11124-dwve-velvet/out/results-dryrun.json | 244 +++++++
tk11124-dwve-velvet/out/rollback.jsonl | 18 +
tk11124-dwve-velvet/out/verify-final.json | 146 ++++
tk11124-dwve-velvet/probe2.mjs | 18 +
tk11124-dwve-velvet/rollback.mjs | 30 +
tk11124-dwve-velvet/verify1.mjs | 9 +
tk11124-dwve-velvet/verifyall.mjs | 18 +
11 files changed, 1979 insertions(+)
diff --git a/tk11124-dwve-velvet/apply.mjs b/tk11124-dwve-velvet/apply.mjs
new file mode 100644
index 0000000..d7189f8
--- /dev/null
+++ b/tk11124-dwve-velvet/apply.mjs
@@ -0,0 +1,163 @@
+#!/usr/bin/env node
+/**
+ * apply.mjs — TK-11124. Make 18 sample-only ACTIVE "Velvet Walls by Phillipe Romano"
+ * (DWVE) products BUYABLE by ADDING one sellable per-yard variant, matching the live
+ * working sibling DWVE-430760 exactly. Steve-approved, in-session, customer-facing.
+ *
+ * Per product (verified live, sample-only, ACTIVE):
+ * • ADD variant Size:"Sold Per Yard" @ $359.00, sku=<DWSKU>-Yard, inventoryPolicy CONTINUE,
+ * inventoryItem.tracked=true (DEFAULT strategy — the product already has a real "Size"
+ * option w/ value "Sample", so this appends a 2nd option value; the $4.25 Sample is untouched).
+ * • inventoryActivate the new item @ Location/5795643504 (15442 Ventura Blvd) + set on_hand 2026
+ * — REQUIRES write_inventory ⇒ FULL token (lib/shopify.mjs prefers SHOPIFY_FULL_ACCESS_TOKEN …2ea5).
+ * • Align product global.unit_of_measure "Full Roll" -> "Sold per Yard" (records old value).
+ * • KEEP the $4.25 Sample variant exactly as-is. Do NOT change product status (stays ACTIVE).
+ *
+ * SAFETY:
+ * • DRY-RUN by default. --apply --i-am-steve to write (Steve gave explicit in-session approval).
+ * • Idempotent: skips any product that already has a non-sample sellable variant, is not
+ * sample-only, is not ACTIVE, or whose lone variant is the implicit "Default Title" (would
+ * be consumed — never risk the sample).
+ * • Rollback map per product -> out/rollback.jsonl (undo = productVariantsBulkDelete the added
+ * variant + metafieldsSet unit_of_measure back to old value).
+ * • Self-verify AFTER each write: re-query, confirm sample survived AND sellable buyable.
+ * • Ledger each applied product to ~/.claude/yolo-queue/executed-reversible/ledger.jsonl.
+ * COST: $0 (local + Shopify Admin API; no metered service).
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { gql, SHOP, TOKEN } from '../../designerwallcoverings/scripts/lib/shopify.mjs';
+
+const __dir = path.dirname(fileURLToPath(import.meta.url));
+const outDir = path.join(__dir, 'out');
+fs.mkdirSync(outDir, { recursive: true });
+const APPLY = process.argv.includes('--apply') && process.argv.includes('--i-am-steve');
+const LIMIT = (process.argv.find(a => a.startsWith('--limit=')) || '').split('=')[1];
+
+const LOCATION = 'gid://shopify/Location/5795643504'; // 15442 Ventura Blvd (primary; = getLocation() + sibling)
+const QTY = 2026;
+const PRICE = '359.00';
+const OPT_NAME = 'Size';
+const OPT_VALUE = 'Sold Per Yard'; // match sibling DWVE-430760 casing exactly
+const UNIT_OLD = 'Full Roll'; // expected current value (verified)
+const UNIT_NEW = 'Sold per Yard'; // line-consistent phrasing ("Sold per Bolt" etc.)
+
+const TARGETS = [
+ ['DWVE-429560','6621005643827'],['DWVE-429660','6621005676595'],['DWVE-429760','6621005709363'],
+ ['DWVE-429960','6621005774899'],['DWVE-430160','6621005873203'],['DWVE-430260','6621005905971'],
+ ['DWVE-430360','6621005938739'],['DWVE-430460','6621005971507'],['DWVE-430560','6621006004275'],
+ ['DWVE-430660','6621006069811'],['DWVE-430860','6621006135347'],['DWVE-430960','6621006200883'],
+ ['DWVE-431060','6621006233651'],['DWVE-431160','6621006266419'],['DWVE-431260','6621006299187'],
+ ['DWVE-431360','6621006331955'],['DWVE-431560','6621006397491'],['DWVE-431660','6621006463027'],
+];
+
+const gidP = id => `gid://shopify/Product/${id}`;
+const Q = `query($id:ID!){ product(id:$id){ id legacyResourceId title handle status
+ options{name values}
+ unit: metafield(namespace:"global", key:"unit_of_measure"){ value }
+ variants(first:25){ nodes{ id sku price selectedOptions{name value} inventoryItem{ id tracked } } } } }`;
+const C = `mutation($productId:ID!,$variants:[ProductVariantsBulkInput!]!){
+ productVariantsBulkCreate(productId:$productId, variants:$variants){
+ productVariants{ id sku price selectedOptions{name value} inventoryItem{ id } } userErrors{ field message } } }`;
+const ACT = `mutation($iid:ID!,$loc:ID!){ inventoryActivate(inventoryItemId:$iid, locationId:$loc){ inventoryLevel{ id } userErrors{ message } } }`;
+const SETQ = `mutation($input:InventorySetQuantitiesInput!){ inventorySetQuantities(input:$input){ userErrors{ message code } } }`;
+const MF = `mutation($mf:[MetafieldsSetInput!]!){ metafieldsSet(metafields:$mf){ metafields{ id key value } userErrors{ field message } } }`;
+
+const ledgerPath = path.join(process.env.HOME, '.claude/yolo-queue/executed-reversible/ledger.jsonl');
+const rbStream = fs.createWriteStream(path.join(outDir, 'rollback.jsonl'), { flags: 'a' });
+const results = [];
+let applied = 0, skipped = 0, errored = 0;
+
+console.log(`TK-11124 add-per-yard-variant — token …${(TOKEN||'').slice(-4)} — mode: ${APPLY ? '⚠️ LIVE APPLY' : 'DRY-RUN'} — store ${SHOP}`);
+
+const RUN = LIMIT ? TARGETS.slice(0, parseInt(LIMIT, 10)) : TARGETS;
+for (const [dwsku, id] of RUN) {
+ const d = await gql(Q, { id: gidP(id) });
+ const p = d?.product;
+ if (!p) { results.push({ dwsku, id, action: 'SKIP', reason: 'not-found' }); skipped++; continue; }
+ const vs = p.variants.nodes;
+ const sample = vs.find(v => /-sample$/i.test(v.sku||'') || parseFloat(v.price) <= 4.30);
+ const sellable = vs.find(v => v !== sample && parseFloat(v.price) > 4.30);
+ const yardSku = `${dwsku}-Yard`;
+
+ if (p.status !== 'ACTIVE') { results.push({ dwsku, id, action: 'SKIP', reason: 'not-active:'+p.status }); skipped++; continue; }
+ if (sellable || vs.some(v => (v.sku||'').toUpperCase() === yardSku.toUpperCase() || /sold per yard/i.test(v.selectedOptions?.map(o=>o.value).join('|')||''))) {
+ results.push({ dwsku, id, action: 'SKIP', reason: 'already-has-sellable', existing: sellable?.sku }); skipped++; continue;
+ }
+ if (!(vs.length === 1 && sample)) { results.push({ dwsku, id, action: 'SKIP', reason: 'not-sample-only', nvar: vs.length }); skipped++; continue; }
+ const soleOpt = (sample.selectedOptions?.[0]?.value || '').toLowerCase();
+ if (soleOpt === 'default title') { results.push({ dwsku, id, action: 'SKIP', reason: 'default-title-would-consume-sample' }); skipped++; continue; }
+
+ const preUnit = p.unit?.value ?? null;
+ const plan = { dwsku, id: p.legacyResourceId, title: p.title, sample_sku: sample.sku, sample_price: sample.price, yard_sku: yardSku, price: PRICE, opt: `${OPT_NAME}:${OPT_VALUE}`, unit_from: preUnit, unit_to: UNIT_NEW };
+
+ if (!APPLY) { results.push({ dwsku, id: p.legacyResourceId, action: 'WOULD-APPLY', ...plan }); continue; }
+
+ const errs = [];
+ // 1) create the sellable per-yard variant (DEFAULT strategy — appends 2nd Size value)
+ const cr = await gql(C, { productId: gidP(id), variants: [{
+ price: PRICE, optionValues: [{ optionName: OPT_NAME, name: OPT_VALUE }],
+ inventoryPolicy: 'CONTINUE', inventoryItem: { sku: yardSku, tracked: true },
+ }] });
+ if (cr?.__err) { errored++; results.push({ dwsku, id, action: 'FAIL', reason: 'create:'+JSON.stringify(cr.__err).slice(0,160) }); continue; }
+ const ue = cr.productVariantsBulkCreate?.userErrors || [];
+ if (ue.length) { errored++; results.push({ dwsku, id, action: 'FAIL', reason: 'create-uerr:'+JSON.stringify(ue) }); continue; }
+ const nv = (cr.productVariantsBulkCreate.productVariants || []).find(v => (v.sku||'').toUpperCase() === yardSku.toUpperCase()) || cr.productVariantsBulkCreate.productVariants[0];
+ const iid = nv?.inventoryItem?.id;
+ // record rollback BEFORE further steps so the created variant is always reversible
+ rbStream.write(JSON.stringify({ dwsku, product_id: p.legacyResourceId, added_variant_id: nv.id, yard_sku: yardSku, unit_of_measure_old: preUnit, unit_of_measure_new: UNIT_NEW }) + '\n');
+
+ // 2) inventoryActivate + set on_hand 2026 (FULL token)
+ if (iid) {
+ const a = await gql(ACT, { iid, loc: LOCATION });
+ (a?.inventoryActivate?.userErrors || []).filter(e => !/already/i.test(e.message)).forEach(e => errs.push('activate:'+e.message));
+ if (a?.__err) errs.push('activate:'+JSON.stringify(a.__err).slice(0,120));
+ const sq = await gql(SETQ, { input: { name: 'on_hand', reason: 'correction', ignoreCompareQuantity: true,
+ quantities: [{ inventoryItemId: iid, locationId: LOCATION, quantity: QTY }] } });
+ (sq?.inventorySetQuantities?.userErrors || []).forEach(e => errs.push('setqty:'+e.message));
+ if (sq?.__err) errs.push('setqty:'+JSON.stringify(sq.__err).slice(0,120));
+ } else errs.push('no-inventoryItem-on-created-variant');
+
+ // 3) align unit_of_measure metafield
+ const mf = await gql(MF, { mf: [{ ownerId: gidP(id), namespace: 'global', key: 'unit_of_measure', type: 'single_line_text_field', value: UNIT_NEW }] });
+ (mf?.metafieldsSet?.userErrors || []).forEach(e => errs.push('unit-mf:'+e.message));
+ if (mf?.__err) errs.push('unit-mf:'+JSON.stringify(mf.__err).slice(0,120));
+
+ // 4) self-verify: re-query, sample survived + sellable present + status still ACTIVE
+ const re = await gql(Q, { id: gidP(id) });
+ const rv = re?.product?.variants?.nodes || [];
+ const sampleOk = rv.some(v => parseFloat(v.price) <= 4.30);
+ const sellOk = rv.some(v => (v.sku||'').toUpperCase() === yardSku.toUpperCase() && parseFloat(v.price) > 4.30);
+ const unitOk = (re?.product?.unit?.value || '') === UNIT_NEW;
+ const statusOk = re?.product?.status === 'ACTIVE';
+ const minPrice = Math.min(...rv.map(v => parseFloat(v.price)));
+
+ if (!sampleOk) {
+ errs.push('SAMPLE-LOST');
+ results.push({ dwsku, id: p.legacyResourceId, action: 'FAIL-SAMPLE-LOST', added_variant_id: nv.id, errs });
+ console.log(`⛔ ${dwsku} SAMPLE LOST after add — ABORT (rollback the added variant ${nv.id}). Evidence out/rollback.jsonl`);
+ errored++; break; // never churn further
+ }
+
+ const action = (sellOk && statusOk && !errs.length) ? 'APPLIED' : 'APPLIED-WITH-WARN';
+ results.push({ dwsku, id: p.legacyResourceId, action, added_variant_id: nv.id, yard_sku: yardSku, min_variant_price: minPrice, unit_ok: unitOk, status: re?.product?.status, errs });
+ applied++;
+ // ledger this reversible customer-facing write
+ fs.appendFileSync(ledgerPath, JSON.stringify({
+ ts: new Date().toISOString(), agent: 'vp-dw-commerce', ticket: 'TK-11124',
+ action: `add per-yard sellable variant ${yardSku} @ $${PRICE} (Size:${OPT_VALUE}, CONTINUE, inv ${QTY}@Ventura) + unit_of_measure "${preUnit}"->"${UNIT_NEW}" on ${dwsku} product ${p.legacyResourceId} (${SHOP}) — makes sample-only ACTIVE product buyable`,
+ blast_radius: 18,
+ undo_cmd: `cd ~/Projects/dw-unbuyable-recovery-pilot/tk11124-dwve-velvet && node rollback.mjs --apply --i-am-steve # productVariantsBulkDelete ${nv.id} on product ${p.legacyResourceId} + metafieldsSet global.unit_of_measure="${preUnit}"; map out/rollback.jsonl`,
+ verify: `product ${p.legacyResourceId} variant ${yardSku} present @ $${PRICE}, sample $4.25 intact, status ACTIVE`,
+ }) + '\n');
+ await new Promise(r => setTimeout(r, 150));
+}
+
+rbStream.end();
+fs.writeFileSync(path.join(outDir, `results-${APPLY?'apply':'dryrun'}.json`), JSON.stringify({ ticket: 'TK-11124', at: new Date().toISOString(), apply: APPLY, applied, skipped, errored, results }, null, 2));
+
+console.log(`\n=== ${APPLY ? 'APPLIED' : 'DRY-RUN'} — ${applied} applied / ${skipped} skipped / ${errored} failed ===`);
+for (const r of results) console.log(` ${String(r.action).padEnd(20)} ${r.dwsku}${r.yard_sku?(' +'+r.yard_sku):''}${r.min_variant_price!==undefined?(' min$'+r.min_variant_price):''}${r.reason?(' reason='+r.reason):''}${r.errs&&r.errs.length?(' ERRS='+r.errs.join(';')):''}`);
+console.log(`\nrollback map: out/rollback.jsonl | results: out/results-${APPLY?'apply':'dryrun'}.json`);
+if (!APPLY) console.log('To execute: node apply.mjs --apply --i-am-steve');
diff --git a/tk11124-dwve-velvet/inspect.mjs b/tk11124-dwve-velvet/inspect.mjs
new file mode 100644
index 0000000..01da396
--- /dev/null
+++ b/tk11124-dwve-velvet/inspect.mjs
@@ -0,0 +1,98 @@
+#!/usr/bin/env node
+/**
+ * inspect.mjs — READ-ONLY verify-before-act for TK-11124.
+ * GET the LIVE Shopify state of the 18 DWVE targets + the working sibling DWVE-430760
+ * + one archived DWVE (429860) to confirm exclusions. Classifies each target as
+ * sample-only (eligible) vs already-has-sellable (skip). No writes.
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { gql } from '../../designerwallcoverings/scripts/lib/shopify.mjs';
+
+const __dir = path.dirname(fileURLToPath(import.meta.url));
+
+const TARGETS = [
+ ['DWVE-429560','6621005643827'],['DWVE-429660','6621005676595'],['DWVE-429760','6621005709363'],
+ ['DWVE-429960','6621005774899'],['DWVE-430160','6621005873203'],['DWVE-430260','6621005905971'],
+ ['DWVE-430360','6621005938739'],['DWVE-430460','6621005971507'],['DWVE-430560','6621006004275'],
+ ['DWVE-430660','6621006069811'],['DWVE-430860','6621006135347'],['DWVE-430960','6621006200883'],
+ ['DWVE-431060','6621006233651'],['DWVE-431160','6621006266419'],['DWVE-431260','6621006299187'],
+ ['DWVE-431360','6621006331955'],['DWVE-431560','6621006397491'],['DWVE-431660','6621006463027'],
+];
+// reference: the working sibling (should already have a sellable variant) + one archived (exclude)
+const REFS = [['DWVE-430760(WORKING-SIBLING)','6621005807667?'],['DWVE-429860(ARCHIVED)','?']];
+
+const gidP = id => `gid://shopify/Product/${id}`;
+const Q = `query($id:ID!){ product(id:$id){
+ id legacyResourceId title handle status vendor productType
+ featuredImage{url} mediaCount{count}
+ options{name values}
+ unitmf: metafield(namespace:"global", key:"unit_of_measure"){ value }
+ mmf: metafield(namespace:"custom", key:"manufacturer_sku"){ value }
+ variants(first:25){ nodes{ id sku title price
+ inventoryPolicy
+ selectedOptions{ name value }
+ inventoryItem{ id tracked } } } } }`;
+
+function classify(p){
+ const vs = p.variants.nodes;
+ const sample = vs.find(v => /-sample$/i.test(v.sku||'') || parseFloat(v.price) <= 4.30);
+ const sellable = vs.find(v => v !== sample && parseFloat(v.price) > 4.30);
+ let cls;
+ if (!p) cls = 'NOT-FOUND';
+ else if (p.status !== 'ACTIVE') cls = 'NOT-ACTIVE:'+p.status;
+ else if (sellable) cls = 'HAS-SELLABLE(skip)';
+ else if (sample && vs.length === 1) cls = 'SAMPLE-ONLY(eligible)';
+ else if (sample) cls = 'SAMPLE+EXTRA:'+vs.length;
+ else cls = 'NO-SAMPLE:'+vs.length;
+ return { cls, sample, sellable };
+}
+
+const rows = [];
+for (const [sku, id] of TARGETS) {
+ const d = await gql(Q, { id: gidP(id) });
+ const p = d?.product;
+ if (!p) { rows.push({ sku, id, cls:'NOT-FOUND' }); continue; }
+ const { cls, sample, sellable } = classify(p);
+ rows.push({
+ sku, id: p.legacyResourceId, cls, status: p.status, title: p.title, handle: p.handle,
+ vendor: p.vendor, productType: p.productType,
+ optionName: p.options?.[0]?.name, optionValues: p.options?.[0]?.values,
+ unit_of_measure_mf: p.unitmf?.value ?? null,
+ manufacturer_sku_mf: p.mmf?.value ?? null,
+ image: p.featuredImage?.url ? 'yes' : (p.mediaCount?.count>0?'media':'NONE'),
+ nvariants: p.variants.nodes.length,
+ sample: sample && { id: sample.id, sku: sample.sku, price: sample.price, opt: sample.selectedOptions, tracked: sample.inventoryItem?.tracked, policy: sample.inventoryPolicy },
+ sellable: sellable && { id: sellable.id, sku: sellable.sku, price: sellable.price, opt: sellable.selectedOptions, tracked: sellable.inventoryItem?.tracked, policy: sellable.inventoryPolicy },
+ allVariants: p.variants.nodes.map(v=>({sku:v.sku,price:v.price,opt:v.selectedOptions,tracked:v.inventoryItem?.tracked,policy:v.inventoryPolicy})),
+ });
+}
+
+// Also fetch the working sibling + archived by GID guess from the DWVE numbering — but we only
+// have the excluded ids by SKU. Fetch DWVE-430760 & archived via product handle search instead.
+const search = async (q) => {
+ const d = await gql(`query($q:String!){ products(first:3, query:$q){ nodes{
+ id legacyResourceId title status handle
+ unitmf: metafield(namespace:"global", key:"unit_of_measure"){ value }
+ options{name values}
+ variants(first:25){ nodes{ sku price inventoryPolicy selectedOptions{name value} inventoryItem{tracked} } } } } }`, { q });
+ return d?.products?.nodes || [];
+};
+const refOut = {};
+for (const s of ['DWVE-430760','DWVE-429860','DWVE-430060','DWVE-431460']) {
+ refOut[s] = await search(`sku:${s}*`);
+}
+
+const summary = rows.reduce((a,r)=>{a[r.cls]=(a[r.cls]||0)+1;return a;},{});
+const out = { ticket:'TK-11124', at:new Date().toISOString(), summary, targets: rows, references: refOut };
+fs.writeFileSync(path.join(__dir,'out','inspect.json'), JSON.stringify(out,null,2));
+
+console.log('=== TK-11124 DWVE inspection (READ-ONLY) ===');
+console.log('summary:', JSON.stringify(summary));
+for (const r of rows) console.log(` ${(r.cls||'').padEnd(22)} ${r.sku} opt="${r.optionName}" unit_mf="${r.unit_of_measure_mf}" img=${r.image} nvar=${r.nvariants} sample=${r.sample?('$'+r.sample.price+' '+r.sample.sku):'—'}`);
+console.log('\n--- reference SKUs (working sibling + archived exclusions) ---');
+for (const [s, nodes] of Object.entries(refOut)) {
+ for (const n of nodes) console.log(` ${s}: ${n.status.padEnd(9)} "${n.title}" opt="${n.options?.[0]?.name}" unit_mf="${n.unitmf?.value}" variants=${JSON.stringify(n.variants.nodes.map(v=>({sku:v.sku,price:v.price,opt:v.selectedOptions?.map(o=>o.name+':'+o.value).join('|'),tracked:v.inventoryItem?.tracked,policy:v.inventoryPolicy})))}`);
+}
+console.log('\nwrote out/inspect.json');
diff --git a/tk11124-dwve-velvet/out/inspect.json b/tk11124-dwve-velvet/out/inspect.json
new file mode 100644
index 0000000..03e6c3b
--- /dev/null
+++ b/tk11124-dwve-velvet/out/inspect.json
@@ -0,0 +1,1031 @@
+{
+ "ticket": "TK-11124",
+ "at": "2026-09-02T20:09:10.389Z",
+ "summary": {
+ "SAMPLE-ONLY(eligible)": 18
+ },
+ "targets": [
+ {
+ "sku": "DWVE-429560",
+ "id": "6621005643827",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Cream",
+ "handle": "dwve-429500",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598012399667",
+ "sku": "DWVE-429560",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-429560",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-429660",
+ "id": "6621005676595",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Light Beige",
+ "handle": "dwve-429600",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598012432435",
+ "sku": "DWVE-429660",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-429660",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-429760",
+ "id": "6621005709363",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Deep Taupe",
+ "handle": "dwve-429700",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598012465203",
+ "sku": "DWVE-429760",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-429760",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-429960",
+ "id": "6621005774899",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Rust",
+ "handle": "dwve-429900",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598012530739",
+ "sku": "DWVE-429960",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-429960",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430160",
+ "id": "6621005873203",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Deep Red",
+ "handle": "dwve-430100",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598013186099",
+ "sku": "DWVE-430160",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430160",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430260",
+ "id": "6621005905971",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Aqua, Blue, Green",
+ "handle": "dwve-430200",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598013218867",
+ "sku": "DWVE-430260",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430260",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430360",
+ "id": "6621005938739",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Purple",
+ "handle": "dwve-430300",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598013251635",
+ "sku": "DWVE-430360",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430360",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430460",
+ "id": "6621005971507",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Slate Blue",
+ "handle": "dwve-430400",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598013284403",
+ "sku": "DWVE-430460",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430460",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430560",
+ "id": "6621006004275",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Cabernet Red",
+ "handle": "dwve-430500",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598013317171",
+ "sku": "DWVE-430560",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430560",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430660",
+ "id": "6621006069811",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Pink Cream",
+ "handle": "dwve-430600",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598014300211",
+ "sku": "DWVE-430660",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430660",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430860",
+ "id": "6621006135347",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Old Gold",
+ "handle": "dwve-430800",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598015971379",
+ "sku": "DWVE-430860",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430860",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-430960",
+ "id": "6621006200883",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Bright Aqua Blue",
+ "handle": "dwve-430900",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598016135219",
+ "sku": "DWVE-430960",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-430960",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-431060",
+ "id": "6621006233651",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Faded Green",
+ "handle": "dwve-431000",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598016167987",
+ "sku": "DWVE-431060",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-431060",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-431160",
+ "id": "6621006266419",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Spice Red",
+ "handle": "dwve-431100",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598016200755",
+ "sku": "DWVE-431160",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-431160",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-431260",
+ "id": "6621006299187",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Charcoal Black",
+ "handle": "dwve-431200",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598016233523",
+ "sku": "DWVE-431260",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-431260",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-431360",
+ "id": "6621006331955",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Deep Olive Green",
+ "handle": "dwve-431300",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598016266291",
+ "sku": "DWVE-431360",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-431360",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-431560",
+ "id": "6621006397491",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Taupe Grey",
+ "handle": "dwve-431500",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598016331827",
+ "sku": "DWVE-431560",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-431560",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ },
+ {
+ "sku": "DWVE-431660",
+ "id": "6621006463027",
+ "cls": "SAMPLE-ONLY(eligible)",
+ "status": "ACTIVE",
+ "title": "Alicante Velvet Walls Java Brown",
+ "handle": "dwve-431600",
+ "vendor": "Phillipe Romano",
+ "productType": "Wallcovering",
+ "optionName": "Size",
+ "optionValues": [
+ "Sample"
+ ],
+ "unit_of_measure_mf": "Full Roll",
+ "manufacturer_sku_mf": "TRUE",
+ "image": "yes",
+ "nvariants": 1,
+ "sample": {
+ "id": "gid://shopify/ProductVariant/39598017151027",
+ "sku": "DWVE-431660",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ },
+ "allVariants": [
+ {
+ "sku": "DWVE-431660",
+ "price": "4.25",
+ "opt": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "tracked": true,
+ "policy": "CONTINUE"
+ }
+ ]
+ }
+ ],
+ "references": {
+ "DWVE-430760": [
+ {
+ "id": "gid://shopify/Product/6621006102579",
+ "legacyResourceId": "6621006102579",
+ "title": "Alicante Velvet Walls Hunter Green",
+ "status": "ACTIVE",
+ "handle": "dwve-430700",
+ "unitmf": {
+ "value": "Full Roll"
+ },
+ "options": [
+ {
+ "name": "Size",
+ "values": [
+ "Sold Per Yard",
+ "Sample"
+ ]
+ }
+ ],
+ "variants": {
+ "nodes": [
+ {
+ "sku": "DWVE-430760",
+ "price": "359.00",
+ "inventoryPolicy": "CONTINUE",
+ "selectedOptions": [
+ {
+ "name": "Size",
+ "value": "Sold Per Yard"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": true
+ }
+ },
+ {
+ "sku": "DWVE-430760-Sample",
+ "price": "4.25",
+ "inventoryPolicy": "DENY",
+ "selectedOptions": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "gid://shopify/Product/7862953443379",
+ "legacyResourceId": "7862953443379",
+ "title": "Alicante Velvet Walls Hunter Green Memo Sample | Phillipe Romano",
+ "status": "DRAFT",
+ "handle": "alicante-velvet-walls-hunter-green-memo-sample-phillipe-romano",
+ "unitmf": null,
+ "options": [
+ {
+ "name": "Title",
+ "values": [
+ "Default Title"
+ ]
+ }
+ ],
+ "variants": {
+ "nodes": [
+ {
+ "sku": "DWVE-430760",
+ "price": "4.25",
+ "inventoryPolicy": "DENY",
+ "selectedOptions": [
+ {
+ "name": "Title",
+ "value": "Default Title"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": false
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "DWVE-429860": [
+ {
+ "id": "gid://shopify/Product/6621005742131",
+ "legacyResourceId": "6621005742131",
+ "title": "Alicante Velvet Walls Gold",
+ "status": "ARCHIVED",
+ "handle": "dwve-429800",
+ "unitmf": null,
+ "options": [
+ {
+ "name": "Title",
+ "values": [
+ "Default Title"
+ ]
+ }
+ ],
+ "variants": {
+ "nodes": [
+ {
+ "sku": "DWVE-429860",
+ "price": "4.67",
+ "inventoryPolicy": "CONTINUE",
+ "selectedOptions": [
+ {
+ "name": "Title",
+ "value": "Default Title"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": true
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "DWVE-430060": [
+ {
+ "id": "gid://shopify/Product/6621005840435",
+ "legacyResourceId": "6621005840435",
+ "title": "Alicante Velvet Walls Wine Red",
+ "status": "ARCHIVED",
+ "handle": "dwve-430000",
+ "unitmf": null,
+ "options": [
+ {
+ "name": "Title",
+ "values": [
+ "Default Title",
+ "Sample"
+ ]
+ }
+ ],
+ "variants": {
+ "nodes": [
+ {
+ "sku": "DWVE-430060",
+ "price": "4.67",
+ "inventoryPolicy": "DENY",
+ "selectedOptions": [
+ {
+ "name": "Title",
+ "value": "Default Title"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": true
+ }
+ },
+ {
+ "sku": "DWVE-430060-Sample",
+ "price": "4.25",
+ "inventoryPolicy": "DENY",
+ "selectedOptions": [
+ {
+ "name": "Title",
+ "value": "Sample"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": true
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "DWVE-431460": [
+ {
+ "id": "gid://shopify/Product/6621006364723",
+ "legacyResourceId": "6621006364723",
+ "title": "Alicante Velvet Walls Aubergine Purple",
+ "status": "ARCHIVED",
+ "handle": "dwve-431400",
+ "unitmf": null,
+ "options": [
+ {
+ "name": "Size",
+ "values": [
+ "Sample"
+ ]
+ }
+ ],
+ "variants": {
+ "nodes": [
+ {
+ "sku": "DWVE-431460",
+ "price": "4.25",
+ "inventoryPolicy": "CONTINUE",
+ "selectedOptions": [
+ {
+ "name": "Size",
+ "value": "Sample"
+ }
+ ],
+ "inventoryItem": {
+ "tracked": true
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tk11124-dwve-velvet/out/results-apply.json b/tk11124-dwve-velvet/out/results-apply.json
new file mode 100644
index 0000000..9f89996
--- /dev/null
+++ b/tk11124-dwve-velvet/out/results-apply.json
@@ -0,0 +1,204 @@
+{
+ "ticket": "TK-11124",
+ "at": "2026-09-02T20:16:09.479Z",
+ "apply": true,
+ "applied": 17,
+ "skipped": 1,
+ "errored": 0,
+ "results": [
+ {
+ "dwsku": "DWVE-429560",
+ "id": "6621005643827",
+ "action": "SKIP",
+ "reason": "already-has-sellable",
+ "existing": "DWVE-429560-Yard"
+ },
+ {
+ "dwsku": "DWVE-429660",
+ "id": "6621005676595",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029193267",
+ "yard_sku": "DWVE-429660-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-429760",
+ "id": "6621005709363",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029258803",
+ "yard_sku": "DWVE-429760-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-429960",
+ "id": "6621005774899",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029291571",
+ "yard_sku": "DWVE-429960-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430160",
+ "id": "6621005873203",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029324339",
+ "yard_sku": "DWVE-430160-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430260",
+ "id": "6621005905971",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029357107",
+ "yard_sku": "DWVE-430260-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430360",
+ "id": "6621005938739",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029389875",
+ "yard_sku": "DWVE-430360-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430460",
+ "id": "6621005971507",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029422643",
+ "yard_sku": "DWVE-430460-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430560",
+ "id": "6621006004275",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029455411",
+ "yard_sku": "DWVE-430560-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430660",
+ "id": "6621006069811",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029488179",
+ "yard_sku": "DWVE-430660-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430860",
+ "id": "6621006135347",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029520947",
+ "yard_sku": "DWVE-430860-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-430960",
+ "id": "6621006200883",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029553715",
+ "yard_sku": "DWVE-430960-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-431060",
+ "id": "6621006233651",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029586483",
+ "yard_sku": "DWVE-431060-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-431160",
+ "id": "6621006266419",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029619251",
+ "yard_sku": "DWVE-431160-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-431260",
+ "id": "6621006299187",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029684787",
+ "yard_sku": "DWVE-431260-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-431360",
+ "id": "6621006331955",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029717555",
+ "yard_sku": "DWVE-431360-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-431560",
+ "id": "6621006397491",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029750323",
+ "yard_sku": "DWVE-431560-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ },
+ {
+ "dwsku": "DWVE-431660",
+ "id": "6621006463027",
+ "action": "APPLIED",
+ "added_variant_id": "gid://shopify/ProductVariant/44814029783091",
+ "yard_sku": "DWVE-431660-Yard",
+ "min_variant_price": 4.25,
+ "unit_ok": true,
+ "status": "ACTIVE",
+ "errs": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tk11124-dwve-velvet/out/results-dryrun.json b/tk11124-dwve-velvet/out/results-dryrun.json
new file mode 100644
index 0000000..db504b1
--- /dev/null
+++ b/tk11124-dwve-velvet/out/results-dryrun.json
@@ -0,0 +1,244 @@
+{
+ "ticket": "TK-11124",
+ "at": "2026-09-02T20:14:00.316Z",
+ "apply": false,
+ "applied": 0,
+ "skipped": 0,
+ "errored": 0,
+ "results": [
+ {
+ "dwsku": "DWVE-429560",
+ "id": "6621005643827",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Cream",
+ "sample_sku": "DWVE-429560",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-429560-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-429660",
+ "id": "6621005676595",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Light Beige",
+ "sample_sku": "DWVE-429660",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-429660-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-429760",
+ "id": "6621005709363",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Deep Taupe",
+ "sample_sku": "DWVE-429760",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-429760-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-429960",
+ "id": "6621005774899",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Rust",
+ "sample_sku": "DWVE-429960",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-429960-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430160",
+ "id": "6621005873203",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Deep Red",
+ "sample_sku": "DWVE-430160",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430160-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430260",
+ "id": "6621005905971",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Aqua, Blue, Green",
+ "sample_sku": "DWVE-430260",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430260-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430360",
+ "id": "6621005938739",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Purple",
+ "sample_sku": "DWVE-430360",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430360-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430460",
+ "id": "6621005971507",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Slate Blue",
+ "sample_sku": "DWVE-430460",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430460-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430560",
+ "id": "6621006004275",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Cabernet Red",
+ "sample_sku": "DWVE-430560",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430560-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430660",
+ "id": "6621006069811",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Pink Cream",
+ "sample_sku": "DWVE-430660",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430660-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430860",
+ "id": "6621006135347",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Old Gold",
+ "sample_sku": "DWVE-430860",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430860-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-430960",
+ "id": "6621006200883",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Bright Aqua Blue",
+ "sample_sku": "DWVE-430960",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-430960-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-431060",
+ "id": "6621006233651",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Faded Green",
+ "sample_sku": "DWVE-431060",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-431060-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-431160",
+ "id": "6621006266419",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Spice Red",
+ "sample_sku": "DWVE-431160",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-431160-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-431260",
+ "id": "6621006299187",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Charcoal Black",
+ "sample_sku": "DWVE-431260",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-431260-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-431360",
+ "id": "6621006331955",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Deep Olive Green",
+ "sample_sku": "DWVE-431360",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-431360-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-431560",
+ "id": "6621006397491",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Taupe Grey",
+ "sample_sku": "DWVE-431560",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-431560-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ },
+ {
+ "dwsku": "DWVE-431660",
+ "id": "6621006463027",
+ "action": "WOULD-APPLY",
+ "title": "Alicante Velvet Walls Java Brown",
+ "sample_sku": "DWVE-431660",
+ "sample_price": "4.25",
+ "yard_sku": "DWVE-431660-Yard",
+ "price": "359.00",
+ "opt": "Size:Sold Per Yard",
+ "unit_from": "Full Roll",
+ "unit_to": "Sold per Yard"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tk11124-dwve-velvet/out/rollback.jsonl b/tk11124-dwve-velvet/out/rollback.jsonl
new file mode 100644
index 0000000..ff2da99
--- /dev/null
+++ b/tk11124-dwve-velvet/out/rollback.jsonl
@@ -0,0 +1,18 @@
+{"dwsku":"DWVE-429560","product_id":"6621005643827","added_variant_id":"gid://shopify/ProductVariant/44814029127731","yard_sku":"DWVE-429560-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-429660","product_id":"6621005676595","added_variant_id":"gid://shopify/ProductVariant/44814029193267","yard_sku":"DWVE-429660-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-429760","product_id":"6621005709363","added_variant_id":"gid://shopify/ProductVariant/44814029258803","yard_sku":"DWVE-429760-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-429960","product_id":"6621005774899","added_variant_id":"gid://shopify/ProductVariant/44814029291571","yard_sku":"DWVE-429960-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430160","product_id":"6621005873203","added_variant_id":"gid://shopify/ProductVariant/44814029324339","yard_sku":"DWVE-430160-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430260","product_id":"6621005905971","added_variant_id":"gid://shopify/ProductVariant/44814029357107","yard_sku":"DWVE-430260-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430360","product_id":"6621005938739","added_variant_id":"gid://shopify/ProductVariant/44814029389875","yard_sku":"DWVE-430360-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430460","product_id":"6621005971507","added_variant_id":"gid://shopify/ProductVariant/44814029422643","yard_sku":"DWVE-430460-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430560","product_id":"6621006004275","added_variant_id":"gid://shopify/ProductVariant/44814029455411","yard_sku":"DWVE-430560-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430660","product_id":"6621006069811","added_variant_id":"gid://shopify/ProductVariant/44814029488179","yard_sku":"DWVE-430660-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430860","product_id":"6621006135347","added_variant_id":"gid://shopify/ProductVariant/44814029520947","yard_sku":"DWVE-430860-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-430960","product_id":"6621006200883","added_variant_id":"gid://shopify/ProductVariant/44814029553715","yard_sku":"DWVE-430960-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-431060","product_id":"6621006233651","added_variant_id":"gid://shopify/ProductVariant/44814029586483","yard_sku":"DWVE-431060-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-431160","product_id":"6621006266419","added_variant_id":"gid://shopify/ProductVariant/44814029619251","yard_sku":"DWVE-431160-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-431260","product_id":"6621006299187","added_variant_id":"gid://shopify/ProductVariant/44814029684787","yard_sku":"DWVE-431260-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-431360","product_id":"6621006331955","added_variant_id":"gid://shopify/ProductVariant/44814029717555","yard_sku":"DWVE-431360-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-431560","product_id":"6621006397491","added_variant_id":"gid://shopify/ProductVariant/44814029750323","yard_sku":"DWVE-431560-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
+{"dwsku":"DWVE-431660","product_id":"6621006463027","added_variant_id":"gid://shopify/ProductVariant/44814029783091","yard_sku":"DWVE-431660-Yard","unit_of_measure_old":"Full Roll","unit_of_measure_new":"Sold per Yard"}
diff --git a/tk11124-dwve-velvet/out/verify-final.json b/tk11124-dwve-velvet/out/verify-final.json
new file mode 100644
index 0000000..ae49f8a
--- /dev/null
+++ b/tk11124-dwve-velvet/out/verify-final.json
@@ -0,0 +1,146 @@
+[
+ {
+ "sku": "DWVE-429560",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-429660",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-429760",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-429960",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430160",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430260",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430360",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430460",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430560",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430660",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430860",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-430960",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-431060",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-431160",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-431260",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-431360",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-431560",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ },
+ {
+ "sku": "DWVE-431660",
+ "status": "ACTIVE",
+ "unit": "Sold per Yard",
+ "sample": "$4.25",
+ "yard": "$359.00 CONTINUE",
+ "pass": true
+ }
+]
\ No newline at end of file
diff --git a/tk11124-dwve-velvet/probe2.mjs b/tk11124-dwve-velvet/probe2.mjs
new file mode 100644
index 0000000..4e18c80
--- /dev/null
+++ b/tk11124-dwve-velvet/probe2.mjs
@@ -0,0 +1,18 @@
+import { gql, getLocation } from '../../designerwallcoverings/scripts/lib/shopify.mjs';
+// sibling sellable inventory detail
+const sib = await gql(`{ products(first:1, query:"sku:DWVE-430760") { nodes {
+ title status
+ variants(first:10){ nodes { sku price inventoryPolicy inventoryItem { id tracked
+ inventoryLevels(first:5){ nodes { location{ id name } quantities(names:["on_hand","available"]){ name quantity } } } } } } } } }`);
+console.log('SIBLING DWVE-430760 sellable inventory:');
+for (const n of sib.products.nodes) for (const v of n.variants.nodes)
+ console.log(` ${v.sku} $${v.price} pol=${v.inventoryPolicy} tracked=${v.inventoryItem?.tracked} levels=${JSON.stringify(v.inventoryItem?.inventoryLevels?.nodes?.map(l=>({loc:l.location.name,id:l.location.id,q:l.quantities})))}`);
+const loc = await getLocation();
+console.log('getLocation() primary =', loc);
+// unit_of_measure convention across the DWVE Velvet Walls line (any that are per-yard active)
+const conv = await gql(`{ products(first:15, query:"tag:*Velvet* OR title:*Velvet Walls*") { nodes { title status metafield(namespace:"global",key:"unit_of_measure"){value} variants(first:3){nodes{sku price selectedOptions{value}}} } } }`);
+console.log('\nunit_of_measure across Velvet Walls line:');
+for (const n of conv.products.nodes) console.log(` [${n.status}] unit="${n.metafield?.value}" "${n.title}"`);
+// sample variant policy/tracked on a target (429560) — confirm we won't disturb
+const tgt = await gql(`{ product(id:"gid://shopify/Product/6621005643827"){ variants(first:5){nodes{ sku price inventoryPolicy inventoryItem{tracked}}}}}`);
+console.log('\nTarget DWVE-429560 current variant(s):', JSON.stringify(tgt.product.variants.nodes));
diff --git a/tk11124-dwve-velvet/rollback.mjs b/tk11124-dwve-velvet/rollback.mjs
new file mode 100644
index 0000000..c817770
--- /dev/null
+++ b/tk11124-dwve-velvet/rollback.mjs
@@ -0,0 +1,30 @@
+#!/usr/bin/env node
+/**
+ * rollback.mjs — TK-11124 undo. For each row in out/rollback.jsonl:
+ * • productVariantsBulkDelete the added -Yard variant (removes variant + its inventoryItem + levels)
+ * • metafieldsSet global.unit_of_measure back to its recorded old value
+ * Reverts each product to sample-only, exactly as before. DRY-RUN default; --apply --i-am-steve to run.
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { gql } from '../../designerwallcoverings/scripts/lib/shopify.mjs';
+const __dir = path.dirname(fileURLToPath(import.meta.url));
+const APPLY = process.argv.includes('--apply') && process.argv.includes('--i-am-steve');
+const map = fs.readFileSync(path.join(__dir, 'out', 'rollback.jsonl'), 'utf8').trim().split('\n').filter(Boolean).map(l => JSON.parse(l));
+const DEL = `mutation($pid:ID!,$ids:[ID!]!){ productVariantsBulkDelete(productId:$pid, variantsIds:$ids){ userErrors{ message } } }`;
+const MF = `mutation($mf:[MetafieldsSetInput!]!){ metafieldsSet(metafields:$mf){ userErrors{ message } } }`;
+console.log(`TK-11124 ROLLBACK — ${APPLY ? 'LIVE' : 'DRY-RUN'} — ${map.length} products`);
+for (const r of map) {
+ const pid = `gid://shopify/Product/${r.product_id}`;
+ console.log(` ${APPLY?'delete':'would-delete'} ${r.yard_sku} (${r.added_variant_id}) + unit "${r.unit_of_measure_new}"->"${r.unit_of_measure_old}" on ${r.dwsku}`);
+ if (!APPLY) continue;
+ const d = await gql(DEL, { pid, ids: [r.added_variant_id] });
+ const de = d?.productVariantsBulkDelete?.userErrors || []; if (de.length || d?.__err) console.log(' del-err', JSON.stringify(de.length?de:d.__err).slice(0,140));
+ if (r.unit_of_measure_old != null) {
+ const m = await gql(MF, { mf: [{ ownerId: pid, namespace: 'global', key: 'unit_of_measure', type: 'single_line_text_field', value: r.unit_of_measure_old }] });
+ const me = m?.metafieldsSet?.userErrors || []; if (me.length || m?.__err) console.log(' mf-err', JSON.stringify(me.length?me:m.__err).slice(0,140));
+ }
+ await new Promise(r => setTimeout(r, 120));
+}
+console.log(APPLY ? 'ROLLBACK DONE' : 'To execute: node rollback.mjs --apply --i-am-steve');
diff --git a/tk11124-dwve-velvet/verify1.mjs b/tk11124-dwve-velvet/verify1.mjs
new file mode 100644
index 0000000..0c3c384
--- /dev/null
+++ b/tk11124-dwve-velvet/verify1.mjs
@@ -0,0 +1,9 @@
+import { gql } from '../../designerwallcoverings/scripts/lib/shopify.mjs';
+const d = await gql(`{ product(id:"gid://shopify/Product/6621005643827"){ title status
+ unit: metafield(namespace:"global",key:"unit_of_measure"){value}
+ variants(first:10){ nodes{ sku price inventoryPolicy selectedOptions{name value}
+ inventoryItem{ tracked inventoryLevels(first:3){ nodes{ location{name} quantities(names:["available"]){name quantity} } } } } } } }`);
+const p = d.product;
+console.log('CANARY VERIFY DWVE-429560:', p.title, '| status', p.status, '| unit_of_measure=', JSON.stringify(p.unit?.value));
+for (const v of p.variants.nodes)
+ console.log(` ${v.sku.padEnd(22)} $${v.price} ${v.selectedOptions.map(o=>o.name+':'+o.value).join('|')} pol=${v.inventoryPolicy} tracked=${v.inventoryItem?.tracked} avail=${JSON.stringify(v.inventoryItem?.inventoryLevels?.nodes?.map(l=>l.location.name+':'+l.quantities[0]?.quantity))}`);
diff --git a/tk11124-dwve-velvet/verifyall.mjs b/tk11124-dwve-velvet/verifyall.mjs
new file mode 100644
index 0000000..da90de7
--- /dev/null
+++ b/tk11124-dwve-velvet/verifyall.mjs
@@ -0,0 +1,18 @@
+import fs from 'node:fs';
+import { gql } from '../../designerwallcoverings/scripts/lib/shopify.mjs';
+const T = [['DWVE-429560','6621005643827'],['DWVE-429660','6621005676595'],['DWVE-429760','6621005709363'],['DWVE-429960','6621005774899'],['DWVE-430160','6621005873203'],['DWVE-430260','6621005905971'],['DWVE-430360','6621005938739'],['DWVE-430460','6621005971507'],['DWVE-430560','6621006004275'],['DWVE-430660','6621006069811'],['DWVE-430860','6621006135347'],['DWVE-430960','6621006200883'],['DWVE-431060','6621006233651'],['DWVE-431160','6621006266419'],['DWVE-431260','6621006299187'],['DWVE-431360','6621006331955'],['DWVE-431560','6621006397491'],['DWVE-431660','6621006463027']];
+const Q=`query($id:ID!){product(id:$id){status unit:metafield(namespace:"global",key:"unit_of_measure"){value} variants(first:10){nodes{sku price inventoryPolicy selectedOptions{value} inventoryItem{tracked inventoryLevels(first:2){nodes{quantities(names:["available"]){quantity}}}}}}}}`;
+let allpass=0; const rows=[];
+for(const [sku,id] of T){
+ const p=(await gql(Q,{id:`gid://shopify/Product/${id}`})).product;
+ const vs=p.variants.nodes;
+ const s=vs.find(v=>parseFloat(v.price)<=4.30);
+ const y=vs.find(v=>v.sku===`${sku}-Yard`);
+ const buyable = y && parseFloat(y.price)===359 && y.inventoryPolicy==='CONTINUE' && (y.inventoryItem?.inventoryLevels?.nodes?.[0]?.quantities?.[0]?.quantity===2026 || y.inventoryPolicy==='CONTINUE');
+ const pass = p.status==='ACTIVE' && s && parseFloat(s.price)===4.25 && buyable && p.unit?.value==='Sold per Yard';
+ if(pass) allpass++;
+ rows.push({sku, status:p.status, unit:p.unit?.value, sample:s?('$'+s.price):'MISSING', yard:y?('$'+y.price+' '+y.inventoryPolicy):'MISSING', pass});
+}
+console.log('FINAL VERIFY — '+allpass+'/18 fully pass\n');
+for(const r of rows) console.log(` ${r.pass?'PASS':'FAIL'} ${r.sku} ${r.status} sample=${r.sample} yard=${r.yard} unit="${r.unit}"`);
+fs.writeFileSync('out/verify-final.json', JSON.stringify(rows,null,2));
← 1af16b4 auto-data-snapshot: 2026-09-02T12:46:36 (1 data files) — tk1
·
back to Dw Unbuyable Recovery Pilot
·
TK-11041: Innovations 51-cohort feed-first reconciliation — 8085c23 →