[object Object]

← back to Dw Yolo Loop

gmc-feed-exclude: add --orphans-only (Bucket A / live-verified true orphans) for C-orphans (TK-10446)

57956008cb66ef5bc41892cd63acba9325c070f5 · 2026-08-10 21:55:23 -0700 · Steve Abrams

Files touched

Diff

commit 57956008cb66ef5bc41892cd63acba9325c070f5
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 10 21:55:23 2026 -0700

    gmc-feed-exclude: add --orphans-only (Bucket A / live-verified true orphans) for C-orphans (TK-10446)
---
 .git.bak-1785779086                                |  1 +
 artmura-site/clickthrough.js                       |  2 +-
 artmura-site/package-lock.json                     |  2 +-
 gmc-425-count.js                                   |  4 +--
 gmc-feed-exclude.js                                | 33 +++++++++++++----
 .../ai-preamble-leak-sweep.mjs                     |  2 +-
 .../body-start-classifier.mjs                      |  2 +-
 scripts/ai-preamble-leak-sweep/broad-net-bound.mjs |  2 +-
 .../ai-preamble-leak-sweep/wallpaper-reconcile.mjs |  2 +-
 .../alt-text-coverage/alt-text-coverage-audit.mjs  |  2 +-
 scripts/artmura-onboard/run-push-artmura.sh        |  2 +-
 scripts/body-quality-scan/body-quality-scan.mjs    |  2 +-
 scripts/buyability-audit/buyability-audit.mjs      |  2 +-
 .../buyability-audit/policy-mechanism-probe.mjs    |  2 +-
 .../com.steve.canary-meta-watchdog.plist           | 10 +++---
 .../cole-son-map-verify/cole-son-map-verify.mjs    |  2 +-
 .../collection-orphan-sweep.mjs                    |  2 +-
 .../low-membership-probe.mjs                       |  2 +-
 .../continue-masked-segmentation-v2.mjs            |  2 +-
 .../continue-masked-segmentation.mjs               |  2 +-
 .../draft-abnormal-decode.mjs                      |  2 +-
 scripts/gmc-feed-guard/data/latest.json            | 36 +++++++++++++++----
 scripts/gmc-feed-guard/gmc-feed-guard.mjs          | 41 ++++++++++++++--------
 .../image-integrity-sweep.mjs                      |  2 +-
 .../inverse-mislabel-disambig.mjs                  |  2 +-
 .../inverse-mislabel-disambig/showroom-negctrl.mjs |  2 +-
 .../inverse-mislabel-sweep.mjs                     |  2 +-
 .../kravet-sibling-map-verify.mjs                  |  2 +-
 .../metafield-coverage-audit.mjs                   |  2 +-
 .../multivariant-zero-sweep.mjs                    |  2 +-
 .../nav-link-reachability/navmenus-admin-probe.mjs |  2 +-
 scripts/orphan-products/orphan-products-scan.mjs   |  2 +-
 scripts/osborne-little-basis/ol-basis-decode.mjs   |  2 +-
 scripts/rl-zero-rootcause/rl-diag.mjs              |  2 +-
 .../gen-philipperomano-sitemap.mjs                 |  2 +-
 .../com.steve.alt-text-coverage.plist              |  2 +-
 .../alt-text-coverage/run-alt-text-coverage.sh     |  2 +-
 .../com.steve.backup-freshness.plist               |  2 +-
 .../com.steve.secrets-env-backup.plist             |  2 +-
 .../gmc-feed-guard/com.steve.gmc-feed-guard.plist  |  2 +-
 .../gmc-feed-guard/run-gmc-feed-guard.sh           |  2 +-
 .../com.steve.handle-freshness.plist               |  2 +-
 .../handle-freshness/run-handle-freshness.sh       |  2 +-
 .../com.steve.live-price-canary.plist              |  2 +-
 .../live-price-canary/run-live-price-canary.sh     |  2 +-
 .../com.steve.metafield-coverage.plist             |  2 +-
 .../metafield-coverage/run-metafield-coverage.sh   |  2 +-
 .../no-image-scan/com.steve.no-image-scan.plist    |  2 +-
 .../no-image-scan/run-no-image-scan.sh             |  2 +-
 scripts/staged-launchd/promote-canary.sh           |  2 +-
 .../robots-sitemap/com.steve.robots-sitemap.plist  |  2 +-
 .../robots-sitemap/run-robots-sitemap.sh           |  2 +-
 .../tls-expiry/com.steve.tls-expiry.plist          |  2 +-
 .../staged-launchd/tls-expiry/run-tls-expiry.sh    |  2 +-
 .../zero-dollar-orderable-canary.mjs               |  2 +-
 scripts/zero-roll-rootcause/era-33-diagnosis.mjs   |  2 +-
 showroom-lines-scan.js                             |  2 +-
 showroom-lines-tag.js                              |  2 +-
 thibaut-mfr-fix/run-push.sh                        |  2 +-
 59 files changed, 143 insertions(+), 88 deletions(-)

diff --git a/.git.bak-1785779086 b/.git.bak-1785779086
new file mode 100644
index 0000000..95ae7bd
--- /dev/null
+++ b/.git.bak-1785779086
@@ -0,0 +1 @@
+gitdir: /Users/stevestudio2/Projects/designerwallcoverings/.git/worktrees/dw-yolo-loop
diff --git a/artmura-site/clickthrough.js b/artmura-site/clickthrough.js
index 4aa7676..ba5e113 100644
--- a/artmura-site/clickthrough.js
+++ b/artmura-site/clickthrough.js
@@ -1,5 +1,5 @@
 /* Live click-through of every Artmura landing component. Reports PASS/FAIL per component. */
-const { chromium } = require('/Users/stevestudio2/Projects/ventura-corridor/node_modules/playwright');
+const { chromium } = require('/Users/macstudio3/Projects/ventura-corridor/node_modules/playwright');
 const BASE = process.env.BASE || 'https://artmura.designerwallcoverings.com';
 const LINE = process.env.LINE || 'Artmura';                       // expected hero H1 / line name
 const COLL = process.env.COLLECTION_SLUG || 'artmura';            // expected /collections/<slug>
diff --git a/artmura-site/package-lock.json b/artmura-site/package-lock.json
index 0e660e2..3e094ba 100644
--- a/artmura-site/package-lock.json
+++ b/artmura-site/package-lock.json
@@ -8,7 +8,7 @@
       "name": "artmura-site",
       "version": "0.1.0",
       "dependencies": {
-        "express": "^4.19.2"
+        "express": "^4.22.2"
       }
     },
     "node_modules/accepts": {
diff --git a/gmc-425-count.js b/gmc-425-count.js
index f66140f..821d963 100644
--- a/gmc-425-count.js
+++ b/gmc-425-count.js
@@ -4,7 +4,7 @@ const fs = require('fs');
 
 const SHOP = 'designer-laboratory-sandbox.myshopify.com';
 const VERSION = '2024-10';
-const ENV = fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env', 'utf8');
+const ENV = fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env', 'utf8');
 const TOKEN = (ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1];
 if (!TOKEN) { console.error('no token'); process.exit(1); }
 
@@ -131,5 +131,5 @@ query($cursor: String) {
     vendor_breakdown_first_model: Object.entries(vendorCountFirst).sort((x,y)=>y[1]-x[1]),
   };
   console.log(JSON.stringify(result, null, 2));
-  fs.writeFileSync('/Users/stevestudio2/Projects/designerwallcoverings/gmc-425-result.json', JSON.stringify(result, null, 2));
+  fs.writeFileSync('/Users/macstudio3/Projects/designerwallcoverings/gmc-425-result.json', JSON.stringify(result, null, 2));
 })().catch(e => { console.error('FATAL', e.message); process.exit(1); });
