[object Object]

← back to Wallco Ai

generator hardening: tone-on-tone suffix + neon/rainbow negative_prompt across all prompt builders

dec2cf795e85363dc23d6af809c1adbe87dcf4e7 · 2026-05-19 23:34:41 -0700 · Steve

Files touched

Diff

commit dec2cf795e85363dc23d6af809c1adbe87dcf4e7
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue May 19 23:34:41 2026 -0700

    generator hardening: tone-on-tone suffix + neon/rainbow negative_prompt across all prompt builders
---
 scripts/cherry_blossom_animal_prompts.js |  4 ++++
 scripts/drunk_animal_prompts.js          |  8 ++++++--
 scripts/fashion_palettes.js              |  8 +++++++-
 scripts/generate_designs.js              | 23 +++++++++++++++++++----
 4 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/scripts/cherry_blossom_animal_prompts.js b/scripts/cherry_blossom_animal_prompts.js
index 8ee92ec..e0e5597 100644
--- a/scripts/cherry_blossom_animal_prompts.js
+++ b/scripts/cherry_blossom_animal_prompts.js
@@ -150,6 +150,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.',
   ].join(', ');
 }
 
@@ -173,6 +175,8 @@ function buildN(n, opts = {}) {
       pickRand(COMPOSITIONS),
       'CRITICAL: every animal MUST be facing UP toward the cherry blossoms above — chin lifted, eyes/snout skyward',
       'seamless wallpaper repeat, archival quality, refined heritage botanical, 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.',
     ].join(', '));
   }
   return out;
diff --git a/scripts/drunk_animal_prompts.js b/scripts/drunk_animal_prompts.js
index 23d1397..8dd57d7 100644
--- a/scripts/drunk_animal_prompts.js
+++ b/scripts/drunk_animal_prompts.js
@@ -200,7 +200,9 @@ function buildPrompt(seed = null) {
       `palette: ${pick(pickPaletteSource())}`,
       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'
+      '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.'
     ].join(', ');
   }
   return [
@@ -230,7 +232,9 @@ function buildN(n) {
       `palette: ${pickRand(pickPaletteSource())}`,
       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'
+      '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.'
     ];
     out.push(parts.join(', '));
   }
diff --git a/scripts/fashion_palettes.js b/scripts/fashion_palettes.js
index f62d835..43623e4 100644
--- a/scripts/fashion_palettes.js
+++ b/scripts/fashion_palettes.js
@@ -42,4 +42,10 @@ function paletteString(p) {
   return `${p.brand} palette — ${p.hex.join(', ')} (${p.signature})`;
 }
 
-module.exports = { FASHION_PALETTES, pickFashionPalette, paletteString };
+// ── 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";
+
+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 ec7f935..58b575c 100644
--- a/scripts/generate_designs.js
+++ b/scripts/generate_designs.js
@@ -28,6 +28,14 @@ fs.mkdirSync(OUT, { recursive: true });
 
 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";
+
 // 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).
 const WIDTH_POOL = (process.env.GENERATE_WIDTH_POOL || '24,24,36,36,52')
@@ -81,7 +89,8 @@ function pickPrompts(category, n) {
   const pool = PROMPT_LIBRARY[category] || PROMPT_LIBRARY.mixed;
   const all = [];
   while (all.length < n) all.push(pool[all.length % pool.length]);
-  return all.slice(0, n);
+  // Append tone-on-tone aesthetic direction to every prompt.
+  return all.slice(0, n).map(p => `${p}. ${TONE_ON_TONE_SUFFIX}`);
 }
 
 // ---- backends -------------------------------------------------------------
