← 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
M data/professional-palette-reference.jsonM data/professional-palette-suffix.txtM scripts/build_professional_palette_reference.jsA scripts/cactus-sample-eval.pyM scripts/cactus-vision-score.jsM scripts/generate-cactus.jsM scripts/generate_designs.js
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 →