{"slug":"wallco-ai","total":1309,"limit":100,"offset":0,"since":null,"commits":[{"hash":"c08236f","date":"2026-07-27 20:05:44 -0700","author":"Steve Abrams","subject":"migrate GoDaddy auth → Bearer PAT (TK-10 key rotation); sso-key fallback retained","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ce1283b","date":"2026-07-03 08:08:19 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"3189159","date":"2026-06-26 06:13:05 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-26T06:12:56 (65 files) — public/marketplace/_layout.css public/marketplace/_partials.js public/marketplace/admin.html public/marketplace/api.html public/marketplace/apply.html","body":""},{"hash":"ce0520d","date":"2026-06-26 04:12:40 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-26T04:09:16 (1 files) — data/designs.json.tmp","body":""},{"hash":"14f9f48","date":"2026-06-26 03:39:10 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-26T03:39:04 (1 files) — data/designs.json.tmp","body":""},{"hash":"bfa2467","date":"2026-06-25 20:07:07 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-25T20:07:02 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"34e93c7","date":"2026-06-25 19:37:00 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-25T19:36:54 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"3135a1e","date":"2026-06-25 14:04:39 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-25T14:04:32 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"16a9ef5","date":"2026-06-24 22:30:06 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-24T22:30:00 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"345b704","date":"2026-06-24 18:59:06 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-24T18:59:00 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"184b469","date":"2026-06-24 16:28:20 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-24T16:28:13 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"94ea8f3","date":"2026-06-24 12:51:49 -0700","author":"Steve","subject":"curator: stage Kamatera reverse-proxy fallback vhost (DTD-A, not deployed)","body":""},{"hash":"6a41dda","date":"2026-06-24 12:26:50 -0700","author":"Steve","subject":"Add API-path tunnel finish-script (DTD-C: scoped CF token, no cloudflared login/cert)","body":""},{"hash":"a641549","date":"2026-06-24 11:22:56 -0700","author":"Steve","subject":"Add curator.wallpapersback.com tunnel finish-script (post cloudflared-login: create tunnel, ingress, DNS route, LaunchAgent)","body":""},{"hash":"d5ea384","date":"2026-06-23 16:23:04 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-23T16:22:58 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"f76ac12","date":"2026-06-23 14:52:28 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-23T14:52:21 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"3a7458b","date":"2026-06-23 11:43:31 -0700","author":"Steve","subject":"Concierge search reads in-memory designs.json cache, not Postgres","body":"toolSearchDesigns now searches the same DESIGNS array the public /api/designs\ngrid renders (data/designs.json snapshot) instead of querying spoon_all_designs.\nOn prod the dw_unified DB is near-empty (~350 rows) and is NOT the catalog\nsource — the ~27k-row designs.json snapshot is — so the PG-query concierge\nreturned near-empty on prod while the grid showed the full catalog. This makes\nsearch return the same catalog the user can see, identically on local and prod.\n\n- server.js: pass { getDesigns: () => DESIGNS } into chat.mount (matches the\n  existing review.js/library.js getter convention; reflects /admin/reload-designs).\n- src/chat.js: mount(app, opts) captures getDesigns; toolSearchDesigns filters\n  the cached array (is_published && !user_removed), soft category/motif keyword\n  match over category+title+motifs+tags (arrays or strings), hue/hex_near color\n  filters with empty-cone keyword fallback, uses each record's own image_url,\n  same {id,title,category,hex,image_url} return shape. GENERATE path + the\n  /api/chat/design/:id PG lookup left untouched.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"126ee4f","date":"2026-06-23 09:42:19 -0700","author":"Steve Abrams","subject":"Fix design concierge returning 0 results","body":"toolSearchDesigns had three compounding bugs that all returned empty-but-200:\n- generator='replicate' scope filter excluded ~84% of the published catalog\n  (incl. every comfy/gemini/wallpapersback row and ALL damask rows)\n- exact category= match against a vocabulary (floral/damask/...) the catalog's\n  real taxonomy (drunk-animals/chinoiserie/...) never uses -> always 0\n- image_url built from local_path basename 404'd; switched to /designs/img/by-id/:id\n\nNow scopes to brand='wallco.ai' AND is_published, treats category as a soft\nkeyword (category OR prompt ILIKE), enlarges the candidate pool when a color\nfilter is active, and fixes hueNameToDeg returning 0(=rose) for unknown colors.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"10c7ad7","date":"2026-06-23 02:49:16 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-23T02:49:11 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"ed959fe","date":"2026-06-22 23:48:37 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-22T23:48:32 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"3ad3d71","date":"2026-06-22 22:18:16 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-22T22:18:11 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"495ac53","date":"2026-06-22 10:35:31 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-22T10:35:23 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"10c54d4","date":"2026-06-22 10:15:39 -0700","author":"Steve Abrams","subject":"Revert \"/designs catalog: collapse Hue + Motif filter groups on load (wrapped in default-closed <details>; auto-open when that filter is active)\"","body":"This reverts commit 01a7253cf77e365a05a12cb5e1a9acfeb3f74d09."},{"hash":"01a7253","date":"2026-06-22 09:46:09 -0700","author":"Steve Abrams","subject":"/designs catalog: collapse Hue + Motif filter groups on load (wrapped in default-closed <details>; auto-open when that filter is active)","body":""},{"hash":"8faeb9b","date":"2026-06-22 09:04:57 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-22T09:04:52 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"4b947bb","date":"2026-06-22 09:03:56 -0700","author":"Steve","subject":"gen-luxe: stamp new designs brand=wallpapersback (de-brand off wallco.ai)","body":""},{"hash":"f0b78f1","date":"2026-06-22 08:38:11 -0700","author":"Steve Abrams","subject":"Fix mural room customizer max dimensions: 21 ft wide × 12 ft tall","body":""},{"hash":"327400c","date":"2026-06-22 04:03:49 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-22T04:03:42 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"5603a69","date":"2026-06-21 20:32:08 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-21T20:31:57 (1 files) — data/logs/gate-rejections.jsonl","body":""},{"hash":"939dec9","date":"2026-06-21 20:06:24 -0700","author":"Steve","subject":"TODO: dedup deploy — wallco.ai retired, deployed+rolled-back wallpapersback (served-total halved = double-card de-dup), Steve decision needed","body":""},{"hash":"8eb1bbe","date":"2026-06-21 19:39:52 -0700","author":"Steve","subject":"TODO: log designs.json dedup fix + gated prod rebuild step","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"f55cefc","date":"2026-06-21 19:39:09 -0700","author":"Steve","subject":"Dedupe designs.json snapshot: DISTINCT ON (id) + dedup-aware shrink guards","body":"all_designs base table physically stores ~2 byte-identical rows per id\n(69,399 rows / 35,192 unique; 34,207/34,207 dup ids fully identical, 0 differ).\nspoon_all_designs view is a plain SELECT FROM all_designs (no JOIN), so the\nbuilder faithfully emitted every physical row -> designs.json doubled.\n\nFix:\n- SELECT DISTINCT ON (id) collapses the fan-out at the point of emission\n  (lossless: kept copy is byte-identical to the dropped one).\n- Catastrophe guard now compares UNIQUE-id coverage (not raw rows) so a\n  legitimate 2x->1x dedup passes while a sparse-PG regen still aborts.\n- Byte-size guard now compares bytes-per-RAW-ROW (not total bytes) so a\n  dedup (same B/row, ~half total) passes while a field-strip clobber aborts.\n- Added a WARN if any prior unique id disappears.\n\nValidated locally (scratch dirs only, prod designs.json untouched):\n53,385->27,165 raw rows, 27,165->27,165 unique ids (0 dropped/added),\n0 payload mismatches, published render set 6,264->6,264 unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"37d9df9","date":"2026-06-12 15:12:04 -0700","author":"Steve Abrams","subject":"marketplace/db: never pass undefined password to pg (fixes SASL 'client password must be a string')","body":"Omit password from pool config unless PGPASSWORD/DW_UNIFIED_PG_PASSWORD is\nactually set, and String()-coerce when present. The old '|| undefined' fed a\nnon-string password into pg's SCRAM handshake on Kamatera, throwing the SASL\nerror. Operational root cause is still a missing MARKETPLACE_DB_URL in the\nmarketplace pm2 env on prod — this fix surfaces a clearer error and lets the\ntrust-auth path work where intended.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"8f57319","date":"2026-06-12 11:39:21 -0700","author":"Steve Abrams","subject":"Fix hero click landing on wrong design: add pointer-events:none to inactive hero slides so only the visible slide is clickable (was always navigating to the 6th/last stacked slide)","body":""},{"hash":"66f6a71","date":"2026-06-12 10:52:04 -0700","author":"Steve Abrams","subject":"colorways: add POST /api/design/:id/recolor-preview — live crisp recolor off full-res TIF (recolor-tif.py, --preview-maxedge 1400, ink-map-hash cache, no_tif fallback) + cache serve route","body":"Server half of the click->TIF crisp-preview feature. Endpoint reuses resolveSrcTifLocal + the edge-preserving recolor-tif.py (the canonical fix for the 600px-canvas blocky+halo edges). Validated on Mac2: no_tif fallback, empty-map + no-op-map rejection. Crisp result verifiable on prod (designs with a TIF). Client wiring (swap img.src on click) still TODO."},{"hash":"393fbb9","date":"2026-06-12 10:51:37 -0700","author":"Steve Abrams","subject":"Add edge-seam mural gate batch (DTD-B: edge-PASS keeps tile, WARN/FAIL→mural) + the (unreliable, kept for record) autocorr gate","body":""},{"hash":"af64e05","date":"2026-06-12 09:43:55 -0700","author":"Steve Abrams","subject":"TODO: seam joint-heal v2 + four-horsemen verdict + non-tiling diagnostic (Steve decision needed)","body":""},{"hash":"0fdef02","date":"2026-06-12 09:40:25 -0700","author":"Steve Abrams","subject":"element_copy_heal v2: wrap-edge-only crisp palette-reconcile (DTD verdict C)","body":"Replaces v1 half-roll patch-copy which sliced a visible line through the frog's\nface on root 2766 and worsened the top/bottom edge. v2 heals ONLY the 4 physical\ntile-wrap edges, and only the columns/rows where the outermost wrap pixels carry\ndifferent palette labels (a motif crossing the wrap). Each rewritten pixel is\nsnapped to a crisp dominant-palette color (no averaging = no smudge), only the\ndisagreeing lines are touched (no drawn line), and the interior mids (x=W/2,\ny=H/2 = motif edges, NOT seams) are never touched. On 2766: wrap-column\ndisagreement 17 -> 0, frog motif fully preserved, no smudge/line."},{"hash":"d99cb67","date":"2026-06-12 09:29:35 -0700","author":"Steve Abrams","subject":"Fix variants montage 0/90: count PASS rows from both i2i + original ControlNet generator tags (img2img pivot 7d5a23e dropped the 4 pre-pivot cells)","body":""},{"hash":"cbb6d9e","date":"2026-06-12 09:16:45 -0700","author":"Steve Abrams","subject":"Add seam-joint-heal-loop: autonomous yolo-runner over the 9 roots, DTD continue/pause decider, one-shot per root (no INSERT-only bloat), 07:00 backstop","body":""},{"hash":"0c5c224","date":"2026-06-12 09:05:42 -0700","author":"Steve Abrams","subject":"seam-joint-heal pipeline + variant-curator shows seam-joint-healed + seam-debug image fallback to by-id route","body":""},{"hash":"e4a15f7","date":"2026-06-12 08:45:28 -0700","author":"Steve Abrams","subject":"variant-curator API: show only the new img2img-cleanup variants (generator=variants-i2i-cleanup), hide the old sparse focal-crop children Steve rejected","body":""},{"hash":"7d5a23e","date":"2026-06-12 08:44:38 -0700","author":"Steve Abrams","subject":"variants-9roots: PIVOT to img2img-low-denoise cleanup — variants now preserve the root's lush composition+palette and just clean it (kill smudge/seam), denoise sweep 0.34-0.61, distinct 'variants-i2i-cleanup' generator tag","body":""},{"hash":"8e69f5d","date":"2026-06-12 08:41:51 -0700","author":"Steve Abrams","subject":"Add self-healing supervisor for variants-9roots regen (relaunches resumable script until 90/90; Mac2 keeps killing the foreground run)","body":""},{"hash":"78491e9","date":"2026-06-12 08:28:16 -0700","author":"Steve Abrams","subject":"Add gated variant-pick export: dry-run by default, publishes kept picks to Kamatera all_designs + scp PNG on --live","body":""},{"hash":"96285b0","date":"2026-06-12 08:20:47 -0700","author":"Steve Abrams","subject":"Add live variant-curator for Wave-1 drunk-animal composition variants","body":"New /admin/variant-curator (admin-gated) + /api/variant-curator + pick endpoint.\nOne row per root: root thumb + up-to-10 unpublished variant children, auto-poll\nevery 5s so new variants appear live as variants-9roots.py lands them. Multi-keep\ntoggle for variety. Each card shows the 🕓 created date+time chip (standing rule).\n\nKEEP is durable via a local sidecar wallco_variant_picks (PK-backed → UPDATE-able)\nrather than UPDATE-ing all_designs, which is INSERT-only on Mac2 (no replica\nidentity in FOR-ALL-TABLES publication dw_unified_pub). Roots never touched; real\nis_published flip to live stays a Steve-gated Kamatera export. DTD verdict A\n(unanimous). Nav link added to the admin hub."},{"hash":"8f035f5","date":"2026-06-12 08:11:09 -0700","author":"Steve Abrams","subject":"variants-9roots: edge-seamless is the only hard gate (Steve curates coverage/subject); target 10 children per root for variety","body":""},{"hash":"660e786","date":"2026-06-12 07:49:37 -0700","author":"Steve Abrams","subject":"Add variants-9roots.py: 10 composition/density variants per Wave-1 root (motif-scale sweep, permissive coverage gate, ledger-resumable, insert-only PASS children)","body":""},{"hash":"a0bab98","date":"2026-06-12 07:48:40 -0700","author":"Steve Abrams","subject":"TODO: log replace-colors-3-methods work (AI-recolor gate fix, preset endpoint, lineage fix, UI unify)","body":""},{"hash":"2d7a39e","date":"2026-06-12 07:47:55 -0700","author":"Steve Abrams","subject":"design-edit: surface preset colorways (method 3) on the recolor-wheel block — all 3 replace-color methods on one admin surface","body":""},{"hash":"62ff6da","date":"2026-06-12 07:47:55 -0700","author":"Steve Abrams","subject":"colorways: add preset-colorway endpoint (method 3) + LIMIT 1 lineage fix (INSERT-only dup-row trap nulled parent_design_id)","body":""},{"hash":"231021e","date":"2026-06-12 07:43:15 -0700","author":"Steve Abrams","subject":"colorway-variants.py: add --detect (two dominant tones) + --list-presets CLI modes for the preset-colorway endpoint","body":""},{"hash":"f7ada02","date":"2026-06-12 07:43:12 -0700","author":"Steve Abrams","subject":"overnight-seam-loop: route DTD vote tally to stderr so it lands in the log instead of being swallowed by the verdict capture","body":""},{"hash":"5b6ed8d","date":"2026-06-12 07:41:54 -0700","author":"Steve Abrams","subject":"Fix AI-recolor publish gate: child SKUs land is_published=FALSE + carry parent_design_id (was auto-publishing orphans)","body":""},{"hash":"a0a8321","date":"2026-06-11 23:19:24 -0700","author":"Steve Abrams","subject":"Throttle overnight seam loop: max-retries default 8→4 (load relief — 15-min load hit 177 + DB timeouts)","body":""},{"hash":"f591bcd","date":"2026-06-11 20:08:26 -0700","author":"Steve Abrams","subject":"Fix overnight loop DTD gate: capture only dtd_decide's final line (logl wrote vote-tally to stdout, polluting VERDICT so it never equaled PAUSE → pause branch was dead, loop ignored DTD)","body":""},{"hash":"dd74023","date":"2026-06-11 20:04:15 -0700","author":"Steve Abrams","subject":"Fix overnight seam loop: (1) generator exits 0 on completed wave not 1-on-any-fail (was freezing manifest index → infinite re-run + orphan dupes); (2) idempotency guard skips roots with existing PASS candidate; (3) point loop at generalized reroll.py not scope-locked reroll-2.py; (4) retire unrescuable 43199 macaw + 54385 peacock","body":""},{"hash":"4992ea4","date":"2026-06-11 19:56:05 -0700","author":"Steve Abrams","subject":"seam-wave Wave 1: 1/3 roots cleared (55272 elephant -> 10000018 PASS-both-axes)","body":"Ran the 3 animal-forward FAIL roots through the generalized retry generator.\n55272 cleared PASS-both-axes (new id 10000018, is_published=FALSE, parent=55272).\n43199 macaw + 54385 peacock exhausted 8 retries without a both-axes PASS\n(motif edge never reached the <=6 strict threshold; honestly recorded, NO DB row\ninserted — orphan-minimization held). Queue updated with the winner only.\n\nNote: manifest grew during the run — a separate overnight-seam-loop (PID 48863)\nappended 100 animal-forward WARN roots (DTD-C bounded slice). Left intact.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"41f6dfc","date":"2026-06-11 19:34:45 -0700","author":"Steve Abrams","subject":"Add seam-warn recovery + animal-forward filter helpers (DTD-C bounded WARN slice)","body":"seam-warn-list.py re-derives the 793 distinct WARN roots (the original\nseam-fail-scan.py persisted only FAILs). seam-warn-animal-filter.py runs the\nFREE local-llava dominance gate over them in id order, CAP=100, dropping\nglassware-dominant / pastoral-toile / animal-minority roots. Both read-only\nagainst the DB; neither appends to the manifest, flips is_published, or deploys."},{"hash":"61d91dd","date":"2026-06-11 19:05:13 -0700","author":"Steve Abrams","subject":"TODO: log overnight seam-fix runner launch (3-root manifest, DTD-gated, self-gating)","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"81fefac","date":"2026-06-11 19:04:20 -0700","author":"Steve Abrams","subject":"overnight-seam-loop: single log sink (drop tee, launcher >> is sole sink)","body":"logl + wave output were doubling because tee -a wrote to $LOG while the nohup\nlauncher also redirected stdout to $LOG. Now logl prints stdout-only and all\nin-loop output relies on the launcher redirect — one clean line per entry.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"2fed439","date":"2026-06-11 19:03:56 -0700","author":"Steve Abrams","subject":"seam-wave: generalize the retry-loop generator to arbitrary --ids","body":"controlnet-anchored-reroll.py wraps the proven reroll_one machinery from\ncontrolnet-anchored-reroll-2 (image-level seam-retry until motif clears\nPASS-both-axes + coverage + llava subject-recovery; insert ONLY the winner;\nroots sacred) but accepts any animal-forward FAIL root via a DEFAULT_CFG canny\nprofile. Per-root special profiles (54076/54266) still honored via imported\nROOT_CFG. This is the SEAM_GENERATOR for scripts/seam-wave.sh.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"0438663","date":"2026-06-11 19:02:41 -0700","author":"Steve Abrams","subject":"seam-wave: build manifest — 3 animal-forward FAIL roots (43199/54385/55272)","body":"Scanned 2448 eligible published drunk-animals roots (not in curator's 85, not\nretired) with the canonical both-axes gate verify-edge-seamless.py: 848 PASS /\n1586 WARN / 7 distinct FAIL. Animal-forward pre-filter (free local llava) kept\n3 (macaw/peacock/elephant), dropped 4 (2 pastoral toile, 1 animal-minority,\n1 glassware-dominant). Adds scripts/seam-fail-scan.py (read-only scanner).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"f1efeda","date":"2026-06-11 19:02:33 -0700","author":"Steve Abrams","subject":"Add autonomous overnight seam-fix wave runner (DTD-gated, self-gating, never publishes)","body":"scripts/overnight-seam-loop.sh drives seam-wave.sh wave-by-wave overnight.\n5 stop conditions (07:00 PDT / manifest exhausted / kill switch / DTD PAUSE /\n3 zero-PASS waves). Self-gates: waits (never runs a wave) until the manifest is\npopulated, the generator exists, and ComfyUI is idle — no collision with Wave-1.\nPASS rate from seam-fix-queue.jsonl per-wave window; DTD panel (codex+qwen+rule)\nvotes CONTINUE/PAUSE, ties fail-safe to PAUSE. bash-3.2 compatible. Nothing\npublishes — only is_published=FALSE candidates; never touches settlement/deploy.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"d08b86e","date":"2026-06-11 18:38:16 -0700","author":"Steve Abrams","subject":"seam-wave: bash-3.2 compat — replace declare -A (unsupported on macOS bash) with grep-based exclude membership","body":""},{"hash":"1dc9a01","date":"2026-06-11 18:37:23 -0700","author":"Steve Abrams","subject":"seam-wave: retire 54076+54266 (glassware-dominant, unrescuable) — exclude list auto-subtracted + animal-forward pre-filter documented","body":""},{"hash":"46f0778","date":"2026-06-11 17:55:12 -0700","author":"Steve Abrams","subject":"TODO: reroll-2 STOP/REPORT — 54076+54266 structurally unrecoverable (animal is minority structure entangled w/ glassware; canny crop=glass not animal; text-led loses wrap); 0 rows inserted; Steve decision A/B/C","body":""},{"hash":"fb6e03f","date":"2026-06-11 17:22:11 -0700","author":"Steve Abrams","subject":"reroll-2: empirical correction — text-led alone fails edges+openness (0/12 cleared); synthesize weak-canny (wrap/open) + subject-recovery gate (rejects glassware-only rolls); cap cov 34%","body":""},{"hash":"95d401a","date":"2026-06-11 16:57:37 -0700","author":"Steve Abrams","subject":"reroll-2: DTD verdict A — drop canny for the 2 glassware-entangled roots (text-led seamless txt2img) + add Gemini/local-llava subject-recovery gate to the retry loop; add free local-llava vision backend (Gemini over spend-cap 429); add gen_textled_seamless to redo module","body":""},{"hash":"9ec758e","date":"2026-06-11 16:41:24 -0700","author":"Steve Abrams","subject":"Add controlnet-anchored-reroll-2: seam-retry loop for the two WARN roots (54076/54266); in-mem motif edge-verify, one INSERT per root, tighter crop, scope-locked to the 2 approved roots","body":""},{"hash":"b9e1b4d","date":"2026-06-11 16:34:47 -0700","author":"Steve Abrams","subject":"TODO: ControlNet redo sample landed (1 PASS, 2 near-miss WARN, 2 fail); note un-deletable orphan rows + DB no-replica-identity constraint","body":""},{"hash":"c63a1ff","date":"2026-06-11 16:29:32 -0700","author":"Steve Abrams","subject":"Add controlnet-anchored-redo.py: SDXL canny-CN anchored native-seamless redo","body":"Uses the controlnet-canny-sdxl-1.0 model installed on Mac1 ComfyUI to anchor a\nsingle focal motif (DTD 3/3: cropped focal canny hint on blank canvas, not the\nfull busy root) while circular-pad SeamlessTile+MakeCircularVAE keeps the tile\nseamless (zero smear). Composites onto real procedural fibre ground. Inserts a\nsacred curator-mode child (is_published/user_removed FALSE, parent=root) with\nexplicit id (dw_admin has no sequence USAGE) and image_url inline (table is in a\nno-replica-identity publication so UPDATE/DELETE error)."},{"hash":"fc72875","date":"2026-06-11 16:07:19 -0700","author":"Steve Abrams","subject":"Wire seam-fix wave cadence (DTD verdict C): gated one-wave-per-invocation runner + runbook + manifest template; refuses to run until 5-root sample is curate-approved","body":""},{"hash":"3a53bd5","date":"2026-06-11 15:04:40 -0700","author":"Steve Abrams","subject":"wallco redo: real-fibre composite path + img2img native-seamless orchestrator","body":"- make-fibre-ground.py: deterministic SEAMLESS natural-fibre swatch generator\n  (grasscloth/raffia/linen/sisal/paperweave) — wraps by construction (edge ΔE\n  0.00), fills the real-fibre-ground gap (no local DW fibre swatch library).\n  Validated: composite of root #54266 onto raffia reads as genuine woven fibre.\n- seamless-bg-swap-file.py: file-input wrapper around seamless-bg-swap.py so the\n  deterministic real-fibre composite runs on a fresh motif PNG (not just a DB id).\n- native-seamless-redo.py: img2img native-seamless orchestrator (VAEEncode root +\n  SeamlessTile/MakeCircularVAE circular-pad, subject-anchored by starting from the\n  root latent) then real-fibre composite. Sacred roots, is_published=FALSE.\n\nFINDING (sample BLOCKED, not shipped): proved txt2img circular-pad PASSES edges\ncleanly (3.18/2.18) but has no subject anchor -> drift; img2img preserves subject\nbut breaks native-seamless edges to WARN AND can't open the busy root. No\nControlNet model + no IPAdapter installed on Mac1 ComfyUI = no anchor that works\nat denoise-1.0 native-seamless strength. Minimum missing: an SDXL canny/lineart\nControlNet model on Mac1. Probes 58056/58057 removed (FALSE+user_removed).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"3555103","date":"2026-06-11 14:47:19 -0700","author":"Steve Abrams","subject":"TODO: native-seamless sanity sample results (smear killed, 2/5 nail brief, abstract-drift + no-fibre-texture findings for Steve)","body":""},{"hash":"12c62e9","date":"2026-06-11 14:36:22 -0700","author":"Steve Abrams","subject":"Add native-seamless-sample.py: retire post-hoc strip-smear, generate native-seamless candidates on textured-natural grounds with open composition (sanity sample, no bulk)","body":""},{"hash":"b9ad50c","date":"2026-06-11 14:25:49 -0700","author":"Steve Abrams","subject":"Force true-toroidal edge-wrap on both axes for the 6 WARN roots; all 6 candidates now edge-PASS","body":"The 6 WARN roots (2662,54076,54078,54123,54266,54507) failed because the box\nscanner never flagged their edge boxes - literal line diff was tiny but the 2x2\ntiled cross-seam band exceeded clean. force-edge-seamless.py mirror-averages a\nfull-width top/bottom + full-height left/right strip unconditionally (no scanner\ndependency), making row[k]==row[H-1-k] and col[k]==col[W-1-k] exactly so both\nline_diff and tiled cross-seam drop to ~0. Roots untouched; each candidate is a\nnew child (ids 58043-58048) is_published=FALSE, parent_design_id=root, appended\nto seam-fix-queue.jsonl with edge_verdict/edge_seamless/edge_axes."},{"hash":"6c41239","date":"2026-06-11 14:10:00 -0700","author":"Steve Abrams","subject":"Add true-toroidal edge-continuity verifier + wire as hard publish gate on seam-fix curator","body":"- scripts/verify-edge-seamless.py: measures literal wrap boundary (col[0] vs col[W-1], row[0] vs row[H-1]) + 2x2 tiled cross-seam, per-axis PASS/WARN/FAIL, exit 0 only on PASS both axes\n- seam-fix-variants.py: record edge_verdict/edge_seamless/edge_axes per candidate (the literal-edge gate, not the strip-mean after_verdict)\n- server.js: runEdgeSeamlessGate() helper; /api/seam-fix-curator/pick refuses to publish a candidate whose edge verdict != PASS (fail-closed, incl. verifier-absent host); list API surfaces edge_verdict so FAIL candidates render non-selectable\n- backfilled edge_verdict into existing 170 queue rows (79 PASS / 71 WARN / 20 FAIL)"},{"hash":"b5f9566","date":"2026-06-11 13:39:57 -0700","author":"Steve Abrams","subject":"TODO: log seam-fix scale-up (80 worst-FAIL roots, 996 flagged remain, Steve confirm to continue)","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"0236a2b","date":"2026-06-11 13:38:56 -0700","author":"Steve Abrams","subject":"seam-fix curator: scale past 5-root sample — 80 worst-FAIL drunk-animals roots → 160 candidates (is_published=FALSE)","body":"Scanned 1304 eligible published drunk-animals roots (parent NULL, has path, not\nuser_removed, needs_fixing IS NULL): 228 PASS, 684 WARN, 392 FAIL = 1076 flagged.\nGenerated 2 composition-preserving candidates (v1 shift-feather, v2 heal-region)\nfor the 80 worst-FAIL roots via scripts/seam-fix-variants.py. All landed as\nparent-linked children, is_published=FALSE — Steve picks per-row in the curator.\nRoots untouched, prior 5 picks untouched. No Gemini/ComfyUI/API cost (PIL only).\n996 flagged roots remain (312 FAIL + 684 WARN) pending Steve confirm.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"4a70b85","date":"2026-06-11 13:27:17 -0700","author":"Steve Abrams","subject":"TODO: log seam-fix curator sample + Steve pick step","body":""},{"hash":"fe0b0b1","date":"2026-06-11 13:26:56 -0700","author":"Steve Abrams","subject":"seam-fix curator: heal seams of good roots as is_published=FALSE children + per-root picker","body":"Steve's narrow ask: the roots are good, only the seams need fixing. This is NOT\nthe luxe aesthetic transform (de Gournay/1838) — each variant is a SEAM-FIXED\ncopy of the SAME design, composition preserved exactly (round-1 sacred).\n\n- scripts/seam-fix-variants.py: for given root ids, mints 2 composition-preserving\n  seam-fix children (v1 fix-seam shift-feather, v2 per-box circular-wrap heal),\n  re-scores each with seam-defect-boxes (before/after overall_max), inserts as\n  parent_design_id=root, is_published=FALSE, generator=seam-fix-v1|v2, and\n  appends to data/seam-fix-queue.jsonl. ComfyUI reroll deliberately excluded\n  (DTD 3/0: a reroll drifts composition).\n- server.js: GET /api/seam-fix-curator (isAdmin) + POST /api/seam-fix-curator/pick\n  (requireAdmin). Pick publishes the chosen child, unpublishes seam-fix siblings,\n  and NEVER touches the root. Pick validates the child is a real seam-fix child\n  of the root before publishing.\n- public/seam-fix-curator.html: luxe-curator-style per-root picker — root + seam-fix\n  candidates side by side, 2x2-tile preview to reveal the seam, before/after seam\n  scores + verdict per tile, cleanest fix starred, keyboard picks.\n\nSample: 5 drunk-animals roots (2810,2778,43186,43198,2662), all FAIL seam gate.\nv2 per-box heal is the consistent winner (FAIL -> WARN/PASS, 50-82% lower max).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"bda8252","date":"2026-06-10 13:03:35 -0700","author":"Steve Abrams","subject":"id-collision resolutions re-run 1..14999 (125 live: 77 F,F skip + 48 F,T preserve-prod verdict A; 1 id drifted F,T→F,F since 06-03; 0 writes)","body":""},{"hash":"88181c9","date":"2026-06-10 07:21:30 -0700","author":"Steve","subject":"max-debug security: sanitize vision-check TITLE (callers pass full gen-prompt → injection surface) — collapse+cap to 160ch + mark it untrusted in-prompt so a crafted title can't steer the legal-gate verdict","body":""},{"hash":"bf0a5f3","date":"2026-06-10 07:13:33 -0700","author":"Steve","subject":"max-debug: add missing Gemini fetch timeout (45s — body-stall no longer hangs child→fail-closed→unpublish); raise ollama 120→180s + spawn 150→240s + batch 90→240s (queue-wait under concurrency); guard SIGTERM-check + stdout-only VERDICT match","body":""},{"hash":"f6b54ad","date":"2026-06-10 07:00:29 -0700","author":"Steve","subject":"settlement vision (2-agent review): keep_alive=2m frees ~8GB idle; timeouts 75→120s/90→150s prevent cold-load fail-closed; in-code model fallback (gemma3→llava) kills the missing-model foot-gun on any box","body":""},{"hash":"52ea65f","date":"2026-06-09 17:29:41 -0700","author":"Steve Abrams","subject":"security: strip DB DSN passwords from audit/digest docs (user@host form)","body":""},{"hash":"4e68e65","date":"2026-06-09 17:27:27 -0700","author":"Steve Abrams","subject":"fix(scripts): DB password from DATABASE_URL (.env), not empty PGPASSWORD env","body":"The secret-scrub left these reading os.environ PGPASSWORD (not exported) → empty\npw → PG auth fail. _pg_password() now parses DATABASE_URL from .env (mirrors\nedges-batch-scan.py); PGPASSWORD env still overrides. SELECT 1 verified all 4 paths."},{"hash":"4a2ef63","date":"2026-06-09 16:37:11 -0700","author":"Steve","subject":"restore script: generalize via CATEGORY_REGEX, hard-exclude damask, REVIEW-VISION-ERROR-only default","body":""},{"hash":"d2decec","date":"2026-06-09 16:20:16 -0700","author":"Steve","subject":"deploy: ship settlement vision-check + tick-guard to prod (hardened gate parity)","body":""},{"hash":"a3e8048","date":"2026-06-09 16:03:01 -0700","author":"Steve","subject":"harden settlement vision fallback (debugger pass): reject non-boolean 'violates' from Gemini→fall through; clamp partial-JSON ollama results to NEEDS REVIEW (close silent false-OK on garbled output)","body":""},{"hash":"a717efc","date":"2026-06-09 15:45:11 -0700","author":"Steve Abrams","subject":"feat(design-curator): 🛋 Room setting button — generate room mockup, show below design in chip","body":"Per-chip 'Room setting' button POSTs to existing /api/room (admin via q() token),\nshows a spinner, then injects the rendered room image + caption in a .roomgen\nbox directly below the design image. Reuses the auth-gated renderer; honest error\nsurfacing on failure. No server change — static curator page."},{"hash":"e3ccb0e","date":"2026-06-09 15:21:40 -0700","author":"Steve Abrams","subject":"cactus scale-sample: 28 gens, seam-PASS 76-90% per window vs 19% baseline, vision 100% — bulk regen stays gated","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"dc1fa17","date":"2026-06-09 14:52:14 -0700","author":"Steve","subject":"restore-verified-drunk-animals: per-image gemma3 re-verify + single-row republish of Gemini-cap false-unpublishes","body":""},{"hash":"a259466","date":"2026-06-09 14:25:02 -0700","author":"Steve Abrams","subject":"geometric pilot: 19/20 generated (57711-57750), settlement OK x19 by construction; ghost votes blocked on Gemini monthly billing cap (429)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"4e65df7","date":"2026-06-09 14:04:03 -0700","author":"Steve","subject":"settlement vision: free local ollama fallback (gemma3:12b) when Gemini capped + clamp local-violation→NEEDS REVIEW (never auto-unpublish on local model)","body":""},{"hash":"eedbd24","date":"2026-06-09 13:32:28 -0700","author":"Steve","subject":"purge-orphan-pngs: reclaim gen-time orphan PNGs (no DB row) — 1693 files freed","body":""},{"hash":"dbe4464","date":"2026-06-09 13:25:24 -0700","author":"Steve Abrams","subject":"generator: log gate rejections to data/logs/gate-rejections.jsonl (close orphan provenance gap)","body":"When the ghost/seamless/frame-overlay gate rejects a tile after its retry, the\nloop continued WITHOUT a DB insert, leaving an orphan PNG with no recorded\nreason. Now each skip appends {ts,seed,file,gate,reason,category,kind} so the\nwallco-live-viewer can name the actual gate instead of inferring 'gate-rejected'\nfrom absence-of-row. Append-only; logging failures never block generation."},{"hash":"afa4976","date":"2026-06-09 13:18:58 -0700","author":"Steve Abrams","subject":"cleanup: manifest of 14,632 May gate-rejected orphan designs removed (2.8GB freed)","body":"Orphans = generated PNGs with no spoon_all_designs row (failed an insert-time\nquality gate: seamless/ghost/frame-overlay/concept). Kept all June orphans\n(recent). Manifest = every deleted filename+seed+mtime."},{"hash":"f969822","date":"2026-06-09 13:17:23 -0700","author":"Steve Abrams","subject":"snapshot before mural-feature + hero-click deploy","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"}]}