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