[object Object]

← back to Quadrille Showroom

chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)

17535f58e713078d8c5c04c2788c85ddeb5a7ee4 · 2026-07-03 08:08:13 -0700 · Steve

Files touched

Diff

commit 17535f58e713078d8c5c04c2788c85ddeb5a7ee4
Author: Steve <steve@designerwallcoverings.com>
Date:   Fri Jul 3 08:08:13 2026 -0700

    chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)
---
 cta/cta-harness.js                      | 12 ++++++------
 cta/cta-v1-harness.js                   | 12 ++++++------
 cta/targeted-test.js                    |  4 ++--
 scripts/clickthrough-showroom.mjs       |  2 +-
 scripts/diag-probe.mjs                  |  2 +-
 scripts/probe-boot-scene.mjs            |  2 +-
 scripts/record-boot-walk.mjs            |  2 +-
 scripts/record-carousel.mjs             |  2 +-
 scripts/record-table.mjs                |  2 +-
 scripts/shot-chunkK-avatar.mjs          |  4 ++--
 scripts/shot-clad-realgpu.mjs           |  4 ++--
 scripts/shot-numbers-realgpu.mjs        |  4 ++--
 scripts/shot-pins-tight.mjs             |  4 ++--
 scripts/verify-bootrace.mjs             |  4 ++--
 scripts/verify-carousel.mjs             |  4 ++--
 scripts/verify-openface.mjs             |  4 ++--
 scripts/verify-qh6.mjs                  |  2 +-
 scripts/verify-roomtypes.mjs            |  2 +-
 scripts/verify-scene-render.mjs         |  4 ++--
 scripts/verify-slice2-spec-legal.mjs    |  4 ++--
 scripts/verify-slice2.mjs               |  4 ++--
 scripts/verify-slice3-fps-realgpu.mjs   |  2 +-
 scripts/verify-slice3.mjs               |  4 ++--
 scripts/verify-sort-density-persist.mjs |  4 ++--
 scripts/verify-table-view.mjs           |  4 ++--
 scripts/verify-walls-on-next.mjs        |  2 +-
 26 files changed, 50 insertions(+), 50 deletions(-)

diff --git a/cta/cta-harness.js b/cta/cta-harness.js
index 0178abe..423fc05 100644
--- a/cta/cta-harness.js
+++ b/cta/cta-harness.js
@@ -13,7 +13,7 @@ const https = require('https');
 const http  = require('http');
 
 const BASE   = 'http://127.0.0.1:7690';
-const OUTDIR = '/Users/stevestudio2/Projects/quadrille-showroom/cta';
+const OUTDIR = '/Users/macstudio3/Projects/quadrille-showroom/cta';
 const SHOTS  = path.join(OUTDIR, 'shots');
 const RECS   = path.join(OUTDIR, 'rec');
 
