← 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
A .git.bak-1785779086M artmura-site/clickthrough.jsM artmura-site/package-lock.jsonM gmc-425-count.jsM gmc-feed-exclude.jsM scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjsM scripts/ai-preamble-leak-sweep/body-start-classifier.mjsM scripts/ai-preamble-leak-sweep/broad-net-bound.mjsM scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjsM scripts/alt-text-coverage/alt-text-coverage-audit.mjsM scripts/artmura-onboard/run-push-artmura.shM scripts/body-quality-scan/body-quality-scan.mjsM scripts/buyability-audit/buyability-audit.mjsM scripts/buyability-audit/policy-mechanism-probe.mjsM scripts/canary-meta-watchdog/com.steve.canary-meta-watchdog.plistM scripts/cole-son-map-verify/cole-son-map-verify.mjsM scripts/collection-orphan-sweep/collection-orphan-sweep.mjsM scripts/collection-orphan-sweep/low-membership-probe.mjsM scripts/continue-masked-segmentation/continue-masked-segmentation-v2.mjsM scripts/continue-masked-segmentation/continue-masked-segmentation.mjsM scripts/draft-abnormal-decode/draft-abnormal-decode.mjsM scripts/gmc-feed-guard/data/latest.jsonM scripts/gmc-feed-guard/gmc-feed-guard.mjsM scripts/image-integrity-sweep/image-integrity-sweep.mjsM scripts/inverse-mislabel-disambig/inverse-mislabel-disambig.mjsM scripts/inverse-mislabel-disambig/showroom-negctrl.mjsM scripts/inverse-mislabel-sweep/inverse-mislabel-sweep.mjsM scripts/kravet-sibling-map-verify/kravet-sibling-map-verify.mjsM scripts/metafield-coverage/metafield-coverage-audit.mjsM scripts/multivariant-zero-sweep/multivariant-zero-sweep.mjsM scripts/nav-link-reachability/navmenus-admin-probe.mjsM scripts/orphan-products/orphan-products-scan.mjsM scripts/osborne-little-basis/ol-basis-decode.mjsM scripts/rl-zero-rootcause/rl-diag.mjsM scripts/sitemap-emergence/gen-philipperomano-sitemap.mjsM scripts/staged-launchd/alt-text-coverage/com.steve.alt-text-coverage.plistM scripts/staged-launchd/alt-text-coverage/run-alt-text-coverage.shM scripts/staged-launchd/com.steve.backup-freshness.plistM scripts/staged-launchd/com.steve.secrets-env-backup.plistM scripts/staged-launchd/gmc-feed-guard/com.steve.gmc-feed-guard.plistM scripts/staged-launchd/gmc-feed-guard/run-gmc-feed-guard.shM scripts/staged-launchd/handle-freshness/com.steve.handle-freshness.plistM scripts/staged-launchd/handle-freshness/run-handle-freshness.shM scripts/staged-launchd/live-price-canary/com.steve.live-price-canary.plistM scripts/staged-launchd/live-price-canary/run-live-price-canary.shM scripts/staged-launchd/metafield-coverage/com.steve.metafield-coverage.plistM scripts/staged-launchd/metafield-coverage/run-metafield-coverage.shM scripts/staged-launchd/no-image-scan/com.steve.no-image-scan.plistM scripts/staged-launchd/no-image-scan/run-no-image-scan.shM scripts/staged-launchd/promote-canary.shM scripts/staged-launchd/robots-sitemap/com.steve.robots-sitemap.plistM scripts/staged-launchd/robots-sitemap/run-robots-sitemap.shM scripts/staged-launchd/tls-expiry/com.steve.tls-expiry.plistM scripts/staged-launchd/tls-expiry/run-tls-expiry.shM scripts/zero-dollar-orderable-canary/zero-dollar-orderable-canary.mjsM scripts/zero-roll-rootcause/era-33-diagnosis.mjsM showroom-lines-scan.jsM showroom-lines-tag.jsM thibaut-mfr-fix/run-push.sh
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 →