← back to Gmc Titlefix
TK-11405: archive the 34 WallQuest-discontinued Malibu products
6963f423644ff78ee90badfd027464893d035c41 · 2026-09-10 12:22:53 -0700 · Steve Abrams
Steve's rule: if no SKU at WallQuest, archive/discontinue.
All 34 carry wallquest_catalog.discontinued = TRUE (scraped 2026-04-29). They
were never unpriced-pending - they are discontinued goods, which explains every
symptom at once: no price anywhere, the Needs-Price hold tags, publishedAt
NEVER. The 'backfill pricing' premise was wrong; a discontinued product never
gets a price.
34 archived, 0 failed, independently verified 34/34. Safe because all were
already unpublished from every channel, so zero customer-facing effect.
Reversible via --rollback against the run-log, which records each prior status.
The script refuses to archive anything still published to the Online Store.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Files touched
A data/tk11405-archive-2026-09-10T19-21-50-674Z.jsonlA tk11405-archive-discontinued-34.mjs
Diff
commit 6963f423644ff78ee90badfd027464893d035c41
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Sep 10 12:22:53 2026 -0700
TK-11405: archive the 34 WallQuest-discontinued Malibu products
Steve's rule: if no SKU at WallQuest, archive/discontinue.
All 34 carry wallquest_catalog.discontinued = TRUE (scraped 2026-04-29). They
were never unpriced-pending - they are discontinued goods, which explains every
symptom at once: no price anywhere, the Needs-Price hold tags, publishedAt
NEVER. The 'backfill pricing' premise was wrong; a discontinued product never
gets a price.
34 archived, 0 failed, independently verified 34/34. Safe because all were
already unpublished from every channel, so zero customer-facing effect.
Reversible via --rollback against the run-log, which records each prior status.
The script refuses to archive anything still published to the Online Store.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---
.../tk11405-archive-2026-09-10T19-21-50-674Z.jsonl | 34 ++++++++
tk11405-archive-discontinued-34.mjs | 99 ++++++++++++++++++++++
2 files changed, 133 insertions(+)
diff --git a/data/tk11405-archive-2026-09-10T19-21-50-674Z.jsonl b/data/tk11405-archive-2026-09-10T19-21-50-674Z.jsonl
new file mode 100644
index 0000000..64c7e24
--- /dev/null
+++ b/data/tk11405-archive-2026-09-10T19-21-50-674Z.jsonl
@@ -0,0 +1,34 @@
+{"gid":"gid://shopify/Product/7822314602547","handle":"hubble-chevron-metallic-gold-and-teal-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343209011","handle":"panama-boho-diamonds-black-sands-and-charcoal-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822315388979","handle":"curie-geo-metallic-silver-and-black-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343405619","handle":"mandala-boho-tile-brushed-ebony-and-stone-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822312407091","handle":"dynasty-lattice-metallic-pearl-and-gray-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822344781875","handle":"indie-linen-embossed-vinyl-oat-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822308671539","handle":"aura-lace-medallion-pearl-and-off-white-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822312472627","handle":"imperial-linen-metallic-pearl-and-tan-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822314405939","handle":"curie-texture-metallic-ivory-and-charcoal-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822308704307","handle":"zigzag-wash-taupe-and-cream-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822314274867","handle":"chadwick-portrait-metallic-gold-and-off-white-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822324695091","handle":"dreamers-linen-soft-gray-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822314569779","handle":"hubble-chevron-metallic-taupe-and-ivory-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822344323123","handle":"horizon-brushed-stripe-teal-seafoam-and-ivory-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822313259059","handle":"great-wall-metallic-silver-and-sky-blue-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822344683571","handle":"indie-linen-embossed-vinyl-bluestone-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822345175091","handle":"calypso-paisley-leaf-fabric-stone-and-latte-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822312144947","handle":"dynasty-metallic-linen-and-blue-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343766067","handle":"tropicana-leaves-charcoal-stone-and-daydream-gray-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822313717811","handle":"lotus-metallic-gold-and-ebony-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822312374323","handle":"dynasty-lattice-metallic-pearl-and-emerald-green-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822307557427","handle":"lindenhofplatz-metallic-champagne-ivory-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822354481203","handle":"de-stijl-geometric-perry-teal-frosted-petal-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822344880179","handle":"indie-linen-embossed-vinyl-rosa-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343438387","handle":"mandala-boho-tile-cerulean-and-washed-denim-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343831603","handle":"tropicana-leaves-jade-rosemary-and-spruce-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822307590195","handle":"lindenhofplatz-wrought-iron-and-metallic-silver-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822314012723","handle":"koi-texture-gold-and-off-white-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822308573235","handle":"aura-lace-medallion-sea-green-beige-and-ebony-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822309457971","handle":"elegant-burlap-tan-and-silver-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822315618355","handle":"newton-damask-metallic-gold-and-off-white-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343110707","handle":"boho-chevron-stripe-gray-mist-and-ivory-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822307819571","handle":"oberdorf-metallic-charcoal-glass-beads-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
+{"gid":"gid://shopify/Product/7822343471155","handle":"mandala-boho-tile-coral-cream-and-midnight-blue-wallcovering-malibu-wallpaper","prior_status":"ACTIVE","ok":true,"new_status":"ARCHIVED","undo":"productUpdate status=ACTIVE"}
diff --git a/tk11405-archive-discontinued-34.mjs b/tk11405-archive-discontinued-34.mjs
new file mode 100644
index 0000000..a6da1ac
--- /dev/null
+++ b/tk11405-archive-discontinued-34.mjs
@@ -0,0 +1,99 @@
+#!/usr/bin/env node
+/**
+ * TK-11405 - archive the 34 Malibu products that WallQuest has DISCONTINUED.
+ *
+ * Steve's rule, 2026-09-10: "if no sku at wallquest .. archive/discontinue".
+ *
+ * Evidence these qualify (all read-only, verified before writing):
+ * - all 34 carry wallquest_catalog.discontinued = TRUE (scraped 2026-04-29)
+ * - all 34 have publishedAt = NEVER (never sold)
+ * - all 34 carry Needs-Price + Needs-Bolt-Variant
+ * - their only variant is the $4.25 memo sample; no roll price exists anywhere
+ * (portal is variant-gated, FileMaker cost is blank or a stale 2016 placeholder,
+ * and no WallQuest cost sheet exists on either connected Drive)
+ * So these are not "unpriced yet" - they are discontinued goods that can never be priced.
+ *
+ * SAFETY: they are ALREADY unpublished from every channel, so archiving has no customer-facing
+ * effect - it removes them from admin working views and stops a future job re-publishing them.
+ * Fully reversible: the run-log records each product's prior status, and --rollback restores it.
+ *
+ * Usage:
+ * node tk11405-archive-discontinued-34.mjs # dry-run
+ * TK11405_APPROVED=1 node ... --apply
+ * node tk11405-archive-discontinued-34.mjs --rollback <runlog>
+ */
+import fs from 'fs';
+import path from 'path';
+
+const SHOP = 'designer-laboratory-sandbox';
+const DATA = path.join(path.dirname(new URL(import.meta.url).pathname), 'data');
+const HANDLES = '/tmp/h34.txt';
+
+const argv = process.argv.slice(2);
+const APPLY = argv.includes('--apply');
+const ROLLBACK = argv.includes('--rollback') ? argv[argv.indexOf('--rollback') + 1] : null;
+
+const tok = (fs.readFileSync(process.env.HOME + '/Projects/secrets-manager/.env', 'utf8').match(/^SHOPIFY_FULL_ACCESS_TOKEN=(.+)$/m) || [])[1];
+async function gql(q, v) {
+ for (let a = 0; a < 5; a++) {
+ const r = await fetch('https://' + SHOP + '.myshopify.com/admin/api/2024-10/graphql.json', {
+ method: 'POST', headers: { 'X-Shopify-Access-Token': tok, 'Content-Type': 'application/json' },
+ body: JSON.stringify({ query: q, variables: v }), signal: AbortSignal.timeout(60000) });
+ const j = await r.json();
+ if (j.errors) { if (JSON.stringify(j.errors).includes('THROTTLED') && a < 4) { await new Promise(z => setTimeout(z, 2000 * (a + 1))); continue; } throw new Error(JSON.stringify(j.errors).slice(0, 200)); }
+ return j.data;
+ }
+ throw new Error('throttled out');
+}
+
+async function main() {
+ const handles = fs.readFileSync(HANDLES, 'utf8').trim().split('\n').filter(Boolean);
+ const plan = [];
+ for (const h of handles) {
+ const d = await gql('query($h:String!,$p:ID!){ productByHandle(handle:$h){ id handle title status publishedOnPublication(publicationId:$p) } }',
+ { h, p: 'gid://shopify/Publication/22208643184' });
+ const p = d.productByHandle;
+ if (!p) { console.log(' SKIP ' + h + ' (not found)'); continue; }
+ if (p.status === 'ARCHIVED') { console.log(' SKIP ' + h + ' (already archived)'); continue; }
+ if (p.publishedOnPublication) { console.log(' REFUSE ' + h + ' — is PUBLISHED to Online Store; not archiving a live product'); continue; }
+ plan.push({ gid: p.id, handle: p.handle, prior_status: p.status });
+ await new Promise(z => setTimeout(z, 110));
+ }
+ console.log('\nto archive: ' + plan.length + ' (all discontinued at WallQuest, all already unpublished)');
+ if (!APPLY || process.env.TK11405_APPROVED !== '1') {
+ console.log('DRY-RUN. To fire: TK11405_APPROVED=1 node tk11405-archive-discontinued-34.mjs --apply');
+ plan.slice(0, 5).forEach(p => console.log(' would archive: ' + p.handle + ' (was ' + p.prior_status + ')'));
+ return;
+ }
+ const RUNLOG = path.join(DATA, 'tk11405-archive-' + new Date().toISOString().replace(/[:.]/g, '-') + '.jsonl');
+ let ok = 0, fail = 0;
+ for (const p of plan) {
+ try {
+ const d = await gql('mutation($input:ProductInput!){ productUpdate(input:$input){ product{ id status } userErrors{ field message } } }',
+ { input: { id: p.gid, status: 'ARCHIVED' } });
+ const errs = d.productUpdate.userErrors || [];
+ if (errs.length) { fs.appendFileSync(RUNLOG, JSON.stringify({ ...p, ok: false, errs }) + '\n'); fail++; continue; }
+ fs.appendFileSync(RUNLOG, JSON.stringify({ ...p, ok: true, new_status: 'ARCHIVED', undo: 'productUpdate status=' + p.prior_status }) + '\n');
+ ok++; console.log(' archived ' + p.handle);
+ } catch (e) { fs.appendFileSync(RUNLOG, JSON.stringify({ ...p, ok: false, err: String(e).slice(0, 160) }) + '\n'); fail++; }
+ await new Promise(z => setTimeout(z, 120));
+ }
+ console.log('\narchived ' + ok + ', failed ' + fail);
+ console.log('run-log: ' + RUNLOG);
+ console.log('UNDO: node tk11405-archive-discontinued-34.mjs --rollback ' + RUNLOG);
+}
+
+async function rollback(lp) {
+ const rows = fs.readFileSync(lp, 'utf8').trim().split('\n').filter(Boolean).map(l => JSON.parse(l)).filter(r => r.ok);
+ console.log('=== ROLLBACK: restoring ' + rows.length + ' products to their prior status ===');
+ for (const r of rows) {
+ try {
+ await gql('mutation($input:ProductInput!){ productUpdate(input:$input){ product{ id status } userErrors{ message } } }',
+ { input: { id: r.gid, status: r.prior_status } });
+ console.log(' restored ' + r.handle + ' -> ' + r.prior_status);
+ } catch (e) { console.error(' FAILED ' + r.handle + ' ' + String(e).slice(0, 120)); }
+ await new Promise(z => setTimeout(z, 120));
+ }
+}
+
+if (ROLLBACK) rollback(ROLLBACK); else main().catch(e => { console.error(String(e)); process.exit(1); });
← 4318138 TK-11233: hi-res expansion 308/308 applied and verified
·
back to Gmc Titlefix
·
TK-10993: commit the read-only overnight verification harnes 84e06d8 →