[object Object]

← back to Designer Wallcoverings

auto-data-snapshot: 2026-09-10T18:07:04 (5 data files) — DW-Programming/verification/e2e-proof.json DW-Programming/verification/tk11241/README.md DW-Programming/verification/tk11241/e2e-proof.json scripts/pj-onboard-20260901 vendor-scrapers/china-seas-refresh

752c4418060b310111c1e7feca1bafecb262faed · 2026-09-10 18:11:47 -0700 · auto-commit-fleet

Files touched

Diff

commit 752c4418060b310111c1e7feca1bafecb262faed
Author: auto-commit-fleet <steve@designerwallcoverings.com>
Date:   Thu Sep 10 18:11:47 2026 -0700

    auto-data-snapshot: 2026-09-10T18:07:04 (5 data files) — DW-Programming/verification/e2e-proof.json DW-Programming/verification/tk11241/README.md DW-Programming/verification/tk11241/e2e-proof.json scripts/pj-onboard-20260901 vendor-scrapers/china-seas-refresh
---
 DW-Programming/verification/e2e-proof.json         | 103 +++++++++++++++++++++
 DW-Programming/verification/tk11241/README.md      |  57 ++++++++++++
 DW-Programming/verification/tk11241/e2e-proof.json |   8 +-
 scripts/pj-onboard-20260901                        |   2 +-
 vendor-scrapers/china-seas-refresh                 |   2 +-
 5 files changed, 169 insertions(+), 3 deletions(-)

