[object Object]

← back to Wallco Ai

Pollock-splatter (12) + Sherman-circus (20) collections published

33bc0da418175adf9591f20896205e7211e4c541 · 2026-05-20 08:33:26 -0700 · Steve

Files touched

Diff

commit 33bc0da418175adf9591f20896205e7211e4c541
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed May 20 08:33:26 2026 -0700

    Pollock-splatter (12) + Sherman-circus (20) collections published
---
 data/do-not-want.jsonl                     |  98 ++++
 scripts/generate-pollock.sh                |  46 ++
 scripts/generate-pollock.sh.bak            |  46 ++
 scripts/generate-sherman-circus.sh         |  75 +++
 scripts/generate-sherman-circus.sh.bak     |  75 +++
 scripts/night-builder.js.bak-vendor-final  | 906 +++++++++++++++++++++++++++++
 scripts/night-builder.js.bak-vendor-scrub  | 906 +++++++++++++++++++++++++++++
 scripts/night-builder.js.bak-vendor-scrub2 | 906 +++++++++++++++++++++++++++++
 8 files changed, 3058 insertions(+)

diff --git a/data/do-not-want.jsonl b/data/do-not-want.jsonl
index 950164b..27cc26b 100644
--- a/data/do-not-want.jsonl
+++ b/data/do-not-want.jsonl
@@ -1018,3 +1018,101 @@
 {"ts":"2026-05-20T14:57:04.886Z","design_id":24568,"category":"muybridge-plate · champagne-linen","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The motif has a clear ghost/duplicate behind it, a halftone layer, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
 {"ts":"2026-05-20T14:57:09.572Z","design_id":24566,"category":"throttled-plaster-roses","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the rose motif behind the main motif, and an atmospheric haze."},"source":"bleed_guard.ghost-layer"}
 {"ts":"2026-05-20T14:57:13.734Z","design_id":24564,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image shows a clear faded duplicate of the motif, halftone layer, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:00:17.364Z","design_id":24723,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the cactus motifs behind the main motifs."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:00:27.233Z","design_id":24719,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a clear faded duplicate of the cactus motifs behind the main motifs, and a soft haze behind the motifs."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:00:37.274Z","design_id":24715,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the deer motif behind the main motif, and a soft atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:00:46.467Z","design_id":24711,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The motifs have a faded duplicate behind them, a halftone layer, atmospheric haze, and interior shading, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:01:03.413Z","design_id":24703,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded duplicate of the horse motifs behind the main motifs, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:01:14.347Z","design_id":24699,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The raccoon motifs have a very obvious faded duplicate/ghost behind them, along with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:01:23.931Z","design_id":24695,"category":"face-skull-damask","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the motif behind the main motif, along with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:01:33.664Z","design_id":24691,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":1,"one_line_reason":"The pattern has a faded duplicate of the animal motifs behind the main motifs, creating a double exposure effect with interior shading and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:01:42.484Z","design_id":24687,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a clear faded duplicate of the cactus motifs behind the main ones, creating a double exposure effect with atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:01:51.040Z","design_id":24682,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded duplicate of the deer motif behind the main motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:02:10.061Z","design_id":24674,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a faded duplicate of the main motif behind itself, and atmospheric haze blurs the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:02:28.750Z","design_id":24666,"category":"face-skull-damask","reason":"obvious bleed: interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.9,"one_line_reason":"There is crosshatching and shading inside the skull motif that should be flat."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:07.802Z","design_id":24841,"category":"throttled-plaster-roses · bordeaux-velvet","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The roses have a faded duplicate behind them, a halftone layer, atmospheric haze, and interior shading, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:10.152Z","design_id":24840,"category":"throttled-plaster-roses","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The roses have a faded duplicate behind them, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:19.960Z","design_id":24834,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a double exposure look with a halftone layer and atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:29.056Z","design_id":24828,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very clear faded duplicate of the rabbit motif behind the main motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:38.111Z","design_id":24823,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded ghost of the jaguar motif behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:50.265Z","design_id":24818,"category":"throttled-plaster-roses","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The roses have a faded, ghosted duplicate behind them, and there is atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:05:59.713Z","design_id":24814,"category":"chinoiserie","reason":"obvious bleed: halftone_layer, atmospheric_haze, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a dot-screen effect, atmospheric haze, and interior shading, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:06:18.352Z","design_id":24803,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded duplicate of the panda motifs behind the main motifs."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:07:11.140Z","design_id":24776,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The lemur motifs have a very obvious faded duplicate behind them, and a halftone layer is also present."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:07:19.823Z","design_id":24772,"category":"fromental-scenic","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded ghost of the floral motif behind the main motif, and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:10:20.936Z","design_id":24935,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a faded ghost of the cactus motif behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:10:30.445Z","design_id":24930,"category":"chinoiserie","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the tree motif behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:10:32.977Z","design_id":24929,"category":"muybridge-plate · bordeaux-velvet","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The motif has a very obvious halftone layer behind it, creating a ghosting effect."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:10:35.277Z","design_id":24928,"category":"muybridge-plate · manor-saddle","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a very obvious halftone layer and atmospheric haze behind the main motif, creating a double exposure look."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:10:38.165Z","design_id":24927,"category":"muybridge-plate · slate-mist","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The motif has a very obvious faded duplicate and halftone layer behind it, creating a double exposure look."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:10:41.236Z","design_id":24926,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded ghost of the lion motif behind the main motif, and a general atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:11:02.564Z","design_id":24917,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded ghost of the main motif behind itself, and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:11:12.788Z","design_id":24913,"category":"face-skull-damask","reason":"obvious bleed: halftone_layer, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a halftone layer behind the motif and interior shading bleed inside the skull."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:11:30.434Z","design_id":24909,"category":"face-skull-damask","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded duplicate of the main motif behind itself, and an atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:11:50.663Z","design_id":24901,"category":"throttled-plaster-roses","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The roses have a very obvious faded ghost image behind them, with a blurred haze layer."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:12:12.400Z","design_id":24892,"category":"chinoiserie","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the floral motif and atmospheric haze behind the main motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:12:29.695Z","design_id":24884,"category":"fromental-scenic","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the floral motif and branches behind the main motif, and an atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:15:24.391Z","design_id":25043,"category":"designer-zoo-calm · manor-saddle","reason":"obvious bleed: halftone_layer, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a halftone layer and interior shading bleed, giving it a double exposure look."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:15:26.535Z","design_id":25042,"category":"designer-zoo-calm · slate-mist","reason":"obvious bleed: halftone_layer, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a dot-screen layer behind the motifs, and crosshatching inside the silhouettes."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:15:31.302Z","design_id":25040,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The main motif has a faded ghost / duplicate / echo offset behind itself, and there is atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:15:40.966Z","design_id":25036,"category":"fromental-scenic","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a clear faded duplicate of the motif behind the main motif, and atmospheric haze is present."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:15:52.094Z","design_id":25031,"category":"fromental-scenic","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the floral motif and branches behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:01.558Z","design_id":25027,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the fox motifs behind the main motifs, along with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:10.151Z","design_id":25023,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":1,"one_line_reason":"The cactus motif has a faded duplicate behind it, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:19.198Z","design_id":25019,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded ghost of the motif behind the main motif, and a soft haze behind the motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:26.410Z","design_id":25016,"category":"fromental-scenic · deep-plum","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The pattern exhibits a clear faded duplicate of the main motif, a halftone layer, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:38.034Z","design_id":25010,"category":"chinoiserie","reason":"obvious bleed: halftone_layer, atmospheric_haze, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a blurred haze layer, interior shading, and a halftone layer behind the motif, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:51.701Z","design_id":25004,"category":"face-skull-damask · oxblood","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The motif has a very obvious faded duplicate behind it, a halftone layer, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:56.720Z","design_id":25002,"category":"face-skull-damask","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the motif behind the main one, with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:16:59.380Z","design_id":25001,"category":"pollock-splatter","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The main motif is repeated as a faded ghost offset behind itself, and there is atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:17:09.429Z","design_id":24997,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious ghosted duplicate of the lion motif behind the main motif, and a halftone layer."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:17:18.935Z","design_id":24993,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a faded duplicate of the animals behind the main motif, and interior shading inside the animal silhouettes."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:20:22.277Z","design_id":25167,"category":"face-skull-damask","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The skull motif has a faded duplicate behind it, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:20:31.046Z","design_id":25161,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious ghosting effect of the figures behind the main figures, and a haze effect."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:20:40.957Z","design_id":25156,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the trees and deer behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:20:49.897Z","design_id":25152,"category":"chinoiserie","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a very obvious faded duplicate of the main motif, a halftone layer, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:20:58.718Z","design_id":25147,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded duplicate of the main motif behind itself."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:01.032Z","design_id":25146,"category":"muybridge-plate · greenhouse-glass","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a very strong bleed effect with a ghosted motif, halftone layer, atmospheric haze, and interior shading."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:03.331Z","design_id":25145,"category":"muybridge-plate · indigo-library","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":1,"one_line_reason":"The motifs have a clear halftone layer behind them and interior shading, creating a double exposure look."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:05.484Z","design_id":25144,"category":"muybridge-plate · bordeaux-velvet","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The motif has a very obvious halftone layer and atmospheric haze behind it, creating a ghosting effect."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:08.336Z","design_id":25143,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious ghosting effect behind the figures, and a halftone layer."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:18.490Z","design_id":25139,"category":"face-skull-damask","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the motif behind the main design, with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:28.089Z","design_id":25135,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded ghost of the fox motif behind the main motif, and a halftone layer."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:47.214Z","design_id":25127,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded ghost of the anteater motif behind the main motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:49.508Z","design_id":25126,"category":"throttled-plaster-roses · bone-ivory","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The roses have a very obvious faded duplicate behind them, with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:21:56.726Z","design_id":25123,"category":"throttled-plaster-roses","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the rose motif behind the main motif, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:22:09.443Z","design_id":25118,"category":"pollock-splatter","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The main motif is repeated as a faded ghost / duplicate / echo offset behind itself."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:22:19.204Z","design_id":25114,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious faded duplicate of the cactus motifs behind the main layer, creating a double exposure effect with atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:25:19.242Z","design_id":25408,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the cactus motif behind the main motif, and an atmospheric haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:25:35.287Z","design_id":25401,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The main motif is repeated as a faded ghost offset behind itself, and there is atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:25:37.316Z","design_id":25400,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded ghost of the bear motif behind the main motif, and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:25:39.724Z","design_id":25399,"category":"pollock-splatter","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a clear faded duplicate of the splatter motif behind the main one, creating a double exposure effect with atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:06.267Z","design_id":25387,"category":"throttled-plaster-roses · bordeaux-velvet","reason":"obvious bleed: halftone_layer, atmospheric_haze","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious halftone layer and atmospheric haze behind the main motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:09.204Z","design_id":25386,"category":"throttled-plaster-roses · manor-saddle","reason":"obvious bleed: halftone_layer, atmospheric_haze, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The pattern has a blurred haze layer behind the motif and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:13.840Z","design_id":25384,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the cactus motif behind the main motif."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:29.190Z","design_id":25373,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The fox motifs have a faded duplicate behind them, atmospheric haze, and interior shading."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:31.435Z","design_id":25372,"category":"muybridge-plate · champagne-linen","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The elephant motifs have a clear ghosting effect and interior shading, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:33.472Z","design_id":25371,"category":"muybridge-plate · bone-ivory","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The elephant motifs have a clear faded duplicate behind them, a halftone layer, atmospheric haze, and interior shading, indicating significant motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:35.541Z","design_id":25370,"category":"muybridge-plate · stone-pewter","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the elephant motif behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:37.853Z","design_id":25369,"category":"muybridge-plate","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a faded duplicate of the elephant motif behind the main motif, atmospheric haze, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:49.079Z","design_id":25364,"category":"throttled-plaster-roses · champagne-linen","reason":"obvious bleed: halftone_layer, atmospheric_haze","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The background has a very strong halftone layer and atmospheric haze, but no motif ghosting or interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:26:56.223Z","design_id":25361,"category":"throttled-plaster-roses","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The roses have a very obvious faded duplicate behind them, with a hazy background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:27:06.436Z","design_id":25356,"category":"throttled-plaster-roses · bordeaux-velvet","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious halftone layer behind the main motif, creating a ghosting effect."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:27:08.560Z","design_id":25355,"category":"throttled-plaster-roses · manor-saddle","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious halftone layer behind the main motif, creating a ghosting effect."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:27:18.274Z","design_id":25352,"category":"muybridge-plate · slate-mist","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The horse motif has a very obvious faded duplicate behind it, with halftone dots and interior shading."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:12.127Z","design_id":25716,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious ghost/duplicate of the motif behind the main motif, as well as interior shading."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:23.288Z","design_id":25711,"category":"designer-zoo-calm · bone-ivory","reason":"obvious bleed: halftone_layer, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The bears have a dot-screen layer behind them and interior shading, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:25.566Z","design_id":25710,"category":"designer-zoo-calm · stone-pewter","reason":"obvious bleed: halftone_layer, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The bears have a dot-screen layer behind them and interior shading, indicating motif bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:27.820Z","design_id":25709,"category":"designer-scenic","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a faded duplicate of the tree motif behind the main motif, along with a halftone layer and atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:30.334Z","design_id":25708,"category":"sherman-circus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a clear double exposure look with a halftone layer and atmospheric haze behind the main motif, and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:32.793Z","design_id":25707,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The bears have a very obvious faded duplicate behind them, a halftone layer, atmospheric haze, and interior shading."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:30:48.715Z","design_id":25700,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a clear faded duplicate of the cactus motifs behind the main ones, creating a double exposure effect with atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:10.834Z","design_id":25692,"category":"sherman-circus","reason":"obvious bleed: halftone_layer, interior_shading_bleed","verdict":{"has_motif_ghost":false,"has_halftone_layer":true,"has_atmospheric_haze":false,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a halftone layer behind the motifs and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:13.342Z","design_id":25691,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded ghost of the fox motif behind the main motif, and a soft haze in the background."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:30.910Z","design_id":25683,"category":"cactus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The cactus motifs have a clear faded duplicate behind them, along with a halftone layer and interior shading."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:33.130Z","design_id":25682,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"The motifs are repeated as faded ghosts behind themselves, creating a double exposure look."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:37.605Z","design_id":25680,"category":"sherman-circus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a clear double exposure look with a halftone layer and interior shading bleed."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:50.528Z","design_id":25674,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":1,"one_line_reason":"There is a very obvious ghost/duplicate of the bear motifs behind the main motifs."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:31:52.696Z","design_id":25673,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":false,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"Faded fox motifs are repeated behind the main foxes, creating a double exposure look."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:32:02.043Z","design_id":25669,"category":"designer-zoo-calm","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":false,"has_atmospheric_haze":true,"has_interior_shading_bleed":false,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"There is a very obvious faded duplicate of the motifs behind the main layer, creating a double exposure look with atmospheric haze."},"source":"bleed_guard.ghost-layer"}
+{"ts":"2026-05-20T15:32:06.562Z","design_id":25667,"category":"sherman-circus","reason":"motif ghost layer (obvious)","verdict":{"has_motif_ghost":true,"has_halftone_layer":true,"has_atmospheric_haze":true,"has_interior_shading_bleed":true,"bleed_severity":"obvious","confidence":0.95,"one_line_reason":"The image has a clear double exposure effect with a halftone layer and atmospheric haze, and interior shading."},"source":"bleed_guard.ghost-layer"}
diff --git a/scripts/generate-pollock.sh b/scripts/generate-pollock.sh
new file mode 100755
index 0000000..622d6cc
--- /dev/null
+++ b/scripts/generate-pollock.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+# One-shot batch: 12 Jackson Pollock-style drip/splatter wallpaper designs
+# in Steve's muted Designer-Wallcoverings palette.
+# Inspired by Pollock "Number 17A" ($200M private 2015) and tapestry-scale
+# drip canvases. NOT a copy — emulate the gestural drip-splatter language
+# in our color vocabulary.
+# 12 base designs × 3 colorway variants = 48 total.
+
+cd "$(dirname "$0")/.."
+PSQL="/opt/homebrew/opt/postgresql@14/bin/psql"
+
+# 12 colorway pairs — each is (ground, drip-figure, accent, shadow), all in
+# the same hue family per Steve's hue-sync directive.
+declare -a CWS=(
+  "Cream Loden|#F2EADB|#3C4844|#9B8050|#1A2520"
+  "Bone Ink|#F2EADB|#1F2740|#C9A14B|#0B0F1C"
+  "Charcoal Cream|#F2EADB|#3D3833|#C9A14B|#0F0D0B"
+  "Saddle Mocha|#F2EADB|#5C4033|#A78863|#2A1810"
+  "Smoke Ash|#F2EADB|#6B6660|#A8A39C|#3A3530"
+  "Forest Loden|#F2EADB|#3C4844|#A8B79A|#1A2520"
+  "Bordeaux Velvet|#F2EADB|#5C2329|#C84A3A|#2A0E10"
+  "Oxblood|#F2EADB|#722F2F|#A85040|#3A1010"
+  "Midnight Navy|#F2EADB|#1B2A3A|#3E6B82|#0B1018"
+  "Deep Plum|#F2EADB|#3D2B3F|#856080|#1A101E"
+  "Pine Charcoal|#F2EADB|#3A4A45|#9CA09B|#1A2520"
+  "Greenhouse Glass|#F2EADB|#1F4E47|#85A095|#0B201C"
+)
+
+for i in 1 2 3 4 5 6 7 8 9 10 11 12; do
+  IFS='|' read -r NAME GROUND FIGURE ACCENT SHADOW <<< "${CWS[$((i-1))]}"
+  PROMPT="Jackson Pollock drip-splatter abstract wallpaper — ${NAME} colorway. Ground: solid ${GROUND}. Primary drip ink: ${FIGURE}. Secondary accent splatter: ${ACCENT}. Tertiary depth splatter: ${SHADOW}. EXACTLY 4 COLORS — ground + figure + accent + shadow, all in the same hue family (hue-sync). Composition: chaotic gestural drip painting — long thrown lines of ink, splatter clusters, dripped pools, swirling skeins. The marks are FLAT FILLED SHAPES (not painted brush strokes) — each splatter, drip, and pool is one uniform solid ink color with hard edges. NO half-tones, NO chromatic gradient, NO color bleed between layers. The 4 colors are layered in distinct flat zones — drip-line, accent-splatter, shadow-pool, ground — never blended. References: Pollock 'Number 17A' \$200M drip painting, but rendered as a 4-color screen-print serigraph (Andy Warhol pop-art treatment of Pollock's drip language), Maya Romanoff handcrafted luxe wallcovering. Generous breathing room — at least 60% of the canvas shows clean ground tone between drip clusters. Square aspect ratio, seamless tile repeat, no edge artifacts."
+  echo "=== generating $i/12: $NAME ==="
+  RESULT=$(GEN_BACKEND=replicate node scripts/generate_designs.js --n 1 --kind seamless_tile --width 54 --height 54 --category pollock-splatter --prompts "$PROMPT" 2>&1 | tail -3)
+  ID=$(echo "$RESULT" | grep -oE "#[0-9]+" | head -1 | tr -d '#')
+  if [ -n "$ID" ]; then
+    LP=$("$PSQL" dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=$ID;")
+    if [ -f "$LP" ]; then
+      # 4-color quantize to enforce hue-sync palette
+      QUANT_COLORS=4 python3 scripts/quantize-2tone.py "$LP" 2>&1 | grep -v Deprecation | tail -1
+      "$PSQL" dw_unified -c "UPDATE spoon_all_designs SET is_published=TRUE WHERE id=$ID;" >/dev/null 2>&1
+      echo "  published id=$ID"
+    fi
+  fi
+sleep 5
+done
+echo "=== done — all 12 Pollock-splatter designs published ==="
diff --git a/scripts/generate-pollock.sh.bak b/scripts/generate-pollock.sh.bak
new file mode 100755
index 0000000..92cbe9a
--- /dev/null
+++ b/scripts/generate-pollock.sh.bak
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+# One-shot batch: 12 Jackson Pollock-style drip/splatter wallpaper designs
+# in Steve's muted Designer-Wallcoverings palette.
+# Inspired by Pollock "Number 17A" ($200M private 2015) and tapestry-scale
+# drip canvases. NOT a copy — emulate the gestural drip-splatter language
+# in our color vocabulary.
+# 12 base designs × 3 colorway variants = 48 total.
+
+cd "$(dirname "$0")/.."
+PSQL="/opt/homebrew/opt/postgresql@14/bin/psql"
+
+# 12 colorway pairs — each is (ground, drip-figure, accent, shadow), all in
+# the same hue family per Steve's hue-sync directive.
+declare -a CWS=(
+  "Cream Loden|#F2EADB|#3C4844|#9B8050|#1A2520"
+  "Bone Ink|#F2EADB|#1F2740|#C9A14B|#0B0F1C"
+  "Charcoal Cream|#F2EADB|#3D3833|#C9A14B|#0F0D0B"
+  "Saddle Mocha|#F2EADB|#5C4033|#A78863|#2A1810"
+  "Smoke Ash|#F2EADB|#6B6660|#A8A39C|#3A3530"
+  "Forest Loden|#F2EADB|#3C4844|#A8B79A|#1A2520"
+  "Bordeaux Velvet|#F2EADB|#5C2329|#C84A3A|#2A0E10"
+  "Oxblood|#F2EADB|#722F2F|#A85040|#3A1010"
+  "Midnight Navy|#F2EADB|#1B2A3A|#3E6B82|#0B1018"
+  "Deep Plum|#F2EADB|#3D2B3F|#856080|#1A101E"
+  "Pine Charcoal|#F2EADB|#3A4A45|#9CA09B|#1A2520"
+  "Greenhouse Glass|#F2EADB|#1F4E47|#85A095|#0B201C"
+)
+
+for i in 1 2 3 4 5 6 7 8 9 10 11 12; do
+  IFS='|' read -r NAME GROUND FIGURE ACCENT SHADOW <<< "${CWS[$((i-1))]}"
+  PROMPT="Jackson Pollock drip-splatter abstract wallpaper — ${NAME} colorway. Ground: solid ${GROUND}. Primary drip ink: ${FIGURE}. Secondary accent splatter: ${ACCENT}. Tertiary depth splatter: ${SHADOW}. EXACTLY 4 COLORS — ground + figure + accent + shadow, all in the same hue family (hue-sync). Composition: chaotic gestural drip painting — long thrown lines of ink, splatter clusters, dripped pools, swirling skeins. The marks are FLAT FILLED SHAPES (not painted brush strokes) — each splatter, drip, and pool is one uniform solid ink color with hard edges. NO half-tones, NO chromatic gradient, NO color bleed between layers. The 4 colors are layered in distinct flat zones — drip-line, accent-splatter, shadow-pool, ground — never blended. References: Pollock 'Number 17A' \$200M drip painting, but rendered as a 4-color screen-print serigraph (Andy Warhol pop-art treatment of Pollock's drip language), Maya Romanoff handcrafted luxe wallcovering. Generous breathing room — at least 60% of the canvas shows clean ground tone between drip clusters. Square aspect ratio, seamless tile repeat, no edge artifacts."
+  echo "=== generating $i/12: $NAME ==="
+  RESULT=$(GEN_BACKEND=comfy COMFY_URL=http://192.168.1.133:8188 node scripts/generate_designs.js --n 1 --kind seamless_tile --width 54 --height 54 --category pollock-splatter --prompts "$PROMPT" 2>&1 | tail -3)
+  ID=$(echo "$RESULT" | grep -oE "#[0-9]+" | head -1 | tr -d '#')
+  if [ -n "$ID" ]; then
+    LP=$("$PSQL" dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=$ID;")
+    if [ -f "$LP" ]; then
+      # 4-color quantize to enforce hue-sync palette
+      QUANT_COLORS=4 python3 scripts/quantize-2tone.py "$LP" 2>&1 | grep -v Deprecation | tail -1
+      "$PSQL" dw_unified -c "UPDATE spoon_all_designs SET is_published=TRUE WHERE id=$ID;" >/dev/null 2>&1
+      echo "  published id=$ID"
+    fi
+  fi
+sleep 5
+done
+echo "=== done — all 12 Pollock-splatter designs published ==="
diff --git a/scripts/generate-sherman-circus.sh b/scripts/generate-sherman-circus.sh
new file mode 100755
index 0000000..1181c79
--- /dev/null
+++ b/scripts/generate-sherman-circus.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+# Cindy Sherman-inspired circus wallpaper collection — 20 designs.
+# Sherman's "Clowns" series (2003) + "Untitled Film Stills" + her hyper-staged
+# theatrical-grotesque vibe, rendered as Designer Wallcoverings 4-color
+# screen-print wallpaper. Tight hue-sync palette per design.
+
+cd "$(dirname "$0")/.."
+PSQL="/opt/homebrew/opt/postgresql@14/bin/psql"
+
+# 20 Sherman-circus subjects
+declare -a SUBJECTS=(
+  "sad-eyed clown portrait silhouette, painted lips drooping, ruffled collar, single tear"
+  "menacing ringmaster in tall top hat silhouette holding a curled whip"
+  "trapeze artist mid-swing, silhouette frozen against starburst rays"
+  "lion tamer with arched whip facing a single roaring lion silhouette"
+  "fortune teller draped in scarves, hands cupped around a crystal ball"
+  "bearded lady in profile silhouette, beard cascading to the shoulder"
+  "strongman with handlebar mustache lifting a barbell with stars at each end"
+  "fire-eater silhouette mid-breath with curling flame ribbon"
+  "tightrope walker carrying a parasol mid-step on a thin line"
+  "snake charmer cross-legged with cobra rising from a woven basket"
+  "contortionist folded into impossible knot silhouette"
+  "tattooed lady silhouette with stars + anchors + roses visible as cut-outs"
+  "knife-thrower mid-throw with knife silhouette frozen in flight"
+  "circus ticket-booth attendant peering out of an arched window"
+  "ventriloquist with dummy on knee, both in profile"
+  "human cannonball silhouette emerging from a cannon mouth with smoke ribbon"
+  "carousel horse with arched neck and flowing mane silhouette"
+  "circus elephant standing on a pedestal with one foot raised"
+  "magician pulling rabbit silhouette from top hat in profile"
+  "clown family group portrait — three figures in descending sizes with ruffled collars"
+)
+
+# 20 hue-sync 4-color quartets
+declare -a CWS=(
+  "Greasepaint White|#F2EADB|#3D3833|#C84A3A|#0F0D0B"
+  "Velvet Bordeaux|#F2EADB|#5C2329|#A85040|#2A0E10"
+  "Carnival Ink|#F2EADB|#1F2740|#C9A14B|#0B0F1C"
+  "Midnight Sawdust|#E8D9B8|#3A2A1C|#7A4A28|#1A100A"
+  "Ringmaster Oxblood|#F2EADB|#722F2F|#A85040|#3A1010"
+  "Stardust Forest|#F2EADB|#3C4844|#A8B79A|#1A2520"
+  "Smoke Curtain|#F2EADB|#6B6660|#A8A39C|#3A3530"
+  "Plum Cabaret|#F2EADB|#3D2B3F|#856080|#1A101E"
+  "Saddle Pony|#F2EADB|#7A4A28|#A78863|#3A2010"
+  "Mossy Big-Top|#F2EADB|#3A4A45|#9CA09B|#1A2520"
+  "Gilded Lobby|#F2EADB|#1F2740|#9B8050|#0B0F1C"
+  "Charcoal Sideshow|#F2EADB|#3D3833|#A8A39C|#0F0D0B"
+  "Bone Tightrope|#E8D9B8|#3A2A1C|#D8C8AA|#1A100A"
+  "Indigo Pavilion|#F2EADB|#1B2A3A|#3E6B82|#0B1018"
+  "Pewter Tent|#F2EADB|#8A857B|#C9A14B|#3A3530"
+  "Greenhouse Greasepaint|#F2EADB|#1F4E47|#85A095|#0B201C"
+  "Antique Brass|#F2EADB|#9B8050|#3A2A1C|#3D2F18"
+  "Carnival Charcoal|#F2EADB|#3D3833|#5C2329|#0F0D0B"
+  "Smoke and Mirrors|#F2EADB|#566554|#9CA09B|#1A2520"
+  "Bone Velvet|#F2EADB|#722F2F|#D7C9A8|#3A1010"
+)
+
+for i in $(seq 1 20); do
+  IFS='|' read -r NAME GROUND FIGURE ACCENT SHADOW <<< "${CWS[$((i-1))]}"
+  SUBJECT="${SUBJECTS[$((i-1))]}"
+  PROMPT="Cindy Sherman circus wallpaper — ${NAME} colorway. Ground: solid ${GROUND}. Figure ink: ${FIGURE}. Accent: ${ACCENT}. Shadow: ${SHADOW}. EXACTLY 4 COLORS — ground + figure + accent + shadow, all in the same hue family (hue-sync). Subject: ${SUBJECT}. ONE central figure or vignette per tile, anchored on the vertical axis of symmetry, large-scale, generous breathing room of clean ground around it. Theatrical / grotesque / Cindy Sherman 'Clowns 2003' staging — slightly unnerving, hyper-staged, art-photography composition. Each figure rendered as a FLAT STENCIL SILHOUETTE in the figure ink, with small ACCENT details (lips, eyes, fingernails, sequins, ribbon trim) in the accent color, and SHADOW pools beneath the figure in the shadow color. NO bleed between layers — each of the 4 colors is a distinct flat zone. References: Cindy Sherman 'Clowns 2003' photography, Maya Romanoff handcrafted luxe wallcovering, Designers Guild theatrical, Saul Bass film-poster minimalism. Square aspect ratio, seamless tile repeat. NO halftone, NO gradient, NO airbrush, NO ghost layer."
+  echo "=== sherman $i/20: $NAME — $SUBJECT ==="
+  RESULT=$(GEN_BACKEND=replicate node scripts/generate_designs.js --n 1 --kind seamless_tile --width 54 --height 54 --category sherman-circus --prompts "$PROMPT" 2>&1 | tail -3)
+  ID=$(echo "$RESULT" | grep -oE "#[0-9]+" | head -1 | tr -d '#')
+  if [ -n "$ID" ]; then
+    LP=$("$PSQL" dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=$ID;")
+    if [ -f "$LP" ]; then
+      QUANT_COLORS=4 python3 scripts/quantize-2tone.py "$LP" 2>&1 | grep -v Deprecation | tail -1
+      "$PSQL" dw_unified -c "UPDATE spoon_all_designs SET is_published=TRUE WHERE id=$ID;" >/dev/null 2>&1
+      echo "  published id=$ID"
+    fi
+  fi
+sleep 5
+done
+echo "=== done — all 20 Sherman-circus designs published ==="
diff --git a/scripts/generate-sherman-circus.sh.bak b/scripts/generate-sherman-circus.sh.bak
new file mode 100755
index 0000000..52fdefa
--- /dev/null
+++ b/scripts/generate-sherman-circus.sh.bak
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+# Cindy Sherman-inspired circus wallpaper collection — 20 designs.
+# Sherman's "Clowns" series (2003) + "Untitled Film Stills" + her hyper-staged
+# theatrical-grotesque vibe, rendered as Designer Wallcoverings 4-color
+# screen-print wallpaper. Tight hue-sync palette per design.
+
+cd "$(dirname "$0")/.."
+PSQL="/opt/homebrew/opt/postgresql@14/bin/psql"
+
+# 20 Sherman-circus subjects
+declare -a SUBJECTS=(
+  "sad-eyed clown portrait silhouette, painted lips drooping, ruffled collar, single tear"
+  "menacing ringmaster in tall top hat silhouette holding a curled whip"
+  "trapeze artist mid-swing, silhouette frozen against starburst rays"
+  "lion tamer with arched whip facing a single roaring lion silhouette"
+  "fortune teller draped in scarves, hands cupped around a crystal ball"
+  "bearded lady in profile silhouette, beard cascading to the shoulder"
+  "strongman with handlebar mustache lifting a barbell with stars at each end"
+  "fire-eater silhouette mid-breath with curling flame ribbon"
+  "tightrope walker carrying a parasol mid-step on a thin line"
+  "snake charmer cross-legged with cobra rising from a woven basket"
+  "contortionist folded into impossible knot silhouette"
+  "tattooed lady silhouette with stars + anchors + roses visible as cut-outs"
+  "knife-thrower mid-throw with knife silhouette frozen in flight"
+  "circus ticket-booth attendant peering out of an arched window"
+  "ventriloquist with dummy on knee, both in profile"
+  "human cannonball silhouette emerging from a cannon mouth with smoke ribbon"
+  "carousel horse with arched neck and flowing mane silhouette"
+  "circus elephant standing on a pedestal with one foot raised"
+  "magician pulling rabbit silhouette from top hat in profile"
+  "clown family group portrait — three figures in descending sizes with ruffled collars"
+)
+
+# 20 hue-sync 4-color quartets
+declare -a CWS=(
+  "Greasepaint White|#F2EADB|#3D3833|#C84A3A|#0F0D0B"
+  "Velvet Bordeaux|#F2EADB|#5C2329|#A85040|#2A0E10"
+  "Carnival Ink|#F2EADB|#1F2740|#C9A14B|#0B0F1C"
+  "Midnight Sawdust|#E8D9B8|#3A2A1C|#7A4A28|#1A100A"
+  "Ringmaster Oxblood|#F2EADB|#722F2F|#A85040|#3A1010"
+  "Stardust Forest|#F2EADB|#3C4844|#A8B79A|#1A2520"
+  "Smoke Curtain|#F2EADB|#6B6660|#A8A39C|#3A3530"
+  "Plum Cabaret|#F2EADB|#3D2B3F|#856080|#1A101E"
+  "Saddle Pony|#F2EADB|#7A4A28|#A78863|#3A2010"
+  "Mossy Big-Top|#F2EADB|#3A4A45|#9CA09B|#1A2520"
+  "Gilded Lobby|#F2EADB|#1F2740|#9B8050|#0B0F1C"
+  "Charcoal Sideshow|#F2EADB|#3D3833|#A8A39C|#0F0D0B"
+  "Bone Tightrope|#E8D9B8|#3A2A1C|#D8C8AA|#1A100A"
+  "Indigo Pavilion|#F2EADB|#1B2A3A|#3E6B82|#0B1018"
+  "Pewter Tent|#F2EADB|#8A857B|#C9A14B|#3A3530"
+  "Greenhouse Greasepaint|#F2EADB|#1F4E47|#85A095|#0B201C"
+  "Antique Brass|#F2EADB|#9B8050|#3A2A1C|#3D2F18"
+  "Carnival Charcoal|#F2EADB|#3D3833|#5C2329|#0F0D0B"
+  "Smoke and Mirrors|#F2EADB|#566554|#9CA09B|#1A2520"
+  "Bone Velvet|#F2EADB|#722F2F|#D7C9A8|#3A1010"
+)
+
+for i in $(seq 1 20); do
+  IFS='|' read -r NAME GROUND FIGURE ACCENT SHADOW <<< "${CWS[$((i-1))]}"
+  SUBJECT="${SUBJECTS[$((i-1))]}"
+  PROMPT="Cindy Sherman circus wallpaper — ${NAME} colorway. Ground: solid ${GROUND}. Figure ink: ${FIGURE}. Accent: ${ACCENT}. Shadow: ${SHADOW}. EXACTLY 4 COLORS — ground + figure + accent + shadow, all in the same hue family (hue-sync). Subject: ${SUBJECT}. ONE central figure or vignette per tile, anchored on the vertical axis of symmetry, large-scale, generous breathing room of clean ground around it. Theatrical / grotesque / Cindy Sherman 'Clowns 2003' staging — slightly unnerving, hyper-staged, art-photography composition. Each figure rendered as a FLAT STENCIL SILHOUETTE in the figure ink, with small ACCENT details (lips, eyes, fingernails, sequins, ribbon trim) in the accent color, and SHADOW pools beneath the figure in the shadow color. NO bleed between layers — each of the 4 colors is a distinct flat zone. References: Cindy Sherman 'Clowns 2003' photography, Maya Romanoff handcrafted luxe wallcovering, Designers Guild theatrical, Saul Bass film-poster minimalism. Square aspect ratio, seamless tile repeat. NO halftone, NO gradient, NO airbrush, NO ghost layer."
+  echo "=== sherman $i/20: $NAME — $SUBJECT ==="
+  RESULT=$(GEN_BACKEND=comfy COMFY_URL=http://192.168.1.133:8188 node scripts/generate_designs.js --n 1 --kind seamless_tile --width 54 --height 54 --category sherman-circus --prompts "$PROMPT" 2>&1 | tail -3)
+  ID=$(echo "$RESULT" | grep -oE "#[0-9]+" | head -1 | tr -d '#')
+  if [ -n "$ID" ]; then
+    LP=$("$PSQL" dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=$ID;")
+    if [ -f "$LP" ]; then
+      QUANT_COLORS=4 python3 scripts/quantize-2tone.py "$LP" 2>&1 | grep -v Deprecation | tail -1
+      "$PSQL" dw_unified -c "UPDATE spoon_all_designs SET is_published=TRUE WHERE id=$ID;" >/dev/null 2>&1
+      echo "  published id=$ID"
+    fi
+  fi
+sleep 5
+done
+echo "=== done — all 20 Sherman-circus designs published ==="
diff --git a/scripts/night-builder.js.bak-vendor-final b/scripts/night-builder.js.bak-vendor-final
new file mode 100755
index 0000000..5d6f6ac
--- /dev/null
+++ b/scripts/night-builder.js.bak-vendor-final
@@ -0,0 +1,906 @@
+#!/usr/bin/env node
+// All-night Replicate generator.
+//
+// Two tracks, interleaved:
+//   A) Muted Gucci-palette CACTUS variants (extends the existing 10 colorways)
+//   B) Drunk-animals → designer-elevated reinterpretation (Schumacher/Cole&Son
+//      register, muted Gucci palette, single-ink, archival gouache)
+//
+// Steve's brief: "continue creating patterns all night with the subdued hues
+// of grey, taupe, cream, ivory, gucci browns, recreate the drunk animals with
+// much more designer like designs."
+//
+// Hard rules:
+//   - Budget cap: $20 (≈2000 Replicate SDXL images at ~$0.01 ea)
+//   - Halt: touch /tmp/halt-night-builder.flag to stop after current image
+//   - Stop time: 07:30 local (Steve wakes ~8 AM)
+//   - Settlement gate inline (single-ink + no Part B elements = OK)
+//   - is_published=TRUE so Steve sees them in /designs immediately
+//   - Category: 'drunk-animals-designer' for the B-track (NOT 'drunk-animals')
+//     so Steve can sort + dedupe vs the kitsch originals
+//   - Cooldown: 5s between calls to be polite to Replicate
+//
+// Cost tracking: each Replicate image hits the cost-tracker via log.js
+// (already wired in generate_designs.js).
+
+const { spawnSync } = require('child_process');
+const fs = require('fs');
+const path = require('path');
+const { execSync } = require('child_process');
+
+const ROOT = path.join(__dirname, '..');
+const HALT_FLAG = '/tmp/halt-night-builder.flag';
+const LOG = '/tmp/night-builder.log';
+const STOP_HOUR = 7;   // local: stop at 07:30 next-morning
+const STOP_MIN  = 30;
+const BUDGET_CAP_USD = 20.0;
+const PER_IMAGE_USD = 0.011;   // Replicate SDXL ~$0.01 (incl. 10% safety margin)
+const COOLDOWN_MS = 5000;
+
+// Compute the actual next-7:30-AM deadline relative to script start.
+function computeStopDeadline() {
+  const now = new Date();
+  const d = new Date(now);
+  d.setHours(STOP_HOUR, STOP_MIN, 0, 0);
+  // If 7:30 today is already in the past, target 7:30 tomorrow.
+  if (d.getTime() <= now.getTime()) d.setDate(d.getDate() + 1);
+  return d;
+}
+const STOP_DEADLINE = computeStopDeadline();
+
+const MUTED_PALETTE = [
+  { slug: 'smoke-ash',       name: 'Smoke Ash',       hex: '#6B6660', tone: 'warm-mid-grey' },
+  { slug: 'mushroom-taupe',  name: 'Mushroom Taupe',  hex: '#8A7E70', tone: 'designer-taupe' },
+  { slug: 'linen-cream',     name: 'Linen Cream',     hex: '#EDE4D3', tone: 'soft-cream' },
+  { slug: 'bone-ivory',      name: 'Bone Ivory',      hex: '#F2EADB', tone: 'warm-ivory' },
+  { slug: 'gucci-cocoa',     name: 'Gucci Cocoa',     hex: '#5C4033', tone: 'deep-cocoa' },
+  { slug: 'antique-tan',     name: 'Antique Tan',     hex: '#A78863', tone: 'warm-camel' },
+  { slug: 'stone-pewter',    name: 'Stone Pewter',    hex: '#7A736A', tone: 'cool-pewter' },
+  { slug: 'saddle-mocha',    name: 'Saddle Mocha',    hex: '#4A3528', tone: 'saddle-leather-brown' },
+  { slug: 'champagne-linen', name: 'Champagne Linen', hex: '#D7C9A8', tone: 'champagne-neutral' },
+  { slug: 'charcoal-smoke',  name: 'Charcoal Smoke',  hex: '#3D3833', tone: 'near-black-charcoal' },
+];
+
+const DB = 'dw_unified';
+const PSQL = `psql ${DB} -At -q`;
+function psql(sql) {
+  return execSync(PSQL, { input: sql, encoding: 'utf8' }).trim();
+}
+
+function nowIso() { return new Date().toISOString(); }
+function logLine(s) {
+  const line = `[${nowIso()}] ${s}`;
+  console.log(line);
+  fs.appendFileSync(LOG, line + '\n');
+}
+
+function pickColorway() {
+  return MUTED_PALETTE[Math.floor(Math.random() * MUTED_PALETTE.length)];
+}
+
+// ── Track A: cactus variants in muted palette ────────────────────────
+const CACTUS_PATTERNS = [
+  'tall saguaro forms with raised arms, scattered prickly-pear paddles',
+  'dense agave rosettes with whip-stem ocotillo verticals',
+  'barrel cactus rosettes and cholla branches in tight tessellation',
+  'sprawling prickly-pear paddle clusters as a vertical wallpaper repeat',
+  'ocotillo whip-stem fountain pattern with small barrel-cactus accents',
+];
+
+function composeCactusPrompt(cw) {
+  const pattern = CACTUS_PATTERNS[Math.floor(Math.random() * CACTUS_PATTERNS.length)];
+  return (
+    `Cactus Repeat — ${cw.name} colorway. ` +
+    `Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) — ALL cactus silhouettes in this exact single ink. ` +
+    `Sonoran desert cacti as FLAT STENCIL SILHOUETTES: ${pattern}, arranged in a tessellated seamless wallpaper repeat. ` +
+    `Each cactus is one solid uniform shape with NO interior detail, NO ribbing lines, NO shading, NO spines drawn — pure silhouette only. ` +
+    `All cacti upright, oriented vertically, symmetric placement on the vertical axis. ` +
+    `Edge-to-edge tessellation, generous breathing room of clean ground between motifs. ` +
+    `Avoid: banana leaves, palm fronds, monstera, philodendron, tropical jungle foliage. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Track B: DEBAUCHED ANIMALS (rewritten 2026-05-20 per Steve directive) ──
+// References:
+//   1. Asterix drunk-Roman-legionnaire pose (Uderzo): staggering gait, leg
+//      kicking sideways, helmet askew, X-pupil eyes, wobble-line motion arc.
+//   2. Eadweard Muybridge "Animal Locomotion" sequential-motion plates: each
+//      animal captured at multiple frozen poses showing the full gait cycle,
+//      tiled side-by-side. The original "movement sneak" before cinema existed.
+// Tone: HEDONISTIC, DEBAUCHED, BACCHANALIAN. Cocktail party gone fully off
+// the rails. Animals are mid-stagger, mid-collapse, mid-tumble — never in
+// dignified repose.
+const ANIMAL_DESCRIPTORS = [
+  // STAGGERING / FALLING
+  'staggering bear mid-stumble with one paw airborne, Asterix-drunk-legionnaire pose',
+  'tumbling fox falling backward limbs splayed',
+  'reticulated giraffe slumped against an invisible wall, legs splayed Bambi-on-ice',
+  'red panda hanging upside down from a phantom branch, eyes spiraled',
+  'lemur mid-cartwheel, limbs flung in four directions, Uderzo motion arcs around it',
+  'sloth lying flat on its back, all four limbs in the air, classic dead-drunk pose',
+  'capybara mid-belly-laugh slumped sideways, hiccup bubble above',
+  'orangutan kicking one leg high in a Charleston-stagger, the other arm windmilling',
+  'raccoon in a top hat falling face-first toward the viewer',
+  'elephant calf doing a full pratfall on its back legs, trunk waving wildly',
+  'tree frog mid-leap and missing, arms grasping at empty air',
+  'Bornean orangutan blowing a kiss with one eye crossed, drink mid-spill',
+  'koala wrapped around a bottle larger than itself, swaying',
+  'wallaby boxer mid-haymaker against nothing, swinging at phantoms',
+  'tasmanian devil mid-spin, dust-cloud lines around it',
+  'fennec fox flopped on its side, tongue lolling out',
+  // DANCING / CABARET POSES
+  'flamingo in a high-kick cancan pose, feathers flying',
+  'okapi in a tango dip, partner is an invisible silhouette',
+  'pangolin doing a one-legged drunken pirouette, scales spread out',
+  'capybara in a top hat doing the Charleston',
+  'meerkat trio in a chorus-line kick',
+  'aardvark mid-Lindy-hop swing-out, partner missing',
+  'lemur ballroom-glide with one paw extended, the other holding a cocktail',
+  'red panda in disco pose, one arm up Saturday-Night-Fever style',
+  // PASSED OUT / OBLIVION
+  'walrus snoring with three Zs above it, X-pupils',
+  'turtle on its back legs in the air, hiccup bubble',
+  'manatee floating belly-up with bubbles around its mouth',
+  'wombat sprawled on a velvet ottoman, paws curled',
+  'lazy panther draped over a bar-stool silhouette',
+  'sleepy hedgehog curled inside an empty cocktail glass',
+  // MID-PRATFALL
+  'chimpanzee mid-banana-peel slip (peel falling, not held)',
+  'baboon doing a forward roll into a stack of empty glasses',
+  'mandrill mid-faceplant, legs in the air',
+  'gorilla doing a dignified slow-motion topple, one finger raised',
+  // INTOXICATED VIBE
+  'platypus floating in zero-gravity with a snifter, monocle askew',
+  'armadillo curled mid-tumble, motion-arc behind it',
+  'tapir wobbling on two legs holding a martini glass overhead',
+  'binturong (bearcat) dangling from a velvet rope by its tail, drink in mouth',
+  'ocelot lounging on a chaise with smoking pipe and one eye closed',
+  'civet stretched out on a Persian rug, paws to the ceiling',
+  // BACCHANALIAN HARVEST
+  'wild boar reclined against a barrel, snout sniffing the air',
+  'bison crowned with a wreath of curlicue smoke, head tipped back',
+  'ibex doing a goat-headstand on a stack of bottles',
+  'fallow deer mid-leap with hooves crossed, antlers tangled with ribbons',
+  // CLASSIC CARTOON-DRUNK
+  'cat with five-o\'clock-shadow holding a cocktail like Tom of Tom-and-Jerry',
+  'penguin in a bowtie tipping a top hat with one flipper',
+  'walrus playing a tiny piano with one tusk',
+  'badger in a smoking jacket striking a Sherlock Holmes pose',
+  'opossum hanging by its tail clutching a martini upside-down',
+  // SMOKE-CLOUD / VAPOR POSES
+  'fox blowing a perfect smoke-ring, eye squinted',
+  'rabbit reclining in a hookah-style pose, pipe in paw',
+  'mongoose with three smoke-curls rising from a pipe',
+  'lizard breathing out a single curling vapor-trail',
+  // CRYPTID DEBAUCHERY (real animals only, no fantasy)
+  'aye-aye gesturing wildly with a long finger raised',
+  'star-nosed mole sniffing a cocktail with thirteen tentacles',
+  'pangolin doing a slow Charleston in scaly tuxedo',
+  'kinkajou dangling from a chandelier with a coupe',
+  // MISC SURREAL POSES
+  'sloth doing a slow-motion crowd-surf on raised paws',
+  'porcupine quill-up flexing arms strongman pose',
+  'capybara DJ-ing on a turntable made of orange slices',
+  'badger conducting a phantom orchestra, baton in paw',
+];
+
+const DRINK_DESCRIPTORS = [
+  'half-empty long-stemmed coupe tilted at 45° with champagne sloshing out',
+  'cut-crystal whiskey tumbler frozen mid-toss, amber liquid arcing through the air',
+  'martini glass tipped over, two olives rolling away',
+  'bottle of pilsner held inverted, foam splashing onto the ground',
+  'red wine balloon mid-spill, dark liquid streaming sideways',
+  'frosted vodka decanter being chugged straight from the neck',
+  'tequila shot raised in toast, lime wedge between teeth',
+  'cognac snifter cradled like a baby',
+  'Aperol spritz in one hand, second drink in the other',
+  'magnum of champagne held aloft and shaken, cork popping with a comic burst',
+  'rolled joint trailing a wispy smoke-curl ribbon',
+  'oversize pipe with three smoke-curls forming a clover',
+  'cocktail with three umbrellas crammed into it',
+  'pint glass overflowing with foam pouring over the sides',
+];
+
+// Muybridge-style: sometimes show the animal in a sequence of 3 frozen motion
+// poses (instead of one), tiled side-by-side. Used 30% of the time.
+const MOTION_FORMATS = [
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  // 3 out of 10 → Muybridge sequence:
+  'Muybridge-style sequence of three frozen poses of the SAME animal mid-stagger, tiled side-by-side left-to-right showing the full stumble cycle',
+  'Muybridge-style sequence of three frozen poses of the SAME animal collapsing forward, tiled side-by-side left-to-right',
+  'Muybridge-style sequence of four frozen poses of the SAME animal mid-pratfall, tiled in a 2x2 grid',
+];
+
+const BOTANICAL_SETTINGS = [
+  'set among silhouetted Ghost Orchids',
+  'against a damask-trellis backdrop',
+  'framed by Botticelli-style arabesques',
+  'surrounded by hand-painted Magnolia branches',
+  'within a Schumacher-Audubon herbarium frame',
+  'set in a Cole&Son chinoiserie panel',
+  'flanked by ogival damask medallions',
+  'centered on a wunderkammer specimen plate',
+];
+
+function composeDrunkAnimalPrompt(cw) {
+  const animal    = ANIMAL_DESCRIPTORS[Math.floor(Math.random() * ANIMAL_DESCRIPTORS.length)];
+  const drink     = DRINK_DESCRIPTORS[Math.floor(Math.random() * DRINK_DESCRIPTORS.length)];
+  return (
+    `Cocktail-hour wallpaper — ${animal} cradling a ${drink}. ` +
+    `Colorway: ${cw.name} (${cw.hex}) ground with bone-ivory (#F2EADB) figure ink. ` +
+    `Each animal-and-drink vignette is one FLAT STENCIL SILHOUETTE in bone-ivory — no interior shading, no anatomical detail, no fur texture. The drink glass is part of the same silhouette, also flat ink. ` +
+    `Vignettes arranged in a symmetric tessellated repeat, generous breathing room of clean ground between them. ` +
+    `Strictly no botanical background, no foliage filler, no decorative arabesques behind the figures — the ground is one uniform flat color with nothing on it except the silhouette vignettes. ` +
+    `No bananas, no grapes, no birds, no butterflies. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── SHARED art direction — rewritten 2026-05-20 to ELIMINATE the bleed-through
+// layered-background problem. Anchor refs swapped from natural-history plates
+// (Haeckel/Merian — those DO have atmospheric depth + layered washes) to pure
+// 2-tone serigraph references (Warhol/Lichtenstein/Toulouse-Lautrec/WPA poster
+// /Saul Bass/pochoir stencil — those are GUARANTEED flat 2-tone with NO depth).
+// Rewritten 2026-05-20 — Steve directive: "way too busy for most designs..
+// keep it simple". Old SHARED_ARTDIR encouraged tessellated edge-to-edge
+// filling. New version forces SPARSE motifs + GENEROUS NEGATIVE SPACE.
+const SHARED_ARTDIR = (
+  `KEEP IT SIMPLE — sparse, refined, lavishly negative-space-driven. At LEAST 75-85% of the tile area is solid clean ground tone with NOTHING in it (often 85%+, like Zuber and Maya Romanoff archives). Motifs are FEW (2-4 per tile maximum), well-spaced, never edge-to-edge, never tessellated, never cluttered. The empty ground IS the design — motifs are punctuation, not pattern-fill. ` +
+  `Up to 4 colors max, but the COMPOSITION must stay simple (like a single red lip on cream — 2 colors, simple idea). Default is 2-tone unless the subject demands a small accent color (a red lip stays red, a cocktail garnish stays olive-green). Never more than 4 distinct ink tones. ` +
+  `ABSOLUTELY NO bleed between layers — bleed looks cheap and is FORBIDDEN. Single-layer screen-print only. ` +
+  `NO ghost layer, NO faded background, NO atmospheric depth, NO secondary motifs behind the main figures. The ground is one completely uniform flat solid color from edge to edge. ` +
+  `Reference aesthetic: high-end designer wallcovering register, anchored to these brand archives — Zuber & Cie (hand-blocked scenic), Designers Guild (refined modern romantic), Thibaut (archival classic), Arte International (natural-fiber luxe), Romo (painterly British), Maya Romanoff (handcrafted luxe surface). Subtle. Sparse. Refined. Negative-space-driven. Single-pass silkscreen with two ink screens. ` +
+  `Hard clean razor-sharp edges. No half-tones, no gradient, no watercolor, no crosshatch shading. Every figure region is one flat color. ` +
+  `Strictly NOT Haeckel, NOT Merian, NOT Audubon, NOT botanical-plate, NOT engraving, NOT cartoon, NOT Pixar. ` +
+  `Square aspect ratio, seamless tile repeat (edges meet cleanly), flat-paper rendering, no watermark, no signature, no text, no logos.`
+);
+
+// Universal negative prompt — passed to Replicate as --negative-prompt. Catches
+// the model's instinct to add depth/layers even when text anti-prompts fail.
+const SHARED_NEGATIVE = (
+  `gradient, ombre, fade, faded, ghosted, ghost layer, atmospheric perspective, depth, layered background, ` +
+  `secondary motifs behind, lighter background copies, halftone, half-tone, chromatic gradient, watercolor wash, ` +
+  `airbrush, soft edges, blurry edges, anti-aliased blur, crosshatching, engraving lines, stippling, ` +
+  `three colors, four colors, multi-color, textured ground, mottled background, shadow, drop shadow, ` +
+  `Haeckel, Merian, Audubon, natural-history plate, botanical plate, engraving, cartoon, Pixar, 3D render`
+);
+
+const CHINOISERIE_MOTIFS = [
+  'pagodas with curved-eave silhouettes flanked by symmetric flowering plum branches',
+  'kylin mythical-beast pair on a rocky outcrop with stylized cloud-bands above',
+  'lotus blossom roundels in vertical stacks separated by bamboo verticals',
+  'mountain-and-temple silhouette repeats with stylized scholar-cloud forms',
+];
+function composeChinoiseriePrompt(cw) {
+  const motif = CHINOISERIE_MOTIFS[Math.floor(Math.random() * CHINOISERIE_MOTIFS.length)];
+  return (
+    `Chinoiserie wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Motif: ${motif}, arranged in a tessellated seamless repeat. ` +
+    `Cole & Son Mandarin / Ming-dynasty woodblock register. ` + SHARED_ARTDIR
+  );
+}
+
+const TOILE_VIGNETTES = [
+  'a pair of mirror-image country-cottage scenes flanking a central fountain',
+  'symmetric pastoral courtship scene under arching elm-tree silhouettes',
+  'paired equestrian-rider vignettes facing each other across a ribbon-tied bouquet',
+  'symmetric harvest-basket scene with sheaves of wheat and hand-tools',
+];
+function composeToilePrompt(cw) {
+  const vig = TOILE_VIGNETTES[Math.floor(Math.random() * TOILE_VIGNETTES.length)];
+  return (
+    `Toile de Jouy wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink line-engraving. ` +
+    `Vignette: ${vig}, repeated as a seamless symmetric tile, every figure rendered in fine-line copperplate-engraving style with cross-hatched shading replaced by solid-flat figure tone. ` +
+    `Pierre-Frey / Manuel Canovas archival toile register. ` + SHARED_ARTDIR
+  );
+}
+
+const STRIPE_STYLES = [
+  'wide-narrow alternating pinstripe (2cm thick / 4cm gap), perfectly vertical, hard edges',
+  'awning stripe — uniform 6cm vertical bands alternating ground and figure tones',
+  'beaded vertical lines with small ornamental dot-clusters between stripes',
+  'fine triple-pinstripe groups separated by wider blank channels',
+];
+function composeStripePrompt(cw) {
+  const style = STRIPE_STYLES[Math.floor(Math.random() * STRIPE_STYLES.length)];
+  return (
+    `Vertical stripe wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure stripes: bone-ivory (#F2EADB) single-ink. ` +
+    `Pattern: ${style}. ` +
+    `Robert Kime / Colefax & Fowler archival stripe register. ` + SHARED_ARTDIR
+  );
+}
+
+const QUATREFOIL_FIELDS = [
+  'classical quatrefoil tessellation, each quatrefoil oriented identically, edge-to-edge tight grid',
+  'gothic-window quatrefoil-plus-circle interlock, symmetric 4-fold',
+  'moorish-tile quatrefoil with negative-space cross channels',
+  'ogee-quatrefoil hybrid — pointed-arch ogee crossed with classical quatrefoil',
+];
+function composeQuatrefoilPrompt(cw) {
+  const field = QUATREFOIL_FIELDS[Math.floor(Math.random() * QUATREFOIL_FIELDS.length)];
+  return (
+    `Quatrefoil / ogee geometric wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Field: ${field}. ` +
+    `Owen Jones Grammar of Ornament register, strict mathematical tessellation. ` + SHARED_ARTDIR
+  );
+}
+
+const DIAMOND_TRELLIS_FIELDS = [
+  'narrow ogival diamond lattice with empty centers (just the lattice lines)',
+  'diamond trellis with a single tiny center-medallion in each diamond',
+  'crossed-ribbon trellis forming diamond cells with ornamental ribbon-knot intersections',
+  'fine-line diamond lattice with classical tassels at each lattice node',
+];
+function composeDiamondTrellisPrompt(cw) {
+  const field = DIAMOND_TRELLIS_FIELDS[Math.floor(Math.random() * DIAMOND_TRELLIS_FIELDS.length)];
+  return (
+    `Diamond trellis wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink line-trellis. ` +
+    `Field: ${field}. NOT a damask, NOT a heavy medallion field — light open trellis only. ` +
+    `Soane Britain / De Gournay archival trellis register. ` + SHARED_ARTDIR
+  );
+}
+
+// ── Track H: DRUNK ZOO 36" (Steve-approved 2026-05-20) ──────────────
+// Replaces the giraffe-only track with a broader symmetric-zoo track.
+// 36" repeat — wall-scale large pattern. Each design = one symmetric
+// paired-animal vignette in 19c-engraving aesthetic.
+const ZOO_VIGNETTES = [
+  'two reticulated giraffes facing each other in symmetric profile, necks crossing in a heart-shape, both sipping champagne coupes',
+  'pair of mirror-image giraffes flanking a central acacia tree, both holding cocktail glasses',
+  'mother-and-calf giraffe pair, mother arching over the calf, both with bottles',
+  'pair of orangutans in symmetric profile facing each other across a magnum bottle of champagne, hand-engraved',
+  'two sloths hanging in mirror-image from a central acacia branch, each with a cocktail glass',
+  'pair of red pandas in symmetric grooming pose, central bottle between them',
+  'two lemurs in symmetric profile leaping toward each other over a central palm-frond-free fern',
+  'pair of capybaras in symmetric resting pose, central mint julep glass between them',
+  'two African elephant calves in symmetric trunk-raised pose, central wine glass',
+  'pair of macaws in symmetric perched pose (no flight), central long-stemmed coupe between them',
+  'two tipsy frogs in symmetric leaping pose mirrored, central decanter',
+];
+function composeDrunkZoo36Prompt(cw) {
+  const vig = ZOO_VIGNETTES[Math.floor(Math.random() * ZOO_VIGNETTES.length)];
+  return (
+    `Drunk Zoo 36" repeat wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Vignette: ${vig}. Renders at wall-scale 36-inch seamless tile — motifs are LARGE, anchored on the central vertical axis of symmetry, generous breathing room of clean ground around each motif. ` +
+    `Each animal is one FLAT STENCIL SILHOUETTE in bone-ivory ink — no interior shading, no anatomical line-detail, no spots, no stripes, no fur texture. Spots/stripes appear ONLY as cut-out negative shapes in the silhouette (revealing ground tone), never as a second ink color. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Track I: FACE-SKULL DAMASK (Steve directive 2026-05-20) ──────────
+// Damask is purged unless it has faces or skulls. This track generates new
+// damask designs where the medallion FILL is a hand-engraved face or skull
+// rendered in single-ink screen-print style.
+const FACE_SKULL_MOTIFS = [
+  'memento-mori skull at the center of each ogival damask medallion, crossed bones forming the lattice spines',
+  'classical-bust face profile centered in each damask medallion, hair flowing into the medallion borders',
+  'death\'s-head moth skull pattern at each damask cell, wings forming the connecting flourishes',
+  'Venetian carnival mask face filling each damask medallion, ribbon-ties forming the lattice',
+  'Day-of-the-Dead calavera skull centered in each damask medallion with marigold-laurel surrounds',
+  'Greek-tragedy theatre-mask face (one comedy / one tragedy alternating) inside each medallion',
+  'anatomical-engraving skull profile at each medallion, scientific-illustration crosshatch replaced by solid flat ink',
+  'phantom-of-the-opera half-mask face at each medallion, opera-cape ribbons forming the lattice',
+];
+function composeFaceSkullDamaskPrompt(cw) {
+  const motif = FACE_SKULL_MOTIFS[Math.floor(Math.random() * FACE_SKULL_MOTIFS.length)];
+  return (
+    `Face-Skull Damask — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Composition: classic ogival damask lattice, but the medallion FILL is ${motif}. ` +
+    `Strict bilateral symmetry — every medallion is symmetric, lattice is symmetric. ` +
+    `Each face/skull/lattice element is one FLAT STENCIL SILHOUETTE in bone-ivory ink. NO interior crosshatching, NO engraved line shading, NO 3D modeling of the skull/face. Pure cut-out silhouette only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Settlement check (inline — same logic as src/fliepaper-bugs.js) ──
+function settlementOK(prompt) {
+  let p = String(prompt || '').toLowerCase();
+  // Strip negatives so anti-prompts don't false-trigger
+  p = p
+    .replace(/\b(?:no|not|without|excluding|never|avoid)\b[^.,;]*(?:banana|bird|butterfl|grape|leaf|leaves|frond|palm|foliage|tropical|fluoresc|neon|rainbow)[^.,;]*[.,;]?/g, ' ')
+    .replace(/\bwithout\b[^.,;]*[.,;]/g, ' ')
+    .replace(/\bexcluding\b[^.,;]*[.,;]/g, ' ');
+  // Part B specific elements (affirmative only)
+  const partB = [
+    /\bbanana(?:s|\s+pods?)?\b/,
+    /\bplantains?\b/,
+    /\bgrapes?\b/,
+    /\bbirds?\b/,
+    /\bbutterfl(?:y|ies)\b/,
+  ];
+  for (const rx of partB) if (rx.test(p)) return false;
+  // Foliage = needs review (we still allow, the figure is single-ink)
+  return true;
+}
+
+// ── Track mix — Steve flagged "needs alot more variety in patterns, way
+// too much damasks" 2026-05-20. Six tracks, equal weight:
+//   cactus            — desert botanical (Sonoran luxury)
+//   chinoiserie       — Cole&Son Mandarin/Ming-style
+//   toile-de-jouy     — classic French pastoral one-color
+//   stripe-block      — vertical stripe / pinstripe / awning stripe
+//   quatrefoil-ogee   — geometric tessellation (non-damask)
+//   diamond-trellis   — narrow ogival lattice (lighter than damask)
+// drunk-animals-designer paused — see feedback_no_modern_bending_designs.
+// 2026-05-20 — top-selling interior-designer styles, ALL at 36" repeat:
+//   chinoiserie       — Cole & Son / de Gournay perennial best-seller
+//   stripe            — Colefax & Fowler ticking stripe (designer classic)
+//   cactus            — Steve's house collection (Sonoran luxury)
+//   drunk-zoo-36      — symmetric paired animals (giraffes lead, sloths/lemurs/
+//                       panda/capybara/elephant added), 19c-engraving register
+// 2026-05-20 Steve directives:
+//  - Add designer-scenic (emulate luxury archival elegance, NOT copy)
+//  - Add throttled-plaster-roses ("throwled plaster look with roses")
+//  - Thibaut is the high-end LLM crisp reference (NEVER York/Brewster/Marburg)
+const DESIGNER_SCENES = [
+  'flowering magnolia branches reaching up the panel with peony blossoms at branch nodes',
+  'cascading wisteria vines hanging in symmetric clusters with stylized vine leaves',
+  'cherry-blossom branches arching across the panel with falling petal motifs',
+  'climbing rose vines on bamboo-trellis armature with full open rose heads at intersections',
+  'flowering plum branches in winter-Asian-painting register with sparse blossoms',
+];
+function composeDesignerScenicPrompt(cw) {
+  const scene = DESIGNER_SCENES[Math.floor(Math.random() * DESIGNER_SCENES.length)];
+  return (
+    `Hand-painted scenic chinoiserie wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}) silk register. Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Scene: ${scene}, arranged as a seamless symmetric tile — each branch repeats with bilateral mirror symmetry. ` +
+    `Thibaut-grade archival register, hand-painted silk-panel aesthetic in the spirit of European hand-painted silk-panel atelier tradition (emulate the elegance, do not copy any specific design). ` +
+    `Strictly no birds, no insects, no human figures. Branches and flowers only. ` + SHARED_ARTDIR
+  );
+}
+
+const PLASTER_ROSE_STYLES = [
+  'full-open garden roses in symmetric pairs with their stems crossing at the panel center',
+  'climbing-rose vine in vertical repeats with rose heads at every node and serrated leaves',
+  'damask-style rose medallions — single large rose head encircled by a wreath of smaller buds',
+  'rose-and-thorn-branch tessellation, each rose head identical, edge-to-edge tight grid',
+];
+function composeThrottledPlasterRosesPrompt(cw) {
+  const style = PLASTER_ROSE_STYLES[Math.floor(Math.random() * PLASTER_ROSE_STYLES.length)];
+  return (
+    `Trowelled-plaster-wall wallpaper with roses — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}) with a subtle warm-cream (#F2EADB) secondary plaster-mottle TONE — rendered as flat zones with hard edges, NOT a gradient. ` +
+    `Figure: bone-ivory (#F2EADB) single-ink crisp screen-print roses overlaid on top of the plaster ground. ` +
+    `Rose style: ${style}. ` +
+    `Venetian trowelled-plaster register, hand-troweled artisanal wall finish with crisp painted roses — Carlisle & Company / Thibaut high-end archival baseline. ` + SHARED_ARTDIR
+  );
+}
+
+// ── MUYBRIDGE — sequential motion-study plates as wallpaper ──────────
+// Eadweard Muybridge "Animal Locomotion" (1887, public domain) — ~780 plates,
+// each one a tiled grid of frozen gait poses of a single subject. The plate
+// FORMAT is already a perfect wallpaper repeat: 12-24 small images tiled in
+// a grid showing the full motion cycle. Steve directive 2026-05-20.
+const MUYBRIDGE_SUBJECTS = [
+  'horse galloping — sequence of 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full gait cycle, tiled left-to-right in three rows of four',
+  'horse trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule tiled in a 4x4 grid',
+  'racehorse with jockey — 12 frozen pose sequence showing the full stride',
+  'leaping greyhound — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule, dog mid-leap, tiled side-by-side',
+  'galloping dog — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule in a 4x4 grid',
+  'mastiff trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in 3 rows',
+  'cat walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule showing the saunter, tiled 4x4',
+  'cat leaping from rock to rock — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule',
+  'lion pacing — 12 frozen pose sequence tiled in a strip',
+  'tiger walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'elephant walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the heavy gait, tiled 3x4',
+  'ostrich running — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'kangaroo hopping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full bound, tiled 3x4',
+  'pig trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 4x3 grid',
+  'goat walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'donkey trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'camel walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the long stride, tiled 3x4',
+  'rabbit hopping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full bound',
+  'deer leaping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in a strip',
+  'bison charging — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'rooster strutting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'cockatoo flapping its wings — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'pigeon taking flight — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full wingbeat',
+  'human walking — Muybridge male figure in a loincloth, 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'human descending stairs — woman in a Victorian dress, 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled left-to-right',
+  'human running — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'human jumping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full leap',
+  'human throwing a discus — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled 3x4',
+  'human ascending stairs — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule left-to-right',
+  'human carrying a heavy bucket — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the strained walk',
+  'human dancing a waltz — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'human waving a flag — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'human boxing — two figures in 12 frozen pose sequence, tiled 3x4',
+  'human wrestling — two figures locked together in 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule',
+  'baby crawling — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in a 3x4 grid',
+  'human hammering a nail — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full swing',
+];
+function composeMuybridgePlatePrompt(cw) {
+  const subj = MUYBRIDGE_SUBJECTS[Math.floor(Math.random() * MUYBRIDGE_SUBJECTS.length)];
+  return (
+    `Eadweard Muybridge motion-study plate as wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Subject: ${subj}. ` +
+    `Each pose is a flat stencil silhouette in single ink on the solid ground — no chiaroscuro, no shading, no anatomical detail inside. ` +
+    `Render as a SEAMLESS REPEAT — the full plate is one tile, edge-to-edge. ` +
+    `Reference: Muybridge "Animal Locomotion" 1887, plate-format, single-color blueprint-style serigraph treatment. NOT photographic, NOT engraved — flat stencil only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── LIPS — Steve directive 2026-05-20. 4-color max, sparse iconic lips on
+// generous ground. Inspired by Warhol Marilyn, Lichtenstein, Patrick Nagel,
+// matchbook covers.
+const LIPS_SUBJECTS = [
+  'one large parted red-velvet lips silhouette centered on the tile, no face, no teeth — just the lips. 80% empty cream ground around it',
+  'a single perfect lipstick-kiss imprint (blot mark) on the upper-third of the tile in scarlet, otherwise empty cream ground',
+  'two lips facing each other almost touching (mid-kiss silhouette), one in deep red and one in cream-outline, lots of empty ground around them',
+  'pursed pouting lips in profile silhouette, scarlet red, no other elements, vast clean ground',
+  'lips biting a single stem of a tiny rose — minimalist Patrick-Nagel silhouette, two-tone (red lips, black rose silhouette, cream ground)',
+  'classic Andy Warhol style pop-art lips — one giant pair of half-open red lips with a thin black outline, 4 colors max (red, black, cream, optional cream highlight on lower lip)',
+];
+
+function composeLipsPrompt(subject, cw) {
+  // For lips: ground=cream/ivory, figure=scarlet red. Override colorway.
+  return (
+    `Lips wallpaper — minimalist pop-art register. ` +
+    `Ground: solid cream-ivory (#F2EADB). Figure: deep scarlet red (#B0282A). ` +
+    `Subject: ${subject}. ` +
+    `Up to 4 colors maximum (cream + scarlet + optional black outline + optional cream highlight on lower lip). NO bleed. NO halftone. NO gradient. ` +
+    `Reference: Andy Warhol pop-art lips, Patrick Nagel, vintage matchbook cover, single-pass screen-print. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── MONTEREY WEST-COAST MURAL — Steve directive 2026-05-20.
+// 6 scene subjects × 4 seasonal colorways = 24 base designs. Each is a single
+// 36"-wide × 132"-tall (11ft) panel intended to be the FIRST in a multi-panel
+// mural set. Admin can later "+next panel" to extend the scene rightward
+// across the wall (via /api/design/:id/add-next-panel).
+const MONTEREY_SUBJECTS = [
+  'Lone Cypress on Pebble Beach 17-Mile Drive — a single windswept Monterey cypress silhouetted on a granite headland with the Pacific behind, hand-painted scenic register, de Gournay aesthetic',
+  'Cannery Row at low tide — silhouettes of the historic canneries on pilings over kelp-strewn rocks, fog ribbons in the upper third',
+  'Point Pinos Lighthouse at dusk — the oldest continuously-operating lighthouse on the West Coast with cypress hedge and bluff in foreground',
+  'Carmel Mission Basilica — adobe bell tower silhouette with rose-garden hedges and ancient olive trees',
+  'Big Sur Bixby Creek Bridge silhouette — arched span over the canyon mouth with the Pacific opening to the west, redwoods on the inland slope',
+  'Monterey Bay kelp-forest above-and-below cross-section — sea-otters on the surface, kelp fronds rising from the seabed, single-layer silhouette only',
+];
+
+const SEASONAL_COLORWAYS = [
+  { season: 'spring', name: 'Spring Bloom',     ground: '#A8B79A', figure: '#F2EADB', tone: 'sage-mint' },
+  { season: 'summer', name: 'Summer Surf',      ground: '#3E6B82', figure: '#F2EADB', tone: 'bay-blue' },
+  { season: 'fall',   name: 'Autumn Saddle',    ground: '#7A4A28', figure: '#F2EADB', tone: 'cypress-burnt-umber' },
+  { season: 'winter', name: 'Winter Fog',       ground: '#9CA09B', figure: '#3A2A1C', tone: 'pacific-mist' },
+];
+
+function composeMontereyMuralPrompt(subject, cw) {
+  return (
+    `Monterey, California west-coast mural panel — ${subject}. ` +
+    `${cw.season.charAt(0).toUpperCase() + cw.season.slice(1)} colorway: ${cw.name}. Ground: solid ${cw.tone} (${cw.ground}). Figure: ${cw.figure} single-ink. ` +
+    `Composition: panoramic vertical panel, motif anchored center-bottom, sky/atmosphere extending up the panel (still in solid ground tone, NOT a sky gradient), generous breathing room. ` +
+    `This is a FULL-ROOM MURAL — width = full wall, height = full ceiling. Compose for a 12'-wide × 9'-tall wall. The customer will choose 24"/36"/54" print-panel widths at order time — generate at room scale, not panel scale. ` +
+    `4-COLOR PALETTE WITH HUE SYNC — all four colors share the same hue family (no warm/cool mixing). Ground + figure as the two main tones; one HIGHLIGHT color for accents (lips, eyes, fingernails, fruit, small jewels); one SHADOW color (under figures, in eye sockets, beneath leaves). Highlight + shadow stay in the same hue family as ground+figure. ` +
+    `Reference: de Gournay scenic panel, hand-painted silk register, NOT Haeckel, NOT Audubon. Single-layer stencil silhouette only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// Tall panel kind — 36" wide × 132" tall (11ft). Different from the seamless_tile
+// kind which is square. Panel kind is meant to hang as-is, not tile-repeat.
+// 2026-05-20 Steve directive: murals are FULL ROOM dimensions, not panels.
+// Customer chooses 24"/36"/54" panel width at print time — generation is room-
+// scale. Default room: 144" wide (12 ft) × 108" tall (9 ft ceiling) @ 150 DPI.
+// SDXL renders at 1536×1152 (4:3 max) — at-print upscale to 21600×16200
+// happens at order time via Topaz/Real-ESRGAN.
+const PANEL_W = 144;        // inches (metadata)
+const PANEL_H = 108;        // inches (metadata)
+const PANEL_RENDER_W = 1536; // pixels (SDXL output)
+const PANEL_RENDER_H = 1152; // pixels (SDXL output)
+
+// 2026-05-20 Steve directive: "up to 4 colors using for highlights like
+// lips.. eyes.. fingernails.. accents in another color and shadows. always
+// make sure hue is in sync." Murals get 4 colors with hue-sync constraint.
+// Tile tracks (cactus/chinoiserie/etc.) stay 2-color.
+const HUE_SYNC_QUARTETS = [
+  // Each quartet is [ground, figure, highlight, shadow] within the same hue
+  // family. The hue-sync constraint = all 4 colors share the same dominant
+  // hue ± neutrals.
+  // WARM EARTH (cream/saddle/rose/cocoa)
+  { name: 'Saddle Rose Warmth', ground: '#F2EADB', figure: '#5C2329', highlight: '#B0282A', shadow: '#2A1010' },
+  // FOREST GREEN (Steve's 10492-loved family)
+  { name: 'Forest Loden Quartet', ground: '#3C4844', figure: '#E8E2D1', highlight: '#A8B79A', shadow: '#1A2520' },
+  // INK + GOLD (Steve's high-end Thibaut energy)
+  { name: 'Ink Library', ground: '#1F2740', figure: '#E8DDB8', highlight: '#C9A14B', shadow: '#0B0F1C' },
+  // BORDEAUX
+  { name: 'Bordeaux Velvet', ground: '#5C2329', figure: '#F2EADB', highlight: '#C84A3A', shadow: '#2A0E10' },
+  // OXBLOOD
+  { name: 'Oxblood', ground: '#722F2F', figure: '#F2EADB', highlight: '#A85040', shadow: '#3A1010' },
+  // STONE PEWTER
+  { name: 'Stone Pewter', ground: '#8A857B', figure: '#F2EADB', highlight: '#C9A14B', shadow: '#3A3530' },
+  // MOSS SLATE
+  { name: 'Moss Slate', ground: '#566554', figure: '#F2EADB', highlight: '#A8B79A', shadow: '#1A2520' },
+  // CHARCOAL + CREAM
+  { name: 'Charcoal Cream', ground: '#3D3833', figure: '#F2EADB', highlight: '#C9A14B', shadow: '#0F0D0B' },
+];
+function pickHueSyncQuartet() {
+  return HUE_SYNC_QUARTETS[Math.floor(Math.random() * HUE_SYNC_QUARTETS.length)];
+}
+
+// ── DESIGNER-ZOO-CALM — Steve directive 2026-05-20 ("love this theme")
+// Inspired by accepted design 10492. Forest-green ground + bone-ivory animal
+// silhouettes, dignified standing/sitting poses (not staggering), sparse
+// fern/grass botanical fillers between animals, Cole-Son/Sister-Parish energy.
+const ZOO_CALM_ANIMALS = [
+  'pair of red pandas in symmetric grooming pose',
+  'bear seated upright in a meditative pose, head slightly tilted',
+  'a tall standing fox in profile, ears alert',
+  'pair of foxes mirrored facing each other, tails curving outward',
+  'family of three lemurs perched in a vertical stack',
+  'pair of standing wolves facing forward, dignified',
+  'mountain lion seated in regal posture, tail curled',
+  'pair of badgers facing each other in symmetric pose',
+  'standing pangolin in profile, scales catching highlight as cut-outs',
+  'pair of capybaras seated side-by-side',
+  'tall standing crane with neck curved (no flying — standing pose only)',
+  'pair of forest deer with antlers, mirrored facing inward',
+  'standing fennec fox with oversized ears, alert pose',
+  'pair of stoats standing upright, paws raised',
+  'standing armadillo in profile, shell silhouette clean',
+  'lounging snow leopard with paws extended',
+];
+const ZOO_CALM_FILLERS = [
+  'sparse fern fronds rising between the animals',
+  'tall slender grass clusters in negative space between motifs',
+  'small wildflower clusters between motifs',
+  'pinecone-and-needle sprigs',
+  'wild-rose stems with single open blossoms',
+  'tall cattails between figures',
+  'sparse oak-leaf clusters in negative space',
+  'olive branches between motifs',
+];
+const ZOO_CALM_PALETTE = [
+  { name: 'Forest Loden', tone: 'deep forest green', hex: '#3C4844' },
+  { name: 'Hunter Olive', tone: 'hunter olive', hex: '#48543A' },
+  { name: 'Bottle Green', tone: 'bottle-green', hex: '#2E4538' },
+  { name: 'Pine Charcoal', tone: 'pine charcoal', hex: '#3A4A45' },
+  { name: 'Moss Slate', tone: 'moss slate', hex: '#566554' },
+  { name: 'Ink Navy', tone: 'ink navy', hex: '#1F2B3A' },
+];
+function composeDesignerZooCalmPrompt() {
+  const animal = ZOO_CALM_ANIMALS[Math.floor(Math.random() * ZOO_CALM_ANIMALS.length)];
+  const filler = ZOO_CALM_FILLERS[Math.floor(Math.random() * ZOO_CALM_FILLERS.length)];
+  const cw = ZOO_CALM_PALETTE[Math.floor(Math.random() * ZOO_CALM_PALETTE.length)];
+  return (
+    `Designer Wallcoverings zoo wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Vignette: ${animal}. Renders at wall-scale 36-inch seamless tile. Animals are LARGE, anchored on the central vertical axis of symmetry, dignified standing or seated pose (NOT staggering, NOT falling, NOT mid-motion). ` +
+    `Between the animals: ${filler}, kept sparse — generous breathing room of clean ground tone visible throughout. ` +
+    `Each animal is one FLAT STENCIL SILHOUETTE in bone-ivory ink. NO interior shading, NO anatomical detail, NO fur texture. Spots/stripes/markings appear ONLY as cut-out negative shapes in the silhouette (revealing ground tone), never as a second ink color. ` +
+    `Reference: Cole & Son archival, Sister Parish, Designer Wallcoverings house style. Refined, restrained, designer-grade. ` +
+    SHARED_ARTDIR
+  );
+}
+
+const TRACKS = [
+  // Weighted — designer-zoo-calm appears MORE often per Steve "do more" of 10492
+  'designer-zoo-calm','designer-zoo-calm','designer-zoo-calm','designer-zoo-calm',
+  'chinoiserie','stripe','cactus','drunk-zoo-36','face-skull-damask',
+  'designer-scenic','throttled-plaster-roses','muybridge-plate','monterey-mural',
+];
+
+// Variable repeat size per Steve directive 2026-05-20: vary 24"/36"/54" so
+// designs render at different motif scales (small/medium/large wall coverage).
+const REPEAT_SIZES = [24, 36, 36, 36, 54];
+function pickRepeatSize() {
+  return REPEAT_SIZES[Math.floor(Math.random() * REPEAT_SIZES.length)];
+}
+const REPEAT_INCHES = 36;   // wall-scale repeat — Steve directive 2026-05-20
+function nextTrack() {
+  return TRACKS[Math.floor(Math.random() * TRACKS.length)];
+}
+
+// ── Stop conditions ──────────────────────────────────────────────────
+function shouldStop(state) {
+  if (fs.existsSync(HALT_FLAG)) {
+    logLine('HALT — flag file present at ' + HALT_FLAG);
+    return true;
+  }
+  if (state.spentUsd >= BUDGET_CAP_USD) {
+    logLine(`HALT — budget cap reached ($${state.spentUsd.toFixed(2)} >= $${BUDGET_CAP_USD})`);
+    return true;
+  }
+  if (Date.now() >= STOP_DEADLINE.getTime()) {
+    logLine(`HALT — stop deadline reached (${new Date().toLocaleString()} past ${STOP_DEADLINE.toLocaleString()})`);
+    return true;
+  }
+  return false;
+}
+
+// ── Generate one design ──────────────────────────────────────────────
+function generateOne(track, cw) {
+  let prompt;
+  switch (track) {
+    case 'cactus':          prompt = composeCactusPrompt(cw); break;
+    case 'chinoiserie':     prompt = composeChinoiseriePrompt(cw); break;
+    case 'toile':           prompt = composeToilePrompt(cw); break;
+    case 'stripe':          prompt = composeStripePrompt(cw); break;
+    case 'quatrefoil':      prompt = composeQuatrefoilPrompt(cw); break;
+    case 'diamond-trellis': prompt = composeDiamondTrellisPrompt(cw); break;
+    case 'drunk-zoo-36':    prompt = composeDrunkZoo36Prompt(cw); break;
+    case 'face-skull-damask': prompt = composeFaceSkullDamaskPrompt(cw); break;
+    case 'designer-scenic':  prompt = composeDesignerScenicPrompt(cw); break;
+    case 'throttled-plaster-roses': prompt = composeThrottledPlasterRosesPrompt(cw); break;
+    case 'muybridge-plate':   prompt = composeMuybridgePlatePrompt(cw); break;
+    case 'designer-zoo-calm': prompt = composeDesignerZooCalmPrompt(); break;
+    case 'monterey-mural':    {
+      const subj = MONTEREY_SUBJECTS[Math.floor(Math.random() * MONTEREY_SUBJECTS.length)];
+      const season = SEASONAL_COLORWAYS[Math.floor(Math.random() * SEASONAL_COLORWAYS.length)];
+      // Override the colorway with the seasonal one for this track
+      cw = { name: season.name, hex: season.ground, tone: season.tone, slug: season.season };
+      prompt = composeMontereyMuralPrompt(subj, season);
+      break;
+    }
+    default:                prompt = composeCactusPrompt(cw);
+  }
+  if (!settlementOK(prompt)) {
+    logLine(`SKIP settlement — track=${track} cw=${cw.slug}`);
+    return { ok: false, settlementBlock: true };
+  }
+  // Each track inserts into its own category for sortability + variety.
+  const category = track === 'cactus'          ? 'cactus'
+                 : track === 'chinoiserie'     ? 'chinoiserie'
+                 : track === 'toile'           ? 'toile-de-jouy'
+                 : track === 'stripe'          ? 'stripe'
+                 : track === 'quatrefoil'      ? 'quatrefoil-ogee'
+                 : track === 'diamond-trellis' ? 'diamond-trellis'
+                 : track === 'drunk-zoo-36'    ? 'drunk-zoo-36'
+                 : track === 'face-skull-damask' ? 'face-skull-damask'
+                 : track === 'designer-scenic' ? 'designer-scenic'
+                 : track === 'throttled-plaster-roses' ? 'throttled-plaster-roses'
+                 : track === 'muybridge-plate' ? 'muybridge-plate'
+                 : track === 'monterey-mural' ? 'monterey-mural'
+                 : track === 'designer-zoo-calm' ? 'designer-zoo-calm'
+                 : 'drunk-animals-designer';
+  // Mural panels render at 36"×132" (11ft); everything else at square tiles
+  // with variable size per Steve 2026-05-20 (24/36/54).
+  const isPanel = (track === 'monterey-mural');
+  const w = isPanel ? PANEL_W : pickRepeatSize();
+  const h = isPanel ? PANEL_H : w;
+  const kind = isPanel ? 'mural_panel' : 'seamless_tile';
+  const r = spawnSync('node', [
+    path.join(__dirname, 'generate_designs.js'),
+    '--n', '1',
+    '--kind', kind,
+    '--width', String(w),
+    '--height', String(h),
+    '--category', category,
+    '--prompts', prompt,
+  ], { cwd: ROOT, encoding: 'utf8', env: process.env });
+
+  if (r.status === 0) {
+    // generate_designs.js prints "  ✓ #<id> ·" per-design and "IDs: <id>,..." summary
+    const summary = (r.stdout || '').match(/IDs:\s*(\d+(?:,\s*\d+)*)/);
+    const perLine = (r.stdout || '').match(/✓\s*#(\d+)/);
+    const idStr = summary ? summary[1].split(/,\s*/)[0] : (perLine ? perLine[1] : null);
+    const id = idStr ? parseInt(idStr, 10) : null;
+    // POST-PROCESS: force 2-tone quantize on the output PNG. Eliminates bleed
+    // between layers (Steve directive 2026-05-20 — looks cheap). The script
+    // backs up the original to <file>.original.png before overwriting.
+    if (id) {
+      try {
+        // psqlAt returns tuples-only, no header/footer — clean single-value reads
+        const lp = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=${id};"`, { encoding: 'utf8' }).trim();
+        if (lp && fs.existsSync(lp)) {
+          const q = spawnSync('python3', [path.join(__dirname, 'quantize-2tone.py'), lp], { encoding: 'utf8' });
+          if (q.status === 0) {
+            logLine(`  2tone OK id=${id}: ${(q.stdout || '').trim().split('->')[1] || '?'}`);
+            // COLORWAY-VARIANTS — for every 2-toned design, generate 3 free
+            // recolors. Steve directive 2026-05-20. Each variant becomes a
+            // child row in spoon_all_designs with parent_design_id=id.
+            // Skip for mural panels (they're meant to be a multi-panel set,
+            // colorway variation happens at the source-prompt level there).
+            if (!isPanel) {
+              try {
+                const cwOut = spawnSync('python3', [path.join(__dirname, 'colorway-variants.py'), lp], { encoding: 'utf8' });
+                if (cwOut.status === 0) {
+                  const parsed = JSON.parse((cwOut.stdout || '').trim().split('\n').pop() || '{}');
+                  const variants = parsed.variants || [];
+                  for (const v of variants) {
+                    if (!fs.existsSync(v.path)) continue;
+                    const cwTitle = `${category} · ${v.slug}`;
+                    // Two-step fix for the "PLACEHOLDER image_url" bug — see
+                    // git log + the bulk PG UPDATE on 2026-05-20. The earlier
+                    // single-statement CTE (INSERT + UPDATE in one) failed
+                    // because PG's data-modifying CTEs share a snapshot, so the
+                    // UPDATE didn't see the just-inserted row and the URL stayed
+                    // PLACEHOLDER. Two separate psql calls — INSERT...RETURNING
+                    // captures id, then a follow-up UPDATE writes the real URL.
+                    const insertSql = `
+                      INSERT INTO spoon_all_designs (brand, kind, width_in, height_in, panels, generator, prompt, image_url, local_path, dominant_hex, category, is_published, notes, parent_design_id, created_at)
+                      SELECT brand, kind, width_in, height_in, panels, generator, prompt || E'\\n[colorway-variant of #${id}]', '/designs/img/by-id/PLACEHOLDER', '${v.path.replace(/'/g, "''")}', '${v.ground.replace(/'/g, "''")}', '${cwTitle.replace(/'/g, "''")}', TRUE, E'colorway variant: ${v.slug} (ground=${v.ground}, figure=${v.figure}) of parent #${id}', ${id}, NOW()
+                      FROM spoon_all_designs WHERE id=${id}
+                      RETURNING id;`;
+                    try {
+                      const insertRaw = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "${insertSql.replace(/"/g, '\\"').replace(/\n/g, ' ')}"`, { encoding: 'utf8' });
+                      // psql -At emits the RETURNING value on line 1, then the
+                      // command tag (e.g. "INSERT 0 1") on line 2. Earlier
+                      // version used `.split(/\s+/).pop()` which grabbed "1"
+                      // from the command tag. Take the FIRST line instead.
+                      const cwId = (insertRaw.trim().split('\n')[0] || '').trim();
+                      if (cwId && /^\d+$/.test(cwId)) {
+                        try {
+                          const updOut = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "UPDATE spoon_all_designs SET image_url='/designs/img/by-id/${cwId}' WHERE id=${cwId};"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
+                          logLine(`    cw url-patch id=${cwId} → ${updOut || '(empty)'}`);
+                        } catch (uErr) {
+                          logLine(`    cw url-patch FAIL id=${cwId}: ${(uErr.message || '').slice(0, 200)}`);
+                        }
+                      } else {
+                        logLine(`    cw NO-ID raw=${JSON.stringify(insertRaw).slice(0, 300)}`);
+                      }
+                      logLine(`    cw child id=${cwId} (${v.slug}) of parent ${id}`);
+                    } catch (e2) {
+                      logLine(`    cw INSERT FAIL ${v.slug}: ${e2.message.slice(0, 200)}`);
+                    }
+                  }
+                } else {
+                  logLine(`  cw FAIL id=${id}: ${(cwOut.stderr || cwOut.stdout || '').slice(0, 200)}`);
+                }
+              } catch (e3) {
+                logLine(`  cw EXC id=${id}: ${e3.message.slice(0, 200)}`);
+              }
+            }
+          } else {
+            logLine(`  2tone FAIL id=${id}: ${(q.stderr || q.stdout || '').slice(0, 200)}`);
+          }
+        } else {
+          logLine(`  2tone SKIP id=${id}: local_path not found (${lp})`);
+        }
+      } catch (e) {
+        logLine(`  2tone EXC id=${id}: ${e.message.slice(0, 200)}`);
+      }
+    }
+    // Auto-publish so Steve sees it in /designs
+    if (id) {
+      try {
+        psql(`UPDATE spoon_all_designs SET is_published=TRUE WHERE id=${id};`);
+      } catch (e) {
+        logLine(`publish-flip FAIL id=${id}: ${e.message.slice(0, 120)}`);
+      }
+    }
+    return { ok: true, id, category, colorway: cw.slug };
+  } else {
+    return { ok: false, stderr: (r.stderr || r.stdout || '').slice(0, 200) };
+  }
+}
+
+// ── Main loop ────────────────────────────────────────────────────────
+(async () => {
+  if (fs.existsSync(HALT_FLAG)) {
+    logLine('ABORT — halt flag already exists at startup. Remove it first.');
+    process.exit(1);
+  }
+  const state = { iterations: 0, ok: 0, fail: 0, settlementSkipped: 0, spentUsd: 0, startedAt: nowIso() };
+  logLine(`START night-builder · budget=$${BUDGET_CAP_USD} stop=${STOP_DEADLINE.toLocaleString()} cooldown=${COOLDOWN_MS}ms`);
+  logLine(`Track mix: 30% cactus / 70% drunk-animals-designer · ${MUTED_PALETTE.length} muted colorways`);
+
+  while (!shouldStop(state)) {
+    state.iterations++;
+    const track = nextTrack();
+    const cw = pickColorway();
+    const r = generateOne(track, cw);
+    state.spentUsd += PER_IMAGE_USD;
+    if (r.settlementBlock) {
+      state.settlementSkipped++;
+    } else if (r.ok) {
+      state.ok++;
+      logLine(`OK  #${state.iterations} ${track}/${cw.slug} id=${r.id} (cumul: ok=${state.ok} fail=${state.fail} spent=$${state.spentUsd.toFixed(2)})`);
+    } else {
+      state.fail++;
+      logLine(`FAIL #${state.iterations} ${track}/${cw.slug}: ${r.stderr || 'unknown'}`);
+      // brief backoff on failure (rate-limit or transient)
+      await new Promise(rs => setTimeout(rs, 15000));
+    }
+    await new Promise(rs => setTimeout(rs, COOLDOWN_MS));
+  }
+
+  logLine(`STOP iterations=${state.iterations} ok=${state.ok} fail=${state.fail} settlementSkip=${state.settlementSkipped} spent=$${state.spentUsd.toFixed(2)}`);
+  process.exit(0);
+})();
diff --git a/scripts/night-builder.js.bak-vendor-scrub b/scripts/night-builder.js.bak-vendor-scrub
new file mode 100755
index 0000000..5a136a9
--- /dev/null
+++ b/scripts/night-builder.js.bak-vendor-scrub
@@ -0,0 +1,906 @@
+#!/usr/bin/env node
+// All-night Replicate generator.
+//
+// Two tracks, interleaved:
+//   A) Muted Gucci-palette CACTUS variants (extends the existing 10 colorways)
+//   B) Drunk-animals → designer-elevated reinterpretation (Schumacher/Cole&Son
+//      register, muted Gucci palette, single-ink, archival gouache)
+//
+// Steve's brief: "continue creating patterns all night with the subdued hues
+// of grey, taupe, cream, ivory, gucci browns, recreate the drunk animals with
+// much more designer like designs."
+//
+// Hard rules:
+//   - Budget cap: $20 (≈2000 Replicate SDXL images at ~$0.01 ea)
+//   - Halt: touch /tmp/halt-night-builder.flag to stop after current image
+//   - Stop time: 07:30 local (Steve wakes ~8 AM)
+//   - Settlement gate inline (single-ink + no Part B elements = OK)
+//   - is_published=TRUE so Steve sees them in /designs immediately
+//   - Category: 'drunk-animals-designer' for the B-track (NOT 'drunk-animals')
+//     so Steve can sort + dedupe vs the kitsch originals
+//   - Cooldown: 5s between calls to be polite to Replicate
+//
+// Cost tracking: each Replicate image hits the cost-tracker via log.js
+// (already wired in generate_designs.js).
+
+const { spawnSync } = require('child_process');
+const fs = require('fs');
+const path = require('path');
+const { execSync } = require('child_process');
+
+const ROOT = path.join(__dirname, '..');
+const HALT_FLAG = '/tmp/halt-night-builder.flag';
+const LOG = '/tmp/night-builder.log';
+const STOP_HOUR = 7;   // local: stop at 07:30 next-morning
+const STOP_MIN  = 30;
+const BUDGET_CAP_USD = 20.0;
+const PER_IMAGE_USD = 0.011;   // Replicate SDXL ~$0.01 (incl. 10% safety margin)
+const COOLDOWN_MS = 5000;
+
+// Compute the actual next-7:30-AM deadline relative to script start.
+function computeStopDeadline() {
+  const now = new Date();
+  const d = new Date(now);
+  d.setHours(STOP_HOUR, STOP_MIN, 0, 0);
+  // If 7:30 today is already in the past, target 7:30 tomorrow.
+  if (d.getTime() <= now.getTime()) d.setDate(d.getDate() + 1);
+  return d;
+}
+const STOP_DEADLINE = computeStopDeadline();
+
+const MUTED_PALETTE = [
+  { slug: 'smoke-ash',       name: 'Smoke Ash',       hex: '#6B6660', tone: 'warm-mid-grey' },
+  { slug: 'mushroom-taupe',  name: 'Mushroom Taupe',  hex: '#8A7E70', tone: 'designer-taupe' },
+  { slug: 'linen-cream',     name: 'Linen Cream',     hex: '#EDE4D3', tone: 'soft-cream' },
+  { slug: 'bone-ivory',      name: 'Bone Ivory',      hex: '#F2EADB', tone: 'warm-ivory' },
+  { slug: 'gucci-cocoa',     name: 'Gucci Cocoa',     hex: '#5C4033', tone: 'deep-cocoa' },
+  { slug: 'antique-tan',     name: 'Antique Tan',     hex: '#A78863', tone: 'warm-camel' },
+  { slug: 'stone-pewter',    name: 'Stone Pewter',    hex: '#7A736A', tone: 'cool-pewter' },
+  { slug: 'saddle-mocha',    name: 'Saddle Mocha',    hex: '#4A3528', tone: 'saddle-leather-brown' },
+  { slug: 'champagne-linen', name: 'Champagne Linen', hex: '#D7C9A8', tone: 'champagne-neutral' },
+  { slug: 'charcoal-smoke',  name: 'Charcoal Smoke',  hex: '#3D3833', tone: 'near-black-charcoal' },
+];
+
+const DB = 'dw_unified';
+const PSQL = `psql ${DB} -At -q`;
+function psql(sql) {
+  return execSync(PSQL, { input: sql, encoding: 'utf8' }).trim();
+}
+
+function nowIso() { return new Date().toISOString(); }
+function logLine(s) {
+  const line = `[${nowIso()}] ${s}`;
+  console.log(line);
+  fs.appendFileSync(LOG, line + '\n');
+}
+
+function pickColorway() {
+  return MUTED_PALETTE[Math.floor(Math.random() * MUTED_PALETTE.length)];
+}
+
+// ── Track A: cactus variants in muted palette ────────────────────────
+const CACTUS_PATTERNS = [
+  'tall saguaro forms with raised arms, scattered prickly-pear paddles',
+  'dense agave rosettes with whip-stem ocotillo verticals',
+  'barrel cactus rosettes and cholla branches in tight tessellation',
+  'sprawling prickly-pear paddle clusters as a vertical wallpaper repeat',
+  'ocotillo whip-stem fountain pattern with small barrel-cactus accents',
+];
+
+function composeCactusPrompt(cw) {
+  const pattern = CACTUS_PATTERNS[Math.floor(Math.random() * CACTUS_PATTERNS.length)];
+  return (
+    `Cactus Repeat — ${cw.name} colorway. ` +
+    `Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) — ALL cactus silhouettes in this exact single ink. ` +
+    `Sonoran desert cacti as FLAT STENCIL SILHOUETTES: ${pattern}, arranged in a tessellated seamless wallpaper repeat. ` +
+    `Each cactus is one solid uniform shape with NO interior detail, NO ribbing lines, NO shading, NO spines drawn — pure silhouette only. ` +
+    `All cacti upright, oriented vertically, symmetric placement on the vertical axis. ` +
+    `Edge-to-edge tessellation, generous breathing room of clean ground between motifs. ` +
+    `Avoid: banana leaves, palm fronds, monstera, philodendron, tropical jungle foliage. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Track B: DEBAUCHED ANIMALS (rewritten 2026-05-20 per Steve directive) ──
+// References:
+//   1. Asterix drunk-Roman-legionnaire pose (Uderzo): staggering gait, leg
+//      kicking sideways, helmet askew, X-pupil eyes, wobble-line motion arc.
+//   2. Eadweard Muybridge "Animal Locomotion" sequential-motion plates: each
+//      animal captured at multiple frozen poses showing the full gait cycle,
+//      tiled side-by-side. The original "movement sneak" before cinema existed.
+// Tone: HEDONISTIC, DEBAUCHED, BACCHANALIAN. Cocktail party gone fully off
+// the rails. Animals are mid-stagger, mid-collapse, mid-tumble — never in
+// dignified repose.
+const ANIMAL_DESCRIPTORS = [
+  // STAGGERING / FALLING
+  'staggering bear mid-stumble with one paw airborne, Asterix-drunk-legionnaire pose',
+  'tumbling fox falling backward limbs splayed',
+  'reticulated giraffe slumped against an invisible wall, legs splayed Bambi-on-ice',
+  'red panda hanging upside down from a phantom branch, eyes spiraled',
+  'lemur mid-cartwheel, limbs flung in four directions, Uderzo motion arcs around it',
+  'sloth lying flat on its back, all four limbs in the air, classic dead-drunk pose',
+  'capybara mid-belly-laugh slumped sideways, hiccup bubble above',
+  'orangutan kicking one leg high in a Charleston-stagger, the other arm windmilling',
+  'raccoon in a top hat falling face-first toward the viewer',
+  'elephant calf doing a full pratfall on its back legs, trunk waving wildly',
+  'tree frog mid-leap and missing, arms grasping at empty air',
+  'Bornean orangutan blowing a kiss with one eye crossed, drink mid-spill',
+  'koala wrapped around a bottle larger than itself, swaying',
+  'wallaby boxer mid-haymaker against nothing, swinging at phantoms',
+  'tasmanian devil mid-spin, dust-cloud lines around it',
+  'fennec fox flopped on its side, tongue lolling out',
+  // DANCING / CABARET POSES
+  'flamingo in a high-kick cancan pose, feathers flying',
+  'okapi in a tango dip, partner is an invisible silhouette',
+  'pangolin doing a one-legged drunken pirouette, scales spread out',
+  'capybara in a top hat doing the Charleston',
+  'meerkat trio in a chorus-line kick',
+  'aardvark mid-Lindy-hop swing-out, partner missing',
+  'lemur ballroom-glide with one paw extended, the other holding a cocktail',
+  'red panda in disco pose, one arm up Saturday-Night-Fever style',
+  // PASSED OUT / OBLIVION
+  'walrus snoring with three Zs above it, X-pupils',
+  'turtle on its back legs in the air, hiccup bubble',
+  'manatee floating belly-up with bubbles around its mouth',
+  'wombat sprawled on a velvet ottoman, paws curled',
+  'lazy panther draped over a bar-stool silhouette',
+  'sleepy hedgehog curled inside an empty cocktail glass',
+  // MID-PRATFALL
+  'chimpanzee mid-banana-peel slip (peel falling, not held)',
+  'baboon doing a forward roll into a stack of empty glasses',
+  'mandrill mid-faceplant, legs in the air',
+  'gorilla doing a dignified slow-motion topple, one finger raised',
+  // INTOXICATED VIBE
+  'platypus floating in zero-gravity with a snifter, monocle askew',
+  'armadillo curled mid-tumble, motion-arc behind it',
+  'tapir wobbling on two legs holding a martini glass overhead',
+  'binturong (bearcat) dangling from a velvet rope by its tail, drink in mouth',
+  'ocelot lounging on a chaise with smoking pipe and one eye closed',
+  'civet stretched out on a Persian rug, paws to the ceiling',
+  // BACCHANALIAN HARVEST
+  'wild boar reclined against a barrel, snout sniffing the air',
+  'bison crowned with a wreath of curlicue smoke, head tipped back',
+  'ibex doing a goat-headstand on a stack of bottles',
+  'fallow deer mid-leap with hooves crossed, antlers tangled with ribbons',
+  // CLASSIC CARTOON-DRUNK
+  'cat with five-o\'clock-shadow holding a cocktail like Tom of Tom-and-Jerry',
+  'penguin in a bowtie tipping a top hat with one flipper',
+  'walrus playing a tiny piano with one tusk',
+  'badger in a smoking jacket striking a Sherlock Holmes pose',
+  'opossum hanging by its tail clutching a martini upside-down',
+  // SMOKE-CLOUD / VAPOR POSES
+  'fox blowing a perfect smoke-ring, eye squinted',
+  'rabbit reclining in a hookah-style pose, pipe in paw',
+  'mongoose with three smoke-curls rising from a pipe',
+  'lizard breathing out a single curling vapor-trail',
+  // CRYPTID DEBAUCHERY (real animals only, no fantasy)
+  'aye-aye gesturing wildly with a long finger raised',
+  'star-nosed mole sniffing a cocktail with thirteen tentacles',
+  'pangolin doing a slow Charleston in scaly tuxedo',
+  'kinkajou dangling from a chandelier with a coupe',
+  // MISC SURREAL POSES
+  'sloth doing a slow-motion crowd-surf on raised paws',
+  'porcupine quill-up flexing arms strongman pose',
+  'capybara DJ-ing on a turntable made of orange slices',
+  'badger conducting a phantom orchestra, baton in paw',
+];
+
+const DRINK_DESCRIPTORS = [
+  'half-empty long-stemmed coupe tilted at 45° with champagne sloshing out',
+  'cut-crystal whiskey tumbler frozen mid-toss, amber liquid arcing through the air',
+  'martini glass tipped over, two olives rolling away',
+  'bottle of pilsner held inverted, foam splashing onto the ground',
+  'red wine balloon mid-spill, dark liquid streaming sideways',
+  'frosted vodka decanter being chugged straight from the neck',
+  'tequila shot raised in toast, lime wedge between teeth',
+  'cognac snifter cradled like a baby',
+  'Aperol spritz in one hand, second drink in the other',
+  'magnum of champagne held aloft and shaken, cork popping with a comic burst',
+  'rolled joint trailing a wispy smoke-curl ribbon',
+  'oversize pipe with three smoke-curls forming a clover',
+  'cocktail with three umbrellas crammed into it',
+  'pint glass overflowing with foam pouring over the sides',
+];
+
+// Muybridge-style: sometimes show the animal in a sequence of 3 frozen motion
+// poses (instead of one), tiled side-by-side. Used 30% of the time.
+const MOTION_FORMATS = [
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  // 3 out of 10 → Muybridge sequence:
+  'Muybridge-style sequence of three frozen poses of the SAME animal mid-stagger, tiled side-by-side left-to-right showing the full stumble cycle',
+  'Muybridge-style sequence of three frozen poses of the SAME animal collapsing forward, tiled side-by-side left-to-right',
+  'Muybridge-style sequence of four frozen poses of the SAME animal mid-pratfall, tiled in a 2x2 grid',
+];
+
+const BOTANICAL_SETTINGS = [
+  'set among silhouetted Ghost Orchids',
+  'against a damask-trellis backdrop',
+  'framed by Botticelli-style arabesques',
+  'surrounded by hand-painted Magnolia branches',
+  'within a Schumacher-Audubon herbarium frame',
+  'set in a Cole&Son chinoiserie panel',
+  'flanked by ogival damask medallions',
+  'centered on a wunderkammer specimen plate',
+];
+
+function composeDrunkAnimalPrompt(cw) {
+  const animal    = ANIMAL_DESCRIPTORS[Math.floor(Math.random() * ANIMAL_DESCRIPTORS.length)];
+  const drink     = DRINK_DESCRIPTORS[Math.floor(Math.random() * DRINK_DESCRIPTORS.length)];
+  return (
+    `Cocktail-hour wallpaper — ${animal} cradling a ${drink}. ` +
+    `Colorway: ${cw.name} (${cw.hex}) ground with bone-ivory (#F2EADB) figure ink. ` +
+    `Each animal-and-drink vignette is one FLAT STENCIL SILHOUETTE in bone-ivory — no interior shading, no anatomical detail, no fur texture. The drink glass is part of the same silhouette, also flat ink. ` +
+    `Vignettes arranged in a symmetric tessellated repeat, generous breathing room of clean ground between them. ` +
+    `Strictly no botanical background, no foliage filler, no decorative arabesques behind the figures — the ground is one uniform flat color with nothing on it except the silhouette vignettes. ` +
+    `No bananas, no grapes, no birds, no butterflies. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── SHARED art direction — rewritten 2026-05-20 to ELIMINATE the bleed-through
+// layered-background problem. Anchor refs swapped from natural-history plates
+// (Haeckel/Merian — those DO have atmospheric depth + layered washes) to pure
+// 2-tone serigraph references (Warhol/Lichtenstein/Toulouse-Lautrec/WPA poster
+// /Saul Bass/pochoir stencil — those are GUARANTEED flat 2-tone with NO depth).
+// Rewritten 2026-05-20 — Steve directive: "way too busy for most designs..
+// keep it simple". Old SHARED_ARTDIR encouraged tessellated edge-to-edge
+// filling. New version forces SPARSE motifs + GENEROUS NEGATIVE SPACE.
+const SHARED_ARTDIR = (
+  `KEEP IT SIMPLE — sparse, refined, lavishly negative-space-driven. At LEAST 75-85% of the tile area is solid clean ground tone with NOTHING in it (often 85%+, like Zuber and Maya Romanoff archives). Motifs are FEW (2-4 per tile maximum), well-spaced, never edge-to-edge, never tessellated, never cluttered. The empty ground IS the design — motifs are punctuation, not pattern-fill. ` +
+  `Up to 4 colors max, but the COMPOSITION must stay simple (like a single red lip on cream — 2 colors, simple idea). Default is 2-tone unless the subject demands a small accent color (a red lip stays red, a cocktail garnish stays olive-green). Never more than 4 distinct ink tones. ` +
+  `ABSOLUTELY NO bleed between layers — bleed looks cheap and is FORBIDDEN. Single-layer screen-print only. ` +
+  `NO ghost layer, NO faded background, NO atmospheric depth, NO secondary motifs behind the main figures. The ground is one completely uniform flat solid color from edge to edge. ` +
+  `Reference aesthetic: high-end designer wallcovering register, anchored to these brand archives — Zuber & Cie (hand-blocked scenic), Designers Guild (refined modern romantic), Thibaut (archival classic), Arte International (natural-fiber luxe), Romo (painterly British), Maya Romanoff (handcrafted luxe surface). Subtle. Sparse. Refined. Negative-space-driven. Single-pass silkscreen with two ink screens. ` +
+  `Hard clean razor-sharp edges. No half-tones, no gradient, no watercolor, no crosshatch shading. Every figure region is one flat color. ` +
+  `Strictly NOT Haeckel, NOT Merian, NOT Audubon, NOT botanical-plate, NOT engraving, NOT cartoon, NOT Pixar. ` +
+  `Square aspect ratio, seamless tile repeat (edges meet cleanly), flat-paper rendering, no watermark, no signature, no text, no logos.`
+);
+
+// Universal negative prompt — passed to Replicate as --negative-prompt. Catches
+// the model's instinct to add depth/layers even when text anti-prompts fail.
+const SHARED_NEGATIVE = (
+  `gradient, ombre, fade, faded, ghosted, ghost layer, atmospheric perspective, depth, layered background, ` +
+  `secondary motifs behind, lighter background copies, halftone, half-tone, chromatic gradient, watercolor wash, ` +
+  `airbrush, soft edges, blurry edges, anti-aliased blur, crosshatching, engraving lines, stippling, ` +
+  `three colors, four colors, multi-color, textured ground, mottled background, shadow, drop shadow, ` +
+  `Haeckel, Merian, Audubon, natural-history plate, botanical plate, engraving, cartoon, Pixar, 3D render`
+);
+
+const CHINOISERIE_MOTIFS = [
+  'pagodas with curved-eave silhouettes flanked by symmetric flowering plum branches',
+  'kylin mythical-beast pair on a rocky outcrop with stylized cloud-bands above',
+  'lotus blossom roundels in vertical stacks separated by bamboo verticals',
+  'mountain-and-temple silhouette repeats with stylized scholar-cloud forms',
+];
+function composeChinoiseriePrompt(cw) {
+  const motif = CHINOISERIE_MOTIFS[Math.floor(Math.random() * CHINOISERIE_MOTIFS.length)];
+  return (
+    `Chinoiserie wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Motif: ${motif}, arranged in a tessellated seamless repeat. ` +
+    `Cole & Son Mandarin / Ming-dynasty woodblock register. ` + SHARED_ARTDIR
+  );
+}
+
+const TOILE_VIGNETTES = [
+  'a pair of mirror-image country-cottage scenes flanking a central fountain',
+  'symmetric pastoral courtship scene under arching elm-tree silhouettes',
+  'paired equestrian-rider vignettes facing each other across a ribbon-tied bouquet',
+  'symmetric harvest-basket scene with sheaves of wheat and hand-tools',
+];
+function composeToilePrompt(cw) {
+  const vig = TOILE_VIGNETTES[Math.floor(Math.random() * TOILE_VIGNETTES.length)];
+  return (
+    `Toile de Jouy wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink line-engraving. ` +
+    `Vignette: ${vig}, repeated as a seamless symmetric tile, every figure rendered in fine-line copperplate-engraving style with cross-hatched shading replaced by solid-flat figure tone. ` +
+    `Pierre-Frey / Manuel Canovas archival toile register. ` + SHARED_ARTDIR
+  );
+}
+
+const STRIPE_STYLES = [
+  'wide-narrow alternating pinstripe (2cm thick / 4cm gap), perfectly vertical, hard edges',
+  'awning stripe — uniform 6cm vertical bands alternating ground and figure tones',
+  'beaded vertical lines with small ornamental dot-clusters between stripes',
+  'fine triple-pinstripe groups separated by wider blank channels',
+];
+function composeStripePrompt(cw) {
+  const style = STRIPE_STYLES[Math.floor(Math.random() * STRIPE_STYLES.length)];
+  return (
+    `Vertical stripe wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure stripes: bone-ivory (#F2EADB) single-ink. ` +
+    `Pattern: ${style}. ` +
+    `Robert Kime / Colefax & Fowler archival stripe register. ` + SHARED_ARTDIR
+  );
+}
+
+const QUATREFOIL_FIELDS = [
+  'classical quatrefoil tessellation, each quatrefoil oriented identically, edge-to-edge tight grid',
+  'gothic-window quatrefoil-plus-circle interlock, symmetric 4-fold',
+  'moorish-tile quatrefoil with negative-space cross channels',
+  'ogee-quatrefoil hybrid — pointed-arch ogee crossed with classical quatrefoil',
+];
+function composeQuatrefoilPrompt(cw) {
+  const field = QUATREFOIL_FIELDS[Math.floor(Math.random() * QUATREFOIL_FIELDS.length)];
+  return (
+    `Quatrefoil / ogee geometric wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Field: ${field}. ` +
+    `Owen Jones Grammar of Ornament register, strict mathematical tessellation. ` + SHARED_ARTDIR
+  );
+}
+
+const DIAMOND_TRELLIS_FIELDS = [
+  'narrow ogival diamond lattice with empty centers (just the lattice lines)',
+  'diamond trellis with a single tiny center-medallion in each diamond',
+  'crossed-ribbon trellis forming diamond cells with ornamental ribbon-knot intersections',
+  'fine-line diamond lattice with classical tassels at each lattice node',
+];
+function composeDiamondTrellisPrompt(cw) {
+  const field = DIAMOND_TRELLIS_FIELDS[Math.floor(Math.random() * DIAMOND_TRELLIS_FIELDS.length)];
+  return (
+    `Diamond trellis wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink line-trellis. ` +
+    `Field: ${field}. NOT a damask, NOT a heavy medallion field — light open trellis only. ` +
+    `Soane Britain / De Gournay archival trellis register. ` + SHARED_ARTDIR
+  );
+}
+
+// ── Track H: DRUNK ZOO 36" (Steve-approved 2026-05-20) ──────────────
+// Replaces the giraffe-only track with a broader symmetric-zoo track.
+// 36" repeat — wall-scale large pattern. Each design = one symmetric
+// paired-animal vignette in 19c-engraving aesthetic.
+const ZOO_VIGNETTES = [
+  'two reticulated giraffes facing each other in symmetric profile, necks crossing in a heart-shape, both sipping champagne coupes',
+  'pair of mirror-image giraffes flanking a central acacia tree, both holding cocktail glasses',
+  'mother-and-calf giraffe pair, mother arching over the calf, both with bottles',
+  'pair of orangutans in symmetric profile facing each other across a magnum bottle of champagne, hand-engraved',
+  'two sloths hanging in mirror-image from a central acacia branch, each with a cocktail glass',
+  'pair of red pandas in symmetric grooming pose, central bottle between them',
+  'two lemurs in symmetric profile leaping toward each other over a central palm-frond-free fern',
+  'pair of capybaras in symmetric resting pose, central mint julep glass between them',
+  'two African elephant calves in symmetric trunk-raised pose, central wine glass',
+  'pair of macaws in symmetric perched pose (no flight), central long-stemmed coupe between them',
+  'two tipsy frogs in symmetric leaping pose mirrored, central decanter',
+];
+function composeDrunkZoo36Prompt(cw) {
+  const vig = ZOO_VIGNETTES[Math.floor(Math.random() * ZOO_VIGNETTES.length)];
+  return (
+    `Drunk Zoo 36" repeat wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Vignette: ${vig}. Renders at wall-scale 36-inch seamless tile — motifs are LARGE, anchored on the central vertical axis of symmetry, generous breathing room of clean ground around each motif. ` +
+    `Each animal is one FLAT STENCIL SILHOUETTE in bone-ivory ink — no interior shading, no anatomical line-detail, no spots, no stripes, no fur texture. Spots/stripes appear ONLY as cut-out negative shapes in the silhouette (revealing ground tone), never as a second ink color. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Track I: FACE-SKULL DAMASK (Steve directive 2026-05-20) ──────────
+// Damask is purged unless it has faces or skulls. This track generates new
+// damask designs where the medallion FILL is a hand-engraved face or skull
+// rendered in single-ink screen-print style.
+const FACE_SKULL_MOTIFS = [
+  'memento-mori skull at the center of each ogival damask medallion, crossed bones forming the lattice spines',
+  'classical-bust face profile centered in each damask medallion, hair flowing into the medallion borders',
+  'death\'s-head moth skull pattern at each damask cell, wings forming the connecting flourishes',
+  'Venetian carnival mask face filling each damask medallion, ribbon-ties forming the lattice',
+  'Day-of-the-Dead calavera skull centered in each damask medallion with marigold-laurel surrounds',
+  'Greek-tragedy theatre-mask face (one comedy / one tragedy alternating) inside each medallion',
+  'anatomical-engraving skull profile at each medallion, scientific-illustration crosshatch replaced by solid flat ink',
+  'phantom-of-the-opera half-mask face at each medallion, opera-cape ribbons forming the lattice',
+];
+function composeFaceSkullDamaskPrompt(cw) {
+  const motif = FACE_SKULL_MOTIFS[Math.floor(Math.random() * FACE_SKULL_MOTIFS.length)];
+  return (
+    `Face-Skull Damask — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Composition: classic ogival damask lattice, but the medallion FILL is ${motif}. ` +
+    `Strict bilateral symmetry — every medallion is symmetric, lattice is symmetric. ` +
+    `Each face/skull/lattice element is one FLAT STENCIL SILHOUETTE in bone-ivory ink. NO interior crosshatching, NO engraved line shading, NO 3D modeling of the skull/face. Pure cut-out silhouette only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Settlement check (inline — same logic as src/fliepaper-bugs.js) ──
+function settlementOK(prompt) {
+  let p = String(prompt || '').toLowerCase();
+  // Strip negatives so anti-prompts don't false-trigger
+  p = p
+    .replace(/\b(?:no|not|without|excluding|never|avoid)\b[^.,;]*(?:banana|bird|butterfl|grape|leaf|leaves|frond|palm|foliage|tropical|fluoresc|neon|rainbow)[^.,;]*[.,;]?/g, ' ')
+    .replace(/\bwithout\b[^.,;]*[.,;]/g, ' ')
+    .replace(/\bexcluding\b[^.,;]*[.,;]/g, ' ');
+  // Part B specific elements (affirmative only)
+  const partB = [
+    /\bbanana(?:s|\s+pods?)?\b/,
+    /\bplantains?\b/,
+    /\bgrapes?\b/,
+    /\bbirds?\b/,
+    /\bbutterfl(?:y|ies)\b/,
+  ];
+  for (const rx of partB) if (rx.test(p)) return false;
+  // Foliage = needs review (we still allow, the figure is single-ink)
+  return true;
+}
+
+// ── Track mix — Steve flagged "needs alot more variety in patterns, way
+// too much damasks" 2026-05-20. Six tracks, equal weight:
+//   cactus            — desert botanical (Sonoran luxury)
+//   chinoiserie       — Cole&Son Mandarin/Ming-style
+//   toile-de-jouy     — classic French pastoral one-color
+//   stripe-block      — vertical stripe / pinstripe / awning stripe
+//   quatrefoil-ogee   — geometric tessellation (non-damask)
+//   diamond-trellis   — narrow ogival lattice (lighter than damask)
+// drunk-animals-designer paused — see feedback_no_modern_bending_designs.
+// 2026-05-20 — top-selling interior-designer styles, ALL at 36" repeat:
+//   chinoiserie       — Cole & Son / de Gournay perennial best-seller
+//   stripe            — Colefax & Fowler ticking stripe (designer classic)
+//   cactus            — Steve's house collection (Sonoran luxury)
+//   drunk-zoo-36      — symmetric paired animals (giraffes lead, sloths/lemurs/
+//                       panda/capybara/elephant added), 19c-engraving register
+// 2026-05-20 Steve directives:
+//  - Add fromental-scenic (emulate Fromental.com elegance, NOT copy)
+//  - Add throttled-plaster-roses ("throwled plaster look with roses")
+//  - Thibaut is the high-end LLM crisp reference (NEVER York/Brewster/Marburg)
+const FROMENTAL_SCENES = [
+  'flowering magnolia branches reaching up the panel with peony blossoms at branch nodes',
+  'cascading wisteria vines hanging in symmetric clusters with stylized vine leaves',
+  'cherry-blossom branches arching across the panel with falling petal motifs',
+  'climbing rose vines on bamboo-trellis armature with full open rose heads at intersections',
+  'flowering plum branches in winter-Asian-painting register with sparse blossoms',
+];
+function composeFromentalScenicPrompt(cw) {
+  const scene = FROMENTAL_SCENES[Math.floor(Math.random() * FROMENTAL_SCENES.length)];
+  return (
+    `Hand-painted scenic chinoiserie wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}) silk register. Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Scene: ${scene}, arranged as a seamless symmetric tile — each branch repeats with bilateral mirror symmetry. ` +
+    `Thibaut-grade archival register, hand-painted silk-panel aesthetic in the spirit of de Gournay or Fromental atelier work (emulate the elegance, do not copy any specific design). ` +
+    `Strictly no birds, no insects, no human figures. Branches and flowers only. ` + SHARED_ARTDIR
+  );
+}
+
+const PLASTER_ROSE_STYLES = [
+  'full-open garden roses in symmetric pairs with their stems crossing at the panel center',
+  'climbing-rose vine in vertical repeats with rose heads at every node and serrated leaves',
+  'damask-style rose medallions — single large rose head encircled by a wreath of smaller buds',
+  'rose-and-thorn-branch tessellation, each rose head identical, edge-to-edge tight grid',
+];
+function composeThrottledPlasterRosesPrompt(cw) {
+  const style = PLASTER_ROSE_STYLES[Math.floor(Math.random() * PLASTER_ROSE_STYLES.length)];
+  return (
+    `Trowelled-plaster-wall wallpaper with roses — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}) with a subtle warm-cream (#F2EADB) secondary plaster-mottle TONE — rendered as flat zones with hard edges, NOT a gradient. ` +
+    `Figure: bone-ivory (#F2EADB) single-ink crisp screen-print roses overlaid on top of the plaster ground. ` +
+    `Rose style: ${style}. ` +
+    `Venetian trowelled-plaster register, hand-troweled artisanal wall finish with crisp painted roses — Carlisle & Company / Thibaut high-end archival baseline. ` + SHARED_ARTDIR
+  );
+}
+
+// ── MUYBRIDGE — sequential motion-study plates as wallpaper ──────────
+// Eadweard Muybridge "Animal Locomotion" (1887, public domain) — ~780 plates,
+// each one a tiled grid of frozen gait poses of a single subject. The plate
+// FORMAT is already a perfect wallpaper repeat: 12-24 small images tiled in
+// a grid showing the full motion cycle. Steve directive 2026-05-20.
+const MUYBRIDGE_SUBJECTS = [
+  'horse galloping — sequence of 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full gait cycle, tiled left-to-right in three rows of four',
+  'horse trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule tiled in a 4x4 grid',
+  'racehorse with jockey — 12 frozen pose sequence showing the full stride',
+  'leaping greyhound — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule, dog mid-leap, tiled side-by-side',
+  'galloping dog — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule in a 4x4 grid',
+  'mastiff trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in 3 rows',
+  'cat walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule showing the saunter, tiled 4x4',
+  'cat leaping from rock to rock — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule',
+  'lion pacing — 12 frozen pose sequence tiled in a strip',
+  'tiger walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'elephant walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the heavy gait, tiled 3x4',
+  'ostrich running — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'kangaroo hopping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full bound, tiled 3x4',
+  'pig trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 4x3 grid',
+  'goat walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'donkey trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'camel walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the long stride, tiled 3x4',
+  'rabbit hopping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full bound',
+  'deer leaping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in a strip',
+  'bison charging — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'rooster strutting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'cockatoo flapping its wings — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'pigeon taking flight — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full wingbeat',
+  'human walking — Muybridge male figure in a loincloth, 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'human descending stairs — woman in a Victorian dress, 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled left-to-right',
+  'human running — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'human jumping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full leap',
+  'human throwing a discus — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled 3x4',
+  'human ascending stairs — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule left-to-right',
+  'human carrying a heavy bucket — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the strained walk',
+  'human dancing a waltz — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'human waving a flag — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'human boxing — two figures in 12 frozen pose sequence, tiled 3x4',
+  'human wrestling — two figures locked together in 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule',
+  'baby crawling — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in a 3x4 grid',
+  'human hammering a nail — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full swing',
+];
+function composeMuybridgePlatePrompt(cw) {
+  const subj = MUYBRIDGE_SUBJECTS[Math.floor(Math.random() * MUYBRIDGE_SUBJECTS.length)];
+  return (
+    `Eadweard Muybridge motion-study plate as wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Subject: ${subj}. ` +
+    `Each pose is a flat stencil silhouette in single ink on the solid ground — no chiaroscuro, no shading, no anatomical detail inside. ` +
+    `Render as a SEAMLESS REPEAT — the full plate is one tile, edge-to-edge. ` +
+    `Reference: Muybridge "Animal Locomotion" 1887, plate-format, single-color blueprint-style serigraph treatment. NOT photographic, NOT engraved — flat stencil only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── LIPS — Steve directive 2026-05-20. 4-color max, sparse iconic lips on
+// generous ground. Inspired by Warhol Marilyn, Lichtenstein, Patrick Nagel,
+// matchbook covers.
+const LIPS_SUBJECTS = [
+  'one large parted red-velvet lips silhouette centered on the tile, no face, no teeth — just the lips. 80% empty cream ground around it',
+  'a single perfect lipstick-kiss imprint (blot mark) on the upper-third of the tile in scarlet, otherwise empty cream ground',
+  'two lips facing each other almost touching (mid-kiss silhouette), one in deep red and one in cream-outline, lots of empty ground around them',
+  'pursed pouting lips in profile silhouette, scarlet red, no other elements, vast clean ground',
+  'lips biting a single stem of a tiny rose — minimalist Patrick-Nagel silhouette, two-tone (red lips, black rose silhouette, cream ground)',
+  'classic Andy Warhol style pop-art lips — one giant pair of half-open red lips with a thin black outline, 4 colors max (red, black, cream, optional cream highlight on lower lip)',
+];
+
+function composeLipsPrompt(subject, cw) {
+  // For lips: ground=cream/ivory, figure=scarlet red. Override colorway.
+  return (
+    `Lips wallpaper — minimalist pop-art register. ` +
+    `Ground: solid cream-ivory (#F2EADB). Figure: deep scarlet red (#B0282A). ` +
+    `Subject: ${subject}. ` +
+    `Up to 4 colors maximum (cream + scarlet + optional black outline + optional cream highlight on lower lip). NO bleed. NO halftone. NO gradient. ` +
+    `Reference: Andy Warhol pop-art lips, Patrick Nagel, vintage matchbook cover, single-pass screen-print. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── MONTEREY WEST-COAST MURAL — Steve directive 2026-05-20.
+// 6 scene subjects × 4 seasonal colorways = 24 base designs. Each is a single
+// 36"-wide × 132"-tall (11ft) panel intended to be the FIRST in a multi-panel
+// mural set. Admin can later "+next panel" to extend the scene rightward
+// across the wall (via /api/design/:id/add-next-panel).
+const MONTEREY_SUBJECTS = [
+  'Lone Cypress on Pebble Beach 17-Mile Drive — a single windswept Monterey cypress silhouetted on a granite headland with the Pacific behind, hand-painted scenic register, de Gournay aesthetic',
+  'Cannery Row at low tide — silhouettes of the historic canneries on pilings over kelp-strewn rocks, fog ribbons in the upper third',
+  'Point Pinos Lighthouse at dusk — the oldest continuously-operating lighthouse on the West Coast with cypress hedge and bluff in foreground',
+  'Carmel Mission Basilica — adobe bell tower silhouette with rose-garden hedges and ancient olive trees',
+  'Big Sur Bixby Creek Bridge silhouette — arched span over the canyon mouth with the Pacific opening to the west, redwoods on the inland slope',
+  'Monterey Bay kelp-forest above-and-below cross-section — sea-otters on the surface, kelp fronds rising from the seabed, single-layer silhouette only',
+];
+
+const SEASONAL_COLORWAYS = [
+  { season: 'spring', name: 'Spring Bloom',     ground: '#A8B79A', figure: '#F2EADB', tone: 'sage-mint' },
+  { season: 'summer', name: 'Summer Surf',      ground: '#3E6B82', figure: '#F2EADB', tone: 'bay-blue' },
+  { season: 'fall',   name: 'Autumn Saddle',    ground: '#7A4A28', figure: '#F2EADB', tone: 'cypress-burnt-umber' },
+  { season: 'winter', name: 'Winter Fog',       ground: '#9CA09B', figure: '#3A2A1C', tone: 'pacific-mist' },
+];
+
+function composeMontereyMuralPrompt(subject, cw) {
+  return (
+    `Monterey, California west-coast mural panel — ${subject}. ` +
+    `${cw.season.charAt(0).toUpperCase() + cw.season.slice(1)} colorway: ${cw.name}. Ground: solid ${cw.tone} (${cw.ground}). Figure: ${cw.figure} single-ink. ` +
+    `Composition: panoramic vertical panel, motif anchored center-bottom, sky/atmosphere extending up the panel (still in solid ground tone, NOT a sky gradient), generous breathing room. ` +
+    `This is a FULL-ROOM MURAL — width = full wall, height = full ceiling. Compose for a 12'-wide × 9'-tall wall. The customer will choose 24"/36"/54" print-panel widths at order time — generate at room scale, not panel scale. ` +
+    `4-COLOR PALETTE WITH HUE SYNC — all four colors share the same hue family (no warm/cool mixing). Ground + figure as the two main tones; one HIGHLIGHT color for accents (lips, eyes, fingernails, fruit, small jewels); one SHADOW color (under figures, in eye sockets, beneath leaves). Highlight + shadow stay in the same hue family as ground+figure. ` +
+    `Reference: de Gournay scenic panel, hand-painted silk register, NOT Haeckel, NOT Audubon. Single-layer stencil silhouette only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// Tall panel kind — 36" wide × 132" tall (11ft). Different from the seamless_tile
+// kind which is square. Panel kind is meant to hang as-is, not tile-repeat.
+// 2026-05-20 Steve directive: murals are FULL ROOM dimensions, not panels.
+// Customer chooses 24"/36"/54" panel width at print time — generation is room-
+// scale. Default room: 144" wide (12 ft) × 108" tall (9 ft ceiling) @ 150 DPI.
+// SDXL renders at 1536×1152 (4:3 max) — at-print upscale to 21600×16200
+// happens at order time via Topaz/Real-ESRGAN.
+const PANEL_W = 144;        // inches (metadata)
+const PANEL_H = 108;        // inches (metadata)
+const PANEL_RENDER_W = 1536; // pixels (SDXL output)
+const PANEL_RENDER_H = 1152; // pixels (SDXL output)
+
+// 2026-05-20 Steve directive: "up to 4 colors using for highlights like
+// lips.. eyes.. fingernails.. accents in another color and shadows. always
+// make sure hue is in sync." Murals get 4 colors with hue-sync constraint.
+// Tile tracks (cactus/chinoiserie/etc.) stay 2-color.
+const HUE_SYNC_QUARTETS = [
+  // Each quartet is [ground, figure, highlight, shadow] within the same hue
+  // family. The hue-sync constraint = all 4 colors share the same dominant
+  // hue ± neutrals.
+  // WARM EARTH (cream/saddle/rose/cocoa)
+  { name: 'Saddle Rose Warmth', ground: '#F2EADB', figure: '#5C2329', highlight: '#B0282A', shadow: '#2A1010' },
+  // FOREST GREEN (Steve's 10492-loved family)
+  { name: 'Forest Loden Quartet', ground: '#3C4844', figure: '#E8E2D1', highlight: '#A8B79A', shadow: '#1A2520' },
+  // INK + GOLD (Steve's high-end Thibaut energy)
+  { name: 'Ink Library', ground: '#1F2740', figure: '#E8DDB8', highlight: '#C9A14B', shadow: '#0B0F1C' },
+  // BORDEAUX
+  { name: 'Bordeaux Velvet', ground: '#5C2329', figure: '#F2EADB', highlight: '#C84A3A', shadow: '#2A0E10' },
+  // OXBLOOD
+  { name: 'Oxblood', ground: '#722F2F', figure: '#F2EADB', highlight: '#A85040', shadow: '#3A1010' },
+  // STONE PEWTER
+  { name: 'Stone Pewter', ground: '#8A857B', figure: '#F2EADB', highlight: '#C9A14B', shadow: '#3A3530' },
+  // MOSS SLATE
+  { name: 'Moss Slate', ground: '#566554', figure: '#F2EADB', highlight: '#A8B79A', shadow: '#1A2520' },
+  // CHARCOAL + CREAM
+  { name: 'Charcoal Cream', ground: '#3D3833', figure: '#F2EADB', highlight: '#C9A14B', shadow: '#0F0D0B' },
+];
+function pickHueSyncQuartet() {
+  return HUE_SYNC_QUARTETS[Math.floor(Math.random() * HUE_SYNC_QUARTETS.length)];
+}
+
+// ── DESIGNER-ZOO-CALM — Steve directive 2026-05-20 ("love this theme")
+// Inspired by accepted design 10492. Forest-green ground + bone-ivory animal
+// silhouettes, dignified standing/sitting poses (not staggering), sparse
+// fern/grass botanical fillers between animals, Cole-Son/Sister-Parish energy.
+const ZOO_CALM_ANIMALS = [
+  'pair of red pandas in symmetric grooming pose',
+  'bear seated upright in a meditative pose, head slightly tilted',
+  'a tall standing fox in profile, ears alert',
+  'pair of foxes mirrored facing each other, tails curving outward',
+  'family of three lemurs perched in a vertical stack',
+  'pair of standing wolves facing forward, dignified',
+  'mountain lion seated in regal posture, tail curled',
+  'pair of badgers facing each other in symmetric pose',
+  'standing pangolin in profile, scales catching highlight as cut-outs',
+  'pair of capybaras seated side-by-side',
+  'tall standing crane with neck curved (no flying — standing pose only)',
+  'pair of forest deer with antlers, mirrored facing inward',
+  'standing fennec fox with oversized ears, alert pose',
+  'pair of stoats standing upright, paws raised',
+  'standing armadillo in profile, shell silhouette clean',
+  'lounging snow leopard with paws extended',
+];
+const ZOO_CALM_FILLERS = [
+  'sparse fern fronds rising between the animals',
+  'tall slender grass clusters in negative space between motifs',
+  'small wildflower clusters between motifs',
+  'pinecone-and-needle sprigs',
+  'wild-rose stems with single open blossoms',
+  'tall cattails between figures',
+  'sparse oak-leaf clusters in negative space',
+  'olive branches between motifs',
+];
+const ZOO_CALM_PALETTE = [
+  { name: 'Forest Loden', tone: 'deep forest green', hex: '#3C4844' },
+  { name: 'Hunter Olive', tone: 'hunter olive', hex: '#48543A' },
+  { name: 'Bottle Green', tone: 'bottle-green', hex: '#2E4538' },
+  { name: 'Pine Charcoal', tone: 'pine charcoal', hex: '#3A4A45' },
+  { name: 'Moss Slate', tone: 'moss slate', hex: '#566554' },
+  { name: 'Ink Navy', tone: 'ink navy', hex: '#1F2B3A' },
+];
+function composeDesignerZooCalmPrompt() {
+  const animal = ZOO_CALM_ANIMALS[Math.floor(Math.random() * ZOO_CALM_ANIMALS.length)];
+  const filler = ZOO_CALM_FILLERS[Math.floor(Math.random() * ZOO_CALM_FILLERS.length)];
+  const cw = ZOO_CALM_PALETTE[Math.floor(Math.random() * ZOO_CALM_PALETTE.length)];
+  return (
+    `Designer Wallcoverings zoo wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Vignette: ${animal}. Renders at wall-scale 36-inch seamless tile. Animals are LARGE, anchored on the central vertical axis of symmetry, dignified standing or seated pose (NOT staggering, NOT falling, NOT mid-motion). ` +
+    `Between the animals: ${filler}, kept sparse — generous breathing room of clean ground tone visible throughout. ` +
+    `Each animal is one FLAT STENCIL SILHOUETTE in bone-ivory ink. NO interior shading, NO anatomical detail, NO fur texture. Spots/stripes/markings appear ONLY as cut-out negative shapes in the silhouette (revealing ground tone), never as a second ink color. ` +
+    `Reference: Cole & Son archival, Sister Parish, Designer Wallcoverings house style. Refined, restrained, designer-grade. ` +
+    SHARED_ARTDIR
+  );
+}
+
+const TRACKS = [
+  // Weighted — designer-zoo-calm appears MORE often per Steve "do more" of 10492
+  'designer-zoo-calm','designer-zoo-calm','designer-zoo-calm','designer-zoo-calm',
+  'chinoiserie','stripe','cactus','drunk-zoo-36','face-skull-damask',
+  'fromental-scenic','throttled-plaster-roses','muybridge-plate','monterey-mural',
+];
+
+// Variable repeat size per Steve directive 2026-05-20: vary 24"/36"/54" so
+// designs render at different motif scales (small/medium/large wall coverage).
+const REPEAT_SIZES = [24, 36, 36, 36, 54];
+function pickRepeatSize() {
+  return REPEAT_SIZES[Math.floor(Math.random() * REPEAT_SIZES.length)];
+}
+const REPEAT_INCHES = 36;   // wall-scale repeat — Steve directive 2026-05-20
+function nextTrack() {
+  return TRACKS[Math.floor(Math.random() * TRACKS.length)];
+}
+
+// ── Stop conditions ──────────────────────────────────────────────────
+function shouldStop(state) {
+  if (fs.existsSync(HALT_FLAG)) {
+    logLine('HALT — flag file present at ' + HALT_FLAG);
+    return true;
+  }
+  if (state.spentUsd >= BUDGET_CAP_USD) {
+    logLine(`HALT — budget cap reached ($${state.spentUsd.toFixed(2)} >= $${BUDGET_CAP_USD})`);
+    return true;
+  }
+  if (Date.now() >= STOP_DEADLINE.getTime()) {
+    logLine(`HALT — stop deadline reached (${new Date().toLocaleString()} past ${STOP_DEADLINE.toLocaleString()})`);
+    return true;
+  }
+  return false;
+}
+
+// ── Generate one design ──────────────────────────────────────────────
+function generateOne(track, cw) {
+  let prompt;
+  switch (track) {
+    case 'cactus':          prompt = composeCactusPrompt(cw); break;
+    case 'chinoiserie':     prompt = composeChinoiseriePrompt(cw); break;
+    case 'toile':           prompt = composeToilePrompt(cw); break;
+    case 'stripe':          prompt = composeStripePrompt(cw); break;
+    case 'quatrefoil':      prompt = composeQuatrefoilPrompt(cw); break;
+    case 'diamond-trellis': prompt = composeDiamondTrellisPrompt(cw); break;
+    case 'drunk-zoo-36':    prompt = composeDrunkZoo36Prompt(cw); break;
+    case 'face-skull-damask': prompt = composeFaceSkullDamaskPrompt(cw); break;
+    case 'fromental-scenic':  prompt = composeFromentalScenicPrompt(cw); break;
+    case 'throttled-plaster-roses': prompt = composeThrottledPlasterRosesPrompt(cw); break;
+    case 'muybridge-plate':   prompt = composeMuybridgePlatePrompt(cw); break;
+    case 'designer-zoo-calm': prompt = composeDesignerZooCalmPrompt(); break;
+    case 'monterey-mural':    {
+      const subj = MONTEREY_SUBJECTS[Math.floor(Math.random() * MONTEREY_SUBJECTS.length)];
+      const season = SEASONAL_COLORWAYS[Math.floor(Math.random() * SEASONAL_COLORWAYS.length)];
+      // Override the colorway with the seasonal one for this track
+      cw = { name: season.name, hex: season.ground, tone: season.tone, slug: season.season };
+      prompt = composeMontereyMuralPrompt(subj, season);
+      break;
+    }
+    default:                prompt = composeCactusPrompt(cw);
+  }
+  if (!settlementOK(prompt)) {
+    logLine(`SKIP settlement — track=${track} cw=${cw.slug}`);
+    return { ok: false, settlementBlock: true };
+  }
+  // Each track inserts into its own category for sortability + variety.
+  const category = track === 'cactus'          ? 'cactus'
+                 : track === 'chinoiserie'     ? 'chinoiserie'
+                 : track === 'toile'           ? 'toile-de-jouy'
+                 : track === 'stripe'          ? 'stripe'
+                 : track === 'quatrefoil'      ? 'quatrefoil-ogee'
+                 : track === 'diamond-trellis' ? 'diamond-trellis'
+                 : track === 'drunk-zoo-36'    ? 'drunk-zoo-36'
+                 : track === 'face-skull-damask' ? 'face-skull-damask'
+                 : track === 'fromental-scenic' ? 'fromental-scenic'
+                 : track === 'throttled-plaster-roses' ? 'throttled-plaster-roses'
+                 : track === 'muybridge-plate' ? 'muybridge-plate'
+                 : track === 'monterey-mural' ? 'monterey-mural'
+                 : track === 'designer-zoo-calm' ? 'designer-zoo-calm'
+                 : 'drunk-animals-designer';
+  // Mural panels render at 36"×132" (11ft); everything else at square tiles
+  // with variable size per Steve 2026-05-20 (24/36/54).
+  const isPanel = (track === 'monterey-mural');
+  const w = isPanel ? PANEL_W : pickRepeatSize();
+  const h = isPanel ? PANEL_H : w;
+  const kind = isPanel ? 'mural_panel' : 'seamless_tile';
+  const r = spawnSync('node', [
+    path.join(__dirname, 'generate_designs.js'),
+    '--n', '1',
+    '--kind', kind,
+    '--width', String(w),
+    '--height', String(h),
+    '--category', category,
+    '--prompts', prompt,
+  ], { cwd: ROOT, encoding: 'utf8', env: process.env });
+
+  if (r.status === 0) {
+    // generate_designs.js prints "  ✓ #<id> ·" per-design and "IDs: <id>,..." summary
+    const summary = (r.stdout || '').match(/IDs:\s*(\d+(?:,\s*\d+)*)/);
+    const perLine = (r.stdout || '').match(/✓\s*#(\d+)/);
+    const idStr = summary ? summary[1].split(/,\s*/)[0] : (perLine ? perLine[1] : null);
+    const id = idStr ? parseInt(idStr, 10) : null;
+    // POST-PROCESS: force 2-tone quantize on the output PNG. Eliminates bleed
+    // between layers (Steve directive 2026-05-20 — looks cheap). The script
+    // backs up the original to <file>.original.png before overwriting.
+    if (id) {
+      try {
+        // psqlAt returns tuples-only, no header/footer — clean single-value reads
+        const lp = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=${id};"`, { encoding: 'utf8' }).trim();
+        if (lp && fs.existsSync(lp)) {
+          const q = spawnSync('python3', [path.join(__dirname, 'quantize-2tone.py'), lp], { encoding: 'utf8' });
+          if (q.status === 0) {
+            logLine(`  2tone OK id=${id}: ${(q.stdout || '').trim().split('->')[1] || '?'}`);
+            // COLORWAY-VARIANTS — for every 2-toned design, generate 3 free
+            // recolors. Steve directive 2026-05-20. Each variant becomes a
+            // child row in spoon_all_designs with parent_design_id=id.
+            // Skip for mural panels (they're meant to be a multi-panel set,
+            // colorway variation happens at the source-prompt level there).
+            if (!isPanel) {
+              try {
+                const cwOut = spawnSync('python3', [path.join(__dirname, 'colorway-variants.py'), lp], { encoding: 'utf8' });
+                if (cwOut.status === 0) {
+                  const parsed = JSON.parse((cwOut.stdout || '').trim().split('\n').pop() || '{}');
+                  const variants = parsed.variants || [];
+                  for (const v of variants) {
+                    if (!fs.existsSync(v.path)) continue;
+                    const cwTitle = `${category} · ${v.slug}`;
+                    // Two-step fix for the "PLACEHOLDER image_url" bug — see
+                    // git log + the bulk PG UPDATE on 2026-05-20. The earlier
+                    // single-statement CTE (INSERT + UPDATE in one) failed
+                    // because PG's data-modifying CTEs share a snapshot, so the
+                    // UPDATE didn't see the just-inserted row and the URL stayed
+                    // PLACEHOLDER. Two separate psql calls — INSERT...RETURNING
+                    // captures id, then a follow-up UPDATE writes the real URL.
+                    const insertSql = `
+                      INSERT INTO spoon_all_designs (brand, kind, width_in, height_in, panels, generator, prompt, image_url, local_path, dominant_hex, category, is_published, notes, parent_design_id, created_at)
+                      SELECT brand, kind, width_in, height_in, panels, generator, prompt || E'\\n[colorway-variant of #${id}]', '/designs/img/by-id/PLACEHOLDER', '${v.path.replace(/'/g, "''")}', '${v.ground.replace(/'/g, "''")}', '${cwTitle.replace(/'/g, "''")}', TRUE, E'colorway variant: ${v.slug} (ground=${v.ground}, figure=${v.figure}) of parent #${id}', ${id}, NOW()
+                      FROM spoon_all_designs WHERE id=${id}
+                      RETURNING id;`;
+                    try {
+                      const insertRaw = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "${insertSql.replace(/"/g, '\\"').replace(/\n/g, ' ')}"`, { encoding: 'utf8' });
+                      // psql -At emits the RETURNING value on line 1, then the
+                      // command tag (e.g. "INSERT 0 1") on line 2. Earlier
+                      // version used `.split(/\s+/).pop()` which grabbed "1"
+                      // from the command tag. Take the FIRST line instead.
+                      const cwId = (insertRaw.trim().split('\n')[0] || '').trim();
+                      if (cwId && /^\d+$/.test(cwId)) {
+                        try {
+                          const updOut = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "UPDATE spoon_all_designs SET image_url='/designs/img/by-id/${cwId}' WHERE id=${cwId};"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
+                          logLine(`    cw url-patch id=${cwId} → ${updOut || '(empty)'}`);
+                        } catch (uErr) {
+                          logLine(`    cw url-patch FAIL id=${cwId}: ${(uErr.message || '').slice(0, 200)}`);
+                        }
+                      } else {
+                        logLine(`    cw NO-ID raw=${JSON.stringify(insertRaw).slice(0, 300)}`);
+                      }
+                      logLine(`    cw child id=${cwId} (${v.slug}) of parent ${id}`);
+                    } catch (e2) {
+                      logLine(`    cw INSERT FAIL ${v.slug}: ${e2.message.slice(0, 200)}`);
+                    }
+                  }
+                } else {
+                  logLine(`  cw FAIL id=${id}: ${(cwOut.stderr || cwOut.stdout || '').slice(0, 200)}`);
+                }
+              } catch (e3) {
+                logLine(`  cw EXC id=${id}: ${e3.message.slice(0, 200)}`);
+              }
+            }
+          } else {
+            logLine(`  2tone FAIL id=${id}: ${(q.stderr || q.stdout || '').slice(0, 200)}`);
+          }
+        } else {
+          logLine(`  2tone SKIP id=${id}: local_path not found (${lp})`);
+        }
+      } catch (e) {
+        logLine(`  2tone EXC id=${id}: ${e.message.slice(0, 200)}`);
+      }
+    }
+    // Auto-publish so Steve sees it in /designs
+    if (id) {
+      try {
+        psql(`UPDATE spoon_all_designs SET is_published=TRUE WHERE id=${id};`);
+      } catch (e) {
+        logLine(`publish-flip FAIL id=${id}: ${e.message.slice(0, 120)}`);
+      }
+    }
+    return { ok: true, id, category, colorway: cw.slug };
+  } else {
+    return { ok: false, stderr: (r.stderr || r.stdout || '').slice(0, 200) };
+  }
+}
+
+// ── Main loop ────────────────────────────────────────────────────────
+(async () => {
+  if (fs.existsSync(HALT_FLAG)) {
+    logLine('ABORT — halt flag already exists at startup. Remove it first.');
+    process.exit(1);
+  }
+  const state = { iterations: 0, ok: 0, fail: 0, settlementSkipped: 0, spentUsd: 0, startedAt: nowIso() };
+  logLine(`START night-builder · budget=$${BUDGET_CAP_USD} stop=${STOP_DEADLINE.toLocaleString()} cooldown=${COOLDOWN_MS}ms`);
+  logLine(`Track mix: 30% cactus / 70% drunk-animals-designer · ${MUTED_PALETTE.length} muted colorways`);
+
+  while (!shouldStop(state)) {
+    state.iterations++;
+    const track = nextTrack();
+    const cw = pickColorway();
+    const r = generateOne(track, cw);
+    state.spentUsd += PER_IMAGE_USD;
+    if (r.settlementBlock) {
+      state.settlementSkipped++;
+    } else if (r.ok) {
+      state.ok++;
+      logLine(`OK  #${state.iterations} ${track}/${cw.slug} id=${r.id} (cumul: ok=${state.ok} fail=${state.fail} spent=$${state.spentUsd.toFixed(2)})`);
+    } else {
+      state.fail++;
+      logLine(`FAIL #${state.iterations} ${track}/${cw.slug}: ${r.stderr || 'unknown'}`);
+      // brief backoff on failure (rate-limit or transient)
+      await new Promise(rs => setTimeout(rs, 15000));
+    }
+    await new Promise(rs => setTimeout(rs, COOLDOWN_MS));
+  }
+
+  logLine(`STOP iterations=${state.iterations} ok=${state.ok} fail=${state.fail} settlementSkip=${state.settlementSkipped} spent=$${state.spentUsd.toFixed(2)}`);
+  process.exit(0);
+})();
diff --git a/scripts/night-builder.js.bak-vendor-scrub2 b/scripts/night-builder.js.bak-vendor-scrub2
new file mode 100755
index 0000000..1d73b21
--- /dev/null
+++ b/scripts/night-builder.js.bak-vendor-scrub2
@@ -0,0 +1,906 @@
+#!/usr/bin/env node
+// All-night Replicate generator.
+//
+// Two tracks, interleaved:
+//   A) Muted Gucci-palette CACTUS variants (extends the existing 10 colorways)
+//   B) Drunk-animals → designer-elevated reinterpretation (Schumacher/Cole&Son
+//      register, muted Gucci palette, single-ink, archival gouache)
+//
+// Steve's brief: "continue creating patterns all night with the subdued hues
+// of grey, taupe, cream, ivory, gucci browns, recreate the drunk animals with
+// much more designer like designs."
+//
+// Hard rules:
+//   - Budget cap: $20 (≈2000 Replicate SDXL images at ~$0.01 ea)
+//   - Halt: touch /tmp/halt-night-builder.flag to stop after current image
+//   - Stop time: 07:30 local (Steve wakes ~8 AM)
+//   - Settlement gate inline (single-ink + no Part B elements = OK)
+//   - is_published=TRUE so Steve sees them in /designs immediately
+//   - Category: 'drunk-animals-designer' for the B-track (NOT 'drunk-animals')
+//     so Steve can sort + dedupe vs the kitsch originals
+//   - Cooldown: 5s between calls to be polite to Replicate
+//
+// Cost tracking: each Replicate image hits the cost-tracker via log.js
+// (already wired in generate_designs.js).
+
+const { spawnSync } = require('child_process');
+const fs = require('fs');
+const path = require('path');
+const { execSync } = require('child_process');
+
+const ROOT = path.join(__dirname, '..');
+const HALT_FLAG = '/tmp/halt-night-builder.flag';
+const LOG = '/tmp/night-builder.log';
+const STOP_HOUR = 7;   // local: stop at 07:30 next-morning
+const STOP_MIN  = 30;
+const BUDGET_CAP_USD = 20.0;
+const PER_IMAGE_USD = 0.011;   // Replicate SDXL ~$0.01 (incl. 10% safety margin)
+const COOLDOWN_MS = 5000;
+
+// Compute the actual next-7:30-AM deadline relative to script start.
+function computeStopDeadline() {
+  const now = new Date();
+  const d = new Date(now);
+  d.setHours(STOP_HOUR, STOP_MIN, 0, 0);
+  // If 7:30 today is already in the past, target 7:30 tomorrow.
+  if (d.getTime() <= now.getTime()) d.setDate(d.getDate() + 1);
+  return d;
+}
+const STOP_DEADLINE = computeStopDeadline();
+
+const MUTED_PALETTE = [
+  { slug: 'smoke-ash',       name: 'Smoke Ash',       hex: '#6B6660', tone: 'warm-mid-grey' },
+  { slug: 'mushroom-taupe',  name: 'Mushroom Taupe',  hex: '#8A7E70', tone: 'designer-taupe' },
+  { slug: 'linen-cream',     name: 'Linen Cream',     hex: '#EDE4D3', tone: 'soft-cream' },
+  { slug: 'bone-ivory',      name: 'Bone Ivory',      hex: '#F2EADB', tone: 'warm-ivory' },
+  { slug: 'gucci-cocoa',     name: 'Gucci Cocoa',     hex: '#5C4033', tone: 'deep-cocoa' },
+  { slug: 'antique-tan',     name: 'Antique Tan',     hex: '#A78863', tone: 'warm-camel' },
+  { slug: 'stone-pewter',    name: 'Stone Pewter',    hex: '#7A736A', tone: 'cool-pewter' },
+  { slug: 'saddle-mocha',    name: 'Saddle Mocha',    hex: '#4A3528', tone: 'saddle-leather-brown' },
+  { slug: 'champagne-linen', name: 'Champagne Linen', hex: '#D7C9A8', tone: 'champagne-neutral' },
+  { slug: 'charcoal-smoke',  name: 'Charcoal Smoke',  hex: '#3D3833', tone: 'near-black-charcoal' },
+];
+
+const DB = 'dw_unified';
+const PSQL = `psql ${DB} -At -q`;
+function psql(sql) {
+  return execSync(PSQL, { input: sql, encoding: 'utf8' }).trim();
+}
+
+function nowIso() { return new Date().toISOString(); }
+function logLine(s) {
+  const line = `[${nowIso()}] ${s}`;
+  console.log(line);
+  fs.appendFileSync(LOG, line + '\n');
+}
+
+function pickColorway() {
+  return MUTED_PALETTE[Math.floor(Math.random() * MUTED_PALETTE.length)];
+}
+
+// ── Track A: cactus variants in muted palette ────────────────────────
+const CACTUS_PATTERNS = [
+  'tall saguaro forms with raised arms, scattered prickly-pear paddles',
+  'dense agave rosettes with whip-stem ocotillo verticals',
+  'barrel cactus rosettes and cholla branches in tight tessellation',
+  'sprawling prickly-pear paddle clusters as a vertical wallpaper repeat',
+  'ocotillo whip-stem fountain pattern with small barrel-cactus accents',
+];
+
+function composeCactusPrompt(cw) {
+  const pattern = CACTUS_PATTERNS[Math.floor(Math.random() * CACTUS_PATTERNS.length)];
+  return (
+    `Cactus Repeat — ${cw.name} colorway. ` +
+    `Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) — ALL cactus silhouettes in this exact single ink. ` +
+    `Sonoran desert cacti as FLAT STENCIL SILHOUETTES: ${pattern}, arranged in a tessellated seamless wallpaper repeat. ` +
+    `Each cactus is one solid uniform shape with NO interior detail, NO ribbing lines, NO shading, NO spines drawn — pure silhouette only. ` +
+    `All cacti upright, oriented vertically, symmetric placement on the vertical axis. ` +
+    `Edge-to-edge tessellation, generous breathing room of clean ground between motifs. ` +
+    `Avoid: banana leaves, palm fronds, monstera, philodendron, tropical jungle foliage. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Track B: DEBAUCHED ANIMALS (rewritten 2026-05-20 per Steve directive) ──
+// References:
+//   1. Asterix drunk-Roman-legionnaire pose (Uderzo): staggering gait, leg
+//      kicking sideways, helmet askew, X-pupil eyes, wobble-line motion arc.
+//   2. Eadweard Muybridge "Animal Locomotion" sequential-motion plates: each
+//      animal captured at multiple frozen poses showing the full gait cycle,
+//      tiled side-by-side. The original "movement sneak" before cinema existed.
+// Tone: HEDONISTIC, DEBAUCHED, BACCHANALIAN. Cocktail party gone fully off
+// the rails. Animals are mid-stagger, mid-collapse, mid-tumble — never in
+// dignified repose.
+const ANIMAL_DESCRIPTORS = [
+  // STAGGERING / FALLING
+  'staggering bear mid-stumble with one paw airborne, Asterix-drunk-legionnaire pose',
+  'tumbling fox falling backward limbs splayed',
+  'reticulated giraffe slumped against an invisible wall, legs splayed Bambi-on-ice',
+  'red panda hanging upside down from a phantom branch, eyes spiraled',
+  'lemur mid-cartwheel, limbs flung in four directions, Uderzo motion arcs around it',
+  'sloth lying flat on its back, all four limbs in the air, classic dead-drunk pose',
+  'capybara mid-belly-laugh slumped sideways, hiccup bubble above',
+  'orangutan kicking one leg high in a Charleston-stagger, the other arm windmilling',
+  'raccoon in a top hat falling face-first toward the viewer',
+  'elephant calf doing a full pratfall on its back legs, trunk waving wildly',
+  'tree frog mid-leap and missing, arms grasping at empty air',
+  'Bornean orangutan blowing a kiss with one eye crossed, drink mid-spill',
+  'koala wrapped around a bottle larger than itself, swaying',
+  'wallaby boxer mid-haymaker against nothing, swinging at phantoms',
+  'tasmanian devil mid-spin, dust-cloud lines around it',
+  'fennec fox flopped on its side, tongue lolling out',
+  // DANCING / CABARET POSES
+  'flamingo in a high-kick cancan pose, feathers flying',
+  'okapi in a tango dip, partner is an invisible silhouette',
+  'pangolin doing a one-legged drunken pirouette, scales spread out',
+  'capybara in a top hat doing the Charleston',
+  'meerkat trio in a chorus-line kick',
+  'aardvark mid-Lindy-hop swing-out, partner missing',
+  'lemur ballroom-glide with one paw extended, the other holding a cocktail',
+  'red panda in disco pose, one arm up Saturday-Night-Fever style',
+  // PASSED OUT / OBLIVION
+  'walrus snoring with three Zs above it, X-pupils',
+  'turtle on its back legs in the air, hiccup bubble',
+  'manatee floating belly-up with bubbles around its mouth',
+  'wombat sprawled on a velvet ottoman, paws curled',
+  'lazy panther draped over a bar-stool silhouette',
+  'sleepy hedgehog curled inside an empty cocktail glass',
+  // MID-PRATFALL
+  'chimpanzee mid-banana-peel slip (peel falling, not held)',
+  'baboon doing a forward roll into a stack of empty glasses',
+  'mandrill mid-faceplant, legs in the air',
+  'gorilla doing a dignified slow-motion topple, one finger raised',
+  // INTOXICATED VIBE
+  'platypus floating in zero-gravity with a snifter, monocle askew',
+  'armadillo curled mid-tumble, motion-arc behind it',
+  'tapir wobbling on two legs holding a martini glass overhead',
+  'binturong (bearcat) dangling from a velvet rope by its tail, drink in mouth',
+  'ocelot lounging on a chaise with smoking pipe and one eye closed',
+  'civet stretched out on a Persian rug, paws to the ceiling',
+  // BACCHANALIAN HARVEST
+  'wild boar reclined against a barrel, snout sniffing the air',
+  'bison crowned with a wreath of curlicue smoke, head tipped back',
+  'ibex doing a goat-headstand on a stack of bottles',
+  'fallow deer mid-leap with hooves crossed, antlers tangled with ribbons',
+  // CLASSIC CARTOON-DRUNK
+  'cat with five-o\'clock-shadow holding a cocktail like Tom of Tom-and-Jerry',
+  'penguin in a bowtie tipping a top hat with one flipper',
+  'walrus playing a tiny piano with one tusk',
+  'badger in a smoking jacket striking a Sherlock Holmes pose',
+  'opossum hanging by its tail clutching a martini upside-down',
+  // SMOKE-CLOUD / VAPOR POSES
+  'fox blowing a perfect smoke-ring, eye squinted',
+  'rabbit reclining in a hookah-style pose, pipe in paw',
+  'mongoose with three smoke-curls rising from a pipe',
+  'lizard breathing out a single curling vapor-trail',
+  // CRYPTID DEBAUCHERY (real animals only, no fantasy)
+  'aye-aye gesturing wildly with a long finger raised',
+  'star-nosed mole sniffing a cocktail with thirteen tentacles',
+  'pangolin doing a slow Charleston in scaly tuxedo',
+  'kinkajou dangling from a chandelier with a coupe',
+  // MISC SURREAL POSES
+  'sloth doing a slow-motion crowd-surf on raised paws',
+  'porcupine quill-up flexing arms strongman pose',
+  'capybara DJ-ing on a turntable made of orange slices',
+  'badger conducting a phantom orchestra, baton in paw',
+];
+
+const DRINK_DESCRIPTORS = [
+  'half-empty long-stemmed coupe tilted at 45° with champagne sloshing out',
+  'cut-crystal whiskey tumbler frozen mid-toss, amber liquid arcing through the air',
+  'martini glass tipped over, two olives rolling away',
+  'bottle of pilsner held inverted, foam splashing onto the ground',
+  'red wine balloon mid-spill, dark liquid streaming sideways',
+  'frosted vodka decanter being chugged straight from the neck',
+  'tequila shot raised in toast, lime wedge between teeth',
+  'cognac snifter cradled like a baby',
+  'Aperol spritz in one hand, second drink in the other',
+  'magnum of champagne held aloft and shaken, cork popping with a comic burst',
+  'rolled joint trailing a wispy smoke-curl ribbon',
+  'oversize pipe with three smoke-curls forming a clover',
+  'cocktail with three umbrellas crammed into it',
+  'pint glass overflowing with foam pouring over the sides',
+];
+
+// Muybridge-style: sometimes show the animal in a sequence of 3 frozen motion
+// poses (instead of one), tiled side-by-side. Used 30% of the time.
+const MOTION_FORMATS = [
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  'single motion-blurred pose with Asterix-style wobble-arc lines around the figure showing the sway',
+  // 3 out of 10 → Muybridge sequence:
+  'Muybridge-style sequence of three frozen poses of the SAME animal mid-stagger, tiled side-by-side left-to-right showing the full stumble cycle',
+  'Muybridge-style sequence of three frozen poses of the SAME animal collapsing forward, tiled side-by-side left-to-right',
+  'Muybridge-style sequence of four frozen poses of the SAME animal mid-pratfall, tiled in a 2x2 grid',
+];
+
+const BOTANICAL_SETTINGS = [
+  'set among silhouetted Ghost Orchids',
+  'against a damask-trellis backdrop',
+  'framed by Botticelli-style arabesques',
+  'surrounded by hand-painted Magnolia branches',
+  'within a Schumacher-Audubon herbarium frame',
+  'set in a Cole&Son chinoiserie panel',
+  'flanked by ogival damask medallions',
+  'centered on a wunderkammer specimen plate',
+];
+
+function composeDrunkAnimalPrompt(cw) {
+  const animal    = ANIMAL_DESCRIPTORS[Math.floor(Math.random() * ANIMAL_DESCRIPTORS.length)];
+  const drink     = DRINK_DESCRIPTORS[Math.floor(Math.random() * DRINK_DESCRIPTORS.length)];
+  return (
+    `Cocktail-hour wallpaper — ${animal} cradling a ${drink}. ` +
+    `Colorway: ${cw.name} (${cw.hex}) ground with bone-ivory (#F2EADB) figure ink. ` +
+    `Each animal-and-drink vignette is one FLAT STENCIL SILHOUETTE in bone-ivory — no interior shading, no anatomical detail, no fur texture. The drink glass is part of the same silhouette, also flat ink. ` +
+    `Vignettes arranged in a symmetric tessellated repeat, generous breathing room of clean ground between them. ` +
+    `Strictly no botanical background, no foliage filler, no decorative arabesques behind the figures — the ground is one uniform flat color with nothing on it except the silhouette vignettes. ` +
+    `No bananas, no grapes, no birds, no butterflies. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── SHARED art direction — rewritten 2026-05-20 to ELIMINATE the bleed-through
+// layered-background problem. Anchor refs swapped from natural-history plates
+// (Haeckel/Merian — those DO have atmospheric depth + layered washes) to pure
+// 2-tone serigraph references (Warhol/Lichtenstein/Toulouse-Lautrec/WPA poster
+// /Saul Bass/pochoir stencil — those are GUARANTEED flat 2-tone with NO depth).
+// Rewritten 2026-05-20 — Steve directive: "way too busy for most designs..
+// keep it simple". Old SHARED_ARTDIR encouraged tessellated edge-to-edge
+// filling. New version forces SPARSE motifs + GENEROUS NEGATIVE SPACE.
+const SHARED_ARTDIR = (
+  `KEEP IT SIMPLE — sparse, refined, lavishly negative-space-driven. At LEAST 75-85% of the tile area is solid clean ground tone with NOTHING in it (often 85%+, like Zuber and Maya Romanoff archives). Motifs are FEW (2-4 per tile maximum), well-spaced, never edge-to-edge, never tessellated, never cluttered. The empty ground IS the design — motifs are punctuation, not pattern-fill. ` +
+  `Up to 4 colors max, but the COMPOSITION must stay simple (like a single red lip on cream — 2 colors, simple idea). Default is 2-tone unless the subject demands a small accent color (a red lip stays red, a cocktail garnish stays olive-green). Never more than 4 distinct ink tones. ` +
+  `ABSOLUTELY NO bleed between layers — bleed looks cheap and is FORBIDDEN. Single-layer screen-print only. ` +
+  `NO ghost layer, NO faded background, NO atmospheric depth, NO secondary motifs behind the main figures. The ground is one completely uniform flat solid color from edge to edge. ` +
+  `Reference aesthetic: high-end designer wallcovering register, anchored to these brand archives — Zuber & Cie (hand-blocked scenic), Designers Guild (refined modern romantic), Thibaut (archival classic), Arte International (natural-fiber luxe), Romo (painterly British), Maya Romanoff (handcrafted luxe surface). Subtle. Sparse. Refined. Negative-space-driven. Single-pass silkscreen with two ink screens. ` +
+  `Hard clean razor-sharp edges. No half-tones, no gradient, no watercolor, no crosshatch shading. Every figure region is one flat color. ` +
+  `Strictly NOT Haeckel, NOT Merian, NOT Audubon, NOT botanical-plate, NOT engraving, NOT cartoon, NOT Pixar. ` +
+  `Square aspect ratio, seamless tile repeat (edges meet cleanly), flat-paper rendering, no watermark, no signature, no text, no logos.`
+);
+
+// Universal negative prompt — passed to Replicate as --negative-prompt. Catches
+// the model's instinct to add depth/layers even when text anti-prompts fail.
+const SHARED_NEGATIVE = (
+  `gradient, ombre, fade, faded, ghosted, ghost layer, atmospheric perspective, depth, layered background, ` +
+  `secondary motifs behind, lighter background copies, halftone, half-tone, chromatic gradient, watercolor wash, ` +
+  `airbrush, soft edges, blurry edges, anti-aliased blur, crosshatching, engraving lines, stippling, ` +
+  `three colors, four colors, multi-color, textured ground, mottled background, shadow, drop shadow, ` +
+  `Haeckel, Merian, Audubon, natural-history plate, botanical plate, engraving, cartoon, Pixar, 3D render`
+);
+
+const CHINOISERIE_MOTIFS = [
+  'pagodas with curved-eave silhouettes flanked by symmetric flowering plum branches',
+  'kylin mythical-beast pair on a rocky outcrop with stylized cloud-bands above',
+  'lotus blossom roundels in vertical stacks separated by bamboo verticals',
+  'mountain-and-temple silhouette repeats with stylized scholar-cloud forms',
+];
+function composeChinoiseriePrompt(cw) {
+  const motif = CHINOISERIE_MOTIFS[Math.floor(Math.random() * CHINOISERIE_MOTIFS.length)];
+  return (
+    `Chinoiserie wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Motif: ${motif}, arranged in a tessellated seamless repeat. ` +
+    `Cole & Son Mandarin / Ming-dynasty woodblock register. ` + SHARED_ARTDIR
+  );
+}
+
+const TOILE_VIGNETTES = [
+  'a pair of mirror-image country-cottage scenes flanking a central fountain',
+  'symmetric pastoral courtship scene under arching elm-tree silhouettes',
+  'paired equestrian-rider vignettes facing each other across a ribbon-tied bouquet',
+  'symmetric harvest-basket scene with sheaves of wheat and hand-tools',
+];
+function composeToilePrompt(cw) {
+  const vig = TOILE_VIGNETTES[Math.floor(Math.random() * TOILE_VIGNETTES.length)];
+  return (
+    `Toile de Jouy wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink line-engraving. ` +
+    `Vignette: ${vig}, repeated as a seamless symmetric tile, every figure rendered in fine-line copperplate-engraving style with cross-hatched shading replaced by solid-flat figure tone. ` +
+    `Pierre-Frey / Manuel Canovas archival toile register. ` + SHARED_ARTDIR
+  );
+}
+
+const STRIPE_STYLES = [
+  'wide-narrow alternating pinstripe (2cm thick / 4cm gap), perfectly vertical, hard edges',
+  'awning stripe — uniform 6cm vertical bands alternating ground and figure tones',
+  'beaded vertical lines with small ornamental dot-clusters between stripes',
+  'fine triple-pinstripe groups separated by wider blank channels',
+];
+function composeStripePrompt(cw) {
+  const style = STRIPE_STYLES[Math.floor(Math.random() * STRIPE_STYLES.length)];
+  return (
+    `Vertical stripe wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure stripes: bone-ivory (#F2EADB) single-ink. ` +
+    `Pattern: ${style}. ` +
+    `Robert Kime / Colefax & Fowler archival stripe register. ` + SHARED_ARTDIR
+  );
+}
+
+const QUATREFOIL_FIELDS = [
+  'classical quatrefoil tessellation, each quatrefoil oriented identically, edge-to-edge tight grid',
+  'gothic-window quatrefoil-plus-circle interlock, symmetric 4-fold',
+  'moorish-tile quatrefoil with negative-space cross channels',
+  'ogee-quatrefoil hybrid — pointed-arch ogee crossed with classical quatrefoil',
+];
+function composeQuatrefoilPrompt(cw) {
+  const field = QUATREFOIL_FIELDS[Math.floor(Math.random() * QUATREFOIL_FIELDS.length)];
+  return (
+    `Quatrefoil / ogee geometric wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Field: ${field}. ` +
+    `Owen Jones Grammar of Ornament register, strict mathematical tessellation. ` + SHARED_ARTDIR
+  );
+}
+
+const DIAMOND_TRELLIS_FIELDS = [
+  'narrow ogival diamond lattice with empty centers (just the lattice lines)',
+  'diamond trellis with a single tiny center-medallion in each diamond',
+  'crossed-ribbon trellis forming diamond cells with ornamental ribbon-knot intersections',
+  'fine-line diamond lattice with classical tassels at each lattice node',
+];
+function composeDiamondTrellisPrompt(cw) {
+  const field = DIAMOND_TRELLIS_FIELDS[Math.floor(Math.random() * DIAMOND_TRELLIS_FIELDS.length)];
+  return (
+    `Diamond trellis wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink line-trellis. ` +
+    `Field: ${field}. NOT a damask, NOT a heavy medallion field — light open trellis only. ` +
+    `Soane Britain / De Gournay archival trellis register. ` + SHARED_ARTDIR
+  );
+}
+
+// ── Track H: DRUNK ZOO 36" (Steve-approved 2026-05-20) ──────────────
+// Replaces the giraffe-only track with a broader symmetric-zoo track.
+// 36" repeat — wall-scale large pattern. Each design = one symmetric
+// paired-animal vignette in 19c-engraving aesthetic.
+const ZOO_VIGNETTES = [
+  'two reticulated giraffes facing each other in symmetric profile, necks crossing in a heart-shape, both sipping champagne coupes',
+  'pair of mirror-image giraffes flanking a central acacia tree, both holding cocktail glasses',
+  'mother-and-calf giraffe pair, mother arching over the calf, both with bottles',
+  'pair of orangutans in symmetric profile facing each other across a magnum bottle of champagne, hand-engraved',
+  'two sloths hanging in mirror-image from a central acacia branch, each with a cocktail glass',
+  'pair of red pandas in symmetric grooming pose, central bottle between them',
+  'two lemurs in symmetric profile leaping toward each other over a central palm-frond-free fern',
+  'pair of capybaras in symmetric resting pose, central mint julep glass between them',
+  'two African elephant calves in symmetric trunk-raised pose, central wine glass',
+  'pair of macaws in symmetric perched pose (no flight), central long-stemmed coupe between them',
+  'two tipsy frogs in symmetric leaping pose mirrored, central decanter',
+];
+function composeDrunkZoo36Prompt(cw) {
+  const vig = ZOO_VIGNETTES[Math.floor(Math.random() * ZOO_VIGNETTES.length)];
+  return (
+    `Drunk Zoo 36" repeat wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Vignette: ${vig}. Renders at wall-scale 36-inch seamless tile — motifs are LARGE, anchored on the central vertical axis of symmetry, generous breathing room of clean ground around each motif. ` +
+    `Each animal is one FLAT STENCIL SILHOUETTE in bone-ivory ink — no interior shading, no anatomical line-detail, no spots, no stripes, no fur texture. Spots/stripes appear ONLY as cut-out negative shapes in the silhouette (revealing ground tone), never as a second ink color. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Track I: FACE-SKULL DAMASK (Steve directive 2026-05-20) ──────────
+// Damask is purged unless it has faces or skulls. This track generates new
+// damask designs where the medallion FILL is a hand-engraved face or skull
+// rendered in single-ink screen-print style.
+const FACE_SKULL_MOTIFS = [
+  'memento-mori skull at the center of each ogival damask medallion, crossed bones forming the lattice spines',
+  'classical-bust face profile centered in each damask medallion, hair flowing into the medallion borders',
+  'death\'s-head moth skull pattern at each damask cell, wings forming the connecting flourishes',
+  'Venetian carnival mask face filling each damask medallion, ribbon-ties forming the lattice',
+  'Day-of-the-Dead calavera skull centered in each damask medallion with marigold-laurel surrounds',
+  'Greek-tragedy theatre-mask face (one comedy / one tragedy alternating) inside each medallion',
+  'anatomical-engraving skull profile at each medallion, scientific-illustration crosshatch replaced by solid flat ink',
+  'phantom-of-the-opera half-mask face at each medallion, opera-cape ribbons forming the lattice',
+];
+function composeFaceSkullDamaskPrompt(cw) {
+  const motif = FACE_SKULL_MOTIFS[Math.floor(Math.random() * FACE_SKULL_MOTIFS.length)];
+  return (
+    `Face-Skull Damask — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Composition: classic ogival damask lattice, but the medallion FILL is ${motif}. ` +
+    `Strict bilateral symmetry — every medallion is symmetric, lattice is symmetric. ` +
+    `Each face/skull/lattice element is one FLAT STENCIL SILHOUETTE in bone-ivory ink. NO interior crosshatching, NO engraved line shading, NO 3D modeling of the skull/face. Pure cut-out silhouette only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── Settlement check (inline — same logic as src/fliepaper-bugs.js) ──
+function settlementOK(prompt) {
+  let p = String(prompt || '').toLowerCase();
+  // Strip negatives so anti-prompts don't false-trigger
+  p = p
+    .replace(/\b(?:no|not|without|excluding|never|avoid)\b[^.,;]*(?:banana|bird|butterfl|grape|leaf|leaves|frond|palm|foliage|tropical|fluoresc|neon|rainbow)[^.,;]*[.,;]?/g, ' ')
+    .replace(/\bwithout\b[^.,;]*[.,;]/g, ' ')
+    .replace(/\bexcluding\b[^.,;]*[.,;]/g, ' ');
+  // Part B specific elements (affirmative only)
+  const partB = [
+    /\bbanana(?:s|\s+pods?)?\b/,
+    /\bplantains?\b/,
+    /\bgrapes?\b/,
+    /\bbirds?\b/,
+    /\bbutterfl(?:y|ies)\b/,
+  ];
+  for (const rx of partB) if (rx.test(p)) return false;
+  // Foliage = needs review (we still allow, the figure is single-ink)
+  return true;
+}
+
+// ── Track mix — Steve flagged "needs alot more variety in patterns, way
+// too much damasks" 2026-05-20. Six tracks, equal weight:
+//   cactus            — desert botanical (Sonoran luxury)
+//   chinoiserie       — Cole&Son Mandarin/Ming-style
+//   toile-de-jouy     — classic French pastoral one-color
+//   stripe-block      — vertical stripe / pinstripe / awning stripe
+//   quatrefoil-ogee   — geometric tessellation (non-damask)
+//   diamond-trellis   — narrow ogival lattice (lighter than damask)
+// drunk-animals-designer paused — see feedback_no_modern_bending_designs.
+// 2026-05-20 — top-selling interior-designer styles, ALL at 36" repeat:
+//   chinoiserie       — Cole & Son / de Gournay perennial best-seller
+//   stripe            — Colefax & Fowler ticking stripe (designer classic)
+//   cactus            — Steve's house collection (Sonoran luxury)
+//   drunk-zoo-36      — symmetric paired animals (giraffes lead, sloths/lemurs/
+//                       panda/capybara/elephant added), 19c-engraving register
+// 2026-05-20 Steve directives:
+//  - Add designer-scenic (emulate Fromental.com elegance, NOT copy)
+//  - Add throttled-plaster-roses ("throwled plaster look with roses")
+//  - Thibaut is the high-end LLM crisp reference (NEVER York/Brewster/Marburg)
+const DESIGNER_SCENES = [
+  'flowering magnolia branches reaching up the panel with peony blossoms at branch nodes',
+  'cascading wisteria vines hanging in symmetric clusters with stylized vine leaves',
+  'cherry-blossom branches arching across the panel with falling petal motifs',
+  'climbing rose vines on bamboo-trellis armature with full open rose heads at intersections',
+  'flowering plum branches in winter-Asian-painting register with sparse blossoms',
+];
+function composeDesignerScenicPrompt(cw) {
+  const scene = DESIGNER_SCENES[Math.floor(Math.random() * DESIGNER_SCENES.length)];
+  return (
+    `Hand-painted scenic chinoiserie wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}) silk register. Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Scene: ${scene}, arranged as a seamless symmetric tile — each branch repeats with bilateral mirror symmetry. ` +
+    `Thibaut-grade archival register, hand-painted silk-panel aesthetic in the spirit of de Gournay or Fromental atelier work (emulate the elegance, do not copy any specific design). ` +
+    `Strictly no birds, no insects, no human figures. Branches and flowers only. ` + SHARED_ARTDIR
+  );
+}
+
+const PLASTER_ROSE_STYLES = [
+  'full-open garden roses in symmetric pairs with their stems crossing at the panel center',
+  'climbing-rose vine in vertical repeats with rose heads at every node and serrated leaves',
+  'damask-style rose medallions — single large rose head encircled by a wreath of smaller buds',
+  'rose-and-thorn-branch tessellation, each rose head identical, edge-to-edge tight grid',
+];
+function composeThrottledPlasterRosesPrompt(cw) {
+  const style = PLASTER_ROSE_STYLES[Math.floor(Math.random() * PLASTER_ROSE_STYLES.length)];
+  return (
+    `Trowelled-plaster-wall wallpaper with roses — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}) with a subtle warm-cream (#F2EADB) secondary plaster-mottle TONE — rendered as flat zones with hard edges, NOT a gradient. ` +
+    `Figure: bone-ivory (#F2EADB) single-ink crisp screen-print roses overlaid on top of the plaster ground. ` +
+    `Rose style: ${style}. ` +
+    `Venetian trowelled-plaster register, hand-troweled artisanal wall finish with crisp painted roses — Carlisle & Company / Thibaut high-end archival baseline. ` + SHARED_ARTDIR
+  );
+}
+
+// ── MUYBRIDGE — sequential motion-study plates as wallpaper ──────────
+// Eadweard Muybridge "Animal Locomotion" (1887, public domain) — ~780 plates,
+// each one a tiled grid of frozen gait poses of a single subject. The plate
+// FORMAT is already a perfect wallpaper repeat: 12-24 small images tiled in
+// a grid showing the full motion cycle. Steve directive 2026-05-20.
+const MUYBRIDGE_SUBJECTS = [
+  'horse galloping — sequence of 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full gait cycle, tiled left-to-right in three rows of four',
+  'horse trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule tiled in a 4x4 grid',
+  'racehorse with jockey — 12 frozen pose sequence showing the full stride',
+  'leaping greyhound — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule, dog mid-leap, tiled side-by-side',
+  'galloping dog — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule in a 4x4 grid',
+  'mastiff trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in 3 rows',
+  'cat walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle, each panel separated by a thin hairline rule showing the saunter, tiled 4x4',
+  'cat leaping from rock to rock — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule',
+  'lion pacing — 12 frozen pose sequence tiled in a strip',
+  'tiger walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'elephant walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the heavy gait, tiled 3x4',
+  'ostrich running — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'kangaroo hopping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full bound, tiled 3x4',
+  'pig trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 4x3 grid',
+  'goat walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'donkey trotting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'camel walking — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the long stride, tiled 3x4',
+  'rabbit hopping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full bound',
+  'deer leaping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in a strip',
+  'bison charging — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'rooster strutting — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'cockatoo flapping its wings — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'pigeon taking flight — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full wingbeat',
+  'human walking — Muybridge male figure in a loincloth, 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'human descending stairs — woman in a Victorian dress, 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled left-to-right',
+  'human running — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'human jumping — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full leap',
+  'human throwing a discus — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled 3x4',
+  'human ascending stairs — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule left-to-right',
+  'human carrying a heavy bucket — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the strained walk',
+  'human dancing a waltz — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule in a 3x4 grid',
+  'human waving a flag — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled side-by-side',
+  'human boxing — two figures in 12 frozen pose sequence, tiled 3x4',
+  'human wrestling — two figures locked together in 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule',
+  'baby crawling — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule tiled in a 3x4 grid',
+  'human hammering a nail — 4 distinct frozen poses arranged as a 4-panel triptych — horizontal 1x4 strip composition showing the full motion cycle progression left-to-right, each panel separated by a thin hairline rule showing the full swing',
+];
+function composeMuybridgePlatePrompt(cw) {
+  const subj = MUYBRIDGE_SUBJECTS[Math.floor(Math.random() * MUYBRIDGE_SUBJECTS.length)];
+  return (
+    `Eadweard Muybridge motion-study plate as wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Subject: ${subj}. ` +
+    `Each pose is a flat stencil silhouette in single ink on the solid ground — no chiaroscuro, no shading, no anatomical detail inside. ` +
+    `Render as a SEAMLESS REPEAT — the full plate is one tile, edge-to-edge. ` +
+    `Reference: Muybridge "Animal Locomotion" 1887, plate-format, single-color blueprint-style serigraph treatment. NOT photographic, NOT engraved — flat stencil only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── LIPS — Steve directive 2026-05-20. 4-color max, sparse iconic lips on
+// generous ground. Inspired by Warhol Marilyn, Lichtenstein, Patrick Nagel,
+// matchbook covers.
+const LIPS_SUBJECTS = [
+  'one large parted red-velvet lips silhouette centered on the tile, no face, no teeth — just the lips. 80% empty cream ground around it',
+  'a single perfect lipstick-kiss imprint (blot mark) on the upper-third of the tile in scarlet, otherwise empty cream ground',
+  'two lips facing each other almost touching (mid-kiss silhouette), one in deep red and one in cream-outline, lots of empty ground around them',
+  'pursed pouting lips in profile silhouette, scarlet red, no other elements, vast clean ground',
+  'lips biting a single stem of a tiny rose — minimalist Patrick-Nagel silhouette, two-tone (red lips, black rose silhouette, cream ground)',
+  'classic Andy Warhol style pop-art lips — one giant pair of half-open red lips with a thin black outline, 4 colors max (red, black, cream, optional cream highlight on lower lip)',
+];
+
+function composeLipsPrompt(subject, cw) {
+  // For lips: ground=cream/ivory, figure=scarlet red. Override colorway.
+  return (
+    `Lips wallpaper — minimalist pop-art register. ` +
+    `Ground: solid cream-ivory (#F2EADB). Figure: deep scarlet red (#B0282A). ` +
+    `Subject: ${subject}. ` +
+    `Up to 4 colors maximum (cream + scarlet + optional black outline + optional cream highlight on lower lip). NO bleed. NO halftone. NO gradient. ` +
+    `Reference: Andy Warhol pop-art lips, Patrick Nagel, vintage matchbook cover, single-pass screen-print. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// ── MONTEREY WEST-COAST MURAL — Steve directive 2026-05-20.
+// 6 scene subjects × 4 seasonal colorways = 24 base designs. Each is a single
+// 36"-wide × 132"-tall (11ft) panel intended to be the FIRST in a multi-panel
+// mural set. Admin can later "+next panel" to extend the scene rightward
+// across the wall (via /api/design/:id/add-next-panel).
+const MONTEREY_SUBJECTS = [
+  'Lone Cypress on Pebble Beach 17-Mile Drive — a single windswept Monterey cypress silhouetted on a granite headland with the Pacific behind, hand-painted scenic register, de Gournay aesthetic',
+  'Cannery Row at low tide — silhouettes of the historic canneries on pilings over kelp-strewn rocks, fog ribbons in the upper third',
+  'Point Pinos Lighthouse at dusk — the oldest continuously-operating lighthouse on the West Coast with cypress hedge and bluff in foreground',
+  'Carmel Mission Basilica — adobe bell tower silhouette with rose-garden hedges and ancient olive trees',
+  'Big Sur Bixby Creek Bridge silhouette — arched span over the canyon mouth with the Pacific opening to the west, redwoods on the inland slope',
+  'Monterey Bay kelp-forest above-and-below cross-section — sea-otters on the surface, kelp fronds rising from the seabed, single-layer silhouette only',
+];
+
+const SEASONAL_COLORWAYS = [
+  { season: 'spring', name: 'Spring Bloom',     ground: '#A8B79A', figure: '#F2EADB', tone: 'sage-mint' },
+  { season: 'summer', name: 'Summer Surf',      ground: '#3E6B82', figure: '#F2EADB', tone: 'bay-blue' },
+  { season: 'fall',   name: 'Autumn Saddle',    ground: '#7A4A28', figure: '#F2EADB', tone: 'cypress-burnt-umber' },
+  { season: 'winter', name: 'Winter Fog',       ground: '#9CA09B', figure: '#3A2A1C', tone: 'pacific-mist' },
+];
+
+function composeMontereyMuralPrompt(subject, cw) {
+  return (
+    `Monterey, California west-coast mural panel — ${subject}. ` +
+    `${cw.season.charAt(0).toUpperCase() + cw.season.slice(1)} colorway: ${cw.name}. Ground: solid ${cw.tone} (${cw.ground}). Figure: ${cw.figure} single-ink. ` +
+    `Composition: panoramic vertical panel, motif anchored center-bottom, sky/atmosphere extending up the panel (still in solid ground tone, NOT a sky gradient), generous breathing room. ` +
+    `This is a FULL-ROOM MURAL — width = full wall, height = full ceiling. Compose for a 12'-wide × 9'-tall wall. The customer will choose 24"/36"/54" print-panel widths at order time — generate at room scale, not panel scale. ` +
+    `4-COLOR PALETTE WITH HUE SYNC — all four colors share the same hue family (no warm/cool mixing). Ground + figure as the two main tones; one HIGHLIGHT color for accents (lips, eyes, fingernails, fruit, small jewels); one SHADOW color (under figures, in eye sockets, beneath leaves). Highlight + shadow stay in the same hue family as ground+figure. ` +
+    `Reference: de Gournay scenic panel, hand-painted silk register, NOT Haeckel, NOT Audubon. Single-layer stencil silhouette only. ` +
+    SHARED_ARTDIR
+  );
+}
+
+// Tall panel kind — 36" wide × 132" tall (11ft). Different from the seamless_tile
+// kind which is square. Panel kind is meant to hang as-is, not tile-repeat.
+// 2026-05-20 Steve directive: murals are FULL ROOM dimensions, not panels.
+// Customer chooses 24"/36"/54" panel width at print time — generation is room-
+// scale. Default room: 144" wide (12 ft) × 108" tall (9 ft ceiling) @ 150 DPI.
+// SDXL renders at 1536×1152 (4:3 max) — at-print upscale to 21600×16200
+// happens at order time via Topaz/Real-ESRGAN.
+const PANEL_W = 144;        // inches (metadata)
+const PANEL_H = 108;        // inches (metadata)
+const PANEL_RENDER_W = 1536; // pixels (SDXL output)
+const PANEL_RENDER_H = 1152; // pixels (SDXL output)
+
+// 2026-05-20 Steve directive: "up to 4 colors using for highlights like
+// lips.. eyes.. fingernails.. accents in another color and shadows. always
+// make sure hue is in sync." Murals get 4 colors with hue-sync constraint.
+// Tile tracks (cactus/chinoiserie/etc.) stay 2-color.
+const HUE_SYNC_QUARTETS = [
+  // Each quartet is [ground, figure, highlight, shadow] within the same hue
+  // family. The hue-sync constraint = all 4 colors share the same dominant
+  // hue ± neutrals.
+  // WARM EARTH (cream/saddle/rose/cocoa)
+  { name: 'Saddle Rose Warmth', ground: '#F2EADB', figure: '#5C2329', highlight: '#B0282A', shadow: '#2A1010' },
+  // FOREST GREEN (Steve's 10492-loved family)
+  { name: 'Forest Loden Quartet', ground: '#3C4844', figure: '#E8E2D1', highlight: '#A8B79A', shadow: '#1A2520' },
+  // INK + GOLD (Steve's high-end Thibaut energy)
+  { name: 'Ink Library', ground: '#1F2740', figure: '#E8DDB8', highlight: '#C9A14B', shadow: '#0B0F1C' },
+  // BORDEAUX
+  { name: 'Bordeaux Velvet', ground: '#5C2329', figure: '#F2EADB', highlight: '#C84A3A', shadow: '#2A0E10' },
+  // OXBLOOD
+  { name: 'Oxblood', ground: '#722F2F', figure: '#F2EADB', highlight: '#A85040', shadow: '#3A1010' },
+  // STONE PEWTER
+  { name: 'Stone Pewter', ground: '#8A857B', figure: '#F2EADB', highlight: '#C9A14B', shadow: '#3A3530' },
+  // MOSS SLATE
+  { name: 'Moss Slate', ground: '#566554', figure: '#F2EADB', highlight: '#A8B79A', shadow: '#1A2520' },
+  // CHARCOAL + CREAM
+  { name: 'Charcoal Cream', ground: '#3D3833', figure: '#F2EADB', highlight: '#C9A14B', shadow: '#0F0D0B' },
+];
+function pickHueSyncQuartet() {
+  return HUE_SYNC_QUARTETS[Math.floor(Math.random() * HUE_SYNC_QUARTETS.length)];
+}
+
+// ── DESIGNER-ZOO-CALM — Steve directive 2026-05-20 ("love this theme")
+// Inspired by accepted design 10492. Forest-green ground + bone-ivory animal
+// silhouettes, dignified standing/sitting poses (not staggering), sparse
+// fern/grass botanical fillers between animals, Cole-Son/Sister-Parish energy.
+const ZOO_CALM_ANIMALS = [
+  'pair of red pandas in symmetric grooming pose',
+  'bear seated upright in a meditative pose, head slightly tilted',
+  'a tall standing fox in profile, ears alert',
+  'pair of foxes mirrored facing each other, tails curving outward',
+  'family of three lemurs perched in a vertical stack',
+  'pair of standing wolves facing forward, dignified',
+  'mountain lion seated in regal posture, tail curled',
+  'pair of badgers facing each other in symmetric pose',
+  'standing pangolin in profile, scales catching highlight as cut-outs',
+  'pair of capybaras seated side-by-side',
+  'tall standing crane with neck curved (no flying — standing pose only)',
+  'pair of forest deer with antlers, mirrored facing inward',
+  'standing fennec fox with oversized ears, alert pose',
+  'pair of stoats standing upright, paws raised',
+  'standing armadillo in profile, shell silhouette clean',
+  'lounging snow leopard with paws extended',
+];
+const ZOO_CALM_FILLERS = [
+  'sparse fern fronds rising between the animals',
+  'tall slender grass clusters in negative space between motifs',
+  'small wildflower clusters between motifs',
+  'pinecone-and-needle sprigs',
+  'wild-rose stems with single open blossoms',
+  'tall cattails between figures',
+  'sparse oak-leaf clusters in negative space',
+  'olive branches between motifs',
+];
+const ZOO_CALM_PALETTE = [
+  { name: 'Forest Loden', tone: 'deep forest green', hex: '#3C4844' },
+  { name: 'Hunter Olive', tone: 'hunter olive', hex: '#48543A' },
+  { name: 'Bottle Green', tone: 'bottle-green', hex: '#2E4538' },
+  { name: 'Pine Charcoal', tone: 'pine charcoal', hex: '#3A4A45' },
+  { name: 'Moss Slate', tone: 'moss slate', hex: '#566554' },
+  { name: 'Ink Navy', tone: 'ink navy', hex: '#1F2B3A' },
+];
+function composeDesignerZooCalmPrompt() {
+  const animal = ZOO_CALM_ANIMALS[Math.floor(Math.random() * ZOO_CALM_ANIMALS.length)];
+  const filler = ZOO_CALM_FILLERS[Math.floor(Math.random() * ZOO_CALM_FILLERS.length)];
+  const cw = ZOO_CALM_PALETTE[Math.floor(Math.random() * ZOO_CALM_PALETTE.length)];
+  return (
+    `Designer Wallcoverings zoo wallpaper — ${cw.name} colorway. Ground: solid ${cw.tone} (${cw.hex}). Figure: bone-ivory (#F2EADB) single-ink. ` +
+    `Vignette: ${animal}. Renders at wall-scale 36-inch seamless tile. Animals are LARGE, anchored on the central vertical axis of symmetry, dignified standing or seated pose (NOT staggering, NOT falling, NOT mid-motion). ` +
+    `Between the animals: ${filler}, kept sparse — generous breathing room of clean ground tone visible throughout. ` +
+    `Each animal is one FLAT STENCIL SILHOUETTE in bone-ivory ink. NO interior shading, NO anatomical detail, NO fur texture. Spots/stripes/markings appear ONLY as cut-out negative shapes in the silhouette (revealing ground tone), never as a second ink color. ` +
+    `Reference: Cole & Son archival, Sister Parish, Designer Wallcoverings house style. Refined, restrained, designer-grade. ` +
+    SHARED_ARTDIR
+  );
+}
+
+const TRACKS = [
+  // Weighted — designer-zoo-calm appears MORE often per Steve "do more" of 10492
+  'designer-zoo-calm','designer-zoo-calm','designer-zoo-calm','designer-zoo-calm',
+  'chinoiserie','stripe','cactus','drunk-zoo-36','face-skull-damask',
+  'designer-scenic','throttled-plaster-roses','muybridge-plate','monterey-mural',
+];
+
+// Variable repeat size per Steve directive 2026-05-20: vary 24"/36"/54" so
+// designs render at different motif scales (small/medium/large wall coverage).
+const REPEAT_SIZES = [24, 36, 36, 36, 54];
+function pickRepeatSize() {
+  return REPEAT_SIZES[Math.floor(Math.random() * REPEAT_SIZES.length)];
+}
+const REPEAT_INCHES = 36;   // wall-scale repeat — Steve directive 2026-05-20
+function nextTrack() {
+  return TRACKS[Math.floor(Math.random() * TRACKS.length)];
+}
+
+// ── Stop conditions ──────────────────────────────────────────────────
+function shouldStop(state) {
+  if (fs.existsSync(HALT_FLAG)) {
+    logLine('HALT — flag file present at ' + HALT_FLAG);
+    return true;
+  }
+  if (state.spentUsd >= BUDGET_CAP_USD) {
+    logLine(`HALT — budget cap reached ($${state.spentUsd.toFixed(2)} >= $${BUDGET_CAP_USD})`);
+    return true;
+  }
+  if (Date.now() >= STOP_DEADLINE.getTime()) {
+    logLine(`HALT — stop deadline reached (${new Date().toLocaleString()} past ${STOP_DEADLINE.toLocaleString()})`);
+    return true;
+  }
+  return false;
+}
+
+// ── Generate one design ──────────────────────────────────────────────
+function generateOne(track, cw) {
+  let prompt;
+  switch (track) {
+    case 'cactus':          prompt = composeCactusPrompt(cw); break;
+    case 'chinoiserie':     prompt = composeChinoiseriePrompt(cw); break;
+    case 'toile':           prompt = composeToilePrompt(cw); break;
+    case 'stripe':          prompt = composeStripePrompt(cw); break;
+    case 'quatrefoil':      prompt = composeQuatrefoilPrompt(cw); break;
+    case 'diamond-trellis': prompt = composeDiamondTrellisPrompt(cw); break;
+    case 'drunk-zoo-36':    prompt = composeDrunkZoo36Prompt(cw); break;
+    case 'face-skull-damask': prompt = composeFaceSkullDamaskPrompt(cw); break;
+    case 'designer-scenic':  prompt = composeDesignerScenicPrompt(cw); break;
+    case 'throttled-plaster-roses': prompt = composeThrottledPlasterRosesPrompt(cw); break;
+    case 'muybridge-plate':   prompt = composeMuybridgePlatePrompt(cw); break;
+    case 'designer-zoo-calm': prompt = composeDesignerZooCalmPrompt(); break;
+    case 'monterey-mural':    {
+      const subj = MONTEREY_SUBJECTS[Math.floor(Math.random() * MONTEREY_SUBJECTS.length)];
+      const season = SEASONAL_COLORWAYS[Math.floor(Math.random() * SEASONAL_COLORWAYS.length)];
+      // Override the colorway with the seasonal one for this track
+      cw = { name: season.name, hex: season.ground, tone: season.tone, slug: season.season };
+      prompt = composeMontereyMuralPrompt(subj, season);
+      break;
+    }
+    default:                prompt = composeCactusPrompt(cw);
+  }
+  if (!settlementOK(prompt)) {
+    logLine(`SKIP settlement — track=${track} cw=${cw.slug}`);
+    return { ok: false, settlementBlock: true };
+  }
+  // Each track inserts into its own category for sortability + variety.
+  const category = track === 'cactus'          ? 'cactus'
+                 : track === 'chinoiserie'     ? 'chinoiserie'
+                 : track === 'toile'           ? 'toile-de-jouy'
+                 : track === 'stripe'          ? 'stripe'
+                 : track === 'quatrefoil'      ? 'quatrefoil-ogee'
+                 : track === 'diamond-trellis' ? 'diamond-trellis'
+                 : track === 'drunk-zoo-36'    ? 'drunk-zoo-36'
+                 : track === 'face-skull-damask' ? 'face-skull-damask'
+                 : track === 'designer-scenic' ? 'designer-scenic'
+                 : track === 'throttled-plaster-roses' ? 'throttled-plaster-roses'
+                 : track === 'muybridge-plate' ? 'muybridge-plate'
+                 : track === 'monterey-mural' ? 'monterey-mural'
+                 : track === 'designer-zoo-calm' ? 'designer-zoo-calm'
+                 : 'drunk-animals-designer';
+  // Mural panels render at 36"×132" (11ft); everything else at square tiles
+  // with variable size per Steve 2026-05-20 (24/36/54).
+  const isPanel = (track === 'monterey-mural');
+  const w = isPanel ? PANEL_W : pickRepeatSize();
+  const h = isPanel ? PANEL_H : w;
+  const kind = isPanel ? 'mural_panel' : 'seamless_tile';
+  const r = spawnSync('node', [
+    path.join(__dirname, 'generate_designs.js'),
+    '--n', '1',
+    '--kind', kind,
+    '--width', String(w),
+    '--height', String(h),
+    '--category', category,
+    '--prompts', prompt,
+  ], { cwd: ROOT, encoding: 'utf8', env: process.env });
+
+  if (r.status === 0) {
+    // generate_designs.js prints "  ✓ #<id> ·" per-design and "IDs: <id>,..." summary
+    const summary = (r.stdout || '').match(/IDs:\s*(\d+(?:,\s*\d+)*)/);
+    const perLine = (r.stdout || '').match(/✓\s*#(\d+)/);
+    const idStr = summary ? summary[1].split(/,\s*/)[0] : (perLine ? perLine[1] : null);
+    const id = idStr ? parseInt(idStr, 10) : null;
+    // POST-PROCESS: force 2-tone quantize on the output PNG. Eliminates bleed
+    // between layers (Steve directive 2026-05-20 — looks cheap). The script
+    // backs up the original to <file>.original.png before overwriting.
+    if (id) {
+      try {
+        // psqlAt returns tuples-only, no header/footer — clean single-value reads
+        const lp = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "SELECT local_path FROM spoon_all_designs WHERE id=${id};"`, { encoding: 'utf8' }).trim();
+        if (lp && fs.existsSync(lp)) {
+          const q = spawnSync('python3', [path.join(__dirname, 'quantize-2tone.py'), lp], { encoding: 'utf8' });
+          if (q.status === 0) {
+            logLine(`  2tone OK id=${id}: ${(q.stdout || '').trim().split('->')[1] || '?'}`);
+            // COLORWAY-VARIANTS — for every 2-toned design, generate 3 free
+            // recolors. Steve directive 2026-05-20. Each variant becomes a
+            // child row in spoon_all_designs with parent_design_id=id.
+            // Skip for mural panels (they're meant to be a multi-panel set,
+            // colorway variation happens at the source-prompt level there).
+            if (!isPanel) {
+              try {
+                const cwOut = spawnSync('python3', [path.join(__dirname, 'colorway-variants.py'), lp], { encoding: 'utf8' });
+                if (cwOut.status === 0) {
+                  const parsed = JSON.parse((cwOut.stdout || '').trim().split('\n').pop() || '{}');
+                  const variants = parsed.variants || [];
+                  for (const v of variants) {
+                    if (!fs.existsSync(v.path)) continue;
+                    const cwTitle = `${category} · ${v.slug}`;
+                    // Two-step fix for the "PLACEHOLDER image_url" bug — see
+                    // git log + the bulk PG UPDATE on 2026-05-20. The earlier
+                    // single-statement CTE (INSERT + UPDATE in one) failed
+                    // because PG's data-modifying CTEs share a snapshot, so the
+                    // UPDATE didn't see the just-inserted row and the URL stayed
+                    // PLACEHOLDER. Two separate psql calls — INSERT...RETURNING
+                    // captures id, then a follow-up UPDATE writes the real URL.
+                    const insertSql = `
+                      INSERT INTO spoon_all_designs (brand, kind, width_in, height_in, panels, generator, prompt, image_url, local_path, dominant_hex, category, is_published, notes, parent_design_id, created_at)
+                      SELECT brand, kind, width_in, height_in, panels, generator, prompt || E'\\n[colorway-variant of #${id}]', '/designs/img/by-id/PLACEHOLDER', '${v.path.replace(/'/g, "''")}', '${v.ground.replace(/'/g, "''")}', '${cwTitle.replace(/'/g, "''")}', TRUE, E'colorway variant: ${v.slug} (ground=${v.ground}, figure=${v.figure}) of parent #${id}', ${id}, NOW()
+                      FROM spoon_all_designs WHERE id=${id}
+                      RETURNING id;`;
+                    try {
+                      const insertRaw = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "${insertSql.replace(/"/g, '\\"').replace(/\n/g, ' ')}"`, { encoding: 'utf8' });
+                      // psql -At emits the RETURNING value on line 1, then the
+                      // command tag (e.g. "INSERT 0 1") on line 2. Earlier
+                      // version used `.split(/\s+/).pop()` which grabbed "1"
+                      // from the command tag. Take the FIRST line instead.
+                      const cwId = (insertRaw.trim().split('\n')[0] || '').trim();
+                      if (cwId && /^\d+$/.test(cwId)) {
+                        try {
+                          const updOut = execSync(`/opt/homebrew/opt/postgresql@14/bin/psql dw_unified -At -c "UPDATE spoon_all_designs SET image_url='/designs/img/by-id/${cwId}' WHERE id=${cwId};"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
+                          logLine(`    cw url-patch id=${cwId} → ${updOut || '(empty)'}`);
+                        } catch (uErr) {
+                          logLine(`    cw url-patch FAIL id=${cwId}: ${(uErr.message || '').slice(0, 200)}`);
+                        }
+                      } else {
+                        logLine(`    cw NO-ID raw=${JSON.stringify(insertRaw).slice(0, 300)}`);
+                      }
+                      logLine(`    cw child id=${cwId} (${v.slug}) of parent ${id}`);
+                    } catch (e2) {
+                      logLine(`    cw INSERT FAIL ${v.slug}: ${e2.message.slice(0, 200)}`);
+                    }
+                  }
+                } else {
+                  logLine(`  cw FAIL id=${id}: ${(cwOut.stderr || cwOut.stdout || '').slice(0, 200)}`);
+                }
+              } catch (e3) {
+                logLine(`  cw EXC id=${id}: ${e3.message.slice(0, 200)}`);
+              }
+            }
+          } else {
+            logLine(`  2tone FAIL id=${id}: ${(q.stderr || q.stdout || '').slice(0, 200)}`);
+          }
+        } else {
+          logLine(`  2tone SKIP id=${id}: local_path not found (${lp})`);
+        }
+      } catch (e) {
+        logLine(`  2tone EXC id=${id}: ${e.message.slice(0, 200)}`);
+      }
+    }
+    // Auto-publish so Steve sees it in /designs
+    if (id) {
+      try {
+        psql(`UPDATE spoon_all_designs SET is_published=TRUE WHERE id=${id};`);
+      } catch (e) {
+        logLine(`publish-flip FAIL id=${id}: ${e.message.slice(0, 120)}`);
+      }
+    }
+    return { ok: true, id, category, colorway: cw.slug };
+  } else {
+    return { ok: false, stderr: (r.stderr || r.stdout || '').slice(0, 200) };
+  }
+}
+
+// ── Main loop ────────────────────────────────────────────────────────
+(async () => {
+  if (fs.existsSync(HALT_FLAG)) {
+    logLine('ABORT — halt flag already exists at startup. Remove it first.');
+    process.exit(1);
+  }
+  const state = { iterations: 0, ok: 0, fail: 0, settlementSkipped: 0, spentUsd: 0, startedAt: nowIso() };
+  logLine(`START night-builder · budget=$${BUDGET_CAP_USD} stop=${STOP_DEADLINE.toLocaleString()} cooldown=${COOLDOWN_MS}ms`);
+  logLine(`Track mix: 30% cactus / 70% drunk-animals-designer · ${MUTED_PALETTE.length} muted colorways`);
+
+  while (!shouldStop(state)) {
+    state.iterations++;
+    const track = nextTrack();
+    const cw = pickColorway();
+    const r = generateOne(track, cw);
+    state.spentUsd += PER_IMAGE_USD;
+    if (r.settlementBlock) {
+      state.settlementSkipped++;
+    } else if (r.ok) {
+      state.ok++;
+      logLine(`OK  #${state.iterations} ${track}/${cw.slug} id=${r.id} (cumul: ok=${state.ok} fail=${state.fail} spent=$${state.spentUsd.toFixed(2)})`);
+    } else {
+      state.fail++;
+      logLine(`FAIL #${state.iterations} ${track}/${cw.slug}: ${r.stderr || 'unknown'}`);
+      // brief backoff on failure (rate-limit or transient)
+      await new Promise(rs => setTimeout(rs, 15000));
+    }
+    await new Promise(rs => setTimeout(rs, COOLDOWN_MS));
+  }
+
+  logLine(`STOP iterations=${state.iterations} ok=${state.ok} fail=${state.fail} settlementSkip=${state.settlementSkipped} spent=$${state.spentUsd.toFixed(2)}`);
+  process.exit(0);
+})();

← dac62a7 wallco /designs: defense-in-depth vendor-name denylist on dr  ·  back to Wallco Ai  ·  fix: hide AI-provenance legal-disclaimer block on /design/:i 6f11ac9 →