[object Object]

← back to Wallco Ai

generator_tick: restrict tile categories to tone-on-tone palettes (DTD verdict B)

b0267050d653bfc0b3b494c89f86091214a595bc · 2026-05-26 10:19:13 -0700 · Steve Abrams

High-contrast fashion palettes (Prada scarlet, Chanel B&W, Gymshark) contradict
the appended TONE_ON_TONE_SUFFIX and fail the seamless edge-pixel check on dense
tile repeats. Tag each fashion palette toneOnTone true/false; tile categories now
pick only from the soft/archival subset via pickFashionPalette({toneOnToneOnly}).
Figure/scenic categories (drunk-animals, murals) keep the full palette set.
Addresses the standing 100% SEAMLESS_FAIL_BOTH-on-damask failure.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit b0267050d653bfc0b3b494c89f86091214a595bc
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue May 26 10:19:13 2026 -0700

    generator_tick: restrict tile categories to tone-on-tone palettes (DTD verdict B)
    
    High-contrast fashion palettes (Prada scarlet, Chanel B&W, Gymshark) contradict
    the appended TONE_ON_TONE_SUFFIX and fail the seamless edge-pixel check on dense
    tile repeats. Tag each fashion palette toneOnTone true/false; tile categories now
    pick only from the soft/archival subset via pickFashionPalette({toneOnToneOnly}).
    Figure/scenic categories (drunk-animals, murals) keep the full palette set.
    Addresses the standing 100% SEAMLESS_FAIL_BOTH-on-damask failure.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 scripts/fashion_palettes.js | 54 +++++++++++++++++++++++++++------------------
 scripts/generator_tick.js   | 23 +++++++++++++++----
 2 files changed, 52 insertions(+), 25 deletions(-)

diff --git a/scripts/fashion_palettes.js b/scripts/fashion_palettes.js
index 15d166d..c65fdd0 100644
--- a/scripts/fashion_palettes.js
+++ b/scripts/fashion_palettes.js
@@ -14,30 +14,42 @@
 const fs = require('fs');
 const path = require('path');
 
