[object Object]

← back to Atomic50 Onboard

TK-12032: require shared fail-closed leak guard before Shopify create + reconcile writes

4ff3c3d8fd0f23a2092f9f260377a61526814568 · 2026-09-22 14:33:11 -0700 · Steve

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 4ff3c3d8fd0f23a2092f9f260377a61526814568
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Sep 22 14:33:11 2026 -0700

    TK-12032: require shared fail-closed leak guard before Shopify create + reconcile writes
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 push-shopify.js | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/push-shopify.js b/push-shopify.js
index 4967b28..d51d4b2 100644
--- a/push-shopify.js
+++ b/push-shopify.js
@@ -21,6 +21,7 @@
  */
 const { Client } = require('pg');
 const fs = require('fs');
+const { assertNoPublicLeak } = require(require('path').join(process.env.HOME, 'Projects/_shared/leak-guard/leak-guard.cjs')); // TK-12032 fail-closed private-label leak guard
 
 const SHOP = 'designer-laboratory-sandbox.myshopify.com';
 const API = '2024-10';
@@ -154,6 +155,9 @@ async function main() {
     try { payload = buildCreatePayload(row); }
     catch (e) { console.error(`  ! build failed ${row.mfr_sku}: ${e.message}`); results.failed.push({ mfr_sku: row.mfr_sku, error: e.message }); continue; }
 
+    try { assertNoPublicLeak(payload, { context: `atomic50 ${row.mfr_sku}` }); }
+    catch (e) { console.error(`  ⛔ LEAK GUARD ${row.mfr_sku}: ${e.message}`); results.failed.push({ mfr_sku: row.mfr_sku, error: e.message }); continue; }
+
     if (DRY) { console.log(`  [dry] would create ${row.mfr_sku} "${payload.product.title}" (${row.product_type})`); results.created.push({ mfr_sku: row.mfr_sku, dry: true }); continue; }
 
     const r = await shopify('POST', 'products.json', payload);
@@ -193,6 +197,8 @@ async function main() {
         // status intentionally omitted -> keep current (active)
       },
     };
+    try { assertNoPublicLeak(update, { context: `atomic50 reconcile ${L.mfr_sku}` }); }
+    catch (e) { console.error(`  ⛔ LEAK GUARD ${L.mfr_sku}: ${e.message}`); results.reconcileFailed.push({ mfr_sku: L.mfr_sku, error: e.message }); continue; }
     if (DRY) { console.log(`  [dry] would reconcile ${L.mfr_sku} -> "${newTitle}" / Tin Ceiling Tile`); results.reconciled.push({ mfr_sku: L.mfr_sku, dry: true }); continue; }
     const r = await shopify('PUT', `products/${L.pid}.json`, update);
     if (!r.ok || !r.json.product) {

← 4e14dd1 auto-data-snapshot: 2026-08-27T01:35:35 (1 data files) — cad  ·  back to Atomic50 Onboard  ·  (newest)