[object Object]

← back to Groundworks Activation

Groundworks activation complete: 94 SKUs live, 5-field clean, collection published; bake image-resize into publish.js

e5e782b45e9ac4ee91217861289a1e5c0731ff80 · 2026-07-22 08:07:31 -0700 · Steve Abrams

Files touched

Diff

commit e5e782b45e9ac4ee91217861289a1e5c0731ff80
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jul 22 08:07:31 2026 -0700

    Groundworks activation complete: 94 SKUs live, 5-field clean, collection published; bake image-resize into publish.js
---
 data/fix-images-results.json |  38 +++
 data/publish-results.json    | 633 ++++++++++++++++++++++++++++++++++++++++++-
 data/verify-results.json     |   4 +
 scripts/fix-images.js        |  53 ++++
 scripts/publish.js           |  17 +-
 scripts/verify.js            |  34 +++
 6 files changed, 771 insertions(+), 8 deletions(-)

diff --git a/data/fix-images-results.json b/data/fix-images-results.json
new file mode 100644
index 0000000..6969fac
--- /dev/null
+++ b/data/fix-images-results.json
@@ -0,0 +1,38 @@
+[
+  {
+    "dw": "DWKK-158004",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158014",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158024",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158034",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158044",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158324",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158334",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158344",
+    "fixed": true
+  },
+  {
+    "dw": "DWKK-158354",
+    "fixed": true
+  }
+]
\ No newline at end of file
diff --git a/data/publish-results.json b/data/publish-results.json
index 7968b0d..d70e591 100644
--- a/data/publish-results.json
+++ b/data/publish-results.json
@@ -1,9 +1,632 @@
 [
   {
-    "mfr_sku": "GWP-3766.6.0",
-    "dwSku": "DWKK-157424",
-    "pid": "7896260313139",
-    "title": "Argus Antique | Groundworks",
-    "price": "562.50"
+    "mfr_sku": "GWP-3738.155.0",
+    "dwSku": "DWKK-157464",
+    "pid": "7896260870195",
+    "title": "Bleecker Paper Capri/Navy | Groundworks",
+    "price": "681.00"
+  },
+  {
+    "mfr_sku": "GWP-3738.353.0",
+    "dwSku": "DWKK-157474",
+    "pid": "7896260902963",
+    "title": "Bleecker Paper Lake/Fern | Groundworks",
+    "price": "681.00"
+  },
+  {
+    "mfr_sku": "GWP-3738.424.0",
+    "dwSku": "DWKK-157484",
+    "pid": "7896260935731",
+    "title": "Bleecker Paper Spice/Gold | Groundworks",
+    "price": "681.00"
+  },
+  {
+    "mfr_sku": "GWP-3737.530.0",
+    "dwSku": "DWKK-157494",
+    "pid": "7896260968499",
+    "title": "Bond Paper Aegean | Groundworks",
+    "price": "321.00"
+  },
+  {
+    "mfr_sku": "GWP-3737.516.0",
+    "dwSku": "DWKK-157504",
+    "pid": "7896261001267",
+    "title": "Bond Paper Blue | Groundworks",
+    "price": "321.00"
+  },
+  {
+    "mfr_sku": "GWP-3737.610.0",
+    "dwSku": "DWKK-157514",
+    "pid": "7896261066803",
+    "title": "Bond Paper Multi | Groundworks",
+    "price": "321.00"
+  },
+  {
+    "mfr_sku": "GWP-3737.611.0",
+    "dwSku": "DWKK-157524",
+    "pid": "7896261132339",
+    "title": "Bond Paper Pebble | Groundworks",
+    "price": "321.00"
+  },
+  {
+    "mfr_sku": "GWP-3752.8.0",
+    "dwSku": "DWKK-157534",
+    "pid": "7896261197875",
+    "title": "Bunny Wall Small Black | Groundworks",
+    "price": "622.50"
+  },
+  {
+    "mfr_sku": "GWP-3752.101.0",
+    "dwSku": "DWKK-157544",
+    "pid": "7896261230643",
+    "title": "Bunny Wall Small Ivory | Groundworks",
+    "price": "622.50"
+  },
+  {
+    "mfr_sku": "GWP-3751.8.0",
+    "dwSku": "DWKK-157554",
+    "pid": "7896261263411",
+    "title": "Bunny Wall Black | Groundworks",
+    "price": "1410.00"
+  },
+  {
+    "mfr_sku": "GWP-3751.101.0",
+    "dwSku": "DWKK-157564",
+    "pid": "7896261296179",
+    "title": "Bunny Wall Ivory | Groundworks",
+    "price": "1410.00"
+  },
+  {
+    "mfr_sku": "GWP-3763.6106.0",
+    "dwSku": "DWKK-157574",
+    "pid": "7896261361715",
+    "title": "Calista Agate | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3763.4.0",
+    "dwSku": "DWKK-157584",
+    "pid": "7896261394483",
+    "title": "Calista Gold | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3763.13.0",
+    "dwSku": "DWKK-157594",
+    "pid": "7896261427251",
+    "title": "Calista Jade | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3763.1111.0",
+    "dwSku": "DWKK-157604",
+    "pid": "7896261460019",
+    "title": "Calista Pearl | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3763.30.0",
+    "dwSku": "DWKK-157614",
+    "pid": "7896261492787",
+    "title": "Calista Peridot | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3763.11.0",
+    "dwSku": "DWKK-157624",
+    "pid": "7896261525555",
+    "title": "Calista Silver | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3763.124.0",
+    "dwSku": "DWKK-157634",
+    "pid": "7896261558323",
+    "title": "Calista Terra | Groundworks",
+    "price": "592.50"
+  },
+  {
+    "mfr_sku": "GWP-3765.166.0",
+    "dwSku": "DWKK-157644",
+    "pid": "7896261591091",
+    "title": "Clio Jute Brass | Groundworks",
+    "price": "337.50"
+  },
+  {
+    "mfr_sku": "GWP-3765.1161.0",
+    "dwSku": "DWKK-157654",
+    "pid": "7896261656627",
+    "title": "Clio Jute Champagne | Groundworks",
+    "price": "337.50"
+  },
+  {
+    "mfr_sku": "GWP-3765.1611.0",
+    "dwSku": "DWKK-157664",
+    "pid": "7896261689395",
+    "title": "Clio Jute Platinum | Groundworks",
+    "price": "337.50"
+  },
+  {
+    "mfr_sku": "GWP-3745.16.0",
+    "dwSku": "DWKK-157674",
+    "pid": "7896261722163",
+    "title": "Flash Alabaster | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3745.1121.0",
+    "dwSku": "DWKK-157684",
+    "pid": "7896261754931",
+    "title": "Flash Cinder | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3745.917.0",
+    "dwSku": "DWKK-157694",
+    "pid": "7896261787699",
+    "title": "Flash Desert | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3745.166.0",
+    "dwSku": "DWKK-157704",
+    "pid": "7896261820467",
+    "title": "Flash Sepia | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3758.106.0",
+    "dwSku": "DWKK-157714",
+    "pid": "7896261853235",
+    "title": "Gesso Clay | Groundworks",
+    "price": "298.50"
+  },
+  {
+    "mfr_sku": "GWP-3758.111.0",
+    "dwSku": "DWKK-157724",
+    "pid": "7896261886003",
+    "title": "Gesso Ivory | Groundworks",
+    "price": "298.50"
+  },
+  {
+    "mfr_sku": "GWP-3758.21.0",
+    "dwSku": "DWKK-157734",
+    "pid": "7896261951539",
+    "title": "Gesso Obsidian | Groundworks",
+    "price": "298.50"
+  },
+  {
+    "mfr_sku": "GWP-3758.4.0",
+    "dwSku": "DWKK-157744",
+    "pid": "7896261984307",
+    "title": "Gesso Ochre | Groundworks",
+    "price": "298.50"
+  },
+  {
+    "mfr_sku": "GWP-3758.116.0",
+    "dwSku": "DWKK-157754",
+    "pid": "7896262017075",
+    "title": "Gesso Sand | Groundworks",
+    "price": "298.50"
+  },
+  {
+    "mfr_sku": "GWP-3744.1121.0",
+    "dwSku": "DWKK-157764",
+    "pid": "7896262049843",
+    "title": "Glyph Charcoal | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3744.16.0",
+    "dwSku": "DWKK-157774",
+    "pid": "7896262082611",
+    "title": "Glyph Sandstone | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3744.86.0",
+    "dwSku": "DWKK-157784",
+    "pid": "7896262115379",
+    "title": "Glyph Sparrow | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3744.1311.0",
+    "dwSku": "DWKK-157794",
+    "pid": "7896262148147",
+    "title": "Glyph Steel | Groundworks",
+    "price": "319.50"
+  },
+  {
+    "mfr_sku": "GWP-3739.5.0",
+    "dwSku": "DWKK-157804",
+    "pid": "7896262180915",
+    "title": "Greene Paper Blue | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3739.16.0",
+    "dwSku": "DWKK-157814",
+    "pid": "7896262213683",
+    "title": "Greene Paper Buff | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3739.24.0",
+    "dwSku": "DWKK-157824",
+    "pid": "7896262246451",
+    "title": "Greene Paper Clay | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3739.4.0",
+    "dwSku": "DWKK-157834",
+    "pid": "7896262279219",
+    "title": "Greene Paper Gold | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3739.8.0",
+    "dwSku": "DWKK-157844",
+    "pid": "7896262311987",
+    "title": "Greene Paper Noir | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3739.50.0",
+    "dwSku": "DWKK-157854",
+    "pid": "7896262344755",
+    "title": "Greene Paper Pacific | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3739.3.0",
+    "dwSku": "DWKK-157864",
+    "pid": "7896262377523",
+    "title": "Greene Paper Spruce | Groundworks",
+    "price": "297.00"
+  },
+  {
+    "mfr_sku": "GWP-3748.7.0",
+    "dwSku": "DWKK-157874",
+    "pid": "7896262410291",
+    "title": "Hula Sisal Bloom | Groundworks",
+    "price": "252.00"
+  },
+  {
+    "mfr_sku": "GWP-3748.8.0",
+    "dwSku": "DWKK-157884",
+    "pid": "7896262443059",
+    "title": "Hula Sisal Ink | Groundworks",
+    "price": "252.00"
+  },
+  {
+    "mfr_sku": "GWP-3748.50.0",
+    "dwSku": "DWKK-157894",
+    "pid": "7896262475827",
+    "title": "Hula Sisal Navy | Groundworks",
+    "price": "252.00"
+  },
+  {
+    "mfr_sku": "GWP-3748.3.0",
+    "dwSku": "DWKK-157904",
+    "pid": "7896262508595",
+    "title": "Hula Sisal Sage | Groundworks",
+    "price": "252.00"
+  },
+  {
+    "mfr_sku": "GWP-3749.513.0",
+    "dwSku": "DWKK-157914",
+    "pid": "7896262541363",
+    "title": "Hutch Ombre Paper Blue | Groundworks",
+    "price": "747.00"
+  },
+  {
+    "mfr_sku": "GWP-3749.719.0",
+    "dwSku": "DWKK-157924",
+    "pid": "7896262574131",
+    "title": "Hutch Ombre Paper Pink | Groundworks",
+    "price": "747.00"
+  },
+  {
+    "mfr_sku": "GWP-3747.319.0",
+    "dwSku": "DWKK-157934",
+    "pid": "7896262606899",
+    "title": "Hutch Patchwork Multi | Groundworks",
+    "price": "627.00"
+  },
+  {
+    "mfr_sku": "GWP-3750.816.0",
+    "dwSku": "DWKK-157944",
+    "pid": "7896262934579",
+    "title": "Hutch Raffia Ink | Groundworks",
+    "price": "6103.50"
+  },
+  {
+    "mfr_sku": "GWP-3768.21.0",
+    "dwSku": "DWKK-157954",
+    "pid": "7896262967347",
+    "title": "Maia Flock Basalt | Groundworks",
+    "price": "517.50"
+  },
+  {
+    "mfr_sku": "GWP-3768.919.0",
+    "dwSku": "DWKK-157964",
+    "pid": "7896263000115",
+    "title": "Maia Flock Garnet | Groundworks",
+    "price": "517.50"
+  },
+  {
+    "mfr_sku": "GWP-3768.116.0",
+    "dwSku": "DWKK-157974",
+    "pid": "7896263032883",
+    "title": "Maia Flock Sand | Groundworks",
+    "price": "517.50"
+  },
+  {
+    "mfr_sku": "GWP-3768.505.0",
+    "dwSku": "DWKK-157984",
+    "pid": "7896263065651",
+    "title": "Maia Flock Sapphire | Groundworks",
+    "price": "517.50"
+  },
+  {
+    "mfr_sku": "GWP-3768.66.0",
+    "dwSku": "DWKK-157994",
+    "pid": "7896263098419",
+    "title": "Maia Flock Tiger Eye | Groundworks",
+    "price": "517.50"
+  },
+  {
+    "mfr_sku": "GWP-3755.535.0",
+    "dwSku": "DWKK-158004",
+    "pid": "7896263163955",
+    "title": "Mar Paper Aqualis | Groundworks",
+    "price": "447.00"
+  },
+  {
+    "mfr_sku": "GWP-3755.421.0",
+    "dwSku": "DWKK-158014",
+    "pid": "7896263196723",
+    "title": "Mar Paper Sahara | Groundworks",
+    "price": "447.00"
+  },
+  {
+    "mfr_sku": "GWP-3755.33.0",
+    "dwSku": "DWKK-158024",
+    "pid": "7896263229491",
+    "title": "Mar Paper Seaglass | Groundworks",
+    "price": "447.00"
+  },
+  {
+    "mfr_sku": "GWP-3755.416.0",
+    "dwSku": "DWKK-158034",
+    "pid": "7896263262259",
+    "title": "Mar Paper Shell | Groundworks",
+    "price": "447.00"
+  },
+  {
+    "mfr_sku": "GWP-3755.1521.0",
+    "dwSku": "DWKK-158044",
+    "pid": "7896263295027",
+    "title": "Mar Paper Siren | Groundworks",
+    "price": "447.00"
+  },
+  {
+    "mfr_sku": "GWP-3741.311.0",
+    "dwSku": "DWKK-158054",
+    "pid": "7896263327795",
+    "title": "Riven Aegean | Groundworks",
+    "price": "1216.50"
+  },
+  {
+    "mfr_sku": "GWP-3741.106.0",
+    "dwSku": "DWKK-158064",
+    "pid": "7896263360563",
+    "title": "Riven Bone | Groundworks",
+    "price": "1216.50"
+  },
+  {
+    "mfr_sku": "GWP-3741.113.0",
+    "dwSku": "DWKK-158074",
+    "pid": "7896263393331",
+    "title": "Riven Cloud | Groundworks",
+    "price": "1216.50"
+  },
+  {
+    "mfr_sku": "GWP-3741.811.0",
+    "dwSku": "DWKK-158084",
+    "pid": "7896263426099",
+    "title": "Riven Jet | Groundworks",
+    "price": "1216.50"
+  },
+  {
+    "mfr_sku": "GWP-3741.917.0",
+    "dwSku": "DWKK-158094",
+    "pid": "7896263458867",
+    "title": "Riven Rose Taupe | Groundworks",
+    "price": "1216.50"
+  },
+  {
+    "mfr_sku": "GWP-3754.815.0",
+    "dwSku": "DWKK-158104",
+    "pid": "7896263491635",
+    "title": "Sift Blueprint | Groundworks",
+    "price": "892.50"
+  },
+  {
+    "mfr_sku": "GWP-3754.124.0",
+    "dwSku": "DWKK-158114",
+    "pid": "7896263524403",
+    "title": "Sift Blush | Groundworks",
+    "price": "892.50"
+  },
+  {
+    "mfr_sku": "GWP-3754.421.0",
+    "dwSku": "DWKK-158124",
+    "pid": "7896263589939",
+    "title": "Sift Citron/Charcoal | Groundworks",
+    "price": "892.50"
+  },
+  {
+    "mfr_sku": "GWP-3754.1621.0",
+    "dwSku": "DWKK-158134",
+    "pid": "7896263852083",
+    "title": "Sift Espresso/Cream | Groundworks",
+    "price": "892.50"
+  },
+  {
+    "mfr_sku": "GWP-3754.13.0",
+    "dwSku": "DWKK-158144",
+    "pid": "7896263884851",
+    "title": "Sift Shadowplay | Groundworks",
+    "price": "892.50"
+  },
+  {
+    "mfr_sku": "GWP-3754.11.0",
+    "dwSku": "DWKK-158154",
+    "pid": "7896263917619",
+    "title": "Sift Silvermist | Groundworks",
+    "price": "892.50"
+  },
+  {
+    "mfr_sku": "GWP-3740.513.0",
+    "dwSku": "DWKK-158164",
+    "pid": "7896263950387",
+    "title": "Signal Paper Ocean | Groundworks",
+    "price": "1140.00"
+  },
+  {
+    "mfr_sku": "GWP-3740.1121.0",
+    "dwSku": "DWKK-158174",
+    "pid": "7896263983155",
+    "title": "Signal Paper Steel | Groundworks",
+    "price": "1140.00"
+  },
+  {
+    "mfr_sku": "GWP-3740.1624.0",
+    "dwSku": "DWKK-158184",
+    "pid": "7896264015923",
+    "title": "Signal Paper Terra | Groundworks",
+    "price": "1140.00"
+  },
+  {
+    "mfr_sku": "GWP-3742.116.0",
+    "dwSku": "DWKK-158194",
+    "pid": "7896264048691",
+    "title": "Sonoma Oatmeal | Groundworks",
+    "price": "438.00"
+  },
+  {
+    "mfr_sku": "GWP-3742.106.0",
+    "dwSku": "DWKK-158204",
+    "pid": "7896264081459",
+    "title": "Sonoma Sand | Groundworks",
+    "price": "438.00"
+  },
+  {
+    "mfr_sku": "GWP-3742.52.0",
+    "dwSku": "DWKK-158214",
+    "pid": "7896264114227",
+    "title": "Sonoma Stoke | Groundworks",
+    "price": "438.00"
+  },
+  {
+    "mfr_sku": "GWP-3764.1116.0",
+    "dwSku": "DWKK-158224",
+    "pid": "7896264146995",
+    "title": "Tetra Champagne | Groundworks",
+    "price": "262.50"
+  },
+  {
+    "mfr_sku": "GWP-3764.8.0",
+    "dwSku": "DWKK-158234",
+    "pid": "7896264179763",
+    "title": "Tetra Coal | Groundworks",
+    "price": "262.50"
+  },
+  {
+    "mfr_sku": "GWP-3764.4.0",
+    "dwSku": "DWKK-158244",
+    "pid": "7896264212531",
+    "title": "Tetra Gold | Groundworks",
+    "price": "262.50"
+  },
+  {
+    "mfr_sku": "GWP-3764.5.0",
+    "dwSku": "DWKK-158254",
+    "pid": "7896264245299",
+    "title": "Tetra Peacock | Groundworks",
+    "price": "262.50"
+  },
+  {
+    "mfr_sku": "GWP-3764.606.0",
+    "dwSku": "DWKK-158264",
+    "pid": "7896264278067",
+    "title": "Tetra Walnut | Groundworks",
+    "price": "262.50"
+  },
+  {
+    "mfr_sku": "GWP-3743.121.0",
+    "dwSku": "DWKK-158274",
+    "pid": "7896264310835",
+    "title": "Torin Ash | Groundworks",
+    "price": "318.00"
+  },
+  {
+    "mfr_sku": "GWP-3743.1617.0",
+    "dwSku": "DWKK-158284",
+    "pid": "7896264376371",
+    "title": "Torin Blush | Groundworks",
+    "price": "318.00"
+  },
+  {
+    "mfr_sku": "GWP-3743.16.0",
+    "dwSku": "DWKK-158294",
+    "pid": "7896264409139",
+    "title": "Torin Sandstone | Groundworks",
+    "price": "318.00"
+  },
+  {
+    "mfr_sku": "GWP-3743.1613.0",
+    "dwSku": "DWKK-158304",
+    "pid": "7896264441907",
+    "title": "Torin Seaglass | Groundworks",
+    "price": "318.00"
+  },
+  {
+    "mfr_sku": "GWP-3743.52.0",
+    "dwSku": "DWKK-158314",
+    "pid": "7896264474675",
+    "title": "Torin Slate | Groundworks",
+    "price": "318.00"
+  },
+  {
+    "mfr_sku": "GWP-3753.424.0",
+    "dwSku": "DWKK-158324",
+    "pid": "7896264507443",
+    "title": "Veda Clay | Groundworks",
+    "price": "1495.50"
+  },
+  {
+    "mfr_sku": "GWP-3753.1621.0",
+    "dwSku": "DWKK-158334",
+    "pid": "7896264540211",
+    "title": "Veda Limestone/Bark | Groundworks",
+    "price": "1495.50"
+  },
+  {
+    "mfr_sku": "GWP-3753.517.0",
+    "dwSku": "DWKK-158344",
+    "pid": "7896264900659",
+    "title": "Veda Mineral | Groundworks",
+    "price": "1495.50"
+  },
+  {
+    "mfr_sku": "GWP-3753.324.0",
+    "dwSku": "DWKK-158354",
+    "pid": "7896265228339",
+    "title": "Veda Patina | Groundworks",
+    "price": "1495.50"
   }
 ]