+// `toneOnTone` flag (2026-05-26, DTD verdict B): true = low-saturation /
+// archival / soft-edged palette that survives the seamless edge-pixel check;
+// false = high-contrast or saturated-primary palette ("sharp", "bold", "high
+// contrast", "maximalism", scarlet/orange jolt) that contradicts the
+// TONE_ON_TONE_SUFFIX and fails the seam check on dense tile repeats. Tile
+// categories pick only from the tone-on-tone subset; figure/scenic categories
+// (drunk-animals, murals) may use any palette since they skip the seam check.
 const FASHION_PALETTES = [
-  { brand: 'Hermès',          hex: ['#FF4F00', '#1a1410', '#FFFEFA', '#E5DDD0'], signature: 'burnt-orange accent, saddle-stitch warmth, generous ground' },
-  { brand: 'Bottega Veneta',  hex: ['#107A3B', '#0e1311', '#F4F0E6', '#1d2a23'], signature: 'BV green, woven intrecciato, craft-forward' },
-  { brand: 'Prada',           hex: ['#000000', '#FF0000', '#F5F2EB'],            signature: 'cream ground, scarlet accent, scientific austerity' },
-  { brand: 'Saint Laurent',   hex: ['#000000', '#FFFFFF'],                       signature: 'pure monochrome, sharp ultra-minimal' },
-  { brand: 'Dior',            hex: ['#1A1A1A', '#FAF9F6', '#A98B5B', '#D8D2C5'], signature: 'refined gray, soft gold accent, couture restraint' },
-  { brand: 'Chanel',          hex: ['#000000', '#FFFFFF'],                       signature: 'timeless black & white, high-contrast hierarchy' },
-  { brand: 'Gucci',           hex: ['#006837', '#A41E1A', '#FFFEF7', '#1a1a1a'], signature: 'green & red maximalism, ornate, warm ivory ground' },
-  { brand: 'Celine',          hex: ['#000000', '#FFFFFF', '#E0E0E0'],            signature: 'minimalist gallery monochrome, sharp' },
-  { brand: 'Loewe',           hex: ['#9B7B4F', '#F2EDE2', '#2C1F0F', '#C9BFA7'], signature: 'soft cream, hand-craft warmth, airy' },
-  { brand: 'Valentino',       hex: ['#D70000', '#FFFFFF', '#000000'],            signature: 'saturated romantic red, classical drama' },
-  { brand: 'Toteme',          hex: ['#1A1A1A', '#F5F2ED', '#D5CFC4'],            signature: 'quiet restrained neutral, understated' },
-  { brand: 'Khaite',          hex: ['#3A3530', '#F2EFE9', '#C9BFB4'],            signature: 'refined warm neutral, soft luxury' },
-  { brand: 'Balenciaga',      hex: ['#000000', '#F5F5F5', '#FF4F00'],            signature: 'brutalist, anti-luxury, oversized orange jolt' },
-  { brand: 'Burberry',        hex: ['#A47C5A', '#FFFFFF', '#000000'],            signature: 'heritage tan, check-pattern motif, clean' },
-  { brand: 'Miu Miu',         hex: ['#FFB6C1', '#FFF8F2', '#000000', '#FFCFD8'], signature: 'playful editorial pink, magazine warmth' },
-  { brand: 'Jacquemus',       hex: ['#F4D24F', '#FFFCF5', '#1a1a1a', '#F2E5A8'], signature: 'sun-yellow accent, French Riviera, cinematic' },
-  { brand: 'Skims',           hex: ['#C9B8A4', '#F5EFE6', '#3D352B', '#E8DDC9'], signature: 'nude flesh tones, soft conversion-led calm' },
-  { brand: 'Gymshark',        hex: ['#000000', '#1B5E20', '#FFFFFF'],            signature: 'bold black, deep-green energy, high contrast' },
-  { brand: 'Phoebe Philo',    hex: ['#000000', '#F5F5F0', '#D8D2C5'],            signature: 'typography-led minimal, refined off-white' },
+  { brand: 'Hermès',          hex: ['#FF4F00', '#1a1410', '#FFFEFA', '#E5DDD0'], signature: 'burnt-orange accent, saddle-stitch warmth, generous ground', toneOnTone: false },
+  { brand: 'Bottega Veneta',  hex: ['#107A3B', '#0e1311', '#F4F0E6', '#1d2a23'], signature: 'BV green, woven intrecciato, craft-forward',                  toneOnTone: true },
+  { brand: 'Prada',           hex: ['#000000', '#FF0000', '#F5F2EB'],            signature: 'cream ground, scarlet accent, scientific austerity',          toneOnTone: false },
+  { brand: 'Saint Laurent',   hex: ['#000000', '#FFFFFF'],                       signature: 'pure monochrome, sharp ultra-minimal',                        toneOnTone: false },
+  { brand: 'Dior',            hex: ['#1A1A1A', '#FAF9F6', '#A98B5B', '#D8D2C5'], signature: 'refined gray, soft gold accent, couture restraint',           toneOnTone: true },
+  { brand: 'Chanel',          hex: ['#000000', '#FFFFFF'],                       signature: 'timeless black & white, high-contrast hierarchy',             toneOnTone: false },
+  { brand: 'Gucci',           hex: ['#006837', '#A41E1A', '#FFFEF7', '#1a1a1a'], signature: 'green & red maximalism, ornate, warm ivory ground',           toneOnTone: false },
+  { brand: 'Celine',          hex: ['#000000', '#FFFFFF', '#E0E0E0'],            signature: 'minimalist gallery monochrome, sharp',                        toneOnTone: false },
+  { brand: 'Loewe',           hex: ['#9B7B4F', '#F2EDE2', '#2C1F0F', '#C9BFA7'], signature: 'soft cream, hand-craft warmth, airy',                         toneOnTone: true },
+  { brand: 'Valentino',       hex: ['#D70000', '#FFFFFF', '#000000'],            signature: 'saturated romantic red, classical drama',                     toneOnTone: false },
+  { brand: 'Toteme',          hex: ['#1A1A1A', '#F5F2ED', '#D5CFC4'],            signature: 'quiet restrained neutral, understated',                       toneOnTone: true },
+  { brand: 'Khaite',          hex: ['#3A3530', '#F2EFE9', '#C9BFB4'],            signature: 'refined warm neutral, soft luxury',                           toneOnTone: true },
+  { brand: 'Balenciaga',      hex: ['#000000', '#F5F5F5', '#FF4F00'],            signature: 'brutalist, anti-luxury, oversized orange jolt',               toneOnTone: false },
+  { brand: 'Burberry',        hex: ['#A47C5A', '#FFFFFF', '#000000'],            signature: 'heritage tan, check-pattern motif, clean',                    toneOnTone: true },
+  { brand: 'Miu Miu',         hex: ['#FFB6C1', '#FFF8F2', '#000000', '#FFCFD8'], signature: 'playful editorial pink, magazine warmth',                     toneOnTone: false },
+  { brand: 'Jacquemus',       hex: ['#F4D24F', '#FFFCF5', '#1a1a1a', '#F2E5A8'], signature: 'sun-yellow accent, French Riviera, cinematic',                toneOnTone: false },
+  { brand: 'Skims',           hex: ['#C9B8A4', '#F5EFE6', '#3D352B', '#E8DDC9'], signature: 'nude flesh tones, soft conversion-led calm',                  toneOnTone: true },
+  { brand: 'Gymshark',        hex: ['#000000', '#1B5E20', '#FFFFFF'],            signature: 'bold black, deep-green energy, high contrast',                toneOnTone: false },
+  { brand: 'Phoebe Philo',    hex: ['#000000', '#F5F5F0', '#D8D2C5'],            signature: 'typography-led minimal, refined off-white',                   toneOnTone: true },
 ];
 
