← 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
A DW-Programming/verification/e2e-proof.jsonA DW-Programming/verification/tk11241/README.mdM DW-Programming/verification/tk11241/e2e-proof.jsonM scripts/pj-onboard-20260901M vendor-scrapers/china-seas-refresh
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 →