[object Object]

← back to Pattern Vault

fernwick: wire trending-dw GAP lanes into the generator (--lanes trending|both)

54f80259abdaaff26350c9972f83ba777628dea1 · 2026-07-08 08:52:05 -0700 · Steve Abrams

Connects the intelligence board to the generation pipeline: gen_daily.py can now generate in
the 8 settlement-safe GAP lanes that trending.designerwallcoverings.com flags as SELLING but
thin in our catalog (Art-Deco Geometric, Animal-Skin Print, Texture-Effect, Boho, Paisley/
Nomadic, Abstract Blur, Retro Geometric, Mushroom/Goblincore) — 'make what's actually selling'
instead of only whimsical. Tropical deliberately EXCLUDED (closest to the DW settlement bone).
--lanes whimsical (default) | trending | both. Records lane per design. Verified end-to-end:
2 trending designs generated + settlement-passed (Boho kilim + rose-blush tiger stripes = the
board's #1 animal-print-with-a-twist pick), actual cost $0.0063.

Files touched

Diff

commit 54f80259abdaaff26350c9972f83ba777628dea1
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jul 8 08:52:05 2026 -0700

    fernwick: wire trending-dw GAP lanes into the generator (--lanes trending|both)
    
    Connects the intelligence board to the generation pipeline: gen_daily.py can now generate in
    the 8 settlement-safe GAP lanes that trending.designerwallcoverings.com flags as SELLING but
    thin in our catalog (Art-Deco Geometric, Animal-Skin Print, Texture-Effect, Boho, Paisley/
    Nomadic, Abstract Blur, Retro Geometric, Mushroom/Goblincore) — 'make what's actually selling'
    instead of only whimsical. Tropical deliberately EXCLUDED (closest to the DW settlement bone).
    --lanes whimsical (default) | trending | both. Records lane per design. Verified end-to-end:
    2 trending designs generated + settlement-passed (Boho kilim + rose-blush tiger stripes = the
    board's #1 animal-print-with-a-twist pick), actual cost $0.0063.
---
 whimsical-compare/daily/scripts/gen_daily.py | 58 +++++++++++++++++++++++++---
 1 file changed, 52 insertions(+), 6 deletions(-)

diff --git a/whimsical-compare/daily/scripts/gen_daily.py b/whimsical-compare/daily/scripts/gen_daily.py
index eeb9c41..44efb03 100755
--- a/whimsical-compare/daily/scripts/gen_daily.py
+++ b/whimsical-compare/daily/scripts/gen_daily.py
@@ -51,6 +51,43 @@ PALETTES = ["sage, cream, terracotta", "dusty blue, ochre, ivory", "blush pink,
             "forest green, rust, bone", "peach, mint, taupe", "navy, marigold, linen",
             "plum, sage, apricot"]
 
+# ── TRENDING GAP LANES ─────────────────────────────────────────────────────────
+# Mapped from trending.designerwallcoverings.com's GAP_STYLES (styles that are demonstrably
+# SELLING across Etsy/Spoonflower/Patternbank/retail but thin in our catalog). Generating in
+# these lanes = "make what's actually selling", not just whimsical. Settlement-safe by
+# construction: NO directional-leaf tropical foliage, NO birds/butterflies/bananas/grapes
+# (the vision check still enforces the 4 banned motifs per output). Tropical is deliberately
+# EXCLUDED — it sits closest to the DW settlement bone; route tropical through the full
+# settlement gate separately, never the daily auto-drop.
+TREND_LANES = {
+    "Art-Deco Geometric":   {"style": "art-deco geometric", "desc": "bold graphic gilded and luxe",
+        "motifs": ["fan and sunburst motifs", "stepped chevron zigzags", "scalloped shell arcs", "metallic linear grid"],
+        "palettes": ["chartreuse, black, gold", "emerald, brass, cream", "navy, gold, black"]},
+    "Animal-Skin Print":    {"style": "animal-skin print", "desc": "chic maximalist with a modern colour twist",
+        "motifs": ["cheetah spots", "tiger stripes", "zebra stripes", "leopard rosettes", "snakeskin scales"],
+        "palettes": ["rose blush, cream, charcoal", "verdant green, black", "claret, sand, ink"]},
+    "Texture-Effect":       {"style": "textured wallcovering effect", "desc": "tactile tonal and sophisticated",
+        "motifs": ["grasscloth woven texture", "linen weave texture", "plaster limewash texture", "tweed fabric texture"],
+        "palettes": ["greige, oatmeal, stone", "mushroom, cream", "sage, taupe"]},
+    "Boho":                 {"style": "artisanal boho block-print", "desc": "earthy handcrafted and global",
+        "motifs": ["block-print medallions", "folk geometric borders", "mudcloth marks", "kilim diamonds"],
+        "palettes": ["terracotta, indigo, cream", "rust, ochre, sand"]},
+    "Paisley / Nomadic":    {"style": "nomadic paisley", "desc": "intricate decorative and heritage",
+        "motifs": ["kashmiri paisley boteh", "persian teardrop paisley", "mandala medallions"],
+        "palettes": ["claret, indigo, gold", "plum, teal, cream"]},
+    "Abstract Blur":        {"style": "abstract watercolor", "desc": "soft ethereal ombre and dreamy",
+        "motifs": ["ombre gradient washes", "inky bleed marks", "marbled fluid swirls", "soft-focus colour drifts"],
+        "palettes": ["blush, taupe, grey", "dusty blue, ivory", "sage, sand"]},
+    "Retro Geometric":      {"style": "retro mid-century geometric", "desc": "nostalgic bold and structured",
+        "motifs": ["interlocking semicircles", "atomic starbursts", "mod circle grids", "totem shapes"],
+        "palettes": ["mustard, teal, cream", "olive, rust, bone"]},
+    "Mushroom / Goblincore":{"style": "goblincore woodland", "desc": "whimsical cozy and folkloric",
+        "motifs": ["mushroom clusters and ferns", "toadstool rings and moss", "snails and pebbles among fungi"],
+        "palettes": ["forest green, brown, cream", "moss, plum, ochre"]},
+}
+# --lanes: whimsical (default, the original pools) | trending (GAP lanes) | both (50/50 mix)
+LANES = argv("--lanes", "whimsical")
+
 def http_json(url, payload=None, headers=None, timeout=180):
     hdr = {"User-Agent": UA, "Content-Type": "application/json"}
     if headers: hdr.update(headers)
@@ -99,11 +136,20 @@ attempts = 0
 i = 0
 while len(designs) < N and attempts < N * 3:
     attempts += 1
-    style = random.choice(STYLES); motif = random.choice(MOTIFS); palette = random.choice(PALETTES)
-    prompt = (f"Original hand-illustrated {style} wallpaper: {motif}, whimsical and charming, playful naive "
-              f"hand-drawn linework, our own artistic invention, not a copy of any existing design. "
-              f"seamless repeating wallpaper pattern, tileable, flat lay, even lighting, high-end wallcovering. "
-              f"Colorway: {palette}.")
+    use_trend = LANES == "trending" or (LANES == "both" and random.random() < 0.5)
+    if use_trend:
+        lane_label = random.choice(list(TREND_LANES)); L = TREND_LANES[lane_label]
+        style = L["style"]; motif = random.choice(L["motifs"]); palette = random.choice(L["palettes"])
+        prompt = (f"Original {style} wallpaper: {motif}, {L['desc']}, our own artistic invention, "
+                  f"not a copy of any existing design. seamless repeating wallpaper pattern, tileable, "
+                  f"flat lay, even lighting, high-end wallcovering. Colorway: {palette}.")
+    else:
+        lane_label = "whimsical"
+        style = random.choice(STYLES); motif = random.choice(MOTIFS); palette = random.choice(PALETTES)
+        prompt = (f"Original hand-illustrated {style} wallpaper: {motif}, whimsical and charming, playful naive "
+                  f"hand-drawn linework, our own artistic invention, not a copy of any existing design. "
+                  f"seamless repeating wallpaper pattern, tileable, flat lay, even lighting, high-end wallcovering. "
+                  f"Colorway: {palette}.")
     seed = SEED_BASE + attempts * 13
     pred = sdxl(prompt, seed)
     secs = (pred.get("metrics") or {}).get("predict_time", 0) or 0
@@ -121,7 +167,7 @@ while len(designs) < N and attempts < N * 3:
         continue
     t = title(style, motif, len(designs))
     designs.append({"n": len(designs)+1, "file": dest, "title": t, "style": style,
-                    "motif": motif, "palette": palette, "prompt": prompt,
+                    "motif": motif, "palette": palette, "lane": lane_label, "prompt": prompt,
                     "settlement": "OK", "predict_secs": round(secs, 1)})
     print(f"[{len(designs)}/{N}] {t}", file=sys.stderr)
     time.sleep(0.6)

← 3f91374 fernwick: surface uploader-DEGRADED in the daily email (both  ·  back to Pattern Vault  ·  fernwick: daily drop generates whimsical+trending mix (--lan db2ebec →