[object Object]

← back to Dw Signup Fulfillment

snapshot before restart: preserve in-flight work (auto-saved by /restart pre-reboot)

e398ba2f8a7854051041929a74bb47569907429a · 2026-08-17 06:52:34 -0700 · Steve

Files touched

Diff

commit e398ba2f8a7854051041929a74bb47569907429a
Author: Steve <steve@designerwallcoverings.com>
Date:   Mon Aug 17 06:52:34 2026 -0700

    snapshot before restart: preserve in-flight work (auto-saved by /restart pre-reboot)
---
 scripts/archive-majilite-dupes.js | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/scripts/archive-majilite-dupes.js b/scripts/archive-majilite-dupes.js
new file mode 100644
index 0000000..5956375
--- /dev/null
+++ b/scripts/archive-majilite-dupes.js
@@ -0,0 +1,33 @@
+#!/usr/bin/env node
+'use strict';
+// Archive the 2 duplicate Majilite listings (the 23:06 double-publish ghosts) on the LIVE
+// DW store, keeping the compliant 17:17 originals. Verified by /yoloforever cycle 1 + Cody:
+//   KEEP  majilite-shimmer-mist   (7916899303475, compliant)
+//   ARCH  majilite-shimmer-mist-600088 (7917049086003, NO mfr metafield, dup)
+//   KEEP  majilite-nuance-pebble  (7916899467315, compliant)
+//   ARCH  majilite-nuance-pebble-600090 (7917049118771, NO mfr metafield, dup)
+// Reversible: set status back to 'active' to un-archive. Cost: $0 (2 status writes).
+// Run: node ~/Projects/dw-signup-fulfillment/scripts/archive-majilite-dupes.js
+const fs = require('fs');
+const os = require('os');
+const env = fs.readFileSync(os.homedir() + '/Projects/secrets-manager/.env', 'utf8');
+const tok = (env.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1]?.trim().replace(/^["']|["']$/g, '');
+if (!tok) { console.error('NO SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
+const SHOP = 'designer-laboratory-sandbox.myshopify.com', VER = '2024-10';
+const DUPES = [
+  { id: '7917049086003', handle: 'majilite-shimmer-mist-600088' },
+  { id: '7917049118771', handle: 'majilite-nuance-pebble-600090' },
+];
+(async () => {
+  for (const d of DUPES) {
+    const r = await fetch(`https://${SHOP}/admin/api/${VER}/products/${d.id}.json`, {
+      method: 'PUT',
+      headers: { 'X-Shopify-Access-Token': tok, 'Content-Type': 'application/json' },
+      body: JSON.stringify({ product: { id: Number(d.id), status: 'archived' } }),
+      signal: AbortSignal.timeout(30000),
+    });
+    const j = await r.json().catch(() => ({}));
+    console.log(`${d.handle} (${d.id}) → HTTP ${r.status} · status=${j?.product?.status || JSON.stringify(j).slice(0, 120)}`);
+  }
+  console.log('💰 $0 (2 Shopify status writes). Re-run dw-golive-gate-canary to confirm the red clears.');
+})();

← 33d6c4b contrarian gate: dedupe /verify confirmation email (fire onc  ·  back to Dw Signup Fulfillment  ·  auto-data-snapshot: 2026-08-17T07:02:20 (2 data files) — .pl f231337 →