[object Object]

← back to Wallco Ai

reconcile generator suffix → empirical professional palette (23,817 real vendor products)

9abdaaa1fff911892473e3e34114892dd6e1a811 · 2026-05-19 23:39:32 -0700 · SteveStudio2

Files touched

Diff

commit 9abdaaa1fff911892473e3e34114892dd6e1a811
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Tue May 19 23:39:32 2026 -0700

    reconcile generator suffix → empirical professional palette (23,817 real vendor products)
---
 scripts/cherry_blossom_animal_prompts.js |  6 ++++--
 scripts/drunk_animal_prompts.js          | 10 ++++++----
 scripts/fashion_palettes.js              | 19 ++++++++++++++++---
 scripts/generate_designs.js              | 19 +++++++++++++++----
 4 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/scripts/cherry_blossom_animal_prompts.js b/scripts/cherry_blossom_animal_prompts.js
index e0e5597..0f2ece1 100644
--- a/scripts/cherry_blossom_animal_prompts.js
+++ b/scripts/cherry_blossom_animal_prompts.js
@@ -20,6 +20,8 @@
  *   - direct CLI: node scripts/cherry_blossom_animal_prompts.js 100
  */
 
+const { TONE_ON_TONE_SUFFIX } = require('./fashion_palettes');
+
 const DRUNK_TABLEAUX = [
   'chin tipped up to the blossoms, mouth wide, mid-guzzle from a long-stemmed wine glass — burgundy sloshing down its throat',
   'face turned skyward through falling petals, draining a frosted vodka bottle held in both paws, condensation dripping onto its chest',
@@ -150,8 +152,8 @@ function buildPrompt({ state = null, seed = null } = {}) {
     pick(COMPOSITIONS),
     'CRITICAL: every animal MUST be facing UP toward the cherry blossoms above — chin lifted, eyes/snout skyward, no animals looking down or sideways',
     'seamless wallpaper repeat, archival quality, refined heritage botanical aesthetic, no neon, no text, no watermark',
-    // Aesthetic gate — Steve 2026-05-19: tone-on-tone, no neon, ≤ 4 hues
-    'Tone-on-tone monochromatic palette, ≤ 3 hues from a single hue family, muted high-fashion neutrals only — ivory, taupe, sand, ecru, mushroom, slate, charcoal, midnight navy, oxblood, sage, olive, camel, tobacco. No saturated colors. No neon. No fluorescent. No rainbow. No more than 4 distinct hues. Editorial Vogue-cover restraint.',
+    // Aesthetic gate — Steve 2026-05-19: empirical professional palette from dw_unified
+    TONE_ON_TONE_SUFFIX,
   ].join(', ');
 }
 
diff --git a/scripts/drunk_animal_prompts.js b/scripts/drunk_animal_prompts.js
index 8dd57d7..d93a3e3 100644
--- a/scripts/drunk_animal_prompts.js
+++ b/scripts/drunk_animal_prompts.js
@@ -15,6 +15,8 @@
  *   - bin/drunk_animals_tick.js   — single design per 4-min cron firing
  */
 
+const { TONE_ON_TONE_SUFFIX } = require('./fashion_palettes');
+
 const ANIMALS = [
   'wide-eyed Amazonian tree frog',
   'pink-cheeked drunken bullfrog',
@@ -201,8 +203,8 @@ function buildPrompt(seed = null) {
       pick(STYLES),
       pick(COMPOSITIONS),
       'seamless wallpaper repeat, archival quality, FLOWERS ONLY, NO leaves, NO foliage, NO monstera, NO palm, NO banana, NO tropical, NO jungle, no text or watermark',
-      // Aesthetic gate — Steve 2026-05-19: tone-on-tone, no neon, ≤ 4 hues
-      'Tone-on-tone monochromatic palette, ≤ 3 hues from a single hue family, muted high-fashion neutrals only — ivory, taupe, sand, ecru, mushroom, slate, charcoal, midnight navy, oxblood, sage, olive, camel, tobacco. No saturated colors. No neon. No fluorescent. No rainbow. No more than 4 distinct hues. Editorial Vogue-cover restraint.'
+      // Aesthetic gate — Steve 2026-05-19: empirical professional palette from dw_unified
+      TONE_ON_TONE_SUFFIX
     ].join(', ');
   }
   return [
@@ -233,8 +235,8 @@ function buildN(n) {
       style,
       pickRand(COMPOSITIONS),
       'seamless wallpaper repeat, archival quality, FLOWERS ONLY, NO leaves, NO foliage, NO monstera, NO palm, NO banana, NO tropical, NO jungle, no text or watermark',
-      // Aesthetic gate — Steve 2026-05-19: tone-on-tone, no neon, ≤ 4 hues
-      'Tone-on-tone monochromatic palette, ≤ 3 hues from a single hue family, muted high-fashion neutrals only — ivory, taupe, sand, ecru, mushroom, slate, charcoal, midnight navy, oxblood, sage, olive, camel, tobacco. No saturated colors. No neon. No fluorescent. No rainbow. No more than 4 distinct hues. Editorial Vogue-cover restraint.'
+      // Aesthetic gate — Steve 2026-05-19: empirical professional palette from dw_unified
+      TONE_ON_TONE_SUFFIX
     ];
     out.push(parts.join(', '));
   }