diff --git a/DW-Programming/verification/e2e-proof.json b/DW-Programming/verification/e2e-proof.json
new file mode 100644
index 00000000..4604ae9d
--- /dev/null
+++ b/DW-Programming/verification/e2e-proof.json
@@ -0,0 +1,103 @@
+{
+  "ticket": "TK-11241",
+  "intent": "Vendor HTML to attributable swatch/color to SQL payload",
+  "risk_tier": "R1",
+  "environment": "Local Chromium; captured vendor HTML; recording SQL adapter (no DB connection)",
+  "timestamp": "2026-09-11T00:40:19.238Z",
+  "checks": [
+    {
+      "name": "Real scraper browser boundary: Kaolin Earthen with absolute SKU swatch",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Live HTML siblings: real labels, unique same-pattern swatches, no shared installs",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Missing swatch fails closed despite matching room photo; HEX is not a name",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Relative, protocol-relative, lazy srcset resolve; largest width preferred",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Wrong SKU, placeholders, room shots and unsafe schemes are rejected",
+      "verdict": "PASS"
+    },
+    {
+      "name": "listing SQL boundary: absolute swatch and JSON array",
+      "verdict": "PASS"
+    },
+    {
+      "name": "legacy SQL boundary: absolute swatch and JSON array",
+      "verdict": "PASS"
+    },
+    {
+      "name": "listing SQL boundary: NULL replaces stale image and JSON array",
+      "verdict": "PASS"
+    },
+    {
+      "name": "legacy SQL boundary: NULL replaces stale image and JSON array",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Enrichment SQL boundary: HEX replaced and swatch saved without fallback",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Enrichment SQL boundary: HEX replaced and NULL saved without fallback",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Enrichment preserves already verified data when no new fields are available",
+      "verdict": "PASS"
+    },
+    {
+      "name": "scrape-versa-evo-pvcfree.js: direct invocation refuses writes without --apply",
+      "verdict": "PASS"
+    },
+    {
+      "name": "versa-evo-pvcfree-scraper.js: direct invocation refuses writes without --apply",
+      "verdict": "PASS"
+    },
+    {
+      "name": "versa-evo-enrich.js: direct invocation refuses writes without --apply",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Invalid detail page throws before any catalog update",
+      "verdict": "PASS"
+    },
+    {
+      "name": "Vendor swatch URL returns actual image",
+      "verdict": "PASS",
+      "http_status": 200,
+      "content_type": "image/jpeg",
+      "bytes": 733834
+    },
+    {
+      "name": "Staged secret scan after removing unrelated vendor scripts",
+      "verdict": "PASS",
+      "tool": "gitleaks git --staged --pre-commit --redact"
+    }
+  ],
+  "vendor_page": "https://www.versadesignedsurfaces.com/north-america/products/product-detail/kaolin-afv29-usa/avf29-128",
+  "source_sha256": {
+    "lib/versa-colorway-extraction.js": "eb3232ce8c033910186d66737e288eea412798020aff2939c23f55c88ed875cd",
+    "scrape-versa-evo-pvcfree.js": "fa471f7164ccabd6af05d7ccafbad1560f56caa061eac136879c185e6fb31857",
+    "versa-evo-pvcfree-scraper.js": "b7bd78d6407ab8421f2102973f4f0be8e0d5d5dcbafb89cb2a7d14f1098ba326",
+    "versa-evo-enrich.js": "83fb7f60e0945a3770d2e6219515bec66c6ed63288ec06f929b2f2b45bed57fa"
+  },
+  "source": "kaolin-vendor.html captured by curl from vendor on 2026-09-10; unrelated script blocks removed from retained fixture",
+  "commands": [
+    "node verification/tk11241/verify.cjs",
+    "node --check (all changed JS files)",
+    "git diff --check",
+    "curl -fsSL --max-time 35 (selected swatch URL)",
+    "gitleaks git --staged --pre-commit --redact"
+  ],
+  "live_catalog": "NOT RUN: requires Steve approval; no persisted production-state claim",
+  "cleanup": "Browser closed; fixture and evidence retained; no database, Shopify, Slack or remote writes",
+  "verdict": "PASS for local code; production refresh approval pending"
+}
diff --git a/DW-Programming/verification/tk11241/README.md b/DW-Programming/verification/tk11241/README.md
new file mode 100644
index 00000000..718d89f9
--- /dev/null
+++ b/DW-Programming/verification/tk11241/README.md
@@ -0,0 +1,57 @@
+# TK-11241 Versa scraper repair
+
+Local code is verified. Production deployment and catalog refresh remain gated.
+
+Both existing EVO inserters and the enrichment script use the same browser-side
+extractor. It reads the vendor's dedicated colorway nodes, resolves HTTP(S) image
+URLs (including lazy srcset), validates the SKU token, and excludes featured room
+photos. Missing swatches become NULL; failed or redirected detail pages are
+skipped. Real color labels come from the vendor's dedicated title elements;
+HEX values are never emitted as new color names.
+
+Both inserters replace image_url on conflict, including NULL, and replace
+all_images with a JSON array containing only the attributable swatch (or []).
+This follows Steve's September 10 swatch-only ruling. It deliberately does not
+copy pattern-level room assets into downstream product image lists. The archive
+versa_catalog_imgfix_bak_20260904 is never read or modified by this patch.
+
+Direct execution now requires --apply. That flag is an execution guard, not
+approval. Slack notifications additionally require --notify-slack and separate
+send authorization. Importing modules for verification performs no DB I/O.
+
+## Evidence
+
+Run `node verification/tk11241/verify.cjs` from DW-Programming. Requires the
+existing Playwright Chromium installation; no DB connection is made. Sixteen
+checks exercise real browser extraction of the captured September 10 vendor
+HTML (unrelated scripts removed), 12 distinct colorways, negative fixtures, both real SQL upsert builders,
+the enrichment update builder, and all three CLI guards. The SQL adapter records
+queries and parameters; these checks do not assert production persistence.
+
+The selected Kaolin Earthen AVF29-128 image also returned HTTP 200, image/jpeg,
+733834 bytes from Versa. Source SHA-256 hashes and assertions are recorded in
+e2e-proof.json and ../e2e-proof.json. No production DB, Shopify, Slack, deployment,
+or remote git writes were performed.
+
+## Production follow-through (requires approval)
+
+1. Establish the currently running scraper paths and compare their source to this
+   patch before deploying the three scripts plus lib/versa-colorway-extraction.js.
+2. Read the current canonical schema and affected rows. The ticket's last reported
+   baseline is 135 relative images and 1406 HEX color names among 2423 rows; those
+   counts were not reverified in this session (the read-only SSH probe returned no
+   usable output). Preserve versa_catalog_imgfix_bak_20260904 indefinitely.
+3. Build and review a per-row before/after refresh plan from the current vendor
+   pages. Do not blindly prefix relative room URLs. Refresh each affected row to
+   its own swatch or NULL, and JSON-normalize all_images to that swatch or [].
+   EVO entry points cover their collection only: non-EVO rows require their own
+   per-page plan using the same extractor, not an assumed full-catalog refresh.
+4. Snapshot the exact approved rows; apply a small approved canary with row-ID and
+   previous-value assertions, then read back image_url, all_images and color_name.
+   Verify HTTP image responses and per-SKU attribution before the remaining batch.
+5. Stop on a schema, identity or row-count mismatch. Reversal must restore only
+   approved changed fields from the fresh snapshot, with before-value checks.
+   Do not restore old poisoned images as a routine fallback or drop any archive.
+6. Keep Shopify writes, room-image publishing, scheduled-job changes, notifications
+   and remote git pushes separately gated. Mark the ticket done only after the
+   deployed producer and approved persisted catalog results are verified.
diff --git a/DW-Programming/verification/tk11241/e2e-proof.json b/DW-Programming/verification/tk11241/e2e-proof.json
index 385c849b..a3e51ed2 100644
--- a/DW-Programming/verification/tk11241/e2e-proof.json
+++ b/DW-Programming/verification/tk11241/e2e-proof.json
@@ -3,7 +3,7 @@
   "intent": "Vendor HTML to attributable swatch/color to SQL payload",
   "risk_tier": "R1",
   "environment": "Local Chromium; captured vendor HTML; recording SQL adapter (no DB connection)",