diff --git a/gmc-feed-exclude.js b/gmc-feed-exclude.js
index 9975202..e9c03bc 100644
--- a/gmc-feed-exclude.js
+++ b/gmc-feed-exclude.js
@@ -24,7 +24,7 @@ const fs = require('fs');
 
 const SHOP = 'designer-laboratory-sandbox.myshopify.com';
 const VERSION = '2024-10';
-const ENV = fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env', 'utf8');
+const ENV = fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env', 'utf8');
 const TOKEN = (ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1];
 if (!TOKEN) { console.error('no SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
 
@@ -35,7 +35,14 @@ const GOOGLE_PUBLICATION_ID = 'gid://shopify/Publication/29646651457'; // "Googl
 const args = process.argv.slice(2);
 const APPLY = args.includes('--apply');
 const CONFIRMED = args.includes('--yes-i-am-steve');
-const WORKLIST = '/Users/stevestudio2/.claude/yolo-queue/gmc-feed-exclude-worklist.json';
+// --orphans-only (2026-08-10, TK-10446): exclude ONLY true orphans (Bucket A =
+// min-price $4.25 AND NO real roll variant), NOT Bucket B (has a sellable roll —
+// those must stay on Google and get the roll-price feed fix instead). Bucket is
+// computed LIVE from actual variant prices (hasRealRoll), so this does NOT rely on
+// the mirror's stale has_product_variant flag. Without the flag, legacy behavior
+// (A+B, ~80k) is preserved.
+const ORPHANS_ONLY = args.includes('--orphans-only');
+const WORKLIST = '/Users/macstudio3/.claude/yolo-queue/gmc-feed-exclude-worklist.json';
 
 const sleep = (ms) => new Promise(r => setTimeout(r, ms));
 
@@ -137,10 +144,21 @@ async function unpublish(ids) {
   console.log(`GMC feed-exclusion — ${APPLY ? 'APPLY' : 'DRY-RUN'} mode`);
   console.log(`Target: unpublish active products with min-variant price <= $${SAMPLE_PRICE} from "Google & YouTube" (pub 29646651457)\n`);
   const r = await scan();
+  // Split the on-Google $4.25 targets by bucket (live-verified via hasRealRoll):
+  //   A = TRUE orphan (no sellable roll) — safe to exclude from Google
+  //   B = HAS a real roll but $4.25 is min — do NOT delist; needs roll-price feed fix
+  const bucketA = r.targets.filter(t => t.bucket === 'A');
+  const bucketB = r.targets.filter(t => t.bucket === 'B');
   console.log(`\nScanned ${r.total} active products in ${r.elapsed}s (${r.pages} pages).`);
-  console.log(`Bucket A+B (would feed $4.25): ${r.aPlusB}`);
-  console.log(`  • currently ON Google channel (in the feed → WOULD be excluded): ${r.onGoogleAB}`);
-  console.log(`  • NOT on Google channel (already absent from feed): ${r.notOnGoogleAB}`);
+  console.log(`On Google channel & feeding $4.25: ${r.onGoogleAB}`);
+  console.log(`  • Bucket A — TRUE orphan (sample-only, no sellable roll): ${bucketA.length}`);
+  console.log(`  • Bucket B — HAS a real roll (leave on Google; needs roll-price feed fix): ${bucketB.length}`);
+  if (ORPHANS_ONLY) {
+    r.targets = bucketA;   // C-orphans: exclude ONLY the true orphans
+    console.log(`\n--orphans-only: targeting Bucket A only (${bucketA.length} products). Bucket B untouched.`);
+  } else {
+    console.log(`\n(legacy A+B mode — would exclude all ${r.onGoogleAB}. Use --orphans-only to limit to Bucket A.)`);
+  }
   fs.writeFileSync(WORKLIST, JSON.stringify({
     generated_at: new Date().toISOString(),
     google_publication_id: GOOGLE_PUBLICATION_ID,
@@ -153,11 +171,12 @@ async function unpublish(ids) {
   console.log(`\nWorklist written: ${WORKLIST} (${r.targets.length} product IDs)`);
 
   if (!APPLY) {
-    console.log(`\nDRY-RUN only — zero writes to Shopify. To apply (GATED): node gmc-feed-exclude.js --apply --yes-i-am-steve`);
+    console.log(`\nDRY-RUN only — zero writes to Shopify.`);
+    console.log(`To apply C-orphans (GATED): node gmc-feed-exclude.js --orphans-only --apply --yes-i-am-steve`);
     return;
   }
   if (!CONFIRMED) {
-    console.error(`\nREFUSING to apply without --yes-i-am-steve. This unpublishes ${r.onGoogleAB} products from the Google channel. Aborting.`);
+    console.error(`\nREFUSING to apply without --yes-i-am-steve. This unpublishes ${r.targets.length} products from the Google channel. Aborting.`);
     process.exit(2);
   }
   console.log(`\nAPPLYING: unpublishing ${r.targets.length} products from Google & YouTube...`);
diff --git a/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs b/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs
index c335247..6ede4d2 100644
--- a/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs
+++ b/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs
@@ -5,7 +5,7 @@
 // human verification. ALSO counts the live "Wallpaper" title blast-radius as CONTEXT (NOT a defect, NOT
 // reopening GMC). NEGATIVE CONTROL: the bulk of bodies have no preamble -> a leak is a true anomaly. EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs b/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs
index 56ea272..47268e1 100644
--- a/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs
+++ b/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
diff --git a/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs b/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs
index 2adcc48..eeafffe 100644
--- a/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs
+++ b/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
diff --git a/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs b/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs
index c6353e6..ec8c83e 100644
--- a/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs
+++ b/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});return r.json();}
diff --git a/scripts/alt-text-coverage/alt-text-coverage-audit.mjs b/scripts/alt-text-coverage/alt-text-coverage-audit.mjs
index 9c58e09..cacc175 100644
--- a/scripts/alt-text-coverage/alt-text-coverage-audit.mjs
+++ b/scripts/alt-text-coverage/alt-text-coverage-audit.mjs
@@ -18,7 +18,7 @@ const MIN =parseInt(args.find((_,i,a)=>a[i-1]==='--min')||'85',10)||85;   // WAR
 const PAGE=parseInt(args.find((_,i,a)=>a[i-1]==='--page')||'100',10)||100;
 const IMG =parseInt(args.find((_,i,a)=>a[i-1]==='--img')||'10',10)||10;   // images sampled per product (gallery cap)
 const SHOP='designer-laboratory-sandbox.myshopify.com', VERSION='2024-10';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOKEN=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
 if(!TOKEN){console.error('no SHOPIFY_ADMIN_TOKEN');process.exit(1);}
 const URL=`https://${SHOP}/admin/api/${VERSION}/graphql.json`;
diff --git a/scripts/artmura-onboard/run-push-artmura.sh b/scripts/artmura-onboard/run-push-artmura.sh
index 17de87e..14ec940 100644
--- a/scripts/artmura-onboard/run-push-artmura.sh
+++ b/scripts/artmura-onboard/run-push-artmura.sh
@@ -8,7 +8,7 @@ cd "$(dirname "$0")"
 
 export SHOPIFY_STORE="designer-laboratory-sandbox.myshopify.com"   # = live designerwallcoverings.com store
 export DATABASE_URL="postgresql:///dw_unified?host=/tmp"
-export NODE_PATH="/Users/stevestudio2/Projects/Designer-Wallcoverings/node_modules"
+export NODE_PATH="/Users/macstudio3/Projects/Designer-Wallcoverings/node_modules"
 export SHOPIFY_ADMIN_TOKEN="$(grep -hiE '^SHOPIFY_ADMIN_TOKEN=' "$HOME/Projects/secrets-manager/.env" | head -1 | cut -d= -f2- | tr -d '"'"'"' ')"
 
 if [ -z "${SHOPIFY_ADMIN_TOKEN:-}" ]; then
diff --git a/scripts/body-quality-scan/body-quality-scan.mjs b/scripts/body-quality-scan/body-quality-scan.mjs
index 3a3b9e1..e5d0b74 100644
--- a/scripts/body-quality-scan/body-quality-scan.mjs
+++ b/scripts/body-quality-scan/body-quality-scan.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const T=(fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8').match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
+const T=(fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8').match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
 const URL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
 async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(URL,{method:'POST',headers:{'X-Shopify-Access-Token':T,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v||{}})});if(r.status===429){await sleep(2500);continue;}const j=await r.json();if(j.errors&&JSON.stringify(j.errors).match(/THROTTLED/)){await sleep(2500);continue;}return j;}throw new Error('throttled');}
diff --git a/scripts/buyability-audit/buyability-audit.mjs b/scripts/buyability-audit/buyability-audit.mjs
index 393a80a..cdde30d 100644
--- a/scripts/buyability-audit/buyability-audit.mjs
+++ b/scripts/buyability-audit/buyability-audit.mjs
@@ -5,7 +5,7 @@
 // measures drift from the standing inventory=2026 both-variants convention. NEGATIVE CONTROL: if the
 // BULK is buyable, an unbuyable-active product is a true anomaly. EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/buyability-audit/policy-mechanism-probe.mjs b/scripts/buyability-audit/policy-mechanism-probe.mjs
index 3548e37..d8127db 100644
--- a/scripts/buyability-audit/policy-mechanism-probe.mjs
+++ b/scripts/buyability-audit/policy-mechanism-probe.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
diff --git a/scripts/canary-meta-watchdog/com.steve.canary-meta-watchdog.plist b/scripts/canary-meta-watchdog/com.steve.canary-meta-watchdog.plist
index 46617dd..e568001 100644
--- a/scripts/canary-meta-watchdog/com.steve.canary-meta-watchdog.plist
+++ b/scripts/canary-meta-watchdog/com.steve.canary-meta-watchdog.plist
@@ -9,11 +9,11 @@
     <string>com.steve.canary-meta-watchdog</string>
     <key>ProgramArguments</key>
     <array>
-        <string>/usr/local/bin/node</string>
-        <string>/Users/stevestudio2/Projects/designerwallcoverings/scripts/canary-meta-watchdog/canary-meta-watchdog.js</string>
+        <string>/opt/homebrew/bin/node</string>
+        <string>/Users/macstudio3/Projects/designerwallcoverings/scripts/canary-meta-watchdog/canary-meta-watchdog.js</string>
     </array>
     <key>WorkingDirectory</key>
-    <string>/Users/stevestudio2/Projects/designerwallcoverings/scripts/canary-meta-watchdog</string>
+    <string>/Users/macstudio3/Projects/designerwallcoverings/scripts/canary-meta-watchdog</string>
     <key>StartCalendarInterval</key>
     <dict>
         <key>Hour</key>
@@ -22,9 +22,9 @@
         <integer>30</integer>
     </dict>
     <key>StandardOutPath</key>
-    <string>/Users/stevestudio2/Projects/designerwallcoverings/scripts/canary-meta-watchdog/cron.out.log</string>
+    <string>/Users/macstudio3/Projects/designerwallcoverings/scripts/canary-meta-watchdog/cron.out.log</string>
     <key>StandardErrorPath</key>
-    <string>/Users/stevestudio2/Projects/designerwallcoverings/scripts/canary-meta-watchdog/cron.err.log</string>
+    <string>/Users/macstudio3/Projects/designerwallcoverings/scripts/canary-meta-watchdog/cron.err.log</string>
     <key>RunAtLoad</key>
     <false/>
 </dict>
diff --git a/scripts/cole-son-map-verify/cole-son-map-verify.mjs b/scripts/cole-son-map-verify/cole-son-map-verify.mjs
index 8ea9dec..773f877 100644
--- a/scripts/cole-son-map-verify/cole-son-map-verify.mjs
+++ b/scripts/cole-son-map-verify/cole-son-map-verify.mjs
@@ -10,7 +10,7 @@
 // EXCLUDES Phillip Jeffries (n/a here). Read-only Admin GraphQL + psql read only.
 import fs from 'fs';
 import { execSync } from 'child_process';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1].replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PSQL='/opt/homebrew/opt/postgresql@14/bin/psql';
diff --git a/scripts/collection-orphan-sweep/collection-orphan-sweep.mjs b/scripts/collection-orphan-sweep/collection-orphan-sweep.mjs
index c214079..acd4cd8 100644
--- a/scripts/collection-orphan-sweep/collection-orphan-sweep.mjs
+++ b/scripts/collection-orphan-sweep/collection-orphan-sweep.mjs
@@ -6,7 +6,7 @@
 // negative-controls the orphan set against the bulk — if the bulk is collection-rich, the orphans
 // are a real anomaly; if the bulk is collection-sparse, we REFRAME (no harm). EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/collection-orphan-sweep/low-membership-probe.mjs b/scripts/collection-orphan-sweep/low-membership-probe.mjs
index 5e83059..7a55f92 100644
--- a/scripts/collection-orphan-sweep/low-membership-probe.mjs
+++ b/scripts/collection-orphan-sweep/low-membership-probe.mjs
@@ -5,7 +5,7 @@
 //  (2) is 'best-seller-internal-use' (90% membership) PUBLISHED to the Online Store channel?
 //      An "internal use" collection visible to shoppers is a leak/oddity worth flagging.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/continue-masked-segmentation/continue-masked-segmentation-v2.mjs b/scripts/continue-masked-segmentation/continue-masked-segmentation-v2.mjs
index 2abfa24..8e91618 100644
--- a/scripts/continue-masked-segmentation/continue-masked-segmentation-v2.mjs
+++ b/scripts/continue-masked-segmentation/continue-masked-segmentation-v2.mjs
@@ -9,7 +9,7 @@
 //   tracked=true & qty<=0 & DENY   -> BLOCKED (should be unbuyable; c89 said 0)
 // Product class = best path: real-stock > untracked > continue-oversold > blocked. True (b) = ONLY-continue-oversold. EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/continue-masked-segmentation/continue-masked-segmentation.mjs b/scripts/continue-masked-segmentation/continue-masked-segmentation.mjs
index 4ea8dfd..efa92f6 100644
--- a/scripts/continue-masked-segmentation/continue-masked-segmentation.mjs
+++ b/scripts/continue-masked-segmentation/continue-masked-segmentation.mjs
@@ -9,7 +9,7 @@
 // never-properly-onboarded signal). NEGATIVE CONTROL: the genuinely-stocked bulk makes the masked-at-zero
 // set a distinct quantifiable population, not the norm. EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/draft-abnormal-decode/draft-abnormal-decode.mjs b/scripts/draft-abnormal-decode/draft-abnormal-decode.mjs
index 56b2be9..7ed09e7 100644
--- a/scripts/draft-abnormal-decode/draft-abnormal-decode.mjs
+++ b/scripts/draft-abnormal-decode/draft-abnormal-decode.mjs
@@ -5,7 +5,7 @@
 // Draft = off-storefront (lower live-severity) BUT the latent-activation landmine (c78): a
 // draft defect ships live the instant it's published. READ-ONLY Admin GraphQL. EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/gmc-feed-guard/data/latest.json b/scripts/gmc-feed-guard/data/latest.json
index 1515012..34724ef 100644
--- a/scripts/gmc-feed-guard/data/latest.json
+++ b/scripts/gmc-feed-guard/data/latest.json
@@ -1,9 +1,31 @@
 {
-  "generated_at": "2026-06-17T16:49:45.672Z",
-  "status": "PASS",
-  "headline": "$4.25-still-on-Google=0 of 74441 active (target 0)",
-  "scanned": 74441,
-  "still_on_425": 0,
-  "offenders": [],
-  "elapsed_s": 232
+  "generated_at": "2026-08-10T16:13:07.845Z",
+  "status": "FAIL",
+  "headline": "sample-leak(real-roll feeding $4.25 on Google)=48745 of 85856 active (target 0); sample-only-$4.25=0 (legit)",
+  "scanned": 85856,
+  "sample_leaks": 48745,
+  "sample_only_425": 0,
+  "offenders": [
+    "venezia-glass-beads-bronzino-gls-114-glass-beads-bronzino [Glitter Walls] min=$4.25 high=$81.41",
+    "the-original-heavy-madagascar-cloth-raffia-wall-paper-mad-100 [Madagascar Walls] min=$4.25 high=$105.89",
+    "grasscloth-wiki-horizontal-aba-311 [Phillipe Romano] min=$4.25 high=$27.06",
+    "grasscloth-tightwiki-ab327-deep-wedgewood-blue-grs-ab327 [Phillipe Romano] min=$4.25 high=$42.5",
+    "grasscloth-tightwiki-ab320-peach-grasscloth-tightwiki-ab320-peach [Phillipe Romano] min=$4.25 high=$37.5",
+    "grasscloth-tightwiki-light-blue-grs-1825 [Phillipe Romano] min=$4.25 high=$42.5",
+    "grasscloth-tightwiki-chocolate-mocha-grs-1819 [Phillipe Romano] min=$4.25 high=$37.5",
+    "grasscloth-tightwiki-tight-caramel-grasscloth-tightwiki-ab305-light [Phillipe Romano] min=$4.25 high=$37.5",
+    "grasscloth-tightwiki-ab318-golden-yellow-grasscloth-tightwiki-ab318-gyell [Phillipe Romano] min=$4.25 high=$37.5",
+    "grasscloth-tightwiki-mixed-naturals-grs-1808 [Phillipe Romano] min=$4.25 high=$18.82",
+    "grasscloth-slubs-natural-ab311-grs-ab311 [Phillipe Romano] min=$4.25 high=$25.88",
+    "brown-tone-paper-weave-grass-2006-grass-2006 [Phillipe Romano] min=$4.25 high=$27.06",
+    "multicolor-sisal-weave-grass-2007-grass-2007 [Phillipe Romano] min=$4.25 high=$33.18",
+    "1970s-daisy-wall-paper-10xrl15b99 [Fentucci] min=$4.25 high=$58.76",
+    "black-and-white-paisley-wall-paper-paisley10xrv999 [Retro Walls] min=$4.25 high=$58.76",
+    "balihigh-gold-tan-natural-bamboo-grasscloth-wallpaper-grs-6262 [Phillipe Romano] min=$4.25 high=$16.76",
+    "medium-heavy-madagascar-cloth-wall-paper-mad-42022 [Madagascar Walls] min=$4.25 high=$105.89",
+    "red-grasscloth-tight-weave-wall-paper-wgrs-2254 [Phillipe Romano] min=$4.25 high=$16.71",
+    "light-mocha-grasscloth-wgrs-2016 [Phillipe Romano] min=$4.25 high=$11.71",
+    "reeded-bamboo-chinese-red-tones-qweb1000 [Phillipe Romano] min=$4.25 high=$23.76"
+  ],
+  "elapsed_s": 245
 }
\ No newline at end of file
diff --git a/scripts/gmc-feed-guard/gmc-feed-guard.mjs b/scripts/gmc-feed-guard/gmc-feed-guard.mjs
index 94d8454..c6a21f6 100644
--- a/scripts/gmc-feed-guard/gmc-feed-guard.mjs
+++ b/scripts/gmc-feed-guard/gmc-feed-guard.mjs
@@ -1,9 +1,12 @@
-// gmc-feed-guard (c57) — READ-ONLY standing canary. Counts ACTIVE products whose
-// min-variant price <= $4.25 that are STILL published on the Google & YouTube
-// channel (pub 29646651457). After the c-GMC surgical exclusion this should be ~0;
-// any reappearance = a re-leak (new import re-published a $4.25 product to Google).
-// Hardened: retry/backoff on non-JSON/429/5xx (fixes the c55 crash). Writes
-// data/latest.json (c34 heartbeat). FAIL if still_on >0. $0.
+// gmc-feed-guard (c58) — READ-ONLY standing canary. Enforces Steve's policy
+// (2026-07-08): "$4.25 is fine to show on SAMPLE-ONLY items; always show the
+// HIGHEST price only." So a violation is a product that HAS a real roll variant
+// (>$4.25) yet still leaks its $4.25 sample as the min price while published to
+// the Google & YouTube channel (pub 29646651457) — Google reads minVariantPrice,
+// so those get price-mismatch DISAPPROVED. Sample-only $4.25 products are LEGIT
+// and are counted separately (informational), never a FAIL.
+// Hardened: retry/backoff on non-JSON/429/5xx. Writes data/latest.json (heartbeat).
+// FAIL if any sample-leak found. $0.
 import fs from 'fs';
 const T=(fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
 const API='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
@@ -15,25 +18,35 @@ async function gql(q,v){
   for(let a=0;a<7;a++){
     try{ const r=await fetch(API,{method:'POST',headers:{'X-Shopify-Access-Token':T,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v||{}}),signal:AbortSignal.timeout(20000)});
       if(r.status===429||r.status>=500){await sleep(2500*(a+1));continue;}
-      const txt=await r.text(); let j; try{j=JSON.parse(txt);}catch(e){await sleep(2500*(a+1));continue;}  // non-JSON → retry (the c55 crash)
+      const txt=await r.text(); let j; try{j=JSON.parse(txt);}catch(e){await sleep(2500*(a+1));continue;}
       if(j.errors&&JSON.stringify(j.errors).match(/THROTTLED/)){await sleep(2500*(a+1));continue;}
       return j;
     }catch(e){ await sleep(2000*(a+1)); }
   }
   throw new Error('exhausted retries');
 }
-let cur=null,scanned=0,on425=0,pages=0,retries=0; const offenders=[]; const t0=Date.now();
+let cur=null,scanned=0,leaks=0,sampleOnly=0,pages=0; const offenders=[]; const t0=Date.now();
 do{
   const d=await gql(`query($c:String){products(first:150,after:$c,query:"status:active"){pageInfo{hasNextPage endCursor} nodes{handle vendor onGoogle:publishedOnPublication(publicationId:"${GOOG}") variants(first:60){nodes{price}}}}}`,{c:cur});
   const pg=d.data.products;
-  for(const p of pg.nodes){ scanned++; const mn=Math.min(...p.variants.nodes.map(v=>parseFloat(v.price)).filter(x=>!isNaN(x))); if(mn<=4.25 && p.onGoogle){on425++; const hasReal=p.variants.nodes.some(v=>parseFloat(v.price)>4.25); if(offenders.length<20)offenders.push((hasReal?'[sample-leak] ':'[real-$4.25] ')+p.handle+' ['+p.vendor+']');} }
-  pages++; if(pages%80===0)process.stderr.write(`  ...${scanned} scanned, still-on=${on425}\n`);
+  for(const p of pg.nodes){ scanned++;
+    const prices=p.variants.nodes.map(v=>parseFloat(v.price)).filter(x=>!isNaN(x));
+    if(!prices.length) continue;
+    const mn=Math.min(...prices), mx=Math.max(...prices);
+    if(mn<=4.25 && p.onGoogle){
+      const hasReal = mx>4.25;           // has a real roll variant above the $4.25 sample
+      if(hasReal){ leaks++; if(offenders.length<20)offenders.push(`${p.handle} [${p.vendor}] min=$${mn} high=$${mx}`); }
+      else sampleOnly++;                  // sample-only $4.25 — legit under the new policy
+    }
+  }
+  pages++; if(pages%80===0)process.stderr.write(`  ...${scanned} scanned, sample-leaks=${leaks}\n`);
   cur=pg.pageInfo.hasNextPage?pg.pageInfo.endCursor:null;
 }while(cur);
-const verdict = on425>0 ? 'FAIL' : 'PASS';
-const out={generated_at:new Date().toISOString(), status:verdict, headline:`$4.25-still-on-Google=${on425} of ${scanned} active (target 0)`, scanned, still_on_425:on425, offenders, elapsed_s:((Date.now()-t0)/1000)|0};
+const verdict = leaks>0 ? 'FAIL' : 'PASS';
+const out={generated_at:new Date().toISOString(), status:verdict, headline:`sample-leak(real-roll feeding $4.25 on Google)=${leaks} of ${scanned} active (target 0); sample-only-$4.25=${sampleOnly} (legit)`, scanned, sample_leaks:leaks, sample_only_425:sampleOnly, offenders, elapsed_s:((Date.now()-t0)/1000)|0};
 fs.mkdirSync(DIR,{recursive:true}); fs.writeFileSync(DIR+'/latest.json',JSON.stringify(out,null,2));
-fs.writeFileSync(Q+'/gmc-feed-guard-2026-06-17.json',JSON.stringify(out,null,2));
+const stamp=new Date().toISOString().slice(0,10);
+fs.writeFileSync(Q+`/gmc-feed-guard-${stamp}.json`,JSON.stringify(out,null,2));
 console.log(`[gmc-feed-guard] ${verdict} — ${out.headline} (full catalog, ${out.elapsed_s}s)`);
-if(on425) offenders.forEach(o=>console.log('  ⚠️ re-leak: '+o));
+if(leaks) offenders.forEach(o=>console.log('  ⚠️ sample-leak: '+o));
 process.exit(verdict==='FAIL'?2:0);
diff --git a/scripts/image-integrity-sweep/image-integrity-sweep.mjs b/scripts/image-integrity-sweep/image-integrity-sweep.mjs
index 2ae6a18..f5d78f8 100644
--- a/scripts/image-integrity-sweep/image-integrity-sweep.mjs
+++ b/scripts/image-integrity-sweep/image-integrity-sweep.mjs
@@ -5,7 +5,7 @@
 // image URLs written out for a separate small 404 spot-check (NOT a 71k full fan-out). EXCLUDES PJ.
 // NEGATIVE CONTROL by construction: if the BULK have images, a no-image product is a true anomaly.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/inverse-mislabel-disambig/inverse-mislabel-disambig.mjs b/scripts/inverse-mislabel-disambig/inverse-mislabel-disambig.mjs
index a743f5d..23346b8 100644
--- a/scripts/inverse-mislabel-disambig/inverse-mislabel-disambig.mjs
+++ b/scripts/inverse-mislabel-disambig/inverse-mislabel-disambig.mjs
@@ -12,7 +12,7 @@
 // Decision per product: untagged-Showroom (collection OR metafield present) => TAG fix (cheap, safe);
 //   else genuine-mislabel => SPLIT (gated on real cost; unexecutable for PR). EXCLUDES PJ.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/inverse-mislabel-disambig/showroom-negctrl.mjs b/scripts/inverse-mislabel-disambig/showroom-negctrl.mjs
index fe27d7f..a128100 100644
--- a/scripts/inverse-mislabel-disambig/showroom-negctrl.mjs
+++ b/scripts/inverse-mislabel-disambig/showroom-negctrl.mjs
@@ -5,7 +5,7 @@
 // no metafield), then 0/238 having them proves nothing. This samples tagged-showroom products and
 // measures collection-membership + metafield coverage = the control that validates the disambig signal.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
diff --git a/scripts/inverse-mislabel-sweep/inverse-mislabel-sweep.mjs b/scripts/inverse-mislabel-sweep/inverse-mislabel-sweep.mjs
index 4204d5f..8a59e6c 100644
--- a/scripts/inverse-mislabel-sweep/inverse-mislabel-sweep.mjs
+++ b/scripts/inverse-mislabel-sweep/inverse-mislabel-sweep.mjs
@@ -8,7 +8,7 @@
 // Sample+roll) + not showroom-tagged. NEGATIVE CONTROL: a $4.25 "Sample"-titled product must
 // NOT match; a full-price wallcovering must NOT match. READ-ONLY Admin GraphQL. EXCLUDES PJ-vendor.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/kravet-sibling-map-verify/kravet-sibling-map-verify.mjs b/scripts/kravet-sibling-map-verify/kravet-sibling-map-verify.mjs
index b698377..66dc4de 100644
--- a/scripts/kravet-sibling-map-verify/kravet-sibling-map-verify.mjs
+++ b/scripts/kravet-sibling-map-verify/kravet-sibling-map-verify.mjs
@@ -11,7 +11,7 @@
 // underprices ~3x; here we read each SKU's product_map.map_unit and only compare same-unit.
 // NEGATIVE CONTROL: reproduce a known Kravet MAP value. EXCLUDES Phillip Jeffries.
 import fs from 'fs'; import { execSync } from 'child_process';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1].replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PSQL='/opt/homebrew/opt/postgresql@14/bin/psql'; const DB='postgresql:///dw_unified?host=/tmp';
diff --git a/scripts/metafield-coverage/metafield-coverage-audit.mjs b/scripts/metafield-coverage/metafield-coverage-audit.mjs
index 7fbf1b8..f9d91de 100644
--- a/scripts/metafield-coverage/metafield-coverage-audit.mjs
+++ b/scripts/metafield-coverage/metafield-coverage-audit.mjs
@@ -23,7 +23,7 @@ const args = process.argv.slice(2);
 const MIN = parseInt(args.find((_,i,a)=>a[i-1]==='--min')||'60',10)||60; // WARN threshold % per axis
 const PAGE = parseInt(args.find((_,i,a)=>a[i-1]==='--page')||'50',10)||50;
 const SHOP='designer-laboratory-sandbox.myshopify.com', VERSION='2024-10';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOKEN=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
 if(!TOKEN){console.error('no SHOPIFY_ADMIN_TOKEN');process.exit(1);}
 const URL=`https://${SHOP}/admin/api/${VERSION}/graphql.json`;
diff --git a/scripts/multivariant-zero-sweep/multivariant-zero-sweep.mjs b/scripts/multivariant-zero-sweep/multivariant-zero-sweep.mjs
index 134fec3..ebcfd5a 100644
--- a/scripts/multivariant-zero-sweep/multivariant-zero-sweep.mjs
+++ b/scripts/multivariant-zero-sweep/multivariant-zero-sweep.mjs
@@ -14,7 +14,7 @@
 // coverage incomplete → totals are lower bounds.
 // ONLY a read query is ever sent — never a mutation. EXCLUDES Phillip Jeffries.
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]?.replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/nav-link-reachability/navmenus-admin-probe.mjs b/scripts/nav-link-reachability/navmenus-admin-probe.mjs
index 1a74b69..bc2b6ee 100644
--- a/scripts/nav-link-reachability/navmenus-admin-probe.mjs
+++ b/scripts/nav-link-reachability/navmenus-admin-probe.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});return r.json();}
diff --git a/scripts/orphan-products/orphan-products-scan.mjs b/scripts/orphan-products/orphan-products-scan.mjs
index c898e3a..ecea0ff 100644
--- a/scripts/orphan-products/orphan-products-scan.mjs
+++ b/scripts/orphan-products/orphan-products-scan.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const T=(fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8').match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
+const T=(fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8').match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1];
 const URL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
 async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(URL,{method:'POST',headers:{'X-Shopify-Access-Token':T,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v||{}})});if(r.status===429){await sleep(2000);continue;}const j=await r.json();if(j.errors&&JSON.stringify(j.errors).match(/THROTTLED/)){await sleep(2000);continue;}return j;}throw new Error('throttled');}
