← 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.