diff --git a/scripts/fashion_palettes.js b/scripts/fashion_palettes.js
index 43623e4..15d166d 100644
--- a/scripts/fashion_palettes.js
+++ b/scripts/fashion_palettes.js
@@ -11,6 +11,8 @@
  * pickFashionPalette() -> a random brand palette object.
  * paletteString(p)     -> prompt-ready string: "Bottega Veneta palette — #.. (signature)".
  */
+const fs = require('fs');
+const path = require('path');
 
 const FASHION_PALETTES = [
   { brand: 'Hermès',          hex: ['#FF4F00', '#1a1410', '#FFFEFA', '#E5DDD0'], signature: 'burnt-orange accent, saddle-stitch warmth, generous ground' },
@@ -44,8 +46,19 @@ function paletteString(p) {
 
 // ── Aesthetic gate (Steve 2026-05-19) ──────────────────────────────────────
 // Re-exported so prompt builders can append a uniform tone-on-tone directive
-// without duplicating the wording.
-const TONE_ON_TONE_SUFFIX = "Tone-on-tone monochromatic palette, ≤ 3 hues from a single hue family, muted high-fashion neutrals only — ivory, taupe, sand, ecru, mushroom, slate, charcoal, midnight navy, oxblood, sage, olive, camel, tobacco. No saturated colors. No neon. No fluorescent. No rainbow. No more than 4 distinct hues. Editorial Vogue-cover restraint.";
-const NEGATIVE_PROMPT_ADDON = "neon, fluorescent, electric, saturated, rainbow, more than 4 colors, multicolor, vivid, day-glo, highlighter colors";
+// without duplicating the wording. The suffix is sourced from the EMPIRICAL
+// professional-palette reference learned from 23,817 real high-end vendor
+// products in dw_unified.shopify_color_enrichment. Refresh by re-running
+// scripts/build_professional_palette_reference.js.
+let TONE_ON_TONE_SUFFIX;
+try {
+  TONE_ON_TONE_SUFFIX = fs.readFileSync(
+    path.join(__dirname, '..', 'data', 'professional-palette-suffix.txt'),
+    'utf8'
+  ).trim();
+} catch (e) {
+  TONE_ON_TONE_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 — 23,817 real products analyzed). 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.";
+}
+const NEGATIVE_PROMPT_ADDON = "neon, fluorescent, electric, saturated, rainbow, more than 4 colors, multicolor, vivid, day-glo, highlighter colors, hot pink, primary red, primary yellow, primary blue, electric green";
 
 module.exports = { FASHION_PALETTES, pickFashionPalette, paletteString, TONE_ON_TONE_SUFFIX, NEGATIVE_PROMPT_ADDON };
diff --git a/scripts/generate_designs.js b/scripts/generate_designs.js
index 58b575c..d5d1968 100644
--- a/scripts/generate_designs.js
+++ b/scripts/generate_designs.js
@@ -31,10 +31,21 @@ const BACKEND = process.env.GEN_BACKEND || 'stub';
 // ── Aesthetic direction (Steve 2026-05-19) ─────────────────────────────────
 // Tone-on-tone, high-fashion. Bright neon and >4-distinct-hue palettes are
 // purged at the catalog level (scripts/purge-neon-and-multicolor.js) AND
-// must not be re-generated. We append this suffix to every prompt at pick
-// time and pass NEGATIVE_PROMPT_ADDON to the diffusion backend.
-const TONE_ON_TONE_SUFFIX = "Tone-on-tone monochromatic palette, ≤ 3 hues from a single hue family, muted high-fashion neutrals only — ivory, taupe, sand, ecru, mushroom, slate, charcoal, midnight navy, oxblood, sage, olive, camel, tobacco. No saturated colors. No neon. No fluorescent. No rainbow. No more than 4 distinct hues. Editorial Vogue-cover restraint.";
-const NEGATIVE_PROMPT_ADDON = "neon, fluorescent, electric, saturated, rainbow, more than 4 colors, multicolor, vivid, day-glo, highlighter colors";
+// must not be re-generated. The suffix is sourced from the EMPIRICAL
+// professional-palette reference learned from 23,817 real high-end vendor
+// products in dw_unified.shopify_color_enrichment (build_professional_palette_reference.js).
+// Rerun that script to refresh the suffix when the catalog changes.
+let TONE_ON_TONE_SUFFIX;
+try {
+  TONE_ON_TONE_SUFFIX = fs.readFileSync(
+    path.join(ROOT, 'data', 'professional-palette-suffix.txt'),
+    'utf8'
+  ).trim();
+} catch (e) {
+  // Inlined empirical fallback (matches the file as of commit 3804d0f).
+  TONE_ON_TONE_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 — 23,817 real products analyzed). 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.";
+}
+const NEGATIVE_PROMPT_ADDON = "neon, fluorescent, electric, saturated, rainbow, more than 4 colors, multicolor, vivid, day-glo, highlighter colors, hot pink, primary red, primary yellow, primary blue, electric green";
 
 // Distribution of generation widths when --width is not explicitly passed.
 // Override via env: GENERATE_WIDTH_POOL="24,24,36,36,52" (entries weight pick frequency).

← c1c8a89 server: passesAestheticGate runtime filter in loadDesigns (n  ·  back to Wallco Ai  ·  add /library surface data — materialize 57,629 real designer 6e30ae3 →