diff --git a/scripts/osborne-little-basis/ol-basis-decode.mjs b/scripts/osborne-little-basis/ol-basis-decode.mjs
index 13403bf..a390382 100644
--- a/scripts/osborne-little-basis/ol-basis-decode.mjs
+++ b/scripts/osborne-little-basis/ol-basis-decode.mjs
@@ -4,7 +4,7 @@
 // kravet_authoritative_pricing? in product_map? costed? Classifies current-mislabel vs
 // disco-straggler. Read-only Admin GraphQL + psql. EXCLUDES Phillip Jeffries (n/a).
 import fs from 'fs'; import { execSync } from 'child_process';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PSQL='/opt/homebrew/opt/postgresql@14/bin/psql', DB='postgresql:///dw_unified?host=/tmp';
diff --git a/scripts/rl-zero-rootcause/rl-diag.mjs b/scripts/rl-zero-rootcause/rl-diag.mjs
index 416fe93..6e8ece8 100644
--- a/scripts/rl-zero-rootcause/rl-diag.mjs
+++ b/scripts/rl-zero-rootcause/rl-diag.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1].replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const sleep=ms=>new Promise(r=>setTimeout(r,ms));
diff --git a/scripts/sitemap-emergence/gen-philipperomano-sitemap.mjs b/scripts/sitemap-emergence/gen-philipperomano-sitemap.mjs
index f502f27..4121687 100644
--- a/scripts/sitemap-emergence/gen-philipperomano-sitemap.mjs
+++ b/scripts/sitemap-emergence/gen-philipperomano-sitemap.mjs
@@ -4,7 +4,7 @@
 // Writes a PROOF file to ~/.claude/yolo-queue/ — does NOT deploy or touch the live
 // server (wiring a /sitemap.xml route + deploy is Steve-gated). $0, local.
 import fs from 'node:fs';
