[object Object]

← back to Wallco Ai

Quality benchmark = top-20 unified-db lines + DW Bespoke; cactus redo wiring

05fa1bcdeb31b2bc5e14f645d4cc2a1804ff2a18 · 2026-05-27 09:37:20 -0700 · Steve Abrams

- build_professional_palette_reference.js: replace ad-hoc vendor list with
  Steve's curated TOP_20_LINES (brand + aesthetic, verified present in
  shopify_color_enrichment) + DW Bespoke Studio. Zuber kept as named scenic
  anchor (0 db rows). Rebuilt benchmark over 14,804 real products.
- cactus vision rubric (scorer + sample-eval) now scores 'most like our top-20
  unified-db lines' explicitly (names the houses + DW Bespoke, bans 2x2 grid).
- generator: env-gated WALLCO_FORCE_TILEABLE circular-padding for cactus +
  tightened all-over/wrap/catalog-grade prompt criteria (cactus quality redo).

Files touched

Diff

commit 05fa1bcdeb31b2bc5e14f645d4cc2a1804ff2a18
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 27 09:37:20 2026 -0700

    Quality benchmark = top-20 unified-db lines + DW Bespoke; cactus redo wiring
    
    - build_professional_palette_reference.js: replace ad-hoc vendor list with
      Steve's curated TOP_20_LINES (brand + aesthetic, verified present in
      shopify_color_enrichment) + DW Bespoke Studio. Zuber kept as named scenic
      anchor (0 db rows). Rebuilt benchmark over 14,804 real products.
    - cactus vision rubric (scorer + sample-eval) now scores 'most like our top-20
      unified-db lines' explicitly (names the houses + DW Bespoke, bans 2x2 grid).
    - generator: env-gated WALLCO_FORCE_TILEABLE circular-padding for cactus +
      tightened all-over/wrap/catalog-grade prompt criteria (cactus quality redo).
---
 data/professional-palette-reference.json        | 863 ++++++++++++------------
 data/professional-palette-suffix.txt            |   2 +-
 scripts/build_professional_palette_reference.js |  82 ++-
 scripts/cactus-sample-eval.py                   |  74 ++
 scripts/cactus-vision-score.js                  |  13 +-
 scripts/generate-cactus.js                      |  10 +-
 scripts/generate_designs.js                     |   8 +-
 7 files changed, 573 insertions(+), 479 deletions(-)