-  "timestamp": "2026-09-10T23:48:39.014Z",
+  "timestamp": "2026-09-11T00:40:19.238Z",
   "checks": [
     {
       "name": "Real scraper browser boundary: Kaolin Earthen with absolute SKU swatch",
@@ -71,6 +71,12 @@
     }
   ],
   "vendor_page": "https://www.versadesignedsurfaces.com/north-america/products/product-detail/kaolin-afv29-usa/avf29-128",
+  "source_sha256": {
+    "lib/versa-colorway-extraction.js": "eb3232ce8c033910186d66737e288eea412798020aff2939c23f55c88ed875cd",
+    "scrape-versa-evo-pvcfree.js": "fa471f7164ccabd6af05d7ccafbad1560f56caa061eac136879c185e6fb31857",
+    "versa-evo-pvcfree-scraper.js": "b7bd78d6407ab8421f2102973f4f0be8e0d5d5dcbafb89cb2a7d14f1098ba326",
+    "versa-evo-enrich.js": "83fb7f60e0945a3770d2e6219515bec66c6ed63288ec06f929b2f2b45bed57fa"
+  },
   "source": "kaolin-vendor.html captured by curl from vendor on 2026-09-10",
   "commands": [
     "node verification/tk11241/verify.cjs"
diff --git a/scripts/pj-onboard-20260901 b/scripts/pj-onboard-20260901
index 07e1c522..b9416c90 160000
--- a/scripts/pj-onboard-20260901
+++ b/scripts/pj-onboard-20260901
@@ -1 +1 @@
-Subproject commit 07e1c522d09339deda4f70e93684ca1b5fd2c26f
+Subproject commit b9416c9010a7900fcc4d5c809511c18452c906e9
diff --git a/vendor-scrapers/china-seas-refresh b/vendor-scrapers/china-seas-refresh
index fb360630..4cbcf43c 160000
--- a/vendor-scrapers/china-seas-refresh
+++ b/vendor-scrapers/china-seas-refresh
@@ -1 +1 @@
-Subproject commit fb360630315d0684d71081c0cd7ae468aaf888c0
+Subproject commit 4cbcf43c2f74fb5081bce4b8c1e738ad8c05cb04

← dd9b2739 auto-data-snapshot: 2026-09-10T17:00:45 (1 data files) — DW-  ·  back to Designer Wallcoverings  ·  auto-data-snapshot: 2026-09-11T06:38:19 (3 data files) — sho 0942045f →