-const SRC='/Users/stevestudio2/Projects/philipperomano/data/products.json';
+const SRC='/Users/macstudio3/Projects/philipperomano/data/products.json';
 const OUT=`${process.env.HOME}/.claude/yolo-queue/philipperomano-sitemap-PROOF.xml`;
 const BASE='https://philipperomano.com';
 const data=JSON.parse(fs.readFileSync(SRC,'utf8'));
diff --git a/scripts/staged-launchd/alt-text-coverage/com.steve.alt-text-coverage.plist b/scripts/staged-launchd/alt-text-coverage/com.steve.alt-text-coverage.plist
index 05414f0..e0e34f6 100644
--- a/scripts/staged-launchd/alt-text-coverage/com.steve.alt-text-coverage.plist
+++ b/scripts/staged-launchd/alt-text-coverage/com.steve.alt-text-coverage.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.alt-text-coverage</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.sh</string></array>
   <key>StartCalendarInterval</key><dict><key>Weekday</key><integer>4</integer><key>Hour</key><integer>3</integer><key>Minute</key><integer>0</integer></dict>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/alt-text-coverage.log</string>
diff --git a/scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.sh b/scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.sh
index bf56e87..918ac9a 100755
--- a/scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.sh
+++ b/scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs alt-text-coverage then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/alt-text-coverage/alt-text-coverage-audit.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/alt-text-coverage/alt-text-coverage-audit.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/alt-text-coverage.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/com.steve.backup-freshness.plist b/scripts/staged-launchd/com.steve.backup-freshness.plist
index 7754809..1394303 100644
--- a/scripts/staged-launchd/com.steve.backup-freshness.plist
+++ b/scripts/staged-launchd/com.steve.backup-freshness.plist
@@ -10,7 +10,7 @@
     <key>ProgramArguments</key>
     <array>
         <string>/bin/bash</string>
