← back to Hollywood Optc
TK-10633: dry-run + apply/rollback tooling for 36 held products missed by the 62-run (HWC-#### restore, gated)
90e1ff88f0d7446b54da6e070c39a48866313772 · 2026-08-27 10:46:18 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
A apply-held36.mjsA build-held36-dryrun.mjsA data/held36-dryrun.jsonA data/order-history-held36.jsonA order-history-check-held36.mjs
Diff
commit 90e1ff88f0d7446b54da6e070c39a48866313772
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Aug 27 10:46:18 2026 -0700
TK-10633: dry-run + apply/rollback tooling for 36 held products missed by the 62-run (HWC-#### restore, gated)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
apply-held36.mjs | 115 +++++++
build-held36-dryrun.mjs | 38 +++
data/held36-dryrun.json | 730 +++++++++++++++++++++++++++++++++++++++++
data/order-history-held36.json | 32 ++
order-history-check-held36.mjs | 17 +
5 files changed, 932 insertions(+)
diff --git a/apply-held36.mjs b/apply-held36.mjs
new file mode 100644
index 0000000..fd0c674
--- /dev/null
+++ b/apply-held36.mjs
@@ -0,0 +1,115 @@
+#!/usr/bin/env node
+// TK-10633 — Option-C EXTENSION: remap the 36 metafield-clean HELD products the original
+// 62-run missed. Each of these 36 ACTIVE Hollywood products still carries a fabricated
+// DWHD-* variant SKU on the LIVE store, yet already has its real, pre-existing HWC-####
+// line code unanimously in global/dwc/custom.dw_sku (verified LIVE). This is the SAME
+// Steve-approved identity scheme + write shape as apply.mjs (the 62-run): variant SKU
+// DWHD-##### -> HWC-####, DWHD-#####-Sample -> HWC-####-Sample. manufacturer_sku (the
+// bare Momentum number) is NEVER touched — no leak.
+//
+// GATED: this is a customer-facing LIVE Shopify write. Do NOT run without Steve's go.
+// Drives off data/held36-dryrun.json (built read-only from LIVE Shopify).
+// Reversibility FIRST: appends {variant_id, from_sku, to_sku, ts} before every write.
+// Idempotent (skips a variant already == target). Rate-limit + THROTTLED aware.
+// Rollback: node rollback.mjs data/apply-reversibility-held36-<ts>.jsonl
+import { readFileSync, appendFileSync } from 'node:fs';
+
+const SHOP = 'designer-laboratory-sandbox.myshopify.com';
+const VER = '2024-10';
+const env = readFileSync(process.env.HOME + '/Projects/secrets-manager/.env', 'utf8');
+const TOKEN = (env.split('\n').find(l => l.startsWith('SHOPIFY_ADMIN_TOKEN=')) || '')
+ .replace('SHOPIFY_ADMIN_TOKEN=', '').replace(/["'\r]/g, '').trim();
+if (!TOKEN) { console.error('no SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
+
+const dry = JSON.parse(readFileSync(new URL('./data/held36-dryrun.json', import.meta.url)));
+const applySet = dry.apply_set || [];
+if (applySet.length !== 36) { console.error(`expected 36 apply_set products, got ${applySet.length}`); process.exit(1); }
+if (dry.problems && dry.problems.length) { console.error(`dry-run has ${dry.problems.length} problems — refusing`); process.exit(1); }
+
+const TS = new Date().toISOString().replace(/[:.]/g, '-');
+const REV_PATH = new URL(`./data/apply-reversibility-held36-${TS}.jsonl`, import.meta.url).pathname;
+const OUT_PATH = new URL(`./data/apply-result-held36-${TS}.json`, import.meta.url).pathname;
+const GQL = `https://${SHOP}/admin/api/${VER}/graphql.json`;
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+
+async function graphql(query, variables, tries = 0) {
+ const res = await fetch(GQL, {
+ method: 'POST',
+ headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' },
+ body: JSON.stringify({ query, variables }),
+ });
+ if (res.status === 429) { await sleep(2000); return graphql(query, variables, tries); }
+ if ((res.status === 502 || res.status === 503) && tries < 4) { await sleep(1500 * (tries + 1)); return graphql(query, variables, tries + 1); }
+ const j = await res.json();
+ if (j.errors && j.errors.some(e => /THROTTLED|throttl/i.test(JSON.stringify(e))) && tries < 6) {
+ await sleep(2500 * (tries + 1)); return graphql(query, variables, tries + 1);
+ }
+ return j;
+}
+
+const MUT = `
+mutation setSku($productId: ID!, $variants: [ProductVariantsBulkInput!]!) {
+ productVariantsBulkUpdate(productId: $productId, variants: $variants) {
+ productVariants { id inventoryItem { sku } }
+ userErrors { field message code }
+ }
+}`;
+const CUR = `query cur($id: ID!) { productVariant(id: $id) { id inventoryItem { sku } } }`;
+
+async function currentSku(variantGid, tries = 0) {
+ const j = await graphql(CUR, { id: variantGid });
+ if (j.errors && tries < 4) { await sleep(1500 * (tries + 1)); return currentSku(variantGid, tries + 1); }
+ return j?.data?.productVariant?.inventoryItem?.sku ?? null;
+}
+
+async function setSku(productGid, variantGid, newSku) {
+ const j = await graphql(MUT, { productId: productGid, variants: [{ id: variantGid, inventoryItem: { sku: newSku } }] });
+ const ue = j?.data?.productVariantsBulkUpdate?.userErrors || [];
+ const pv = j?.data?.productVariantsBulkUpdate?.productVariants || [];
+ return { userErrors: ue, topErrors: j.errors || [], confirmedSku: pv[0]?.inventoryItem?.sku ?? null };
+}
+
+async function main() {
+ const results = { applied: 0, skipped_idempotent: 0, failed: 0, details: [] };
+ const totalVariants = applySet.reduce((a, p) => a + p.writes.length, 0);
+ let idx = 0;
+ for (const p of applySet) {
+ const productGid = `gid://shopify/Product/${p.product_id}`;
+ for (const w of p.writes) {
+ idx++;
+ const variantGid = `gid://shopify/ProductVariant/${w.variant_id}`;
+ appendFileSync(REV_PATH, JSON.stringify({ variant_id: w.variant_id, from_sku: w.from_sku, to_sku: w.to_sku, ts: new Date().toISOString() }) + '\n');
+ let live = null;
+ try { live = await currentSku(variantGid); } catch (e) { /* attempt write */ }
+ if (live && live.toUpperCase() === w.to_sku.toUpperCase()) {
+ results.skipped_idempotent++;
+ results.details.push({ variant_id: w.variant_id, status: 'skip_already_target', sku: live });
+ continue;
+ }
+ const r = await setSku(productGid, variantGid, w.to_sku);
+ if (r.topErrors.length || r.userErrors.length) {
+ results.failed++;
+ results.details.push({ variant_id: w.variant_id, handle: p.handle, from: w.from_sku, to: w.to_sku, status: 'ERROR', userErrors: r.userErrors, topErrors: r.topErrors });
+ console.error(`[${idx}/${totalVariants}] FAIL ${w.from_sku} -> ${w.to_sku}: ` + JSON.stringify(r.userErrors.length ? r.userErrors : r.topErrors));
+ } else if (r.confirmedSku && r.confirmedSku.toUpperCase() === w.to_sku.toUpperCase()) {
+ results.applied++;
+ results.details.push({ variant_id: w.variant_id, status: 'applied', from: w.from_sku, to: r.confirmedSku });
+ console.log(`[${idx}/${totalVariants}] OK ${w.from_sku} -> ${r.confirmedSku}`);
+ } else {
+ results.failed++;
+ results.details.push({ variant_id: w.variant_id, status: 'UNCONFIRMED', from: w.from_sku, to: w.to_sku, confirmedSku: r.confirmedSku });
+ console.error(`[${idx}/${totalVariants}] UNCONFIRMED ${w.from_sku} -> ${w.to_sku} (got ${r.confirmedSku})`);
+ }
+ await sleep(350);
+ }
+ }
+ console.log('\n=== SUMMARY ===');
+ console.log(`applied: ${results.applied}`);
+ console.log(`skipped_idempotent: ${results.skipped_idempotent}`);
+ console.log(`failed: ${results.failed}`);
+ console.log(`reversibility file: ${REV_PATH}`);
+ appendFileSync(OUT_PATH, JSON.stringify(results, null, 2));
+ console.log(`result detail: ${OUT_PATH}`);
+ if (results.failed) { console.error('\n!! FAILURES PRESENT — reversibility record intact, do NOT half-apply silently.'); process.exit(2); }
+}
+main().catch(e => { console.error('FATAL', e); process.exit(1); });
diff --git a/build-held36-dryrun.mjs b/build-held36-dryrun.mjs
new file mode 100644
index 0000000..59df72f
--- /dev/null
+++ b/build-held36-dryrun.mjs
@@ -0,0 +1,38 @@
+import { readFileSync, writeFileSync } from 'node:fs';
+const TOKEN=process.env.SHOPIFY_ADMIN_TOKEN;
+const SHOP="designer-laboratory-sandbox.myshopify.com", VER="2024-10";
+const handles=readFileSync('/tmp/held36-handles.txt','utf8').split('\n').map(s=>s.trim()).filter(Boolean);
+async function gj(url,t=0){const r=await fetch(url,{headers:{"X-Shopify-Access-Token":TOKEN}});
+ if(r.status===429){await new Promise(x=>setTimeout(x,2000));return gj(url,t);}
+ if((r.status===502||r.status===503)&&t<3){await new Promise(x=>setTimeout(x,1500));return gj(url,t+1);}
+ if(!r.ok)throw new Error(r.status+" "+url);return r.json();}
+const applySet=[]; const problems=[];
+for(const h of handles){
+ const j=await gj(`https://${SHOP}/admin/api/${VER}/products.json?handle=${h}&fields=id,handle,status,variants`);
+ const p=(j.products||[])[0];
+ if(!p){problems.push({h,why:'not found live'});continue;}
+ const mj=await gj(`https://${SHOP}/admin/api/${VER}/products/${p.id}/metafields.json?limit=250`);
+ const mfs=mj.metafields||[];
+ const dwskus=mfs.filter(m=>m.key==='dw_sku').map(m=>String(m.value).trim().toUpperCase());
+ const hwc=dwskus.find(v=>/^HWC-\d+$/.test(v));
+ const unanimous = dwskus.length>0 && dwskus.every(v=>v===hwc);
+ if(!hwc){problems.push({h,why:'no HWC in live dw_sku',dwskus});continue;}
+ if(!unanimous){problems.push({h,why:'dw_sku namespaces disagree',dwskus});continue;}
+ // build variant writes: DWHD-* base -> HWC, DWHD-*-Sample -> HWC-Sample
+ const writes=[];
+ for(const v of p.variants){
+ const cur=String(v.sku||'');
+ if(!/^DWHD/i.test(cur)){problems.push({h,why:'variant not DWHD',cur});continue;}
+ const isSample=/-sample$/i.test(cur);
+ const target=isSample?`${hwc}-Sample`:hwc;
+ if(cur===target)continue;
+ writes.push({variant_id:v.id,from_sku:cur,to_sku:target,title:v.title});
+ }
+ if(writes.length) applySet.push({product_id:p.id,handle:h,hwc,manufacturer_sku_untouched:true,writes});
+}
+const out={generated_at:new Date().toISOString(),ticket:'TK-10633',scope:'held36-metafield-clean-HWC-remap',
+ products:applySet.length, variant_writes:applySet.reduce((a,x)=>a+x.writes.length,0),
+ apply_set:applySet, problems};
+writeFileSync('data/held36-dryrun.json',JSON.stringify(out,null,2));
+console.log('products:',out.products,'| variant_writes:',out.variant_writes,'| problems:',problems.length);
+if(problems.length)console.log('PROBLEMS:',JSON.stringify(problems.slice(0,10),null,1));
diff --git a/data/held36-dryrun.json b/data/held36-dryrun.json
new file mode 100644
index 0000000..7c56241
--- /dev/null
+++ b/data/held36-dryrun.json
@@ -0,0 +1,730 @@
+{
+ "generated_at": "2026-08-27T17:41:50.238Z",
+ "ticket": "TK-10633",
+ "scope": "held36-metafield-clean-HWC-remap",
+ "products": 36,
+ "variant_writes": 72,
+ "apply_set": [
+ {
+ "product_id": 7814464307251,
+ "handle": "asilomar-candlelight-hollywood-wallcoverings",
+ "hwc": "HWC-61247",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188115763251,
+ "from_sku": "DWHD-502873",
+ "to_sku": "HWC-61247",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188115730483,
+ "from_sku": "DWHD-502873-Sample",
+ "to_sku": "HWC-61247-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464340019,
+ "handle": "asilomar-cerulean-hollywood-wallcoverings",
+ "hwc": "HWC-61248",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188115828787,
+ "from_sku": "DWHD-502874",
+ "to_sku": "HWC-61248",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188115796019,
+ "from_sku": "DWHD-502874-Sample",
+ "to_sku": "HWC-61248-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464372787,
+ "handle": "asilomar-chestnut-hollywood-wallcoverings",
+ "hwc": "HWC-61249",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188115894323,
+ "from_sku": "DWHD-502875",
+ "to_sku": "HWC-61249",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188115861555,
+ "from_sku": "DWHD-502875-Sample",
+ "to_sku": "HWC-61249-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464405555,
+ "handle": "asilomar-coastal-fog-hollywood-wallcoverings",
+ "hwc": "HWC-61250",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188115959859,
+ "from_sku": "DWHD-502876",
+ "to_sku": "HWC-61250",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188115927091,
+ "from_sku": "DWHD-502876-Sample",
+ "to_sku": "HWC-61250-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464438323,
+ "handle": "asilomar-cocoa-bean-hollywood-wallcoverings",
+ "hwc": "HWC-61251",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116025395,
+ "from_sku": "DWHD-502877",
+ "to_sku": "HWC-61251",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188115992627,
+ "from_sku": "DWHD-502877-Sample",
+ "to_sku": "HWC-61251-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464471091,
+ "handle": "asilomar-crystalline-hollywood-wallcoverings",
+ "hwc": "HWC-61252",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116090931,
+ "from_sku": "DWHD-502878",
+ "to_sku": "HWC-61252",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116058163,
+ "from_sku": "DWHD-502878-Sample",
+ "to_sku": "HWC-61252-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464503859,
+ "handle": "asilomar-dappled-hollywood-wallcoverings",
+ "hwc": "HWC-61253",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116156467,
+ "from_sku": "DWHD-502879",
+ "to_sku": "HWC-61253",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116123699,
+ "from_sku": "DWHD-502879-Sample",
+ "to_sku": "HWC-61253-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464700467,
+ "handle": "asilomar-dark-star-hollywood-wallcoverings",
+ "hwc": "HWC-61256",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116811827,
+ "from_sku": "DWHD-502880",
+ "to_sku": "HWC-61256",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116779059,
+ "from_sku": "DWHD-502880-Sample",
+ "to_sku": "HWC-61256-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464733235,
+ "handle": "asilomar-dawn-hollywood-wallcoverings",
+ "hwc": "HWC-61257",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116877363,
+ "from_sku": "DWHD-502881",
+ "to_sku": "HWC-61257",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116844595,
+ "from_sku": "DWHD-502881-Sample",
+ "to_sku": "HWC-61257-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464766003,
+ "handle": "asilomar-deep-shadow-hollywood-wallcoverings",
+ "hwc": "HWC-61258",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116942899,
+ "from_sku": "DWHD-502882",
+ "to_sku": "HWC-61258",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116910131,
+ "from_sku": "DWHD-502882-Sample",
+ "to_sku": "HWC-61258-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464798771,
+ "handle": "asilomar-ember-glow-hollywood-wallcoverings",
+ "hwc": "HWC-61259",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117008435,
+ "from_sku": "DWHD-502883",
+ "to_sku": "HWC-61259",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116975667,
+ "from_sku": "DWHD-502883-Sample",
+ "to_sku": "HWC-61259-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464831539,
+ "handle": "asilomar-felt-grey-hollywood-wallcoverings",
+ "hwc": "HWC-61260",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117073971,
+ "from_sku": "DWHD-502884",
+ "to_sku": "HWC-61260",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117041203,
+ "from_sku": "DWHD-502884-Sample",
+ "to_sku": "HWC-61260-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464864307,
+ "handle": "asilomar-firelight-hollywood-wallcoverings",
+ "hwc": "HWC-61261",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117237811,
+ "from_sku": "DWHD-502885",
+ "to_sku": "HWC-61261",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117205043,
+ "from_sku": "DWHD-502885-Sample",
+ "to_sku": "HWC-61261-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464897075,
+ "handle": "asilomar-fossil-hollywood-wallcoverings",
+ "hwc": "HWC-61262",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117303347,
+ "from_sku": "DWHD-502886",
+ "to_sku": "HWC-61262",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117270579,
+ "from_sku": "DWHD-502886-Sample",
+ "to_sku": "HWC-61262-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464929843,
+ "handle": "asilomar-herbal-hollywood-wallcoverings",
+ "hwc": "HWC-61263",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117368883,
+ "from_sku": "DWHD-502887",
+ "to_sku": "HWC-61263",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117336115,
+ "from_sku": "DWHD-502887-Sample",
+ "to_sku": "HWC-61263-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464962611,
+ "handle": "asilomar-hot-sun-hollywood-wallcoverings",
+ "hwc": "HWC-61264",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117434419,
+ "from_sku": "DWHD-502888",
+ "to_sku": "HWC-61264",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117401651,
+ "from_sku": "DWHD-502888-Sample",
+ "to_sku": "HWC-61264-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464995379,
+ "handle": "asilomar-island-sky-hollywood-wallcoverings",
+ "hwc": "HWC-61265",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117499955,
+ "from_sku": "DWHD-502889",
+ "to_sku": "HWC-61265",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117467187,
+ "from_sku": "DWHD-502889-Sample",
+ "to_sku": "HWC-61265-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465028147,
+ "handle": "asilomar-mirage-hollywood-wallcoverings",
+ "hwc": "HWC-61266",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117565491,
+ "from_sku": "DWHD-502890",
+ "to_sku": "HWC-61266",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117532723,
+ "from_sku": "DWHD-502890-Sample",
+ "to_sku": "HWC-61266-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465060915,
+ "handle": "asilomar-moonlight-hollywood-wallcoverings",
+ "hwc": "HWC-61267",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117631027,
+ "from_sku": "DWHD-502891",
+ "to_sku": "HWC-61267",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117598259,
+ "from_sku": "DWHD-502891-Sample",
+ "to_sku": "HWC-61267-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465093683,
+ "handle": "asilomar-nimbus-hollywood-wallcoverings",
+ "hwc": "HWC-61268",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117696563,
+ "from_sku": "DWHD-502892",
+ "to_sku": "HWC-61268",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117663795,
+ "from_sku": "DWHD-502892-Sample",
+ "to_sku": "HWC-61268-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465126451,
+ "handle": "asilomar-pale-silver-hollywood-wallcoverings",
+ "hwc": "HWC-61269",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117762099,
+ "from_sku": "DWHD-502893",
+ "to_sku": "HWC-61269",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117729331,
+ "from_sku": "DWHD-502893-Sample",
+ "to_sku": "HWC-61269-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465159219,
+ "handle": "asilomar-peridot-hollywood-wallcoverings",
+ "hwc": "HWC-61270",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117827635,
+ "from_sku": "DWHD-502894",
+ "to_sku": "HWC-61270",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117794867,
+ "from_sku": "DWHD-502894-Sample",
+ "to_sku": "HWC-61270-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465191987,
+ "handle": "asilomar-pewter-hollywood-wallcoverings",
+ "hwc": "HWC-61271",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117893171,
+ "from_sku": "DWHD-502895",
+ "to_sku": "HWC-61271",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117860403,
+ "from_sku": "DWHD-502895-Sample",
+ "to_sku": "HWC-61271-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465224755,
+ "handle": "asilomar-porcelain-hollywood-wallcoverings",
+ "hwc": "HWC-61272",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188117958707,
+ "from_sku": "DWHD-502896",
+ "to_sku": "HWC-61272",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188117925939,
+ "from_sku": "DWHD-502896-Sample",
+ "to_sku": "HWC-61272-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465257523,
+ "handle": "asilomar-radiance-hollywood-wallcoverings",
+ "hwc": "HWC-61273",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188118057011,
+ "from_sku": "DWHD-502897",
+ "to_sku": "HWC-61273",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188118024243,
+ "from_sku": "DWHD-502897-Sample",
+ "to_sku": "HWC-61273-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465290291,
+ "handle": "asilomar-renaissance-hollywood-wallcoverings",
+ "hwc": "HWC-61274",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188118122547,
+ "from_sku": "DWHD-502898",
+ "to_sku": "HWC-61274",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188118089779,
+ "from_sku": "DWHD-502898-Sample",
+ "to_sku": "HWC-61274-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465323059,
+ "handle": "asilomar-shimmer-hollywood-wallcoverings",
+ "hwc": "HWC-61275",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188118188083,
+ "from_sku": "DWHD-502899",
+ "to_sku": "HWC-61275",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188118155315,
+ "from_sku": "DWHD-502899-Sample",
+ "to_sku": "HWC-61275-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465355827,
+ "handle": "asilomar-silver-leaf-hollywood-wallcoverings",
+ "hwc": "HWC-61276",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188118253619,
+ "from_sku": "DWHD-502900",
+ "to_sku": "HWC-61276",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188118220851,
+ "from_sku": "DWHD-502900-Sample",
+ "to_sku": "HWC-61276-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465388595,
+ "handle": "asilomar-snow-field-hollywood-wallcoverings",
+ "hwc": "HWC-61277",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188118319155,
+ "from_sku": "DWHD-502901",
+ "to_sku": "HWC-61277",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188118286387,
+ "from_sku": "DWHD-502901-Sample",
+ "to_sku": "HWC-61277-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465421363,
+ "handle": "asilomar-sparkle-hollywood-wallcoverings",
+ "hwc": "HWC-61278",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188118384691,
+ "from_sku": "DWHD-502902",
+ "to_sku": "HWC-61278",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188118351923,
+ "from_sku": "DWHD-502902-Sample",
+ "to_sku": "HWC-61278-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465486899,
+ "handle": "asilomar-summer-field-hollywood-wallcoverings",
+ "hwc": "HWC-61279",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188119072819,
+ "from_sku": "DWHD-502903",
+ "to_sku": "HWC-61279",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188119040051,
+ "from_sku": "DWHD-502903-Sample",
+ "to_sku": "HWC-61279-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814465519667,
+ "handle": "asilomar-suntan-hollywood-wallcoverings",
+ "hwc": "HWC-61280",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188119138355,
+ "from_sku": "DWHD-502904",
+ "to_sku": "HWC-61280",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188119105587,
+ "from_sku": "DWHD-502904-Sample",
+ "to_sku": "HWC-61280-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464536627,
+ "handle": "asilomar-tangerine-hollywood-wallcoverings",
+ "hwc": "HWC-61254",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116222003,
+ "from_sku": "DWHD-502905",
+ "to_sku": "HWC-61254",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116189235,
+ "from_sku": "DWHD-502905-Sample",
+ "to_sku": "HWC-61254-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814464602163,
+ "handle": "asilomar-twilight-hollywood-wallcoverings",
+ "hwc": "HWC-61255",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188116484147,
+ "from_sku": "DWHD-502906",
+ "to_sku": "HWC-61255",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44188116451379,
+ "from_sku": "DWHD-502906-Sample",
+ "to_sku": "HWC-61255-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814884818995,
+ "handle": "back-bay-glitterati-hollywood-wallcoverings",
+ "hwc": "HWC-61284",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44193896398899,
+ "from_sku": "DWHD-502551-Yard",
+ "to_sku": "HWC-61284",
+ "title": "Sold Per Yard"
+ },
+ {
+ "variant_id": 44190205771827,
+ "from_sku": "DWHD-502551-Sample",
+ "to_sku": "HWC-61284-Sample",
+ "title": "Sample"
+ }
+ ]
+ },
+ {
+ "product_id": 7814360137779,
+ "handle": "doud-creek-midnight-hollywood-wallcoverings",
+ "hwc": "HWC-61245",
+ "manufacturer_sku_untouched": true,
+ "writes": [
+ {
+ "variant_id": 44188083912755,
+ "from_sku": "DWHD-503061",
+ "to_sku": "HWC-61245",
+ "title": "Yard"
+ },
+ {
+ "variant_id": 44187866103859,
+ "from_sku": "DWHD-503061-Sample",
+ "to_sku": "HWC-61245-Sample",
+ "title": "Sample"
+ }
+ ]
+ }
+ ],
+ "problems": []
+}
\ No newline at end of file
diff --git a/data/order-history-held36.json b/data/order-history-held36.json
new file mode 100644
index 0000000..63e021c
--- /dev/null
+++ b/data/order-history-held36.json
@@ -0,0 +1,32 @@
+{
+ "generated_at": "2026-08-27T17:45:06.310Z",
+ "ticket": "TK-10633",
+ "scope": "held36",
+ "window": {
+ "since": "2025-08-27T17:43:21.783Z"
+ },
+ "orders_scanned": 3498,
+ "line_items_scanned": 9391,
+ "target_skus": 72,
+ "distinct_target_skus_in_orders": 4,
+ "matched_line_items": 5,
+ "matched_orders": 4,
+ "hits": [
+ [
+ "DWHD-502899-SAMPLE",
+ 2
+ ],
+ [
+ "DWHD-502885-SAMPLE",
+ 1
+ ],
+ [
+ "DWHD-502892-SAMPLE",
+ 1
+ ],
+ [
+ "DWHD-502873-SAMPLE",
+ 1
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/order-history-check-held36.mjs b/order-history-check-held36.mjs
new file mode 100644
index 0000000..042e5b9
--- /dev/null
+++ b/order-history-check-held36.mjs
@@ -0,0 +1,17 @@
+import { readFileSync, writeFileSync } from 'node:fs';
+const SHOP='designer-laboratory-sandbox.myshopify.com', VER='2024-10';
+const TOKEN=(readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').split('\n').find(l=>l.startsWith('SHOPIFY_FULL_ACCESS_TOKEN='))||'').replace('SHOPIFY_FULL_ACCESS_TOKEN=','').replace(/["'\r]/g,'').trim();
+if(!TOKEN){console.error('no FULL token');process.exit(1);}
+const targets=new Set(readFileSync('/tmp/held36-fromskus.txt','utf8').split('\n').map(s=>s.trim().toUpperCase()).filter(Boolean));
+async function gj(url){const r=await fetch(url,{headers:{'X-Shopify-Access-Token':TOKEN}});
+ if(r.status===429){await new Promise(x=>setTimeout(x,2000));return gj(url);}
+ if(!r.ok)throw new Error(r.status+' '+await r.text());
+ const link=r.headers.get('link')||''; const m=link.match(/<([^>]+)>;\s*rel="next"/);
+ return {body:await r.json(), next:m?m[1]:null};}
+const since=new Date(Date.now()-365*864e5).toISOString();
+let url=`https://${SHOP}/admin/api/${VER}/orders.json?status=any&created_at_min=${since}&limit=250&fields=id,line_items`;
+let orders=0,li=0,matched=0; const hits=new Map(); const mo=new Set(); let pages=0;
+while(url){const {body,next}=await gj(url); for(const o of (body.orders||[])){orders++; for(const l of (o.line_items||[])){li++; const s=(l.sku||'').toUpperCase(); if(s&&targets.has(s)){matched++; mo.add(o.id); hits.set(s,(hits.get(s)||0)+1);}}} pages++; url=next; if(pages%8===0)console.error(` ...${orders} orders / ${li} LI`);}
+const res={generated_at:new Date().toISOString(),ticket:'TK-10633',scope:'held36',window:{since},orders_scanned:orders,line_items_scanned:li,target_skus:targets.size,distinct_target_skus_in_orders:hits.size,matched_line_items:matched,matched_orders:mo.size,hits:[...hits.entries()].sort((a,b)=>b[1]-a[1]).slice(0,20)};
+writeFileSync('data/order-history-held36.json',JSON.stringify(res,null,2));
+console.log(JSON.stringify(res,null,2));
← 1428520 Add LBI Boyd HWC-recovery request CSV (584 held products)
·
back to Hollywood Optc
·
TK-10633: restore 36 held Hollywood products to real HWC-### ca7f7f2 →