diff --git a/data/professional-palette-reference.json b/data/professional-palette-reference.json
index 4e0783a..9d4070e 100644
--- a/data/professional-palette-reference.json
+++ b/data/professional-palette-reference.json
@@ -1,19 +1,7 @@
 {
   "source": "dw_unified.shopify_color_enrichment",
-  "ts": "2026-05-20T06:32:03.507Z",
+  "ts": "2026-05-27T16:36:31.457Z",
   "vendors_surveyed": [
-    {
-      "vendor": "Kravet",
-      "product_count": 2532
-    },
-    {
-      "vendor": "Koroseal",
-      "product_count": 2522
-    },
-    {
-      "vendor": "Phillip Jeffries",
-      "product_count": 2503
-    },
     {
       "vendor": "Schumacher",
       "product_count": 1690
@@ -34,10 +22,6 @@
       "vendor": "Osborne & Little",
       "product_count": 1021
     },
-    {
-      "vendor": "Wolf Gordon",
-      "product_count": 938
-    },
     {
       "vendor": "Designers Guild",
       "product_count": 861
@@ -66,10 +50,18 @@
       "vendor": "Brunschwig & Fils",
       "product_count": 569
     },
+    {
+      "vendor": "DW Bespoke Studio",
+      "product_count": 535
+    },
     {
       "vendor": "William Morris",
       "product_count": 526
     },
+    {
+      "vendor": "1838 Wallcoverings",
+      "product_count": 468
+    },
     {
       "vendor": "Lee Jofa",
       "product_count": 465
@@ -78,22 +70,10 @@
       "vendor": "Romo",
       "product_count": 450
     },
-    {
-      "vendor": "Innovations USA",
-      "product_count": 436
-    },
     {
       "vendor": "Thibaut",
       "product_count": 417
     },
-    {
-      "vendor": "Clarke And Clarke",
-      "product_count": 368
-    },
-    {
-      "vendor": "Gaston Y Daniela",
-      "product_count": 278
-    },
     {
       "vendor": "GP & J Baker",
       "product_count": 267
@@ -107,31 +87,43 @@
       "product_count": 244
     },
     {
-      "vendor": "Christian Lacroix Europe",
-      "product_count": 170
+      "vendor": "Arte International Wallcoverings",
+      "product_count": 7
     },
     {
-      "vendor": "Donghia",
-      "product_count": 160
+      "vendor": "Schumacher Wallcoverings",
+      "product_count": 6
     },
     {
-      "vendor": "Mulberry",
-      "product_count": 131
+      "vendor": "Arte",
+      "product_count": 5
     },
     {
       "vendor": "Pierre Frey",
       "product_count": 3
+    },
+    {
+      "vendor": "THIBAUT AT DW",
+      "product_count": 2
+    },
+    {
+      "vendor": "Ralph Lauren Wallpaper",
+      "product_count": 1
+    },
+    {
+      "vendor": "Morris and Company",
+      "product_count": 1
     }
   ],
-  "product_count": 23817,
-  "hex_instance_count": 62732,
-  "distinct_hex_count": 24212,
+  "product_count": 14804,
+  "hex_instance_count": 42334,
+  "distinct_hex_count": 19325,
   "top_50_hexes": [
     {
       "hex": "#FFFFFF",
-      "pct_of_products": 0.1014,
-      "appearances": 2414,
-      "avg_share_in_design": 21.8,
+      "pct_of_products": 0.0783,
+      "appearances": 1159,
+      "avg_share_in_design": 34.1,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -141,23 +133,23 @@
       "common_name": "ivory"
     },
     {
-      "hex": "#6B382C",
-      "pct_of_products": 0.0742,
-      "appearances": 1768,
-      "avg_share_in_design": 98,
+      "hex": "#F5F5DC",
+      "pct_of_products": 0.0675,
+      "appearances": 1000,
+      "avg_share_in_design": 37.7,
       "hsl": {
-        "h": 11.4,
-        "s": 41.7,
-        "l": 29.6
+        "h": 60,
+        "s": 55.6,
+        "l": 91.2
       },
-      "hue_bucket": "red",
-      "common_name": "cocoa"
+      "hue_bucket": "orange-yellow",
+      "common_name": "cream"
     },
     {
       "hex": "#D3D3D3",
-      "pct_of_products": 0.0607,
-      "appearances": 1445,
-      "avg_share_in_design": 38.4,
+      "pct_of_products": 0.0576,
+      "appearances": 852,
+      "avg_share_in_design": 38,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -166,24 +158,11 @@
       "hue_bucket": "neutral-gray",
       "common_name": "oyster"
     },
-    {
-      "hex": "#F5F5DC",
-      "pct_of_products": 0.0571,
-      "appearances": 1359,
-      "avg_share_in_design": 38.9,
-      "hsl": {
-        "h": 60,
-        "s": 55.6,
-        "l": 91.2
-      },
-      "hue_bucket": "orange-yellow",
-      "common_name": "cream"
-    },
     {
       "hex": "#F5F5F5",
-      "pct_of_products": 0.0353,
-      "appearances": 841,
-      "avg_share_in_design": 42.8,
+      "pct_of_products": 0.0418,
+      "appearances": 619,
+      "avg_share_in_design": 42.6,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -194,9 +173,9 @@
     },
     {
       "hex": "#C0C0C0",
-      "pct_of_products": 0.0304,
-      "appearances": 725,
-      "avg_share_in_design": 41.3,
+      "pct_of_products": 0.0301,
+      "appearances": 445,
+      "avg_share_in_design": 39.4,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -207,9 +186,9 @@
     },
     {
       "hex": "#D2B48C",
-      "pct_of_products": 0.0264,
-      "appearances": 628,
-      "avg_share_in_design": 35.9,
+      "pct_of_products": 0.027,
+      "appearances": 400,
+      "avg_share_in_design": 34.8,
       "hsl": {
         "h": 34.3,
         "s": 43.7,
@@ -218,24 +197,11 @@
       "hue_bucket": "red-orange",
       "common_name": "fawn"
     },
-    {
-      "hex": "#000000",
-      "pct_of_products": 0.0256,
-      "appearances": 610,
-      "avg_share_in_design": 22.4,
-      "hsl": {
-        "h": 0,
-        "s": 0,
-        "l": 0
-      },
-      "hue_bucket": "neutral-black",
-      "common_name": "noir"
-    },
     {
       "hex": "#F2F2F2",
-      "pct_of_products": 0.0228,
-      "appearances": 542,
-      "avg_share_in_design": 35,
+      "pct_of_products": 0.0268,
+      "appearances": 397,
+      "avg_share_in_design": 35.2,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -245,36 +211,36 @@
       "common_name": "off-white"
     },
     {
-      "hex": "#F0F0F0",
-      "pct_of_products": 0.0174,
-      "appearances": 415,
-      "avg_share_in_design": 54.4,
+      "hex": "#000000",
+      "pct_of_products": 0.0251,
+      "appearances": 371,
+      "avg_share_in_design": 30.5,
       "hsl": {
         "h": 0,
         "s": 0,
-        "l": 94.1
+        "l": 0
       },
-      "hue_bucket": "neutral-white",
-      "common_name": "cream"
+      "hue_bucket": "neutral-black",
+      "common_name": "noir"
     },
     {
-      "hex": "#4A4A4A",
-      "pct_of_products": 0.013,
-      "appearances": 310,
-      "avg_share_in_design": 42.4,
+      "hex": "#F0F0F0",
+      "pct_of_products": 0.0224,
+      "appearances": 332,
+      "avg_share_in_design": 56.8,
       "hsl": {
         "h": 0,
         "s": 0,
-        "l": 29
+        "l": 94.1
       },
-      "hue_bucket": "neutral-gray",
-      "common_name": "umber"
+      "hue_bucket": "neutral-white",
+      "common_name": "cream"
     },
     {
       "hex": "#F5F3EE",
-      "pct_of_products": 0.013,
-      "appearances": 309,
-      "avg_share_in_design": 43.7,
+      "pct_of_products": 0.0164,
+      "appearances": 243,
+      "avg_share_in_design": 42,
       "hsl": {
         "h": 42.9,
         "s": 25.9,
@@ -283,37 +249,11 @@
       "hue_bucket": "red-orange",
       "common_name": "off-white"
     },
-    {
-      "hex": "#6B3827",
-      "pct_of_products": 0.0123,
-      "appearances": 292,
-      "avg_share_in_design": 96.8,
-      "hsl": {
-        "h": 15,
-        "s": 46.6,
-        "l": 28.6
-      },
-      "hue_bucket": "red",
-      "common_name": "cocoa"
-    },
-    {
-      "hex": "#F0E68C",
-      "pct_of_products": 0.0114,
-      "appearances": 272,
-      "avg_share_in_design": 32.4,
-      "hsl": {
-        "h": 54,
-        "s": 76.9,
-        "l": 74.5
-      },
-      "hue_bucket": "orange-yellow",
-      "common_name": "butter"
-    },
     {
       "hex": "#F5F0E1",
-      "pct_of_products": 0.0114,
-      "appearances": 271,
-      "avg_share_in_design": 54.4,
+      "pct_of_products": 0.0138,
+      "appearances": 204,
+      "avg_share_in_design": 52.6,
       "hsl": {
         "h": 45,
         "s": 50,
@@ -322,11 +262,24 @@
       "hue_bucket": "red-orange",
       "common_name": "cream"
     },
+    {
+      "hex": "#F5F3ED",
+      "pct_of_products": 0.0131,
+      "appearances": 194,
+      "avg_share_in_design": 44.7,
+      "hsl": {
+        "h": 45,
+        "s": 28.6,
+        "l": 94.5
+      },
+      "hue_bucket": "red-orange",
+      "common_name": "off-white"
+    },
     {
       "hex": "#F5F5F0",
-      "pct_of_products": 0.0113,
-      "appearances": 269,
-      "avg_share_in_design": 50.9,
+      "pct_of_products": 0.0126,
+      "appearances": 187,
+      "avg_share_in_design": 49.9,
       "hsl": {
         "h": 60,
         "s": 20,
@@ -336,62 +289,23 @@
       "common_name": "off-white"
     },
     {
-      "hex": "#333333",
-      "pct_of_products": 0.0111,
-      "appearances": 264,
-      "avg_share_in_design": 44.6,
-      "hsl": {
-        "h": 0,
-        "s": 0,
-        "l": 20
-      },
-      "hue_bucket": "neutral-gray",
-      "common_name": "charcoal"
-    },
-    {
-      "hex": "#A9A9A9",
-      "pct_of_products": 0.0109,
-      "appearances": 260,
-      "avg_share_in_design": 35.1,
-      "hsl": {
-        "h": 0,
-        "s": 0,
-        "l": 66.3
-      },
-      "hue_bucket": "neutral-gray",
-      "common_name": "stone"
-    },
-    {
-      "hex": "#363636",
-      "pct_of_products": 0.0108,
-      "appearances": 257,
-      "avg_share_in_design": 43.4,
+      "hex": "#4A4A4A",
+      "pct_of_products": 0.0121,
+      "appearances": 179,
+      "avg_share_in_design": 39.6,
       "hsl": {
         "h": 0,
         "s": 0,
-        "l": 21.2
+        "l": 29
       },
       "hue_bucket": "neutral-gray",
-      "common_name": "charcoal"
-    },
-    {
-      "hex": "#F5F3ED",
-      "pct_of_products": 0.0107,
-      "appearances": 256,
-      "avg_share_in_design": 46.6,
-      "hsl": {
-        "h": 45,
-        "s": 28.6,
-        "l": 94.5
-      },
-      "hue_bucket": "red-orange",
-      "common_name": "off-white"
+      "common_name": "umber"
     },
     {
       "hex": "#F2E8D9",
-      "pct_of_products": 0.0107,
-      "appearances": 254,
-      "avg_share_in_design": 46.3,
+      "pct_of_products": 0.0121,
+      "appearances": 179,
+      "avg_share_in_design": 44.4,
       "hsl": {
         "h": 36,
         "s": 49,
@@ -401,49 +315,36 @@
       "common_name": "pearl"
     },
     {
-      "hex": "#36454F",
-      "pct_of_products": 0.0102,
-      "appearances": 243,
-      "avg_share_in_design": 29.1,
-      "hsl": {
-        "h": 204,
-        "s": 18.8,
-        "l": 26.1
-      },
-      "hue_bucket": "blue",
-      "common_name": "charcoal"
-    },
-    {
-      "hex": "#6B3A2A",
-      "pct_of_products": 0.0101,
-      "appearances": 240,
-      "avg_share_in_design": 96.5,
+      "hex": "#F0E68C",
+      "pct_of_products": 0.0118,
+      "appearances": 175,
+      "avg_share_in_design": 31,
       "hsl": {
-        "h": 14.8,
-        "s": 43.6,
-        "l": 29.2
+        "h": 54,
+        "s": 76.9,
+        "l": 74.5
       },
-      "hue_bucket": "red",
-      "common_name": "cocoa"
+      "hue_bucket": "orange-yellow",
+      "common_name": "butter"
     },
     {
-      "hex": "#808080",
-      "pct_of_products": 0.0096,
-      "appearances": 229,
-      "avg_share_in_design": 30.6,
+      "hex": "#A9A9A9",
+      "pct_of_products": 0.0115,
+      "appearances": 170,
+      "avg_share_in_design": 34.4,
       "hsl": {
         "h": 0,
         "s": 0,
-        "l": 50.2
+        "l": 66.3
       },
       "hue_bucket": "neutral-gray",
-      "common_name": "slate"
+      "common_name": "stone"
     },
     {
       "hex": "#008080",
-      "pct_of_products": 0.009,
-      "appearances": 215,
-      "avg_share_in_design": 36.1,
+      "pct_of_products": 0.0111,
+      "appearances": 165,
+      "avg_share_in_design": 33.7,
       "hsl": {
         "h": 180,
         "s": 100,
@@ -453,36 +354,36 @@
       "common_name": "malachite"
     },
     {
-      "hex": "#483C32",
-      "pct_of_products": 0.009,
-      "appearances": 214,
-      "avg_share_in_design": 27.7,
+      "hex": "#333333",
+      "pct_of_products": 0.0109,
+      "appearances": 162,
+      "avg_share_in_design": 43.1,
       "hsl": {
-        "h": 27.3,
-        "s": 18,
-        "l": 23.9
+        "h": 0,
+        "s": 0,
+        "l": 20
       },
-      "hue_bucket": "red-orange",
-      "common_name": "walnut"
+      "hue_bucket": "neutral-gray",
+      "common_name": "charcoal"
     },
     {
-      "hex": "#F2E7D6",
-      "pct_of_products": 0.0086,
-      "appearances": 204,
-      "avg_share_in_design": 59.5,
+      "hex": "#363636",
+      "pct_of_products": 0.0101,
+      "appearances": 149,
+      "avg_share_in_design": 42.6,
       "hsl": {
-        "h": 36.4,
-        "s": 51.9,
-        "l": 89.4
+        "h": 0,
+        "s": 0,
+        "l": 21.2
       },
-      "hue_bucket": "red-orange",
-      "common_name": "pearl"
+      "hue_bucket": "neutral-gray",
+      "common_name": "charcoal"
     },
     {
       "hex": "#B0C4DE",
-      "pct_of_products": 0.0084,
-      "appearances": 199,
-      "avg_share_in_design": 42.2,
+      "pct_of_products": 0.0099,
+      "appearances": 147,
+      "avg_share_in_design": 41.5,
       "hsl": {
         "h": 213.9,
         "s": 41.1,
@@ -493,9 +394,9 @@
     },
     {
       "hex": "#87CEEB",
-      "pct_of_products": 0.0076,
-      "appearances": 182,
-      "avg_share_in_design": 29.8,
+      "pct_of_products": 0.0099,
+      "appearances": 146,
+      "avg_share_in_design": 29.6,
       "hsl": {
         "h": 197.4,
         "s": 71.4,
@@ -505,23 +406,62 @@
       "common_name": "robin egg"
     },
     {
-      "hex": "#F8F8F8",
-      "pct_of_products": 0.0074,
-      "appearances": 177,
-      "avg_share_in_design": 27.5,
+      "hex": "#36454F",
+      "pct_of_products": 0.0097,
+      "appearances": 144,
+      "avg_share_in_design": 28.7,
       "hsl": {
-        "h": 0,
-        "s": 0,
-        "l": 97.3
+        "h": 204,
+        "s": 18.8,
+        "l": 26.1
       },
-      "hue_bucket": "neutral-white",
-      "common_name": "off-white"
+      "hue_bucket": "blue",
+      "common_name": "charcoal"
+    },
+    {
+      "hex": "#483C32",
+      "pct_of_products": 0.0092,
+      "appearances": 136,
+      "avg_share_in_design": 25.8,
+      "hsl": {
+        "h": 27.3,
+        "s": 18,
+        "l": 23.9
+      },
+      "hue_bucket": "red-orange",
+      "common_name": "walnut"
+    },
+    {
+      "hex": "#6495ED",
+      "pct_of_products": 0.009,
+      "appearances": 133,
+      "avg_share_in_design": 40.2,
+      "hsl": {
+        "h": 218.5,
+        "s": 79.2,
+        "l": 66.1
+      },
+      "hue_bucket": "blue",
+      "common_name": "cornflower"
+    },
+    {
+      "hex": "#F2E7D6",
+      "pct_of_products": 0.0089,
+      "appearances": 132,
+      "avg_share_in_design": 58.2,
+      "hsl": {
+        "h": 36.4,
+        "s": 51.9,
+        "l": 89.4
+      },
+      "hue_bucket": "red-orange",
+      "common_name": "pearl"
     },
     {
       "hex": "#F5F3E8",
-      "pct_of_products": 0.0067,
-      "appearances": 160,
-      "avg_share_in_design": 47.2,
+      "pct_of_products": 0.0085,
+      "appearances": 126,
+      "avg_share_in_design": 47.8,
       "hsl": {
         "h": 50.8,
         "s": 39.4,
@@ -530,11 +470,24 @@
       "hue_bucket": "orange-yellow",
       "common_name": "cream"
     },
+    {
+      "hex": "#808080",
+      "pct_of_products": 0.0085,
+      "appearances": 126,
+      "avg_share_in_design": 28.7,
+      "hsl": {
+        "h": 0,
+        "s": 0,
+        "l": 50.2
+      },
+      "hue_bucket": "neutral-gray",
+      "common_name": "slate"
+    },
     {
       "hex": "#ADD8E6",
-      "pct_of_products": 0.0067,
-      "appearances": 160,
-      "avg_share_in_design": 32,
+      "pct_of_products": 0.0081,
+      "appearances": 120,
+      "avg_share_in_design": 31.9,
       "hsl": {
         "h": 194.7,
         "s": 53.3,
@@ -544,23 +497,23 @@
       "common_name": "powder blue"
     },
     {
-      "hex": "#BDB76B",
-      "pct_of_products": 0.0066,
-      "appearances": 158,
-      "avg_share_in_design": 39.8,
+      "hex": "#6B8E23",
+      "pct_of_products": 0.008,
+      "appearances": 118,
+      "avg_share_in_design": 36.7,
       "hsl": {
-        "h": 55.6,
-        "s": 38.3,
-        "l": 58
+        "h": 79.6,
+        "s": 60.5,
+        "l": 34.7
       },
-      "hue_bucket": "orange-yellow",
-      "common_name": "fawn"
+      "hue_bucket": "yellow-green",
+      "common_name": "moss"
     },
     {
       "hex": "#F8F8FF",
-      "pct_of_products": 0.0064,
-      "appearances": 153,
-      "avg_share_in_design": 36.7,
+      "pct_of_products": 0.0074,
+      "appearances": 110,
+      "avg_share_in_design": 36,
       "hsl": {
         "h": 240,
         "s": 100,
@@ -570,36 +523,75 @@
       "common_name": "off-white"
     },
     {
-      "hex": "#6495ED",
-      "pct_of_products": 0.0063,
-      "appearances": 150,
-      "avg_share_in_design": 40.1,
+      "hex": "#BDB76B",
+      "pct_of_products": 0.0068,
+      "appearances": 101,
+      "avg_share_in_design": 39.3,
       "hsl": {
-        "h": 218.5,
-        "s": 79.2,
-        "l": 66.1
+        "h": 55.6,
+        "s": 38.3,
+        "l": 58
       },
-      "hue_bucket": "blue",
-      "common_name": "cornflower"
+      "hue_bucket": "orange-yellow",
+      "common_name": "fawn"
     },
     {
-      "hex": "#6B8E23",
+      "hex": "#808000",
+      "pct_of_products": 0.0061,
+      "appearances": 90,
+      "avg_share_in_design": 25.6,
+      "hsl": {
+        "h": 60,
+        "s": 100,
+        "l": 25.1
+      },
+      "hue_bucket": "orange-yellow",
+      "common_name": "bronze"
+    },
+    {
+      "hex": "#F08080",
       "pct_of_products": 0.006,
-      "appearances": 143,
-      "avg_share_in_design": 36.7,
+      "appearances": 89,
+      "avg_share_in_design": 24.5,
       "hsl": {
-        "h": 79.6,
-        "s": 60.5,
-        "l": 34.7
+        "h": 0,
+        "s": 78.9,
+        "l": 72.2
+      },
+      "hue_bucket": "red",
+      "common_name": "coral"
+    },
+    {
+      "hex": "#000080",
+      "pct_of_products": 0.0058,
+      "appearances": 86,
+      "avg_share_in_design": 21.6,
+      "hsl": {
+        "h": 240,
+        "s": 100,
+        "l": 25.1
+      },
+      "hue_bucket": "blue-purple",
+      "common_name": "midnight"
+    },
+    {
+      "hex": "#F2F4F0",
+      "pct_of_products": 0.0055,
+      "appearances": 81,
+      "avg_share_in_design": 26.1,
+      "hsl": {
+        "h": 90,
+        "s": 15.4,
+        "l": 94.9
       },
       "hue_bucket": "yellow-green",
-      "common_name": "moss"
+      "common_name": "off-white"
     },
     {
       "hex": "#BDBDBD",
       "pct_of_products": 0.0055,
-      "appearances": 132,
-      "avg_share_in_design": 39.6,
+      "appearances": 81,
+      "avg_share_in_design": 40.2,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -609,23 +601,49 @@
       "common_name": "dove"
     },
     {
-      "hex": "#808000",
+      "hex": "#F8F8F8",
+      "pct_of_products": 0.0053,
+      "appearances": 79,
+      "avg_share_in_design": 43.7,
+      "hsl": {
+        "h": 0,
+        "s": 0,
+        "l": 97.3
+      },
+      "hue_bucket": "neutral-white",
+      "common_name": "off-white"
+    },
+    {
+      "hex": "#F2F0E6",
       "pct_of_products": 0.0052,
-      "appearances": 124,
-      "avg_share_in_design": 26.5,
+      "appearances": 77,
+      "avg_share_in_design": 40.8,
+      "hsl": {
+        "h": 50,
+        "s": 31.6,
+        "l": 92.5
+      },
+      "hue_bucket": "orange-yellow",
+      "common_name": "cream"
+    },
+    {
+      "hex": "#FFFFF0",
+      "pct_of_products": 0.0051,
+      "appearances": 76,
+      "avg_share_in_design": 41.6,
       "hsl": {
         "h": 60,
         "s": 100,
-        "l": 25.1
+        "l": 97.1
       },
       "hue_bucket": "orange-yellow",
-      "common_name": "bronze"
+      "common_name": "ivory"
     },
     {
       "hex": "#C2B280",
-      "pct_of_products": 0.0051,
-      "appearances": 122,
-      "avg_share_in_design": 30.2,
+      "pct_of_products": 0.005,
+      "appearances": 74,
+      "avg_share_in_design": 29.2,
       "hsl": {
         "h": 45.5,
         "s": 35.1,
@@ -635,49 +653,36 @@
       "common_name": "fawn"
     },
     {
-      "hex": "#E5DDCB",
-      "pct_of_products": 0.0051,
-      "appearances": 121,
-      "avg_share_in_design": 43.9,
-      "hsl": {
-        "h": 41.5,
-        "s": 33.3,
-        "l": 84.7
-      },
-      "hue_bucket": "red-orange",
-      "common_name": "bone"
-    },
-    {
-      "hex": "#F2F0E6",
-      "pct_of_products": 0.005,
-      "appearances": 119,
-      "avg_share_in_design": 41.4,
+      "hex": "#E8E8E8",
+      "pct_of_products": 0.0047,
+      "appearances": 69,
+      "avg_share_in_design": 31.6,
       "hsl": {
-        "h": 50,
-        "s": 31.6,
-        "l": 92.5
+        "h": 0,
+        "s": 0,
+        "l": 91
       },
-      "hue_bucket": "orange-yellow",
-      "common_name": "cream"
+      "hue_bucket": "neutral-white",
+      "common_name": "pearl"
     },
     {
-      "hex": "#696969",
-      "pct_of_products": 0.0049,
-      "appearances": 117,
-      "avg_share_in_design": 42,
+      "hex": "#D0D0D0",
+      "pct_of_products": 0.0046,
+      "appearances": 68,
+      "avg_share_in_design": 34.6,
       "hsl": {
         "h": 0,
         "s": 0,
-        "l": 41.2
+        "l": 81.6
       },
       "hue_bucket": "neutral-gray",
-      "common_name": "fern"
+      "common_name": "oyster"
     },
     {
       "hex": "#708090",
-      "pct_of_products": 0.0047,
-      "appearances": 112,
-      "avg_share_in_design": 31.8,
+      "pct_of_products": 0.0046,
+      "appearances": 68,
+      "avg_share_in_design": 29.1,
       "hsl": {
         "h": 210,
         "s": 12.6,
@@ -686,37 +691,11 @@
       "hue_bucket": "neutral-gray",
       "common_name": "slate"
     },
-    {
-      "hex": "#F0E6D2",
-      "pct_of_products": 0.0047,
-      "appearances": 111,
-      "avg_share_in_design": 36.4,
-      "hsl": {
-        "h": 40,
-        "s": 50,
-        "l": 88.2
-      },
-      "hue_bucket": "red-orange",
-      "common_name": "parchment"
-    },
-    {
-      "hex": "#FFFFF0",
-      "pct_of_products": 0.0045,
-      "appearances": 107,
-      "avg_share_in_design": 39.6,
-      "hsl": {
-        "h": 60,
-        "s": 100,
-        "l": 97.1
-      },
-      "hue_bucket": "orange-yellow",
-      "common_name": "ivory"
-    },
     {
       "hex": "#E0E0E0",
-      "pct_of_products": 0.0043,
-      "appearances": 103,
-      "avg_share_in_design": 34.1,
+      "pct_of_products": 0.0046,
+      "appearances": 68,
+      "avg_share_in_design": 36,
       "hsl": {
         "h": 0,
         "s": 0,
@@ -726,36 +705,49 @@
       "common_name": "linen"
     },
     {
-      "hex": "#E8E8E8",
-      "pct_of_products": 0.0043,
-      "appearances": 102,
-      "avg_share_in_design": 31.8,
+      "hex": "#F8F7F2",
+      "pct_of_products": 0.0045,
+      "appearances": 67,
+      "avg_share_in_design": 39,
       "hsl": {
-        "h": 0,
-        "s": 0,
-        "l": 91
+        "h": 50,
+        "s": 30,
+        "l": 96.1
       },
-      "hue_bucket": "neutral-white",
-      "common_name": "pearl"
+      "hue_bucket": "orange-yellow",
+      "common_name": "off-white"
     },
     {
-      "hex": "#F08080",
+      "hex": "#E5DDCB",
+      "pct_of_products": 0.0044,
+      "appearances": 65,
+      "avg_share_in_design": 44.1,
+      "hsl": {
+        "h": 41.5,
+        "s": 33.3,
+        "l": 84.7
+      },
+      "hue_bucket": "red-orange",
+      "common_name": "bone"
+    },
+    {
+      "hex": "#E0D8C4",
       "pct_of_products": 0.0043,
-      "appearances": 102,
-      "avg_share_in_design": 24.6,
+      "appearances": 64,
+      "avg_share_in_design": 39.5,
       "hsl": {
-        "h": 0,
-        "s": 78.9,
-        "l": 72.2
+        "h": 42.9,
+        "s": 31.1,
+        "l": 82.4
       },
-      "hue_bucket": "red",
-      "common_name": "coral"
+      "hue_bucket": "red-orange",
+      "common_name": "bone"
     },
     {
       "hex": "#4682B4",
-      "pct_of_products": 0.0042,
-      "appearances": 100,
-      "avg_share_in_design": 33.1,
+      "pct_of_products": 0.0043,
+      "appearances": 64,
+      "avg_share_in_design": 31.3,
       "hsl": {
         "h": 207.3,
         "s": 44,
@@ -765,93 +757,93 @@
       "common_name": "denim"
     },
     {
-      "hex": "#E0D8C4",
-      "pct_of_products": 0.004,
-      "appearances": 95,
-      "avg_share_in_design": 38.7,
+      "hex": "#F0E6D2",
+      "pct_of_products": 0.0042,
+      "appearances": 62,
+      "avg_share_in_design": 37,
       "hsl": {
-        "h": 42.9,
-        "s": 31.1,
-        "l": 82.4
+        "h": 40,
+        "s": 50,
+        "l": 88.2
       },
       "hue_bucket": "red-orange",
-      "common_name": "bone"
+      "common_name": "parchment"
     }
   ],
   "hue_distribution": {
-    "red-orange": 0.2781,
-    "neutral-gray": 0.1945,
-    "orange-yellow": 0.1244,
-    "blue": 0.0875,
-    "red": 0.0871,
-    "neutral-white": 0.0851,
-    "blue-green": 0.0446,
-    "yellow-green": 0.0402,
-    "green": 0.0193,
-    "neutral-black": 0.0167,
-    "magenta-pink": 0.0099,
-    "blue-purple": 0.0093,
-    "purple": 0.0033
+    "red-orange": 0.2737,
+    "neutral-gray": 0.1778,
+    "orange-yellow": 0.1357,
+    "blue": 0.0986,
+    "neutral-white": 0.0777,
+    "red": 0.0627,
+    "blue-green": 0.0545,
+    "yellow-green": 0.0485,
+    "green": 0.025,
+    "neutral-black": 0.016,
+    "magenta-pink": 0.0131,
+    "blue-purple": 0.0124,
+    "purple": 0.0041
   },
   "saturation_distribution": {
-    "0-20": 0.3668,
-    "20-40": 0.2838,
-    "40-60": 0.2382,
-    "60-80": 0.0759,
-    "80-100": 0.0353
+    "0-20": 0.3407,
+    "20-40": 0.3001,
+    "40-60": 0.2239,
+    "60-80": 0.0936,
+    "80-100": 0.0417
   },
   "lightness_distribution": {
-    "0-20": 0.0225,
-    "20-40": 0.1689,
-    "40-60": 0.1847,
-    "60-80": 0.2828,
-    "80-100": 0.3411
+    "0-20": 0.0214,
+    "20-40": 0.1304,
+    "40-60": 0.2024,
+    "60-80": 0.3028,
+    "80-100": 0.3429
   },
   "hexes_per_design_distribution": [
     {
       "distinct_hexes": 1,
-      "product_count": 1525,
-      "pct": 0.064
+      "product_count": 116,
+      "pct": 0.0078
     },
     {
       "distinct_hexes": 2,
-      "product_count": 11026,
-      "pct": 0.4629
+      "product_count": 6518,
+      "pct": 0.4403
     },
     {
       "distinct_hexes": 3,
-      "product_count": 8258,
-      "pct": 0.3467
+      "product_count": 5507,
+      "pct": 0.372
     },
     {
       "distinct_hexes": 4,
-      "product_count": 1543,
-      "pct": 0.0648
+      "product_count": 1386,
+      "pct": 0.0936
     },
     {
       "distinct_hexes": 5,
-      "product_count": 681,
-      "pct": 0.0286
+      "product_count": 609,
+      "pct": 0.0411
     },
     {
       "distinct_hexes": 6,
-      "product_count": 718,
-      "pct": 0.0301
+      "product_count": 628,
+      "pct": 0.0424
     },
     {
       "distinct_hexes": 7,
-      "product_count": 42,
+      "product_count": 26,
       "pct": 0.0018
     },
     {
       "distinct_hexes": 8,
-      "product_count": 18,
-      "pct": 0.0008
+      "product_count": 8,
+      "pct": 0.0005
     },
     {
       "distinct_hexes": 9,
       "product_count": 3,
-      "pct": 0.0001
+      "pct": 0.0002
     },
     {
       "distinct_hexes": 10,
@@ -861,38 +853,37 @@
     {
       "distinct_hexes": 11,
       "product_count": 1,
-      "pct": 0
+      "pct": 0.0001
     }
   ],
   "professional_palette_words": [
     "ivory",
-    "cocoa",
-    "oyster",
     "cream",
+    "oyster",
     "off-white",
     "dove",
     "fawn",
     "noir",
     "umber",
+    "pearl",
     "butter",
-    "charcoal",
     "stone",
-    "pearl",
-    "slate",
     "malachite",
-    "walnut",
+    "charcoal",
     "sky",
     "robin egg",
-    "powder blue",
+    "walnut",
     "cornflower",
+    "slate",
+    "powder blue",
     "moss",
     "bronze",
-    "bone",
-    "fern",
-    "parchment",
-    "linen",
     "coral",
-    "denim"
+    "midnight",
+    "linen",
+    "bone",
+    "denim",
+    "parchment"
   ],
   "methodology": {
     "table": "shopify_color_enrichment",
diff --git a/data/professional-palette-suffix.txt b/data/professional-palette-suffix.txt
index 816b637..a7f3bf4 100644
--- a/data/professional-palette-suffix.txt
+++ b/data/professional-palette-suffix.txt
@@ -1 +1 @@
-Professional designer-wallpaper palette grounded in real-world high-end vendor catalogs (Schumacher, Maya Romanoff, Thibaut, Arte International, Cole & Son, Brunschwig & Fils, Scalamandre, Phillip Jeffries, Koroseal, Romo, Pierre Frey, Designers Guild, Osborne & Little — 23,817 real products analyzed in dw_unified.shopify_color_enrichment). Use ONLY colors from this learned palette: #FFFFFF (ivory), #6B382C (cocoa), #D3D3D3 (oyster), #F5F5DC (cream), #F5F5F5 (off-white), #C0C0C0 (dove), #D2B48C (fawn), #000000 (noir), #F2F2F2 (off-white), #F0F0F0 (cream), #4A4A4A (umber), #F5F3EE (off-white), #6B3827 (cocoa), #F0E68C (butter), #F5F0E1 (cream), #F5F5F0 (off-white), #333333 (charcoal), #A9A9A9 (stone), #363636 (charcoal), #F5F3ED (off-white), #F2E8D9 (pearl), #36454F (charcoal), #6B3A2A (cocoa), #808080 (slate), #008080 (malachite). Saturation distribution observed in real professional wallpaper: S<20% = 36.7% of all color usage, S 20–40% = 28.4%, S>60% = 11.1%. Most professional wallpapers use a low-saturation, tone-on-tone or 2–3 color story. Median distinct hues per design = 2; 90th percentile = 4. Keep total distinct hues per design ≤ 5. Never use neon, fluorescent, rainbow, primary-saturated red/yellow/blue, hot pink, or electric green. Prefer aged, slightly-grayed, archival pigments over pure chromatic colors.
+Professional designer-wallpaper palette grounded in real-world high-end vendor catalogs (top-20 lines: Zuber & Cie, Thibaut, Schumacher, Cole & Son, Scalamandré, Osborne & Little, Designers Guild, Nina Campbell, Maya Romanoff, Anna French, Harlequin, Arte International, Brunschwig & Fils, William Morris, 1838 Wallcoverings, Lee Jofa, Romo, GP & J Baker, Ralph Lauren, Élitis + DW Bespoke Studio — 14,804 real products analyzed in dw_unified.shopify_color_enrichment). Use ONLY colors from this learned palette: #FFFFFF (ivory), #F5F5DC (cream), #D3D3D3 (oyster), #F5F5F5 (off-white), #C0C0C0 (dove), #D2B48C (fawn), #F2F2F2 (off-white), #000000 (noir), #F0F0F0 (cream), #F5F3EE (off-white), #F5F0E1 (cream), #F5F3ED (off-white), #F5F5F0 (off-white), #4A4A4A (umber), #F2E8D9 (pearl), #F0E68C (butter), #A9A9A9 (stone), #008080 (malachite), #333333 (charcoal), #363636 (charcoal), #B0C4DE (sky), #87CEEB (robin egg), #36454F (charcoal), #483C32 (walnut), #6495ED (cornflower). Saturation distribution observed in real professional wallpaper: S<20% = 34.1% of all color usage, S 20–40% = 30.0%, S>60% = 13.5%. Most professional wallpapers use a low-saturation, tone-on-tone or 2–3 color story. Median distinct hues per design = 3; 90th percentile = 4. Keep total distinct hues per design ≤ 5. Never use neon, fluorescent, rainbow, primary-saturated red/yellow/blue, hot pink, or electric green. Prefer aged, slightly-grayed, archival pigments over pure chromatic colors.
diff --git a/scripts/build_professional_palette_reference.js b/scripts/build_professional_palette_reference.js
index 56e5fd6..b5caafa 100644
--- a/scripts/build_professional_palette_reference.js
+++ b/scripts/build_professional_palette_reference.js
@@ -12,45 +12,60 @@ const { execSync } = require('child_process');
 const fs = require('fs');
 const path = require('path');
 
-// Canonical "professional / luxury wallpaper" vendors that actually exist in
-// dw_unified.shopify_color_enrichment (verified before adding here).
+// Top-20 prestige decorative wallcovering lines — Steve's quality benchmark
+// (2026-05-27): the reference set that defines "catalog-grade / most like our
+// unified-db patterns" for cactus (and all) ranking. Each carries a one-line
+// aesthetic. Zuber & Cie is the named scenic anchor but has 0 rows in
+// shopify_color_enrichment, so it contributes NO db palette — aesthetic-only.
+const TOP_20_LINES = [
+  { brand: 'Zuber & Cie',        aesthetic: 'hand-blocked scenic panoramic',     db: false },
+  { brand: 'Thibaut',            aesthetic: 'archival classic' },
+  { brand: 'Schumacher',         aesthetic: 'American archival glamour' },
+  { brand: 'Cole & Son',         aesthetic: 'iconic British print archive' },
+  { brand: 'Scalamandré',        aesthetic: 'old-world opulence' },
+  { brand: 'Osborne & Little',   aesthetic: 'English eclectic colour' },
+  { brand: 'Designers Guild',    aesthetic: 'refined modern romantic' },
+  { brand: 'Nina Campbell',      aesthetic: 'English country elegance' },
+  { brand: 'Maya Romanoff',      aesthetic: 'handcrafted luxe surface' },
+  { brand: 'Anna French',        aesthetic: 'delicate prints & lace' },
+  { brand: 'Harlequin',          aesthetic: 'contemporary British design-led' },
+  { brand: 'Arte International',  aesthetic: 'natural-fibre luxe' },
+  { brand: 'Brunschwig & Fils',  aesthetic: 'French archival document prints' },
+  { brand: 'William Morris',     aesthetic: 'Arts & Crafts heritage' },
+  { brand: '1838 Wallcoverings', aesthetic: 'British flocked/velvet revival' },
+  { brand: 'Lee Jofa',           aesthetic: 'English country-house archive' },
+  { brand: 'Romo',               aesthetic: 'painterly British' },
+  { brand: 'GP & J Baker',       aesthetic: 'English heritage florals' },
+  { brand: 'Ralph Lauren',       aesthetic: 'American heritage luxe' },
+  { brand: 'Élitis',             aesthetic: 'French textural avant-garde' },
+];
+
+// Vendor-name variants exactly as they appear in shopify_color_enrichment (the
+// palette pull matches on these), plus DW's own premium bespoke line
+// ('DW Bespoke Studio', ~1,029 enriched rows — Steve 2026-05-27). Zuber omitted
+// (0 rows). Pierre Frey kept as an extra French maison present in the db.
 const PRO_VENDORS = [
-  'Schumacher',
-  'Maya Romanoff',
-  'Thibaut',
-  'Thibaut Wallpaper',
-  'Arte International',
+  'Thibaut', 'Thibaut Wallpaper', 'THIBAUT AT DW',
+  'Schumacher', 'Schumacher Wallcoverings',
   'Cole & Son',
-  'Brunschwig & Fils',
-  'Scalamandre',
-  'Scalamandre Wallpaper',
-  'Phillip Jeffries',
-  'Koroseal',
-  'Romo',
-  'Designtex',
-  'Pierre Frey',
-  'Elitis',
-  'Élitis',
-  'Hermès',
-  'Fromental',
-  'a luxury hand-painted scenic house',
-  'Nina Campbell',
+  'Scalamandre Wallpaper', 'Scalamandre',
   'Osborne & Little',
   'Designers Guild',
-  'Harlequin',
+  'Nina Campbell',
+  'Maya Romanoff',
   'Anna French',
+  'Harlequin',
+  'Arte International', 'Arte International Wallcoverings', 'Arte',
+  'Brunschwig & Fils',
+  'William Morris', 'Morris and Company',
+  '1838 Wallcoverings',
   'Lee Jofa',
+  'Romo',
   'GP & J Baker',
-  'Mulberry',
-  'Ralph Lauren',
-  'William Morris',
-  'Donghia',
-  'Kravet',
-  'Wolf Gordon',
-  'Innovations USA',
-  'Christian Lacroix Europe',
-  'Gaston Y Daniela',
-  'Clarke And Clarke',
+  'Ralph Lauren', 'Ralph Lauren Wallpaper',
+  'Elitis', 'Élitis',
+  'Pierre Frey',
+  'DW Bespoke Studio',
 ];
 
 // ---------- color math helpers ----------
@@ -362,8 +377,7 @@ function nearestName(hex) {
 
   const suffix =
 `Professional designer-wallpaper palette grounded in real-world high-end vendor catalogs ` +
-`(Schumacher, Maya Romanoff, Thibaut, Arte International, Cole & Son, Brunschwig & Fils, Scalamandre, ` +
-`Phillip Jeffries, Koroseal, Romo, Pierre Frey, Designers Guild, Osborne & Little — ${rows.length.toLocaleString()} ` +
+`(top-20 lines: ${TOP_20_LINES.map(l => l.brand).join(', ')} + DW Bespoke Studio — ${rows.length.toLocaleString()} ` +
 `real products analyzed in dw_unified.shopify_color_enrichment). ` +
 `Use ONLY colors from this learned palette: ${hexList}. ` +
 `Saturation distribution observed in real professional wallpaper: S<20% = ${satLow}% of all color usage, ` +
diff --git a/scripts/cactus-sample-eval.py b/scripts/cactus-sample-eval.py
new file mode 100644
index 0000000..4e6197d
--- /dev/null
+++ b/scripts/cactus-sample-eval.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+"""cactus-sample-eval.py — measure the quality-redo sample.
+
+Finds the freshly-generated comfy cactus tiles (generator='comfy', created in
+the last N minutes), runs the 6-lens edges scan + a local-Ollama vision quality
+score on each, and prints a table + the PASS rate against the new criteria
+(edge & center ΔE ≤ 5, vision ≥ 70). Read-only — does NOT publish anything.
+
+  python3 scripts/cactus-sample-eval.py [--minutes 60]
+"""
+import importlib.util, json, os, subprocess, sys, base64, urllib.request
+from pathlib import Path
+
+ROOT = Path(__file__).resolve().parent.parent
+MIN = 60
+if '--minutes' in sys.argv: MIN = int(sys.argv[sys.argv.index('--minutes')+1])
+VHOST = os.environ.get('OLLAMA_VISION_HOST', '127.0.0.1:11434')
+VMODEL = os.environ.get('OLLAMA_VISION_MODEL', 'llava:latest')
+
+_spec = importlib.util.spec_from_file_location('edges_scan', str(ROOT/'scripts'/'edges-scan.py'))
+_es = importlib.util.module_from_spec(_spec); _spec.loader.exec_module(_es)
+
+def psql(sql):
+    return subprocess.run(['psql','dw_unified','-At','-F','|','-c',sql],capture_output=True,text=True).stdout.strip()
+
+rows = psql(f"""SELECT id, local_path FROM all_designs
+  WHERE category ILIKE 'cactus%' AND kind='seamless_tile' AND generator='comfy'
+    AND created_at > now() - interval '{MIN} minutes'
+  ORDER BY id;""")
+rows = [r.split('|',1) for r in rows.split('\n') if r.strip()]
+if not rows:
+    print(f"No comfy cactus generated in the last {MIN} min."); sys.exit(0)
+
+PROMPT=("Score 0-100 how much this looks like a REAL design from our top catalog lines (Thibaut, Schumacher, "
+        "Cole & Son, Scalamandré, Designers Guild, Maya Romanoff, Arte, Brunschwig & Fils, William Morris, "
+        "Zuber-grade scenic, DW Bespoke): clean even all-over repeat, cohesive aged/archival palette, no AI "
+        "smears/garbled motifs, no harsh seams, no obvious 2x2 grid repeat, refined. 100=premium catalog "
+        "product, 0=broken AI junk. Reply ONLY the integer.")
+def vision(path):
+    try:
+        jpg='/tmp/_cse.jpg'
+        subprocess.run(['sips','-Z','512','-s','format','jpeg',path,'--out',jpg],
+                       capture_output=True)
+        b64=base64.b64encode(open(jpg,'rb').read()).decode()
+        body=json.dumps({"model":VMODEL,"prompt":PROMPT,"images":[b64],"stream":False,
+                         "options":{"temperature":0.1,"num_predict":10}}).encode()
+        r=urllib.request.urlopen(urllib.request.Request(f"http://{VHOST}/api/generate",data=body,
+            headers={"Content-Type":"application/json"}),timeout=120)
+        m=__import__('re').search(r'\d{1,3}', json.load(r).get('response',''))
+        return max(0,min(100,int(m.group()))) if m else None
+    except Exception as e: return None
+
+print(f"\nEvaluating {len(rows)} sample tiles (edges scan + vision @ {VMODEL})\n")
+print(f"{'id':>7} {'edge':>6} {'mid':>6} {'hmid':>6} {'vmid':>6} {'verdict':>5} {'vision':>6}  result")
+seam_pass=vis_pass=both=0
+for rid,lp in rows:
+    if not lp or not os.path.isfile(lp):
+        print(f"{rid:>7}  (no PNG on disk)"); continue
+    r=_es.scan_path(Path(lp))
+    if not r.get('ok'): print(f"{rid:>7}  scan err: {r.get('error')}"); continue
+    e=r['edges_max']; m=r['mids_max']; hm=r['lenses']['h_mid']['score']; vm=r['lenses']['v_mid']['score']
+    sp = (e<=5 and m<=5)
+    v=vision(lp); vp = (v is not None and v>=70)
+    if sp: seam_pass+=1
+    if vp: vis_pass+=1
+    if sp and vp: both+=1
+    flag = 'KEEP' if (sp and vp) else ('seam-fail' if not sp else 'vision-low')
+    print(f"{rid:>7} {e:>6.1f} {m:>6.1f} {hm:>6.1f} {vm:>6.1f} {r['verdict']:>5} {str(v):>6}  {flag}")
+n=len(rows)
+print(f"\n=== SAMPLE RESULT ({n} tiles) ===")
+print(f"  seamless PASS (edge & center ΔE≤5): {seam_pass}/{n} ({100*seam_pass//max(n,1)}%)")
+print(f"  vision ≥70                        : {vis_pass}/{n}")
+print(f"  KEEP (pass BOTH criteria)         : {both}/{n}")
+print(f"  vs OLD cactus seamless PASS rate  : ~19% (replicate, no circular padding)")
diff --git a/scripts/cactus-vision-score.js b/scripts/cactus-vision-score.js
index 7b4bc99..2fdb767 100644
--- a/scripts/cactus-vision-score.js
+++ b/scripts/cactus-vision-score.js
@@ -34,11 +34,16 @@ const SRV_PORT = process.env.WALLCO_PORT || '9905';
 const TMP = path.join(os.tmpdir(), 'cactus-vision');
 fs.mkdirSync(TMP, { recursive: true });
 
+// Quality benchmark = Steve's top-20 unified-db lines + DW Bespoke (the set
+// surveyed in build_professional_palette_reference.js). The score literally
+// means "most like our unified-db catalog lines."
 const PROMPT =
-  'You are a luxury wallcovering buyer evaluating an AI-generated wallpaper tile for our high-end catalog. ' +
-  'Score 0-100 how much it looks like a REAL, professional, sellable wallcovering (Schumacher / Thibaut / Designtex grade): ' +
-  'clean even repeat, cohesive refined palette, NO AI smears or garbled/melted motifs, no harsh visible seams, ' +
-  'balanced composition, tasteful not cartoonish. 100 = indistinguishable from a premium catalog product; ' +
+  'You are a luxury wallcovering buyer. Score 0-100 how much this wallpaper tile looks like a REAL design from ' +
+  'our top catalog lines — Thibaut, Schumacher, Cole & Son, Scalamandré, Osborne & Little, Designers Guild, ' +
+  'Maya Romanoff, Arte International, Brunschwig & Fils, William Morris, Lee Jofa, Romo, Zuber-grade hand-blocked ' +
+  'scenic, and our own DW Bespoke studio: clean even all-over repeat, cohesive aged/archival low-saturation palette, ' +
+  'NO AI smears or garbled/melted motifs, no harsh visible seams, no obvious 2x2 grid repeat, balanced and tasteful ' +
+  '(not cartoonish, not fluorescent). 100 = indistinguishable from one of those premium catalog products; ' +
   '0 = obviously broken AI junk. Reply with ONLY the integer, nothing else.';
 
 // ensure a rank row exists for every cactus design, then pick the unscored set
diff --git a/scripts/generate-cactus.js b/scripts/generate-cactus.js
index 2766d73..fb8e15a 100755
--- a/scripts/generate-cactus.js
+++ b/scripts/generate-cactus.js
@@ -41,9 +41,13 @@ const COMPOSITION =
   'ocotillo whip stems, and cholla branches — arranged in a tessellated seamless wallpaper repeat. ' +
   'All cactus silhouettes are upright and oriented to vertical; no rotation, no tossing, no directional variation. ' +
   'Every cactus is rendered in the EXACT same single ink color (no internal color variation within the figure layer). ' +
-  'Edge-to-edge tessellation with even spacing between motifs. ' +
-  'Designer-grade, archival illustration quality, reads as a high-end Spanish Colonial / Pueblo Revival wallcovering, ' +
-  'indigenous Tohono O\'odham textile rhythm.';
+  // 2026-05-27 quality-redo criteria: leverage circular-padding (true wrap) +
+  // demand catalog-grade even coverage with no framed focal cluster.
+  'TRUE SEAMLESS WRAP — motifs that touch any tile edge continue uninterrupted onto the opposite edge, like one infinite pattern. ' +
+  'Even all-over distribution across the entire tile — every quadrant equally populated, no empty corners, no central focal cluster, no framed vignette, no border. ' +
+  'Consistent motif scale and spacing edge to edge including all four boundaries. ' +
+  'Designer-grade, archival illustration quality, reads as a high-end Spanish Colonial / Pueblo Revival wallcovering ' +
+  'on par with a Schumacher or Thibaut catalog plate, indigenous Tohono O\'odham textile rhythm.';
 
 const ANTI_PROMPT =
   'No banana, no banana leaves, no banana pods, no palm, no palm fronds, no monstera, no philodendron, ' +
diff --git a/scripts/generate_designs.js b/scripts/generate_designs.js
index ac9235e..2f882b1 100644
--- a/scripts/generate_designs.js
+++ b/scripts/generate_designs.js
@@ -321,7 +321,13 @@ function genComfy(prompt, seed, outPath, meta) {
   // Conditional on TILE_CATEGORIES because figure-on-ground categories
   // (drunk-animals, designer-bugs) shouldn't have the figure wrap around edges.
   // Requires spinagon/ComfyUI-seamless-tiling on target ComfyUI (Mac1 9225ed5d).
-  const tileable = !!(meta && TILE_CATEGORIES.has(meta.category));
+  // WALLCO_FORCE_TILEABLE=1 opts a silhouette category (e.g. cactus) into the
+  // circular-padding seamless workflow without adding it to TILE_CATEGORIES
+  // (which would also swap its prompt to the dense tile profile). For a true
+  // seamless wallpaper repeat the figure SHOULD wrap across the boundary —
+  // 2026-05-27 cactus quality-redo. Default behavior unchanged when unset.
+  const tileable = process.env.WALLCO_FORCE_TILEABLE === '1'
+    || !!(meta && TILE_CATEGORIES.has(meta.category));
   const BASE_MODEL_REF  = tileable ? ['1000', 0] : ['4',  0];
   const REFINER_MODEL_REF = tileable ? ['1001', 0] : ['15', 0];
   const BASE_VAE_REF    = tileable ? ['2000', 0] : ['4',  2];

← ef42bbe defect-registry viewer: accurate filtered_total + Load-more  ·  back to Wallco Ai  ·  cactus-curator: SHIFT+drag to box bad areas (dotted red boxe 0d0cca4 →