@@ -625,7 +625,7 @@ async function runEngine(engineName, browser, results, browserbaseReplay) {
 async function runBrowserbase(results) {
   log('browserbase', 'Checking credentials...');
   let envRaw = '';
-  try { envRaw = fs.readFileSync('/Users/stevestudio2/.claude/skills/browserbase/.env', 'utf8'); } catch (e) {
+  try { envRaw = fs.readFileSync('/Users/macstudio3/.claude/skills/browserbase/.env', 'utf8'); } catch (e) {
     results.push({ component: 'Browserbase', engine: 'browserbase', rendered: false, worked: false,
       errors: 0, notes: 'SKIPPED: .env not found' });
     log('browserbase', 'SKIPPED: .env not found');
@@ -825,7 +825,7 @@ function generateReport(results, bbReplay, engineErrors) {
   let md = `# CTA Report — Quadrille Showroom\n`;
   md += `**Date:** ${new Date().toISOString()}\n`;
   md += `**Target:** ${BASE}\n`;
-  md += `**Project:** /Users/stevestudio2/Projects/quadrille-showroom\n\n`;
+  md += `**Project:** /Users/macstudio3/Projects/quadrille-showroom\n\n`;
 
   // BROKEN section at top
   const anyBroken = engines.some(e => broken[e].length > 0);
@@ -891,9 +891,9 @@ function generateReport(results, bbReplay, engineErrors) {
 
   // Recordings
   md += `\n## Recordings & Screenshots\n`;
-  md += `- Chrome recording: /Users/stevestudio2/Projects/quadrille-showroom/cta/rec/chrome.mp4 (or .webm)\n`;
-  md += `- Safari recording: /Users/stevestudio2/Projects/quadrille-showroom/cta/rec/safari.mp4 (or .webm)\n`;
-  md += `- Screenshots: /Users/stevestudio2/Projects/quadrille-showroom/cta/shots/{chrome,safari,browserbase}/\n\n`;
+  md += `- Chrome recording: /Users/macstudio3/Projects/quadrille-showroom/cta/rec/chrome.mp4 (or .webm)\n`;
+  md += `- Safari recording: /Users/macstudio3/Projects/quadrille-showroom/cta/rec/safari.mp4 (or .webm)\n`;
+  md += `- Screenshots: /Users/macstudio3/Projects/quadrille-showroom/cta/shots/{chrome,safari,browserbase}/\n\n`;
 
   // Verdict
   const chromePass = results.filter(r => r.engine === 'chrome').every(r => r.rendered && r.worked);
diff --git a/cta/cta-v1-harness.js b/cta/cta-v1-harness.js
index 115d4e3..b6a3f9a 100644
--- a/cta/cta-v1-harness.js
+++ b/cta/cta-v1-harness.js
@@ -25,7 +25,7 @@ const path = require('path');
 const https = require('https');
 
 const BASE   = 'http://127.0.0.1:7690';
-const OUTDIR = '/Users/stevestudio2/Projects/quadrille-showroom/cta';
+const OUTDIR = '/Users/macstudio3/Projects/quadrille-showroom/cta';
 const SHOTS  = path.join(OUTDIR, 'shots');
 const RECS   = path.join(OUTDIR, 'rec');
 
@@ -749,7 +749,7 @@ async function runEngine(engineName, browser, results) {
 async function runBrowserbase(results) {
   log('browserbase', 'Checking credentials...');
   let envRaw = '';
-  try { envRaw = fs.readFileSync('/Users/stevestudio2/.claude/skills/browserbase/.env', 'utf8'); }
+  try { envRaw = fs.readFileSync('/Users/macstudio3/.claude/skills/browserbase/.env', 'utf8'); }
   catch (e) {
     results.push({ component: 'Browserbase', engine: 'browserbase', rendered: false, worked: false,
       errors: 0, notes: 'SKIPPED: .env not found', errDetails: [] });
@@ -801,7 +801,7 @@ function generateReport(results, bbReplay, engineErrors) {
   let md = `# CTA Report — Quadrille Showroom V1 Definitive Build\n`;
   md += `**Date:** ${new Date().toISOString()}\n`;
   md += `**Target:** ${BASE}\n`;
-  md += `**Project:** /Users/stevestudio2/Projects/quadrille-showroom\n\n`;
+  md += `**Project:** /Users/macstudio3/Projects/quadrille-showroom\n\n`;
 
   // BROKEN section at top
   const chromeBroken = broken.chrome || [];
@@ -900,9 +900,9 @@ function generateReport(results, bbReplay, engineErrors) {
 
   // Recordings
   md += `\n## Recordings & Screenshots\n`;
-  md += `- Chrome recording: /Users/stevestudio2/Projects/quadrille-showroom/cta/rec/chrome.mp4 (or .webm)\n`;
-  md += `- Safari recording: /Users/stevestudio2/Projects/quadrille-showroom/cta/rec/safari.mp4 (or .webm)\n`;
-  md += `- Screenshots dir: /Users/stevestudio2/Projects/quadrille-showroom/cta/shots/\n\n`;
+  md += `- Chrome recording: /Users/macstudio3/Projects/quadrille-showroom/cta/rec/chrome.mp4 (or .webm)\n`;
+  md += `- Safari recording: /Users/macstudio3/Projects/quadrille-showroom/cta/rec/safari.mp4 (or .webm)\n`;
+  md += `- Screenshots dir: /Users/macstudio3/Projects/quadrille-showroom/cta/shots/\n\n`;
 
   // Verdict
   const chromeResults = results.filter(r => r.engine === 'chrome');
diff --git a/cta/targeted-test.js b/cta/targeted-test.js
index 7e09085..8573e29 100644
--- a/cta/targeted-test.js
+++ b/cta/targeted-test.js
@@ -3,7 +3,7 @@ const {chromium, webkit} = require('playwright');
 const fs = require('fs');
 const path = require('path');
 
-const SHOTS = '/Users/stevestudio2/Projects/quadrille-showroom/cta/shots';
+const SHOTS = '/Users/macstudio3/Projects/quadrille-showroom/cta/shots';
 
 async function testEngine(eng, launcher) {
   console.log('\n=== ENGINE:', eng, '===');
@@ -476,6 +476,6 @@ async function testEngine(eng, launcher) {
   }
 
   // Save JSON results
-  fs.writeFileSync('/Users/stevestudio2/Projects/quadrille-showroom/cta/targeted-results.json', JSON.stringify(allResults, null, 2));
+  fs.writeFileSync('/Users/macstudio3/Projects/quadrille-showroom/cta/targeted-results.json', JSON.stringify(allResults, null, 2));
   console.log('\nResults saved to cta/targeted-results.json');
 })().catch(e => { console.error('FATAL:', e); process.exit(1); });
diff --git a/scripts/clickthrough-showroom.mjs b/scripts/clickthrough-showroom.mjs
index 93fa0aa..816ac66 100644
--- a/scripts/clickthrough-showroom.mjs
+++ b/scripts/clickthrough-showroom.mjs
@@ -16,7 +16,7 @@
  * Run: NODE_PATH=$HOME/.npm-global/lib/node_modules node scripts/clickthrough-showroom.mjs
  * Exit 0 = clean; 1 = real defects (printed + JSON); 2 = crash.
  * ========================================================================== */
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 import fs from 'fs';
 import path from 'path';
 import { fileURLToPath } from 'url';
diff --git a/scripts/diag-probe.mjs b/scripts/diag-probe.mjs
index 9ee3367..57c85de 100644
--- a/scripts/diag-probe.mjs
+++ b/scripts/diag-probe.mjs
@@ -5,7 +5,7 @@
 //      measure how many screen pixels of clad SIDE/BACK wall are visible (raycast a grid
 //      of screen points into the scene; count hits on a roomWall mesh that carries a clad
 //      material map).  NO setMode('room'), NO park(), NO camera move.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 const browser = await chromium.launch({ args: ['--use-gl=angle','--use-angle=swiftshader','--enable-webgl','--ignore-gpu-blocklist'] });
 const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
diff --git a/scripts/probe-boot-scene.mjs b/scripts/probe-boot-scene.mjs
index c3ba6ac..487641b 100644
--- a/scripts/probe-boot-scene.mjs
+++ b/scripts/probe-boot-scene.mjs
@@ -1,4 +1,4 @@
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 
 const errors = [];
diff --git a/scripts/record-boot-walk.mjs b/scripts/record-boot-walk.mjs
index 7c928cc..7c1f4a0 100644
--- a/scripts/record-boot-walk.mjs
+++ b/scripts/record-boot-walk.mjs
@@ -17,7 +17,7 @@
  *
  * Run: node scripts/record-boot-walk.mjs
  */
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync, existsSync, renameSync, writeFileSync } from 'fs';
 import { execFileSync } from 'child_process';
diff --git a/scripts/record-carousel.mjs b/scripts/record-carousel.mjs
index 062ad53..23b8215 100644
--- a/scripts/record-carousel.mjs
+++ b/scripts/record-carousel.mjs
@@ -22,7 +22,7 @@
  *
  * Run: node scripts/record-carousel.mjs
  */
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync, existsSync, renameSync, writeFileSync } from 'fs';
 import { execFileSync } from 'child_process';
diff --git a/scripts/record-table.mjs b/scripts/record-table.mjs
index cfdfb43..f162944 100644
--- a/scripts/record-table.mjs
+++ b/scripts/record-table.mjs
@@ -1,7 +1,7 @@
 // record-table.mjs — screen-record the "At the Table" view (Phase 3):
 // enter table mode → add samples from a few different boards → drag one → click a
 // board to center the design. Playwright chromium + recordVideo, webm→mp4.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 import { execSync } from 'node:child_process';
 import fs from 'node:fs';
 const { chromium } = pw;
diff --git a/scripts/shot-chunkK-avatar.mjs b/scripts/shot-chunkK-avatar.mjs
index c56f969..4b1ebfa 100644
--- a/scripts/shot-chunkK-avatar.mjs
+++ b/scripts/shot-chunkK-avatar.mjs
@@ -3,10 +3,10 @@
 // runs the asserts: camera.position constant across yaw (posDelta 0), body present +
 // yaw-only parented (rig pitch 0 even when camera pitches down), 50 boards, click still
 // → carousel + 4-wall clad, errorCount 0, room = 20'×20'.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/chunkK';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/chunkK';
 mkdirSync(OUT, { recursive: true });
 
 const errors = [];
diff --git a/scripts/shot-clad-realgpu.mjs b/scripts/shot-clad-realgpu.mjs
index fa78684..aeb67d1 100644
--- a/scripts/shot-clad-realgpu.mjs
+++ b/scripts/shot-clad-realgpu.mjs
@@ -1,10 +1,10 @@
 // Real-GPU headed screenshot of a SELECTED state — proves the off-thread clad path
 // renders the walls right-side-up (CanvasTexture flipY) + the hero opens. Also a
 // room-preview shot so the side/back clad walls fill frame for visual inspection.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/slice3';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/slice3';
 mkdirSync(OUT, { recursive: true });
 
 const browser = await chromium.launch({ channel: 'chrome', headless: false, args: ['--use-angle=metal', '--ignore-gpu-blocklist', '--window-size=1440,900'] });
diff --git a/scripts/shot-numbers-realgpu.mjs b/scripts/shot-numbers-realgpu.mjs
index bece053..070f9ff 100644
--- a/scripts/shot-numbers-realgpu.mjs
+++ b/scripts/shot-numbers-realgpu.mjs
@@ -1,10 +1,10 @@
 // Real-GPU headed screenshot of "① Numbers ON" — pins visibly bearing their
 // globally-unique 1000QH<version> code chips. Also a tight DOM crop of one pin so
 // the code text is unambiguous in the proof, plus a JSON dump of the rendered codes.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/slice3';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/slice3';
 mkdirSync(OUT, { recursive: true });
 
 const browser = await chromium.launch({ channel: 'chrome', headless: false, args: ['--use-angle=metal', '--ignore-gpu-blocklist', '--window-size=1440,900'] });
diff --git a/scripts/shot-pins-tight.mjs b/scripts/shot-pins-tight.mjs
index 11e39bb..a7240a9 100644
--- a/scripts/shot-pins-tight.mjs
+++ b/scripts/shot-pins-tight.mjs
@@ -1,9 +1,9 @@
 // Tight, legible real-GPU proof of the code chips: open all V1 pin labels, read each
 // pin's on-screen bounding box, screenshot the union region (clip) so the 1000QHV1…
 // code chips are unambiguous. Native res, no upscale.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/slice3';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/slice3';
 const browser = await chromium.launch({ channel: 'chrome', headless: false, args: ['--use-angle=metal', '--ignore-gpu-blocklist', '--window-size=1600,1000'] });
 const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } });
 await page.goto('http://localhost:7690/', { waitUntil: 'domcontentloaded' });
diff --git a/scripts/verify-bootrace.mjs b/scripts/verify-bootrace.mjs
index 8352a64..78f2cff 100644
--- a/scripts/verify-bootrace.mjs
+++ b/scripts/verify-bootrace.mjs
@@ -8,11 +8,11 @@
 // ~2.5s via route interception, then dispatch a REAL DOM click on #showroom-canvas at
 // t≈1000ms (well before buildWingWall runs). We assert it queued, capture the pre-ready
 // screenshot, let the bank load, then assert the queued click ended in a real selection.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
 
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/bootrace';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/bootrace';
 mkdirSync(OUT, { recursive: true });
 
 const result = {};
diff --git a/scripts/verify-carousel.mjs b/scripts/verify-carousel.mjs
index ee55189..8da34f3 100644
--- a/scripts/verify-carousel.mjs
+++ b/scripts/verify-carousel.mjs
@@ -7,11 +7,11 @@
 //   - click a RIGHT-of-centre board -> carousels to centre (closes prior)
 //   - the CAMERA never moves across the whole interaction (posDelta ~0)
 //   - errorCount 0
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
 
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/carousel';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/carousel';
 mkdirSync(OUT, { recursive: true });
 
 const result = {};
diff --git a/scripts/verify-openface.mjs b/scripts/verify-openface.mjs
index 6776741..df24d55 100644
--- a/scripts/verify-openface.mjs
+++ b/scripts/verify-openface.mjs
@@ -2,11 +2,11 @@
 // NO neighbour slat-bars / frames crossing it, plus a mid-swivel "flip-through" frame.
 // Also computes a screen-space occlusion check: raycast a grid of points over the open
 // hero's face rect and assert the FIRST hit mesh is the hero's own face (nothing in front).
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
 
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/openface';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/openface';
 mkdirSync(OUT, { recursive: true });
 const result = {}, errors = [];
 
diff --git a/scripts/verify-qh6.mjs b/scripts/verify-qh6.mjs
index e89cc26..7acb364 100644
--- a/scripts/verify-qh6.mjs
+++ b/scripts/verify-qh6.mjs
@@ -1,4 +1,4 @@
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 
 const errors = [];
diff --git a/scripts/verify-roomtypes.mjs b/scripts/verify-roomtypes.mjs
index db1c3b8..b4b5502 100644
--- a/scripts/verify-roomtypes.mjs
+++ b/scripts/verify-roomtypes.mjs
@@ -8,7 +8,7 @@
 //
 // playwright is installed globally at ~/.npm-global/lib/node_modules/playwright.
 import { createRequire } from 'module';
-const require = createRequire('/Users/stevestudio2/.npm-global/lib/node_modules/');
+const require = createRequire('/Users/macstudio3/.npm-global/lib/node_modules/');
 const { chromium } = require('playwright');
 import fs from 'fs';
 import path from 'path';
diff --git a/scripts/verify-scene-render.mjs b/scripts/verify-scene-render.mjs
index 5ba6613..616b992 100644
--- a/scripts/verify-scene-render.mjs
+++ b/scripts/verify-scene-render.mjs
@@ -6,8 +6,8 @@
 import { createRequire } from 'module';
 const require = createRequire(import.meta.url);
 const CANDIDATES = ['playwright',
-  '/Users/stevestudio2/.claude/skills/hero-readability-auditor/node_modules/playwright/index.js',
-  '/Users/stevestudio2/.claude/skills/app-demo-video/node_modules/playwright/index.js'];
+  '/Users/macstudio3/.claude/skills/hero-readability-auditor/node_modules/playwright/index.js',
+  '/Users/macstudio3/.claude/skills/app-demo-video/node_modules/playwright/index.js'];
 let chromium=null; for (const c of CANDIDATES){ try{({chromium}=require(c)); if(chromium)break;}catch{} }
 if(!chromium){ console.error('playwright not found'); process.exit(2); }
 
diff --git a/scripts/verify-slice2-spec-legal.mjs b/scripts/verify-slice2-spec-legal.mjs
index 64e981f..3e4dfe7 100644
--- a/scripts/verify-slice2-spec-legal.mjs
+++ b/scripts/verify-slice2-spec-legal.mjs
@@ -18,11 +18,11 @@
 //     a FRESH selection STILL starts collapsed
 //   • camera posDelta 0 across the whole spin; yaw clamp ±72°; errorCount 0
 // ============================================================
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
 
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/slice2-spec-legal';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/slice2-spec-legal';
 mkdirSync(OUT, { recursive: true });
 
 const result = {}; const errors = [];
diff --git a/scripts/verify-slice2.mjs b/scripts/verify-slice2.mjs
index 69d9967..47cb7b3 100644
--- a/scripts/verify-slice2.mjs
+++ b/scripts/verify-slice2.mjs
@@ -5,11 +5,11 @@
 //   - detail-expanded: expand reveals 27x27 China Seas specs
 //   - spin-to-clad-wall: yaw to a side wall shows the selected pattern (clad)
 //   - camera fixed-centre (posDelta ~0), yaw still clamped ±72°, errorCount 0
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
 
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/slice2';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/slice2';
 mkdirSync(OUT, { recursive: true });
 
 const result = {};
diff --git a/scripts/verify-slice3-fps-realgpu.mjs b/scripts/verify-slice3-fps-realgpu.mjs
index 4fab056..56c5098 100644
--- a/scripts/verify-slice3-fps-realgpu.mjs
+++ b/scripts/verify-slice3-fps-realgpu.mjs
@@ -3,7 +3,7 @@
 // at single-digit FPS regardless of the app — useless for the ≥55 gate. This launches
 // a HEADED Chromium with the real Apple GPU (Metal/ANGLE) so window._perf reports the
 // genuine frame rate, then runs the same spin+select+version-switch sweep.
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 
 // Use the SYSTEM Chrome (real Apple GPU via Metal/ANGLE) — the bundled Playwright
diff --git a/scripts/verify-slice3.mjs b/scripts/verify-slice3.mjs
index 2c98e2c..cc6002a 100644
--- a/scripts/verify-slice3.mjs
+++ b/scripts/verify-slice3.mjs
@@ -15,11 +15,11 @@
 //   • confirm Slice-1/2 invariants still hold (posDelta 0, yaw clamp ±72°, 50 boards,
 //     click → 4-wall clad + hero).
 // ============================================================================
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const { chromium } = pw;
 import { mkdirSync } from 'fs';
 
-const OUT = '/Users/stevestudio2/Projects/quadrille-showroom/recordings/slice3';
+const OUT = '/Users/macstudio3/Projects/quadrille-showroom/recordings/slice3';
 mkdirSync(OUT, { recursive: true });
 
 const result = {};
diff --git a/scripts/verify-sort-density-persist.mjs b/scripts/verify-sort-density-persist.mjs
index 6638dc4..f3562e7 100644
--- a/scripts/verify-sort-density-persist.mjs
+++ b/scripts/verify-sort-density-persist.mjs
@@ -6,8 +6,8 @@ import { createRequire } from 'module';
 const require = createRequire(import.meta.url);
 const CANDIDATES = [
   'playwright',
-  '/Users/stevestudio2/.claude/skills/hero-readability-auditor/node_modules/playwright/index.js',
-  '/Users/stevestudio2/.claude/skills/app-demo-video/node_modules/playwright/index.js',
+  '/Users/macstudio3/.claude/skills/hero-readability-auditor/node_modules/playwright/index.js',
+  '/Users/macstudio3/.claude/skills/app-demo-video/node_modules/playwright/index.js',
 ];
 let chromium=null;
 for (const c of CANDIDATES){ try { ({ chromium } = require(c)); if (chromium) break; } catch {} }
diff --git a/scripts/verify-table-view.mjs b/scripts/verify-table-view.mjs
index 7a713d1..140c7e4 100644
--- a/scripts/verify-table-view.mjs
+++ b/scripts/verify-table-view.mjs
@@ -4,8 +4,8 @@
 import { createRequire } from 'module';
 const require = createRequire(import.meta.url);
 const CANDIDATES = ['playwright',
-  '/Users/stevestudio2/.claude/skills/hero-readability-auditor/node_modules/playwright/index.js',
-  '/Users/stevestudio2/.claude/skills/app-demo-video/node_modules/playwright/index.js'];
+  '/Users/macstudio3/.claude/skills/hero-readability-auditor/node_modules/playwright/index.js',
+  '/Users/macstudio3/.claude/skills/app-demo-video/node_modules/playwright/index.js'];
 let chromium=null; for (const c of CANDIDATES){ try{({chromium}=require(c)); if(chromium)break;}catch{} }
 if(!chromium){ console.error('playwright not found'); process.exit(2); }
 
diff --git a/scripts/verify-walls-on-next.mjs b/scripts/verify-walls-on-next.mjs
index a7c146c..4e5bce3 100644
--- a/scripts/verify-walls-on-next.mjs
+++ b/scripts/verify-walls-on-next.mjs
@@ -1,5 +1,5 @@
 /* Verify: every Next/Prev book-page clads the NEW design onto ALL 4 walls. */
-import pw from '/Users/stevestudio2/.npm-global/lib/node_modules/playwright/index.js';
+import pw from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
 const URL='http://127.0.0.1:7690/';
 const b=await pw.chromium.launch({channel:'chrome',args:['--use-gl=angle']});
 const c=await b.newContext({viewport:{width:1280,height:820},httpCredentials:{username:'admin',password:'DWSecure2024!'}});

← e7f3b0f auto-save: 2026-07-02T11:47:40 (2 files) — public/js/rack.js  ·  back to Quadrille Showroom  ·  (newest)