-function pickFashionPalette() {
-  return FASHION_PALETTES[Math.floor(Math.random() * FASHION_PALETTES.length)];
+// pickFashionPalette({ toneOnToneOnly: true }) restricts to the soft/archival
+// subset (tile categories). Default (no opts) picks from the full set.
+function pickFashionPalette(opts = {}) {
+  const pool = opts.toneOnToneOnly
+    ? FASHION_PALETTES.filter(p => p.toneOnTone)
+    : FASHION_PALETTES;
+  return pool[Math.floor(Math.random() * pool.length)];
 }
 
 function paletteString(p) {
diff --git a/scripts/generator_tick.js b/scripts/generator_tick.js
index 7375e8c..6777cfe 100644
--- a/scripts/generator_tick.js
+++ b/scripts/generator_tick.js
@@ -63,12 +63,27 @@ function pick(arr) {
   return arr[Math.floor(Math.random() * arr.length)];
 }
 
-function buildPrompt(recipe, paletteSeeds) {
+// Categories that are single-figure / scenic compositions, NOT dense tile
+// repeats — the seamless edge-pixel check is relaxed or skipped for these
+// (see SCENIC_CATEGORIES in lib/seamless-detector.js + the drunk-animal carve-
+// out in generate_designs.js), so bold high-contrast palettes are fine here.
+// Everything else is a tile repeat and must use the tone-on-tone palette subset
+// (DTD verdict B, 2026-05-26). New tile categories default to tone-on-tone (the
+// safe, seam-passing side) without needing to be listed.
+const BOLD_PALETTE_OK = new Set([
+  'drunk-animals', 'drunk-zoo', 'mural', 'scenic', 'designer-scenic',
+  'mural-animal', 'cactus-11ft-mural', 'tree-mural', 'cactus-pine-scenic',
+]);
+
+function buildPrompt(recipe, paletteSeeds, opts = {}) {
   const artist  = pick(recipe.source_artists) || 'a master textile designer';
   const style   = pick(recipe.style_tags) || 'damask';
   // Colour is seeded from the dw-fashion-templates style guide — a curated
-  // luxury-house palette per tick — rather than raw recent-order hex.
-  const palette = paletteString(pickFashionPalette());
+  // luxury-house palette per tick — rather than raw recent-order hex. For tile
+  // categories we restrict to the tone-on-tone subset: high-contrast fashion
+  // palettes (Prada scarlet, Chanel B&W, Gymshark) contradict the appended
+  // TONE_ON_TONE_SUFFIX and fail the seamless edge-pixel check (DTD verdict B).
+  const palette = paletteString(pickFashionPalette({ toneOnToneOnly: !!opts.toneOnToneOnly }));
   const tpl = recipe.prompt_template ||
     'A seamless wallpaper pattern in the style of {artist}, with {style} motifs, palette {palette}. Tileable 24x24 inch.';
   return tpl
@@ -136,7 +151,7 @@ function main() {
   }
 
   const seeds = recentPaletteSeeds(3);
-  let prompt = buildPrompt(recipe, seeds);
+  let prompt = buildPrompt(recipe, seeds, { toneOnToneOnly: !BOLD_PALETTE_OK.has(category) });
   if (failureCount > 0) {
     prompt = prompt + getAvoidanceAddendum(category);
   }

← f03778e geometric pilot: push 9 both-gates-clean designs live to wal  ·  back to Wallco Ai  ·  geometric pilot: record ghost-detector false-fail verificati 39c5e38 →