-        <string>/Users/stevestudio2/Projects/backup-freshness-checker/check-backups.sh</string>
+        <string>/Users/macstudio3/Projects/backup-freshness-checker/check-backups.sh</string>
     </array>
     <key>StartCalendarInterval</key>
     <dict>
diff --git a/scripts/staged-launchd/com.steve.secrets-env-backup.plist b/scripts/staged-launchd/com.steve.secrets-env-backup.plist
index a21589c..495f227 100644
--- a/scripts/staged-launchd/com.steve.secrets-env-backup.plist
+++ b/scripts/staged-launchd/com.steve.secrets-env-backup.plist
@@ -11,7 +11,7 @@
     <key>ProgramArguments</key>
     <array>
         <string>/bin/bash</string>
-        <string>/Users/stevestudio2/Projects/secrets-manager/scripts/backup-env.sh</string>
+        <string>/Users/macstudio3/Projects/secrets-manager/scripts/backup-env.sh</string>
         <string>--apply</string>
     </array>
     <key>StartCalendarInterval</key>
diff --git a/scripts/staged-launchd/gmc-feed-guard/com.steve.gmc-feed-guard.plist b/scripts/staged-launchd/gmc-feed-guard/com.steve.gmc-feed-guard.plist
index 677ab58..f8fda73 100644
--- a/scripts/staged-launchd/gmc-feed-guard/com.steve.gmc-feed-guard.plist
+++ b/scripts/staged-launchd/gmc-feed-guard/com.steve.gmc-feed-guard.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.gmc-feed-guard</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.sh</string></array>
   <key>StartInterval</key><integer>86400</integer>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/gmc-feed-guard.log</string>
