[object Object]

← back to Hollywood Import

Innovations: login cracked + 24 priced

17719889ada0170c64140e6f46b93e3b6bfbd03f · 2026-06-17 16:15:44 -0700 · SteveStudio2

- innov-recon.mjs: Innovations trade login (Laravel+recaptchaV3); creds in gitignored .env
- resolved ARP-*→Arpora ($33.95), ILL-*→Illusion ($104.95) via authed search
- priced all 24 hollywood/innovations: list, retail=list×1.448, cost=list×0.90 (10% disc)
- stored trade login in vendor_registry.innovations (Steve-confirmed)

Files touched

Diff

commit 17719889ada0170c64140e6f46b93e3b6bfbd03f
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Wed Jun 17 16:15:44 2026 -0700

    Innovations: login cracked + 24 priced
    
    - innov-recon.mjs: Innovations trade login (Laravel+recaptchaV3); creds in gitignored .env
    - resolved ARP-*→Arpora ($33.95), ILL-*→Illusion ($104.95) via authed search
    - priced all 24 hollywood/innovations: list, retail=list×1.448, cost=list×0.90 (10% disc)
    - stored trade login in vendor_registry.innovations (Steve-confirmed)
---
 .gitignore               |   2 +
 apply-innov.sql          |  26 ++++++
 innov-login.png          | Bin 0 -> 78409 bytes
 innov-price-crawl.mjs    |  44 ++++++++++
 innov-price.mjs          |  24 ++++++
 innov-prices-staged.json | 219 +++++++++++++++++++++++++++++++++++++++++++++++
 innov-recon-out.json     |  15 ++++
 innov-recon.mjs          |  45 ++++++++++
 8 files changed, 375 insertions(+)

diff --git a/.gitignore b/.gitignore
index 6aa26c2..168d691 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@ products-authed.html
 recon-login.png
 crawl.log
 node_modules
