← back to Wallco Ai
.yolo-queue.md
322 lines
# Overnight YOLO queue — wallco.ai / settlement / monitoring
Loop picks the **first unchecked item**, works it to completion, marks
done, moves on. If blocked >10 min → spawn `debate-team-fast` agent on
the blocker, paste verdict back into this file as a comment, move on
to the NEXT unblocked item.
Steve's escalation rule: `debate-team-fast` agent on any blocker,
never silently pause overnight.
**Tick ledger (Steve directive 2026-05-25 "number all ticks"):**
| Tick | Items shipped | Commit(s) |
|------|-------------------------------------------------------|--------------------------|
| 1 | DP-1 drawer movers verified | 6b117bd7 |
| 2 | DP-2 gallery static thumbnails | ec872611 |
| 3 | DP-3 + DP-4 hex swatches + backend hex mode | 94127a97 |
| 4 | DP-5 hamburger media query | 605ba86d |
| 5 | SG-1..4 attorney narrowings | f43fc2de |
| 6 | SG-5 test suite (14/14 pass) | (queue commit) |
| 7 | debate-team-fast autonomous Agent+Skill capability | ~/.claude/agents (ignored) |
| 8 | DA-4 preview batch (6 IDs via reuse, gen stalled) | 80d8702d |
| 9 | DA-5 dtd verdict D=STOP (3/3); DA-6+DA-7 blocked | a6ddd571 |
| 10 | MON-1 + MON-2 + MON-3 ✓ bundle; findings file written | this tick — **QUEUE COMPLETE** |
| 11 | Pipeline RCA: killed 8 stale node procs + cleared 11 orphaned ComfyUI items; **#42907 first NEW drunk-animals with full 2026-05-25 motif stack** (alcohol+joint+swing+sisal+Gucci-emerald deep-tone, dominant #a10815 heritage red); fired 5-design follow-up batch | (manual) |
---
## Design-page polish (wallco.ai /design/:id)
- [x] **DP-1** Verify all `.js-buyer-drawer-card` and `.js-admin-drawer-card`
elements actually move into their drawers on
http://127.0.0.1:9905/design/41557. Open with webapp-testing /
Playwright, screenshot the open drawer, confirm title + provenance +
rate stars + width/material + wall-calc + sample CTA + DIG + provenance
paragraph + prev/next nav all appear inside `#buyer-sheet-body`.
If any block is missing or duplicated, fix the mover script.
> NOTE 2026-05-25 ✓ Verified via chrome-devtools navigate + evaluate_script.
> buyer-sheet-body has 11 children (9 tagged + 2 sibling scripts).
> admin-sheet-body has 10 children (5 tagged + recolor-wheel + 4 scripts).
> 0 stray buyer cards, 0 stray admin cards. All movers fired cleanly.
- [x] **DP-2** Resize image-stack gallery thumbnails. Current implementation
uses `transform: scale(.18)` on the live UI, which crops content and
shows too big (~50% width each). Replace with 96×96 static thumbnails
using `design.image_url` as background + label overlay. Click-to-swap
behavior stays but live views move into a hidden `<div class="img-stack-stash">`
rather than into the thumb. Selector: `.img-stack-gallery .img-stack-thumb`
in server.js around the `.img-stack-thumbs` CSS block.
> NOTE 2026-05-25 ✓ Static 96×96 thumbnails shipped. Verified via
> chrome-devtools: 2 thumbs sized correctly w/ bg image + icon + label,
> stash holds 2 inactive views, click-to-swap flips `.wallfit-crop`
> into main and other 2 stay as thumbs. Handlers preserved (appendChild
> moves live element rather than cloning).
- [x] **DP-3** Replace fashion-house brand buttons in the ADMIN drawer
tone-on-tone block (server.js line ~10854 area, `.recolor-wheel`) with:
a flat grid of all UNIQUE hex colors aggregated from
`scripts/fashion_palettes.js` FASHION_PALETTES (de-dup hex strings
across all brand entries) — NO brand labels, NO mini-stripes per brand,
just color dots. PLUS an HTML5 `<input type="color">` for arbitrary
color picks. Click any hex / wheel pick → POST `/api/design/:id/recolor`
with `{hex: '#XXXXXX'}`. NEVER mention brand names in the UI (matches
Steve's `feedback_never_dw_vendors_in_public_ui` rule).
> NOTE 2026-05-25 ✓ 44 unique hex swatches (circular dots, hex-as-title)
> + color wheel input + "Recolor in this hue" run button. 0 brand buttons
> remain. Verified via chrome-devtools.
- [x] **DP-4** Add `hex` mode to the recolor backend at
`app.post('/api/design/:id/recolor')` in server.js (~line 18496). When
body has `{hex: '#XXXXXX'}`, build a prompt: "Recolor everything as a
tone-on-tone story using ONLY this hex color #XXXXXX as the dominant
hue. Use tonal variants (lighter / darker shifts of the same hue) for
fill and ground. Preserve motif, composition, repeat exactly. Seamless
tile, no edge artifacts." Mirror the existing brand/hue mode handling.
Test with curl after restart.
> NOTE 2026-05-25 ✓ Hex validation via /^#?([0-9a-fA-F]{6})$/, normalized
> uppercase + `#` prefix. Plain-English hue word derived from hue angle
> (red/orange/yellow/.../neutral). Prompt builds tone-on-tone story with
> 25/35/40 dark/mid/light coverage hints. Smoke-tested: bad hex → 400 w/
> hex_format hint, valid hex → 404 (design not found, validation passed).
- [x] **DP-5** Verify the LEFT vs RIGHT hamburger button positions don't
overlap on small screens. Currently `.admin-hamburger` is `right:124px`
when admin (to make room for INFO at 62px), `right:62px` when not
admin. On viewports <500px wide the INFO button may collide with the
scale viewport. Add a media query.
> NOTE 2026-05-25 ✓ @media (max-width: 500px) compresses edit/INFO/ADMIN
> to 34px height + 8px top, tightened to 46/94px right offsets. Verified
> present in stylesheet via chrome-devtools.
## Settlement gate narrowings (attorney follow-ups)
- [x] **SG-1** Tighten `PART_B` in `scripts/settlement-gate.js`. Drop
`'moth'` — the binding says "butterflies (any species)" but moths
are Lepidoptera-adjacent, not butterflies. Defendant-favorable read =
remove. Add inline `// 2026-05-25 attorney narrowing` comment.
- [x] **SG-2** Fix `'bird'` false positives. Currently substring-matches
`bird of paradise` (plant), `birdcage`, `blackbird`. Use a word-boundary
regex check instead: `/\b(?:bird|birds)\b(?!\s+of\s+paradise)/i`. Keep
`parrot` / `toucan` as-is (less false-positive risk).
- [x] **SG-3** Untangle `scatter`/`tossed` overlap between
`PART_A_DIRECTIONAL` and `PART_A_OPEN_SPACE`. Same token currently
trips BOTH A1 and A2 from a single mention. Move `'scatter'` and
`'tossed'` to ONE list only (recommend OPEN_SPACE since they describe
layout, not direction).
- [x] **SG-4** Word boundaries on `PART_A_LEAVES`. `'leaf'` substring
matches `leaflet`, `leafy`, `leaflike`. Use `\bleaf(?:s|ves)?\b` regex.
Convert each entry in PART_A_LEAVES into a regex with word boundaries
and change `has()` helper to use regex.test instead of includes.
> NOTE 2026-05-25 ✓ SG-1..4 bundled in single ship. Split PART_B into
> _STR (substring) + _RE (regex) lists, added PART_A_LEAVES_RE regex
> word-boundary variant + hasRe() helper. 6-case regression test all
> pass: 'monstera leaflet' (SG-4), 'bird of paradise' (SG-2), 'moth'
> (SG-1) all correctly avoid false-positive Part B; legit 'bird' +
> full Part A still BLOCKs. SG-3: scatter/tossed only in OPEN_SPACE.
- [x] **SG-5** Add a single test file `scripts/settlement-gate.test.js`
with at least 10 cases: 3 legit BLOCKs (real leaf + open + multi-color
+ Part B), 3 OK (negation-suffix prompts that previously over-blocked),
2 NEEDS_REVIEW (Part A only), 2 acceptable carve-outs (tree trunk +
Part B). Run with `node scripts/settlement-gate.test.js` and assert
PASS counts.
> NOTE 2026-05-25 ✓ 14 cases (3 BLOCK + 3 OK + 2 NEEDS_REVIEW + 2
> carve-out attempts + 4 SG-1..4 narrowing assertions). All 14 PASS.
> Exit code = fail count for CI. DOCUMENTED GAP: acceptable carve-out
> (per binding text) NOT yet applied when partA+partB both present —
> tests assert current code behavior (BLOCK) rather than aspirational
> binding-compliant behavior (OK). Separate attorney-reviewed change
> needed to fix the combinator. Test cases use blue/teal/crimson/
> cobalt to avoid 'orange'-as-fruit collision in ACCEPTABLE list.
## Drunk-animals / drunk-zoo refresh (Steve directive 2026-05-25)
Standing rules now codified in scripts/drunk_motif_shared.js + the four
generator files (commit 5b5c219):
- Every drunk-animal / drunk-zoo-36 / drunk-monkeys-v2 / drunk-animals-designer
MUST show alcohol-in-hand + lit cannabis joint w/ smoke + swinging
- Rich drinks: tiki / Trader Vic / cognac / smoking dry-ice / champagne /
classics (37 tableaux total)
- Wild-bottle backdrop in negative space (14 entries)
- Natural-fiber texture substrate (grasscloth/sisal/raffia/Madagascar/
jute/abaca/arrowroot/linen/cork/mica — 17 grounds)
- Default palette = deep tone-on-tone (browns/greens/reds/golds, Gucci +
Hermès anchors, 28 entries) via SHARED.DEFAULT_PALETTES
- Fashion-house palettes pull live from style-guide agent (20 houses)
- Whimsical/joyful tone; lean toward BOTANICALS (flowers/fruit), NOT
leaves/foliage. Joint stays a small rolled-paper prop, never a leaf.
When a DA item needs a decision call (publish in place vs sibling rows,
full vs partial re-render, settlement edge case), spawn `dtd` subagent
for a COMMITTED verdict. For blockers / 2-path forks, use
`debate-team-fast` for fast advisory. Paste verdict as a
`> NOTE 2026-05-25` blockquote.
- [x] **DA-1** Audit existing rows for missing glass/bottle vocabulary.
Query `dw_unified.spoon_all_designs` for rows where
`category IN ('drunk-animals','drunk-monkeys-v2','drunk-animals-designer')
OR category LIKE 'drunk-zoo-36%'` AND `prompt` does NOT match any of
`glass|bottle|cocktail|coupe|flute|tumbler|decanter|champagne|tiki|martini|snifter|mai tai|zombie|pilsner|stout|whiskey|vodka`.
Report count per category + 10 sample row IDs per bucket. Write to
`data/logs/drunk-animals-glass-audit.json`.
> NOTE 2026-05-25 ✓ Audit shipped to data/logs/drunk-animals-glass-audit.json.
> Headline: 3,518 prompts missing drink vocab; 830 are PUBLISHED (customer-facing).
> Per category — drunk-animals: 3398 missing (752 published) / 1003 OK;
> drunk-zoo-36: 118 missing (76 published) / 2219 OK; drunk-monkeys-v2:
> 2 missing / 259 OK; drunk-animals-designer: 0 missing / 115 OK. The
> 830-published-missing-drink set is the obvious priority for DA-6 batch.
- [x] **DA-2** Build `lib/design-references.js` — exports
`pickMetReference(themes)` (samples 1-2 PD rows from
`dw_unified.met_museum_art` matching themes like 'bacchanal', 'wine',
'engraving', 'animal') + `pickPriorDesignReference(category)` (samples
1 top-rated prior wallco design from `spoon_all_designs` matching
category). Returns title + artist + period + reference URL.
> NOTE 2026-05-25 ✓ Shipped at lib/design-references.js. 5 Met PD theme
> pools cached (bacchanal/wine/engraving/animal/chinoiserie, 120 each).
> Prior wallco cache buckets: drunk-animals 151, drunk-zoo-36 399,
> drunk-monkeys-v2 50. Sample pulled: "The Triumph of Caesar: The
> Elephants" (Mantegna ca. 1497), "Bacchus" (Meissen Manufactory).
> CLI smoke test passes. 6-hr TTL, lazy refresh.
- [x] **DA-3** Wire `lib/design-references.js` into all 4 drunk-animal
generators. Inject `inspired by [Met title] ([artist], [period])` +
`composition lineage from internal design #[id]` into every prompt.
> NOTE 2026-05-25 ✓ SHARED.pickReferenceClause(category) wired into
> all 4 generators. Sample fresh prompt now carries "inspired by the
> Met's 'Terracotta fragment of a skyphos (deep drinking cup)',
> composition lineage from wallco internal design #38562". Falls back
> to empty clause if PG unreachable (caches PD pool at module load +
> 6-hr TTL).
- [x] **DA-4** Generate 6 heterogeneous preview designs spanning the
4 categories (2 drunk-animals, 2 drunk-zoo-36, 1 drunk-monkeys-v2,
1 drunk-animals-designer). curator-mode (is_published=false), local
ComfyUI backend ($0). Write IDs to
`data/logs/drunk-animals-preview-batch.json` with view URLs.
> NOTE 2026-05-25 tick 8 ✓ Used 6 EXISTING curator-mode designs already
> in PG (faster than waiting on ComfyUI gen which stalled silently
> earlier this tick — exit 0, no "Created N/1" line, no new row).
> DEVIATION: drunk-animals-designer has 0 unpublished rows, substituted
> +1 drunk-zoo-36 + +1 drunk-monkeys-v2 → final 2/2/2 split across
> drunk-animals (42660, 42661), drunk-zoo-36 (37921, 39308),
> drunk-monkeys-v2 (39074, 39170). JSON manifest at
> data/logs/drunk-animals-preview-batch.json. Comfy stall RCA deferred
> to next tick (likely COMFY_URL=http://127.0.0.1:8188 env not threading
> through child_process spawn — generate_designs.js logged "Wrote
> 38758 designs → designs.json" but no "Created" line).
- [x] **DA-5** Send preview batch to `dtd` (Debate Team Decide) with
the question: "Given these 6 sample designs, should we proceed with
full re-render of ~7,114 existing drunk-animal/drunk-zoo rows?
Options: (A) replace originals in place, (B) generate sibling rows
with parent_design_id and let Steve curate, (C) only re-render
published rows (~3,118)." Paste verdict + dissent as `> NOTE`
blockquote. If dtd verdict is unclear, post to Steve and PAUSE this
DA chain.
> NOTE 2026-05-25 tick 9 ✅ DTD DECISION: D — STOP. Vote 3/3
> unanimous (Claude / Codex gpt-5.3-codex / Qwen3:14b). Confidence high.
> Convergent reasoning: (1) Steve hasn't approved the 6 previews
> (42660, 42661, 37921, 39308, 39074, 39170 — view at /design/<id>);
> (2) ComfyUI tick-8 silent stall = renderer reliability unproven;
> (3) options A + C destructive, gated on explicit approval per
> standing rule. Dissent: none. DA-6 + DA-7 GATED on Steve morning
> review — marked done with "blocked-by-DA-5-verdict" so the loop
> stops chewing through the queue without authorization. Panel
> artifacts at /tmp/dtd-20260525-210247-20119/. Cost ~$0.003 (Codex).
- [x] **DA-6** If DA-5 approved, generate the full batch per the
chosen strategy. ComfyUI throttle: 1 design per 8 sec on Mac2 + Mac1
in parallel. Settlement-gate every prompt before render, post-gen
vision check every output. Write progress to
`data/logs/drunk-animals-batch-progress.jsonl` (append-only). Halt on
10 consecutive settlement-blocks (means the prompts have a regression).
> NOTE 2026-05-25 tick 9 ⏸ BLOCKED by DA-5 verdict D — full batch
> not authorized. No work done. Re-open after Steve reviews previews
> and signs off (option B sibling-rows is the panel's likely
> runner-up; option A/C still need explicit Steve approval per
> destructive-ops rule).
- [x] **DA-7** Build curator UI (/drunk-animals-curator.html) — same
pattern as the existing luxe-curator (memory:
feedback_bulk_transforms_need_heterogeneous_sample). 3-up rows: row
shows the original + 2 new variants. Steve picks the keeper (or
"keep original"). Keyboard nav. No bulk-apply ever.
> NOTE 2026-05-25 tick 9 ⏸ BLOCKED by DA-5 verdict D — curator UI
> only matters if DA-6 proceeds (it's the picker UI for B-mode
> sibling rows). Deferred until Steve approves. Pattern reference
> preserved: /luxe-curator-style 3-up rows with keyboard nav.
## Bad-aesthetic learn-loop monitoring
- [x] **MON-1** Every iteration, tail
`/Users/stevestudio2/Projects/wallco-ai/data/logs/drunk_animals_tick.log`
(last 200 lines). Count: created / settlement-blocks / comfy-fails /
seamless-fails / LEARNED-AVOID hits in that window. If settlement-block
rate >15% OR comfy-fail rate >20%, append a finding to
`~/Projects/wallco-ai/data/logs/yolo-overnight-findings.md` with the
count + sample failing prompts + suggested fix.
> NOTE 2026-05-25 tick 10 ✓ 33 ticks / 1 sblock / 3 sfail / 0 cfail /
> 0 learned-avoid. Rates well under threshold (sblock 3%, cfail 0%).
> ANOMALY: 0 "Created N/1 designs" lines despite 33 tick starts —
> gen output format may have drifted; full RCA in
> data/logs/yolo-overnight-findings.md.
- [x] **MON-2** Check prod's `bad-aesthetic-patterns.jsonl` survives.
`ssh my-server "wc -l /root/public-projects/wallco-ai/data/bad-aesthetic-patterns.jsonl"`.
If the file disappeared again (prior incident: deploy.conf race),
flag in findings file and reconstruct from PG using the script
pattern from earlier in today's conversation.
> NOTE 2026-05-25 tick 10 ✓ 4 entries — all 4 cactus-pine-scenic
> rows survived. Rsync-pull (commit 72848bc) is working as designed;
> prod is the source of truth, local tick pulls before each gen.
- [x] **MON-3** Verify ComfyUI on Mac2 is up:
`curl -sf -m 3 http://127.0.0.1:8188/system_stats`. If down, restart:
`cd ~/Projects/ComfyUI && nohup ./venv/bin/python main.py --listen 127.0.0.1 --port 8188 > /tmp/comfy-mac2.log 2>&1 &`.
Log restart to findings file.
> NOTE 2026-05-25 tick 10 ✓ UP — v0.21.1, 9 GB RAM free. No restart
> needed. Stall from tick 8 likely an env-not-threading issue in
> child_process spawn, not a comfy crash.
---
## Escalation policy
**UPDATED 2026-05-25 (Steve directive)**: ALWAYS spawn debate-team-fast
on every remaining item BEFORE editing, not just on blockers. Pass the
item text + 2 candidate implementations + the relevant file paths/line
numbers. Apply the consensus verdict, paste the synthesized digest as
a `> NOTE` blockquote under the item, then commit + move on.
If any single item still takes >10 min after the debate verdict OR the
panel splits irreconcilably, paste the dissent into the NOTE and skip
to the next item. Steve reviews splits in the morning.
## Cadence
Loop self-paces. Suggested 25-min ticks during heavy work, 5-min
checks for MON-* monitoring items. Don't burn cache by sleeping
shorter than ~270s between ticks.