@@ -152,7 +161,7 @@ function genReplicate(prompt, seed, outPath) {
   const HEIGHT = parseInt(process.env.REPLICATE_HEIGHT || '1024', 10);
 
   const positive = `${prompt}, seamless tile, repeating pattern, no edges, fabric pattern, wallpaper design, archival quality, high detail, screen-printed wallpaper quality, solid opaque richly-saturated ink, every motif fully filled with solid color, crisp clean color separation, dimensional embossed relief, three-dimensional rendered depth welcome, tactile luxe material finishes — suede, woven trim, raffia, grasscloth texture`;
-  const negative = 'low quality, blurry, edges, seam, border, frame, signature, watermark, text, hands, fingers, deformed, transparent, see-through, translucent, unfilled shapes, hollow outlines, outline-only motifs, ghosted layers, washed out, faded, low opacity, gaps in the ink, missing fill, gradient bleed, halftone, halftone dots, ben-day dots, dot-screen shading, half-tone gradient texture';
+  const negative = `low quality, blurry, edges, seam, border, frame, signature, watermark, text, hands, fingers, deformed, transparent, see-through, translucent, unfilled shapes, hollow outlines, outline-only motifs, ghosted layers, washed out, faded, low opacity, gaps in the ink, missing fill, gradient bleed, halftone, halftone dots, ben-day dots, dot-screen shading, half-tone gradient texture, ${NEGATIVE_PROMPT_ADDON}`;
 
   const body = {
     version: MODEL_VERSION,
@@ -217,7 +226,7 @@ function genComfy(prompt, seed, outPath) {
   // suffix to the prompt — works adequately with SDXL. A proper SDXL tile-mode model
   // would be cleaner; swap COMFY_MODEL later.
   const positivePrompt = `${prompt}, seamless tile, repeating pattern, no edges, fabric pattern, wallpaper design, high detail, archival quality, screen-printed wallpaper quality, solid opaque richly-saturated ink, every motif fully filled with solid color, crisp clean color separation, dimensional embossed relief, three-dimensional rendered depth welcome, tactile luxe material finishes — suede, woven trim, raffia, grasscloth texture`;
-  const negativePrompt = 'low quality, blurry, edges, seam, border, frame, signature, watermark, text, hands, fingers, transparent, see-through, translucent, unfilled shapes, hollow outlines, outline-only motifs, ghosted layers, washed out, faded, low opacity, gaps in the ink, missing fill, gradient bleed, halftone, halftone dots, ben-day dots, dot-screen shading, half-tone gradient texture';
+  const negativePrompt = `low quality, blurry, edges, seam, border, frame, signature, watermark, text, hands, fingers, transparent, see-through, translucent, unfilled shapes, hollow outlines, outline-only motifs, ghosted layers, washed out, faded, low opacity, gaps in the ink, missing fill, gradient bleed, halftone, halftone dots, ben-day dots, dot-screen shading, half-tone gradient texture, ${NEGATIVE_PROMPT_ADDON}`;
 
   // Optional SDXL refiner — set COMFY_REFINER_MODEL=sd_xl_refiner_1.0.safetensors
   // to run base+refiner (expert-ensemble), matching what Replicate's SDXL does.
@@ -378,7 +387,13 @@ function main() {
   const widthFixed = (opt.width != null);
   console.log(`Generating ${opt.n} × ${opt.kind} (${widthFixed ? `${opt.width}"×${opt.height||opt.width}"` : `width mixed from [${WIDTH_POOL.join(',')}]`}, category=${opt.category}, backend=${BACKEND})`);
 
-  const prompts = opt.prompts || pickPrompts(opt.category, opt.n);
+  // If caller passed --prompts directly (e.g. drunk_animal/cherry_blossom
+  // batch runners, settlement regen), still append the tone-on-tone suffix
+  // so the aesthetic gate applies at the entrypoint level — no caller can
+  // bypass it without explicitly stripping the suffix.
+  const prompts = opt.prompts
+    ? opt.prompts.map(p => /tone-on-tone/i.test(p) ? p : `${p}. ${TONE_ON_TONE_SUFFIX}`)
+    : pickPrompts(opt.category, opt.n);
   const created = [];
   for (let i = 0; i < opt.n; i++) {
     const prompt = prompts[i];

← df08ff3 add professional-palette reference + suffix learned from dw_  ·  back to Wallco Ai  ·  server: passesAestheticGate runtime filter in loadDesigns (n c1c8a89 →