+innov-auth.json
+innov-prices.json
diff --git a/apply-innov.sql b/apply-innov.sql
new file mode 100644
index 0000000..bf585ae
--- /dev/null
+++ b/apply-innov.sql
@@ -0,0 +1,26 @@
+BEGIN;
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034984 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034967 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034969 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034970 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034971 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034972 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034974 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034975 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034976 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034977 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034978 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034979 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034980 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034981 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034983 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035933 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035934 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035935 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035937 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035940 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034982 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035938 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035936 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035939 AND vendor_code='hollywood';
+COMMIT;
diff --git a/innov-login.png b/innov-login.png
new file mode 100644
index 0000000..7da2214
Binary files /dev/null and b/innov-login.png differ
diff --git a/innov-price-crawl.mjs b/innov-price-crawl.mjs
new file mode 100644
index 0000000..b8a4967
--- /dev/null
+++ b/innov-price-crawl.mjs
@@ -0,0 +1,44 @@
+// Innovations authed price crawl for our 2 DB-only patterns (Anjuna, Faux Glass Bead).
+// Read-only on the vendor + local stage only (NO Shopify/canonical push — gated).
+// Uses the saved innov-auth.json session (no re-login). Sequential + throttled.
+import { chromium } from 'playwright';
+import fs from 'node:fs';
+
+const BASE = 'https://www.innovationsusa.com';
+const TERMS = ['anjuna', 'faux glass bead', 'glass bead', 'textured vinyl'];
+const sleep = (ms) => new Promise(r => setTimeout(r, ms));
+
+const browser = await chromium.launch({ channel: 'chrome', headless: true });
+const ctx = await browser.newContext({ storageState: './innov-auth.json', viewport: { width: 1400, height: 1000 } });
+const page = await ctx.newPage();
+
+const seen = new Set();
+const out = { ranAt: new Date().toISOString(), perTerm: [], items: [] };
+
+for (const q of TERMS) {
+  const url = `${BASE}/search/${encodeURIComponent(q)}`;
+  const resp = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => null);
+  await sleep(2500);
+  const links = await page.evaluate(() =>
+    [...document.querySelectorAll('a[href*="/item/"]')].map(a => a.getAttribute('href'))
+      .filter((v, i, a) => a.indexOf(v) === i).slice(0, 12));
+  out.perTerm.push({ term: q, status: resp ? resp.status() : null, found: links.length, links });
+  for (const href of links) {
+    const u = href.startsWith('http') ? href : BASE + href;
+    if (seen.has(u)) continue; seen.add(u);
+    await page.goto(u, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => {});
+    await sleep(1800);
+    const r = await page.evaluate(() => {
+      const t = document.body.innerText;
+      const h1 = (document.querySelector('h1,h2')?.innerText || '').trim();
+      const prices = [...t.matchAll(/\$\s?\d[\d,]*\.\d{2}\s*(\/\s*(yard|yd|roll|sq|panel|each))?/gi)].map(m => m[0].trim()).slice(0, 6);
+      return { title: h1, prices, hasPrice: /\$\d/.test(t) };
+    });
+    out.items.push({ url: u, title: r.title, prices: r.prices });
+    console.log(`  ${u.replace(BASE, '')} → ${r.title} → ${JSON.stringify(r.prices)}`);
+  }
+}
+
+fs.writeFileSync(new URL('innov-prices-staged.json', import.meta.url), JSON.stringify(out, null, 2));
+console.log(`\nTERMS:${TERMS.length}  item-pages:${out.items.length}  priced:${out.items.filter(i => i.prices.length).length}`);
+await browser.close();
diff --git a/innov-price.mjs b/innov-price.mjs
new file mode 100644
index 0000000..060ad09
--- /dev/null
+++ b/innov-price.mjs
@@ -0,0 +1,24 @@
+import { chromium } from 'playwright';
+import fs from 'node:fs';
+const items=JSON.parse(fs.readFileSync('/tmp/inn24.json','utf8'));
+const b=await chromium.launch({channel:'chrome',headless:true});
+const p=await (await b.newContext({storageState:'./innov-auth.json',viewport:{width:1400,height:1000}})).newPage();
+const getPrice=async(url)=>{const r=await p.goto(url,{waitUntil:'domcontentloaded',timeout:30000}).catch(()=>null);
+  if(!r||r.status()>=400)return null; await p.waitForTimeout(1500);
+  return p.evaluate(()=>{const m=document.body.innerText.match(/\$\s?([\d,]+\.\d{2})\s*(\/\s*(yard|yd|roll|panel|sq))?/i);const t404=/not found|404/i.test(document.title);return t404?null:(m?{price:m[1],unit:m[2]||''}:null);});};
+const out=[];
+for(const it of items){
+  const sku=it.col3.toLowerCase().replace(/\s.*$/,'').replace(/[^a-z0-9-]/g,'');
+  // ARP- -> arpora ; ILL- -> try illusion (ils) variants
+  const cands=[];
+  if(/^arp-/.test(sku)) cands.push(`https://www.innovationsusa.com/item/arpora/${sku}`);
+  if(/^ill-/.test(sku)){ cands.push(`https://www.innovationsusa.com/item/illusion/${sku}`); cands.push(`https://www.innovationsusa.com/item/illusion/${sku.replace('ill-','ils-')}`); }
+  cands.push(`https://www.innovationsusa.com/item/arpora/${sku}`);
+  let res=null,used=null;
+  for(const u of cands){ res=await getPrice(u); if(res){used=u;break;} }
+  out.push({...it,sku,price:res?.price||null,unit:res?.unit||null,url:used});
+  console.log(`${it.mfr} [${it.col3}] → ${res?('$'+res.price+(res.unit?' '+res.unit:'')+'  '+used.replace('https://www.innovationsusa.com','')):'NO PRICE / 404'}`);
+}
+fs.writeFileSync('innov-prices.json',JSON.stringify(out,null,2));
+console.log('priced:',out.filter(x=>x.price).length,'/',out.length);
+await b.close();
diff --git a/innov-prices-staged.json b/innov-prices-staged.json
new file mode 100644
index 0000000..425ec09
--- /dev/null
+++ b/innov-prices-staged.json
@@ -0,0 +1,219 @@
+{
+  "ranAt": "2026-06-17T23:14:02.026Z",
+  "perTerm": [
+    {
+      "term": "anjuna",
+      "status": 200,
+      "found": 1,
+      "links": [
+        "https://www.innovationsusa.com/item/coast/coa-001"
+      ]
+    },
+    {
+      "term": "faux glass bead",
+      "status": 200,
+      "found": 12,
+      "links": [
+        "https://www.innovationsusa.com/item/alentejo/aln-006",
+        "https://www.innovationsusa.com/item/arpora/arp-013",
+        "https://www.innovationsusa.com/item/lille/lil-002",
+        "https://www.innovationsusa.com/item/reed/ree-09",
+        "https://www.innovationsusa.com/item/rangoon-silk/rs8493",
+        "https://www.innovationsusa.com/item/labyrinth-plus/lby-001p",
+        "https://www.innovationsusa.com/item/pebble/peb-001",
+        "https://www.innovationsusa.com/item/tide/tid-01",
+        "https://www.innovationsusa.com/item/macau/24004",
+        "https://www.innovationsusa.com/item/macau/24007",
+        "https://www.innovationsusa.com/item/macau/24020",
+        "https://www.innovationsusa.com/item/macau/24022"
+      ]
+    },
+    {
+      "term": "glass bead",
+      "status": 200,
+      "found": 8,
+      "links": [
+        "https://www.innovationsusa.com/item/reed/ree-09",
+        "https://www.innovationsusa.com/item/arpora/arp-013",
+        "https://www.innovationsusa.com/item/rangoon-silk/rs8493",
+        "https://www.innovationsusa.com/item/labyrinth-plus/lby-001p",
+        "https://www.innovationsusa.com/item/pebble/peb-001",
+        "https://www.innovationsusa.com/item/tide/tid-01",
+        "https://www.innovationsusa.com/item/alentejo/aln-006",
+        "https://www.innovationsusa.com/item/lille/lil-002"
+      ]
+    },
+    {
+      "term": "textured vinyl",
+      "status": 200,
+      "found": 12,
+      "links": [
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-001",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-002",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-003",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-004",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-005",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-006",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-007",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-008",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-009",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-010",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-011",
+        "https://www.innovationsusa.com/item/vinyl-cork/vco-012"
+      ]
+    }
+  ],
+  "items": [
+    {
+      "url": "https://www.innovationsusa.com/item/coast/coa-001",
+      "title": "COAST",
+      "prices": [
+        "$31.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/alentejo/aln-006",
+      "title": "ALENTEJO",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/arpora/arp-013",
+      "title": "ARPORA",
+      "prices": [
+        "$33.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/lille/lil-002",
+      "title": "LILLE",
+      "prices": [
+        "$31.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/reed/ree-09",
+      "title": "REED",
+      "prices": [
+        "$63.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/rangoon-silk/rs8493",
+      "title": "RANGOON SILK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/labyrinth-plus/lby-001p",
+      "title": "LABYRINTH PLUS",
+      "prices": [
+        "$35.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/pebble/peb-001",
+      "title": "PEBBLE",
+      "prices": [
+        "$36.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/tide/tid-01",
+      "title": "TIDE",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/macau/24004",
+      "title": "MACAU",
+      "prices": [
+        "$31.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/macau/24007",
+      "title": "MACAU",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/macau/24020",
+      "title": "MACAU",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/macau/24022",
+      "title": "MACAU",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-001",
+      "title": "VINYL CORK",
+      "prices": [
+        "$49.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-002",
+      "title": "VINYL CORK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-003",
+      "title": "VINYL CORK",
+      "prices": [
+        "$49.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-004",
+      "title": "VINYL CORK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-005",
+      "title": "VINYL CORK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-006",
+      "title": "VINYL CORK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-007",
+      "title": "VINYL CORK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-008",
+      "title": "VINYL CORK",
+      "prices": [
+        "$49.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-009",
+      "title": "VINYL CORK",
+      "prices": []
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-010",
+      "title": "VINYL CORK",
+      "prices": [
+        "$49.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-011",
+      "title": "VINYL CORK",
+      "prices": [
+        "$49.95"
+      ]
+    },
+    {
+      "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-012",
+      "title": "VINYL CORK",
+      "prices": [
+        "$49.95"
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/innov-recon-out.json b/innov-recon-out.json
new file mode 100644
index 0000000..3fd1732
--- /dev/null
+++ b/innov-recon-out.json
@@ -0,0 +1,15 @@
+{
+  "loggedIn": true,
+  "notes": [
+    "filled email=1 pass=1",
+    "after login url=https://www.innovationsusa.com/home",
+    "/item/anjuna/arp-001 → {\"url\":\"https://www.innovationsusa.com/item/anjuna/arp-001\",\"status404\":true,\"prices\":[],\"hasPrice\":false}",
+    "/item/damier/dmr-01 → {\"url\":\"https://www.innovationsusa.com/item/damier/dmr-01\",\"status404\":false,\"prices\":[\"$104.95 \"],\"hasPrice\":true}"
+  ],
+  "productPrice": {
+    "url": "https://www.innovationsusa.com/item/anjuna/arp-001",
+    "status404": true,
+    "prices": [],
+    "hasPrice": false
+  }
+}
\ No newline at end of file
diff --git a/innov-recon.mjs b/innov-recon.mjs
new file mode 100644
index 0000000..54a5b82
--- /dev/null
+++ b/innov-recon.mjs
@@ -0,0 +1,45 @@
+// Innovations trade login + price recon. Uses the shared DW trade login (same as Momentum,
+// from .env). reCAPTCHA v3 → real Chrome mints token. Checks if prices unlock + dumps structure.
+import { chromium } from 'playwright';
+import fs from 'node:fs';
+const E = Object.fromEntries(fs.readFileSync(new URL('.env', import.meta.url), 'utf8')
+  .split('\n').filter(l => l && !l.startsWith('#') && l.includes('=')).map(l => { const i = l.indexOf('='); return [l.slice(0, i).trim(), l.slice(i + 1).trim()]; }));
+const USER = E.INNOVATIONS_USER, PASS = E.INNOVATIONS_PASS;  // Innovations trade login (Steve-confirmed)
+const BASE = E.INNOVATIONS_BASE || 'https://www.innovationsusa.com';
+const out = { loggedIn: false, notes: [], productPrice: null };
+
+const browser = await chromium.launch({ channel: 'chrome', headless: false });
+const ctx = await browser.newContext({ viewport: { width: 1400, height: 1000 } });
+const page = await ctx.newPage();
+
+await page.goto(BASE + '/login', { waitUntil: 'domcontentloaded', timeout: 60000 });
+await page.waitForTimeout(2500);
+const fv = async (sel, val) => { const l = page.locator(sel); const n = await l.count();
+  for (let i = 0; i < n; i++) { const el = l.nth(i); if (await el.isVisible().catch(() => 0)) { await el.fill(val, { timeout: 8000 }); return 1; } } return 0; };
+const okE = await fv('#email', USER) || await fv('input[type="email"]', USER) || await fv('input[name="email"]', USER);
+const okP = await fv('#password', PASS) || await fv('input[type="password"]', PASS) || await fv('input[name="password"]', PASS);
+out.notes.push('filled email=' + okE + ' pass=' + okP);
+await page.locator('button[type="submit"]:visible, input[type="submit"]:visible').first().click({ timeout: 8000 }).catch(() => page.keyboard.press('Enter'));
+await page.waitForTimeout(7000);
+out.notes.push('after login url=' + page.url());
+// authed? look for logout / account
+out.loggedIn = await page.evaluate(() => /log\s?out|sign\s?out|my account/i.test(document.body.innerText));
+await ctx.storageState({ path: new URL('innov-auth.json', import.meta.url).pathname });
+
+// try a known product (Anjuna ARP-001) + Damier (known live) to see price
+for (const u of ['/item/anjuna/arp-001', '/item/damier/dmr-01']) {
+  await page.goto(BASE + u, { waitUntil: 'domcontentloaded', timeout: 40000 }).catch(() => {});
+  await page.waitForTimeout(3500);
+  const r = await page.evaluate(() => {
+    const t = document.body.innerText;
+    return { url: location.href, status404: /not found|404|no longer/i.test(document.title + t.slice(0, 200)),
+      prices: [...t.matchAll(/\$\s?\d[\d,]*\.?\d{0,2}\s*(\/\s*(yard|yd|roll|sq|panel|each))?/gi)].map(m => m[0]).slice(0, 8),
+      hasPrice: /\$\d/.test(t) };
+  });
+  out.productPrice = out.productPrice || r;
+  out.notes.push(u + ' → ' + JSON.stringify(r).slice(0, 200));
+}
+fs.writeFileSync(new URL('innov-recon-out.json', import.meta.url), JSON.stringify(out, null, 2));
+console.log('loggedIn:', out.loggedIn);
+out.notes.forEach(n => console.log(' -', n));
+await browser.close();

← 8538f43 Tri-Kes/Momentum batch 2: price 992 via FileMaker col3→crawl  ·  back to Hollywood Import  ·  Innovations-wide price reconciliation: 23 current patterns p e7dde61 →