diff --git a/scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.sh b/scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.sh
index b9e4f10..0e3b6a4 100755
--- a/scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.sh
+++ b/scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs gmc-feed-guard then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/gmc-feed-guard/gmc-feed-guard.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/gmc-feed-guard/gmc-feed-guard.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/gmc-feed-guard.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/handle-freshness/com.steve.handle-freshness.plist b/scripts/staged-launchd/handle-freshness/com.steve.handle-freshness.plist
index 57fba58..56e03df 100644
--- a/scripts/staged-launchd/handle-freshness/com.steve.handle-freshness.plist
+++ b/scripts/staged-launchd/handle-freshness/com.steve.handle-freshness.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.handle-freshness</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/handle-freshness/run-handle-freshness.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/handle-freshness/run-handle-freshness.sh</string></array>
   <key>StartInterval</key><integer>86400</integer>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/handle-freshness.log</string>
diff --git a/scripts/staged-launchd/handle-freshness/run-handle-freshness.sh b/scripts/staged-launchd/handle-freshness/run-handle-freshness.sh
index 2c5a3c2..9c56276 100755
--- a/scripts/staged-launchd/handle-freshness/run-handle-freshness.sh
+++ b/scripts/staged-launchd/handle-freshness/run-handle-freshness.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs handle-freshness then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/handle-freshness/handle-freshness-canary.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/handle-freshness/handle-freshness-canary.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/handle-freshness.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/live-price-canary/com.steve.live-price-canary.plist b/scripts/staged-launchd/live-price-canary/com.steve.live-price-canary.plist
index 3949a83..c58c3a8 100644
--- a/scripts/staged-launchd/live-price-canary/com.steve.live-price-canary.plist
+++ b/scripts/staged-launchd/live-price-canary/com.steve.live-price-canary.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.live-price-canary</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/live-price-canary/run-live-price-canary.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/live-price-canary/run-live-price-canary.sh</string></array>
   <key>StartInterval</key><integer>86400</integer>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/live-price-canary.log</string>
