[object Object]

← back to Designer Wallcoverings

JS reconcile: newline-agnostic title regex + post-scrape 91xxx resolution SQL

d52584b412b9f07c74799e23902e58d4698307fd · 2026-06-25 18:14:49 -0700 · Steve Abrams

Files touched

Diff

commit d52584b412b9f07c74799e23902e58d4698307fd
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jun 25 18:14:49 2026 -0700

    JS reconcile: newline-agnostic title regex + post-scrape 91xxx resolution SQL
---
 .../reconcile-91xxx-post-scrape.sql                | 64 ++++++++++++++++++++++
 .../scrape-js-via-openclaw.mjs                     |  2 +-
 2 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/scripts/jeffrey-stevens-reconcile/reconcile-91xxx-post-scrape.sql b/scripts/jeffrey-stevens-reconcile/reconcile-91xxx-post-scrape.sql
new file mode 100644
index 00000000..83b9514b
--- /dev/null
+++ b/scripts/jeffrey-stevens-reconcile/reconcile-91xxx-post-scrape.sql
@@ -0,0 +1,64 @@
+-- 91xxx cohort current/disco resolution AFTER the live yorkwall.com scrape into york_catalog.
+-- DTD verdict C step 3 follow-on. READ-ONLY. Run: psql -d dw_unified -f reconcile-91xxx-post-scrape.sql
+-- The 491 active DWJS-91xxx SKUs were absent from brewster_york_master; their ground-truth
+-- current/discontinued status now lives in york_catalog (scraped via the authed trade portal).
+
+\echo '== 91xxx cohort: portal-scrape coverage (how many of 491 now resolved) =='
+WITH cohort AS (
+  SELECT s.mfr_sku,
+         COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) eff,
+         s.status shopify_status
+  FROM shopify_products s
+  WHERE s.vendor ILIKE 'jeffrey stevens' AND s.status='ACTIVE'
+    AND COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) LIKE 'DWJS-91%')
+SELECT count(*) cohort_active_skus,
+       count(y.mfr_sku) resolved_in_york_catalog,
+       count(*) - count(y.mfr_sku) still_unresolved
+FROM cohort c LEFT JOIN york_catalog y ON y.mfr_sku = c.mfr_sku
+  AND y.crawled_at > NOW() - INTERVAL '1 day';
+
+\echo '== 91xxx cohort: ground-truth status from the fresh scrape =='
+WITH cohort AS (
+  SELECT s.mfr_sku,
+         COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) eff
+  FROM shopify_products s
+  WHERE s.vendor ILIKE 'jeffrey stevens' AND s.status='ACTIVE'
+    AND COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) LIKE 'DWJS-91%')
+SELECT COALESCE(y.sku_status,'(not on portal)') portal_status, count(*)
+FROM cohort c
+LEFT JOIN york_catalog y ON y.mfr_sku = c.mfr_sku AND y.crawled_at > NOW() - INTERVAL '1 day'
+GROUP BY 1 ORDER BY 2 DESC;
+
+\echo '== ACTION BUCKET A: Shopify-ACTIVE but portal says DISCONTINUED -> ARCHIVE candidates =='
+WITH cohort AS (
+  SELECT s.mfr_sku, s.handle,
+         COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) eff
+  FROM shopify_products s
+  WHERE s.vendor ILIKE 'jeffrey stevens' AND s.status='ACTIVE'
+    AND COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) LIKE 'DWJS-91%')
+SELECT count(*) archive_candidates
+FROM cohort c JOIN york_catalog y ON y.mfr_sku = c.mfr_sku
+WHERE y.sku_status='Discontinued' AND y.crawled_at > NOW() - INTERVAL '1 day';
+
+\echo '== ACTION BUCKET B: portal CURRENT -> keep ACTIVE (now spec/MAP-backed) =='
+WITH cohort AS (
+  SELECT s.mfr_sku,
+         COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) eff
+  FROM shopify_products s
+  WHERE s.vendor ILIKE 'jeffrey stevens' AND s.status='ACTIVE'
+    AND COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) LIKE 'DWJS-91%')
+SELECT count(*) keep_active
+FROM cohort c JOIN york_catalog y ON y.mfr_sku = c.mfr_sku
+WHERE y.sku_status='Active' AND y.crawled_at > NOW() - INTERVAL '1 day';
+
+\echo '== ARCHIVE-candidate detail (handle + MAP + pattern) for the gated memo =='
+WITH cohort AS (
+  SELECT s.mfr_sku, s.handle,
+         COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) eff
+  FROM shopify_products s
+  WHERE s.vendor ILIKE 'jeffrey stevens' AND s.status='ACTIVE'
+    AND COALESCE(NULLIF(s.dw_sku,''), regexp_replace(s.sku,'-Sample$','','i')) LIKE 'DWJS-91%')
+SELECT c.eff, c.mfr_sku, y.pattern_name, y.us_map, c.handle
+FROM cohort c JOIN york_catalog y ON y.mfr_sku = c.mfr_sku
+WHERE y.sku_status='Discontinued' AND y.crawled_at > NOW() - INTERVAL '1 day'
+ORDER BY c.eff;
diff --git a/scripts/jeffrey-stevens-reconcile/scrape-js-via-openclaw.mjs b/scripts/jeffrey-stevens-reconcile/scrape-js-via-openclaw.mjs
index 62904a29..5b8b9861 100644
--- a/scripts/jeffrey-stevens-reconcile/scrape-js-via-openclaw.mjs
+++ b/scripts/jeffrey-stevens-reconcile/scrape-js-via-openclaw.mjs
@@ -71,7 +71,7 @@ async function lookup(sku) {
       found,
       authed: /Hello, STEVE ABRAMS/.test(T),
       sku: g(/SKU #:\\s*([0-9A-Za-z\\-]+)/),
-      title: g(/PRODUCT DETAILS\\s+([^\\n]+?)\\s+SKU #:/s),
+      title: g(/PRODUCT DETAILS\\s+(.+?)\\s+SKU #:/s),
       msrp: g(/MSRP:\\s*\\$?([0-9.,]+)/),
       uom: g(/MSRP:\\s*\\$?[0-9.,]+\\s+([A-Za-z ]+?)\\s+COLLECTION/),
       collection: g(/COLLECTION:\\s*([^\\n]+?)\\s+PRICE CODE/),

← 4d1ec978 Jeffrey Stevens reconcile: openclaw-driven authed yorkwall.c  ·  back to Designer Wallcoverings  ·  auto-save: 2026-06-25T18:36:37 (4 files) — pending-approval/ c945123f →