← 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
M scripts/cherry_blossom_animal_prompts.jsM scripts/drunk_animal_prompts.jsM scripts/fashion_palettes.jsM scripts/generate_designs.js
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 →