diff --git a/scripts/staged-launchd/live-price-canary/run-live-price-canary.sh b/scripts/staged-launchd/live-price-canary/run-live-price-canary.sh
index fc1f171..b13cd08 100755
--- a/scripts/staged-launchd/live-price-canary/run-live-price-canary.sh
+++ b/scripts/staged-launchd/live-price-canary/run-live-price-canary.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs live-price-canary then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/live-price-canary/live-price-canary.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/live-price-canary/live-price-canary.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/live-price-canary.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/metafield-coverage/com.steve.metafield-coverage.plist b/scripts/staged-launchd/metafield-coverage/com.steve.metafield-coverage.plist
index 6203e67..fdd8e06 100644
--- a/scripts/staged-launchd/metafield-coverage/com.steve.metafield-coverage.plist
+++ b/scripts/staged-launchd/metafield-coverage/com.steve.metafield-coverage.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.metafield-coverage</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/metafield-coverage/run-metafield-coverage.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/metafield-coverage/run-metafield-coverage.sh</string></array>
   <key>StartCalendarInterval</key><dict><key>Weekday</key><integer>3</integer><key>Hour</key><integer>3</integer><key>Minute</key><integer>0</integer></dict>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/metafield-coverage.log</string>
diff --git a/scripts/staged-launchd/metafield-coverage/run-metafield-coverage.sh b/scripts/staged-launchd/metafield-coverage/run-metafield-coverage.sh
index 192f309..2c3eee9 100755
--- a/scripts/staged-launchd/metafield-coverage/run-metafield-coverage.sh
+++ b/scripts/staged-launchd/metafield-coverage/run-metafield-coverage.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs metafield-coverage then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/metafield-coverage/metafield-coverage-audit.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/metafield-coverage/metafield-coverage-audit.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/metafield-coverage.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/no-image-scan/com.steve.no-image-scan.plist b/scripts/staged-launchd/no-image-scan/com.steve.no-image-scan.plist
index d782d8f..8e130c8 100644
--- a/scripts/staged-launchd/no-image-scan/com.steve.no-image-scan.plist
+++ b/scripts/staged-launchd/no-image-scan/com.steve.no-image-scan.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.no-image-scan</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/no-image-scan/run-no-image-scan.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/no-image-scan/run-no-image-scan.sh</string></array>
   <key>StartCalendarInterval</key><dict><key>Weekday</key><integer>5</integer><key>Hour</key><integer>3</integer><key>Minute</key><integer>0</integer></dict>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/no-image-scan.log</string>
diff --git a/scripts/staged-launchd/no-image-scan/run-no-image-scan.sh b/scripts/staged-launchd/no-image-scan/run-no-image-scan.sh
index 3516f9f..ba77952 100755
--- a/scripts/staged-launchd/no-image-scan/run-no-image-scan.sh
+++ b/scripts/staged-launchd/no-image-scan/run-no-image-scan.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs no-image-scan then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/no-image-scan/no-image-scan.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/no-image-scan/no-image-scan.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/no-image-scan.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/promote-canary.sh b/scripts/staged-launchd/promote-canary.sh
index 17f7d93..701ba98 100644
--- a/scripts/staged-launchd/promote-canary.sh
+++ b/scripts/staged-launchd/promote-canary.sh
@@ -18,7 +18,7 @@ LABEL="$1"; SCRIPT="$2"; INTERVAL="$3"; WARN="${4:-$((INTERVAL*2))}"; FAIL="${5:
 [ -z "$LABEL" ] || [ -z "$SCRIPT" ] || [ -z "$INTERVAL" ] && { echo "usage: promote-canary.sh <label> <script.mjs> <interval_s> [warn] [fail]"; exit 2; }
 BASE="$(cd "$(dirname "$0")" && pwd)/$LABEL"   # worktree-aware: write next to this script, not a hardcoded repo
 mkdir -p "$BASE"
-NODE="$(command -v node || echo /usr/local/bin/node)"
+NODE="$(command -v node || echo /opt/homebrew/bin/node)"
 
 # 1) run wrapper — runs the canary, then stamps the heartbeat on exit 0/2 (PASS/FAIL both = "it ran")
 cat > "$BASE/run-$LABEL.sh" <<WRAP