\ No newline at end of file
diff --git a/data/verify-results.json b/data/verify-results.json
new file mode 100644
index 0000000..32af8fd
--- /dev/null
+++ b/data/verify-results.json
@@ -0,0 +1,4 @@
+{
+  "ok": 94,
+  "fails": []
+}
\ No newline at end of file
diff --git a/scripts/fix-images.js b/scripts/fix-images.js
new file mode 100644
index 0000000..a929d49
--- /dev/null
+++ b/scripts/fix-images.js
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+// Remediate the 9 image-FAILED products: try resized re-upload; if still failing, draft + Needs-Image tag.
+const { Client } = require('pg');
+const fs = require('fs');
+const { execSync } = require('child_process');
+const os = require('os');
+const DOMAIN='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const TOKEN=(fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN='))||'').split('=').slice(1).join('=').trim();
+const GQL=`https://${DOMAIN}/admin/api/${API}/graphql.json`;
+const REST=`https://${DOMAIN}/admin/api/${API}`;
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});return (await r.json()).data;}
+
+(async()=>{
+  const pg=new Client({host:'/tmp',database:'dw_unified'});await pg.connect();
+  const failed=JSON.parse(fs.readFileSync(__dirname+'/../data/verify-results.json')).fails.filter(f=>f.issues&&f.issues.includes('image'));
+  const out=[];
+  for(const f of failed){
+    const pid=f.pid;
+    const row=(await pg.query(`SELECT mfr_sku,image_url,name FROM groundworks_catalog WHERE dw_sku=$1`,[f.dw])).rows[0];
+    // download + resize with sips to <=2000px, re-upload via staged? Simpler: use REST product image with a resized data URL is not allowed.
+    // Resize locally then upload via REST images.json with attachment (base64).
+    let attached=false;
+    try{
+      const tmp=`${os.tmpdir()}/gw_${f.dw}.jpg`;
+      execSync(`curl -sL -A "Mozilla/5.0" -e "https://www.kravet.com/" "${row.image_url}" -o "${tmp}"`,{stdio:'ignore'});
+      // resize longest side to 2000, quality via sips
+      execSync(`sips -Z 2000 "${tmp}" --out "${tmp}" >/dev/null 2>&1`);
+      const b64=fs.readFileSync(tmp).toString('base64');
+      const r=await fetch(`${REST}/products/${pid}/images.json`,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({image:{attachment:b64,filename:`${row.mfr_sku}.jpg`}})});
+      const jr=await r.json();
+      if(jr.image&&jr.image.id) attached=true;
+      fs.unlinkSync(tmp);
+    }catch(e){out.push({dw:f.dw,resize_err:String(e).slice(0,120)});}
+    await sleep(1500);
+    // verify featuredImage now present
+    const d=await gql(`query($id:ID!){product(id:$id){featuredImage{url}}}`,{id:`gid://shopify/Product/${pid}`});
+    if(d.product.featuredImage){
+      // ensure ACTIVE (it already is) and record fixed
+      out.push({dw:f.dw,fixed:true});
+      console.log(`  ✓ image fixed ${f.dw}`);
+    }else{
+      // draft + Needs-Image
+      await gql(`mutation($input:ProductInput!){productUpdate(input:$input){userErrors{message}}}`,{input:{id:`gid://shopify/Product/${pid}`,status:'DRAFT',tags:['Wallcovering','Groundworks','Needs-Image']}});
+      out.push({dw:f.dw,drafted:true});
+      console.log(`  ⚠ drafted + Needs-Image ${f.dw}`);
+    }
+    await sleep(600);
+  }
+  await pg.end();
+  fs.writeFileSync(__dirname+'/../data/fix-images-results.json',JSON.stringify(out,null,2));
+  console.log('fixed=',out.filter(o=>o.fixed).length,'drafted=',out.filter(o=>o.drafted).length);
+})();
diff --git a/scripts/publish.js b/scripts/publish.js
index 0e9e94d..db00968 100644
--- a/scripts/publish.js
+++ b/scripts/publish.js
@@ -159,9 +159,20 @@ async function main() {
     if (perr && perr.length) { results.push({ mfr_sku: row.mfr_sku, err: JSON.stringify(perr) }); continue; }
     const pid = cr.productCreate.product.id;
 
-    // 2) media (featured image)
-    await shopify(`mutation($pid:ID!,$media:[CreateMediaInput!]!){productCreateMedia(productId:$pid,media:$media){userErrors{field message}}}`,
-      { pid, media: [{ originalSource: row.image_url, mediaContentType: 'IMAGE' }] });
+    // 2) media (featured image). Brandfolder serves oversized print-masters that Shopify
+    // rejects ("image too large") — so resize locally to <=2000px and upload as attachment.
+    try {
+      const os = require('os'); const { execSync } = require('child_process');
+      const numericPidTmp = pid.split('/').pop();
+      const tmp = `${os.tmpdir()}/gw_${dwSku}.jpg`;
+      execSync(`curl -sL -A "Mozilla/5.0" -e "https://www.kravet.com/" "${row.image_url}" -o "${tmp}"`, { stdio: 'ignore' });
+      execSync(`sips -Z 2000 "${tmp}" --out "${tmp}" >/dev/null 2>&1`);
+      const b64 = fs.readFileSync(tmp).toString('base64');
+      await fetch(`https://${DOMAIN}/admin/api/${API}/products/${numericPidTmp}/images.json`,
+        { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Access-Token': TOKEN },
+          body: JSON.stringify({ image: { attachment: b64, filename: `${row.mfr_sku}.jpg` } }) });
+      fs.unlinkSync(tmp);
+    } catch (e) { /* image will be caught by the 5-field verify pass */ }
 
     // 3) variants: rename option "Title"->"Size" + its value -> sellable label, set price+sku, then add sample
     const sellLabel = unitLabel(row);
diff --git a/scripts/verify.js b/scripts/verify.js
new file mode 100644
index 0000000..8bd768a
--- /dev/null
+++ b/scripts/verify.js
@@ -0,0 +1,34 @@
+#!/usr/bin/env node
+// Post-publish 5-field audit of every Groundworks product on the LIVE store.
+const { Client } = require('pg');
+const fs = require('fs');
+const DOMAIN='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const TOKEN=(fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN='))||'').split('=').slice(1).join('=').trim();
+const GQL=`https://${DOMAIN}/admin/api/${API}/graphql.json`;
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});return (await r.json()).data;}
+(async()=>{
+  const pg=new Client({host:'/tmp',database:'dw_unified'});await pg.connect();
+  const rows=(await pg.query(`SELECT dw_sku,shopify_product_id FROM groundworks_catalog WHERE shopify_product_id IS NOT NULL ORDER BY dw_sku`)).rows;
+  let fails=[];let ok=0;
+  for(const r of rows){
+    const d=await gql(`query($id:ID!){product(id:$id){status featuredImage{url} tags description variants(first:10){nodes{sku price selectedOptions{value}}}}}`,{id:`gid://shopify/Product/${r.shopify_product_id}`});
+    const p=d.product; if(!p){fails.push({dw:r.dw_sku,why:'missing'});continue;}
+    const vs=p.variants.nodes;
+    const sample=vs.find(v=>v.sku && v.sku.endsWith('-Sample'));
+    const sell=vs.find(v=>v.sku && !v.sku.endsWith('-Sample'));
+    const issues=[];
+    if(!sample||Number(sample.price)!==4.25) issues.push('sample');
+    if(!sell||!(Number(sell.price)>0)) issues.push('sellable/price');
+    if(!p.featuredImage) issues.push('image');
+    if(!p.description||p.description.length<20) issues.push('description');
+    if(!p.tags||p.tags.length<2) issues.push('tags<2');
+    if(p.status!=='ACTIVE') issues.push('status='+p.status);
+    if(issues.length){fails.push({dw:r.dw_sku,pid:r.shopify_product_id,issues});}else ok++;
+    await sleep(120);
+  }
+  await pg.end();
+  console.log(`5-FIELD AUDIT: pass=${ok}  fail=${fails.length}  total=${rows.length}`);
+  if(fails.length)console.log(JSON.stringify(fails,null,2));
+  fs.writeFileSync(__dirname+'/../data/verify-results.json',JSON.stringify({ok,fails},null,2));
+})();

← 228360c Fix variant mutation sequence (option rename via optionValue  ·  back to Groundworks Activation  ·  Add deferred-150 escalation memo + blocked-SKU lists 6b72f52 →