diff --git a/scripts/staged-launchd/robots-sitemap/com.steve.robots-sitemap.plist b/scripts/staged-launchd/robots-sitemap/com.steve.robots-sitemap.plist
index f7f276c..9b82503 100644
--- a/scripts/staged-launchd/robots-sitemap/com.steve.robots-sitemap.plist
+++ b/scripts/staged-launchd/robots-sitemap/com.steve.robots-sitemap.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.robots-sitemap</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/robots-sitemap/run-robots-sitemap.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/robots-sitemap/run-robots-sitemap.sh</string></array>
   <key>StartCalendarInterval</key><dict><key>Weekday</key><integer>2</integer><key>Hour</key><integer>2</integer><key>Minute</key><integer>0</integer></dict>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/robots-sitemap.log</string>
diff --git a/scripts/staged-launchd/robots-sitemap/run-robots-sitemap.sh b/scripts/staged-launchd/robots-sitemap/run-robots-sitemap.sh
index 6bf394b..ca9dbed 100755
--- a/scripts/staged-launchd/robots-sitemap/run-robots-sitemap.sh
+++ b/scripts/staged-launchd/robots-sitemap/run-robots-sitemap.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs robots-sitemap then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/robots-sitemap/robots-sitemap-canary.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/robots-sitemap/robots-sitemap-canary.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/robots-sitemap.stamp"; fi
 exit $rc
diff --git a/scripts/staged-launchd/tls-expiry/com.steve.tls-expiry.plist b/scripts/staged-launchd/tls-expiry/com.steve.tls-expiry.plist
index f405f80..9d39111 100644
--- a/scripts/staged-launchd/tls-expiry/com.steve.tls-expiry.plist
+++ b/scripts/staged-launchd/tls-expiry/com.steve.tls-expiry.plist
@@ -2,7 +2,7 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0"><dict>
   <key>Label</key><string>com.steve.tls-expiry</string>
-  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/stevestudio2/Projects/dw-yolo-loop/scripts/staged-launchd/tls-expiry/run-tls-expiry.sh</string></array>
+  <key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/macstudio3/Projects/dw-yolo-loop/scripts/staged-launchd/tls-expiry/run-tls-expiry.sh</string></array>
   <key>StartCalendarInterval</key><dict><key>Weekday</key><integer>1</integer><key>Hour</key><integer>2</integer><key>Minute</key><integer>0</integer></dict>
   <key>RunAtLoad</key><false/>
   <key>StandardOutPath</key><string>/tmp/tls-expiry.log</string>
diff --git a/scripts/staged-launchd/tls-expiry/run-tls-expiry.sh b/scripts/staged-launchd/tls-expiry/run-tls-expiry.sh
index 8079011..cdf0da7 100755
--- a/scripts/staged-launchd/tls-expiry/run-tls-expiry.sh
+++ b/scripts/staged-launchd/tls-expiry/run-tls-expiry.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # auto-generated by promote-canary.sh — runs tls-expiry then writes its heartbeat stamp
 mkdir -p "$HOME/.claude/heartbeats"
-"/usr/local/bin/node" "/Users/stevestudio2/Projects/dw-yolo-loop/scripts/tls-expiry/tls-expiry-canary.mjs"; rc=$?
+"/opt/homebrew/bin/node" "/Users/macstudio3/Projects/dw-yolo-loop/scripts/tls-expiry/tls-expiry-canary.mjs"; rc=$?
 # rc 0=PASS, 2=FAIL-verdict — both mean the canary actually executed → stamp it
 if [ $rc -eq 0 ] || [ $rc -eq 2 ]; then date -u +%Y-%m-%dT%H:%M:%SZ > "$HOME/.claude/heartbeats/tls-expiry.stamp"; fi
 exit $rc
diff --git a/scripts/zero-dollar-orderable-canary/zero-dollar-orderable-canary.mjs b/scripts/zero-dollar-orderable-canary/zero-dollar-orderable-canary.mjs
index f0daa70..7ad3a0b 100644
--- a/scripts/zero-dollar-orderable-canary/zero-dollar-orderable-canary.mjs
+++ b/scripts/zero-dollar-orderable-canary/zero-dollar-orderable-canary.mjs
@@ -18,7 +18,7 @@
 //    the under-count risk). exit 3 on live ACTIVE exposure, 0 if clean, 2 if inconclusive.
 // EXCLUDES Phillip Jeffries. Read-only Admin GraphQL; never a mutation.
 import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim(); // c78-officer: guard missing token
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/scripts/zero-roll-rootcause/era-33-diagnosis.mjs b/scripts/zero-roll-rootcause/era-33-diagnosis.mjs
index 4e2600e..14134b8 100644
--- a/scripts/zero-roll-rootcause/era-33-diagnosis.mjs
+++ b/scripts/zero-roll-rootcause/era-33-diagnosis.mjs
@@ -1,5 +1,5 @@
 import fs from 'fs';
-const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
 const TOK=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1].replace(/['"\r]/g,'').trim();
 const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
 const PJ=/phillip[- ]?jeffries/i;
diff --git a/showroom-lines-scan.js b/showroom-lines-scan.js
index beb5051..792f00d 100644
--- a/showroom-lines-scan.js
+++ b/showroom-lines-scan.js
@@ -14,7 +14,7 @@
 const fs = require('fs');
 const SHOP = 'designer-laboratory-sandbox.myshopify.com';
 const VERSION = '2024-10';
-const ENV = fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env', 'utf8');
+const ENV = fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env', 'utf8');
 const TOKEN = (ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1];
 if (!TOKEN) { console.error('no SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
 const ENDPOINT = `https://${SHOP}/admin/api/${VERSION}/graphql.json`;
diff --git a/showroom-lines-tag.js b/showroom-lines-tag.js
index 3159149..22dadcb 100644
--- a/showroom-lines-tag.js
+++ b/showroom-lines-tag.js
@@ -11,7 +11,7 @@
 const fs = require('fs');
 const SHOP = 'designer-laboratory-sandbox.myshopify.com';
 const VERSION = '2024-10';
-const ENV = fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env', 'utf8');
+const ENV = fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env', 'utf8');
 const TOKEN = (ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1];
 if (!TOKEN) { console.error('no SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
 const ENDPOINT = `https://${SHOP}/admin/api/${VERSION}/graphql.json`;
diff --git a/thibaut-mfr-fix/run-push.sh b/thibaut-mfr-fix/run-push.sh
index 0d64c97..7898ed6 100755
--- a/thibaut-mfr-fix/run-push.sh
+++ b/thibaut-mfr-fix/run-push.sh
@@ -8,7 +8,7 @@ cd "$(dirname "$0")"
 
 export SHOPIFY_STORE="designer-laboratory-sandbox.myshopify.com"   # = the live designerwallcoverings.com store
 export DATABASE_URL="postgresql:///dw_unified?host=/tmp"
-export NODE_PATH="/Users/stevestudio2/Projects/Designer-Wallcoverings/node_modules"
+export NODE_PATH="/Users/macstudio3/Projects/Designer-Wallcoverings/node_modules"
 export SHOPIFY_ADMIN_TOKEN="$(grep -hiE '^SHOPIFY_ADMIN_TOKEN=' "$HOME/Projects/secrets-manager/.env" | head -1 | cut -d= -f2- | tr -d '"'"'"' ')"
 
 if [ -z "${SHOPIFY_ADMIN_TOKEN:-}" ]; then

← 86f28e8 TK-10210: fix false no_roll_variant_price exclusion in dw-yo  ·  back to Dw Yolo Loop  ·  chore: TK-10451 scope doc + version bump v0.1.1 (session clo 05f0068 →