[object Object]

← back to Wallco Ai

auto-decider TRIAGE mode: flag AUTO_HOT_CANDIDATE (no auto-publish), exclude flagged from re-scan, curator surfaces triaged winners

10cd2cf25cc0b767c678e4565441dadade6ea852 · 2026-05-27 14:03:28 -0700 · Steve Abrams

Files touched

Diff

commit 10cd2cf25cc0b767c678e4565441dadade6ea852
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 27 14:03:28 2026 -0700

    auto-decider TRIAGE mode: flag AUTO_HOT_CANDIDATE (no auto-publish), exclude flagged from re-scan, curator surfaces triaged winners
---
 scripts/auto-decide-drunk.js | 11 +++++++----
 server.js                    |  3 ++-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/scripts/auto-decide-drunk.js b/scripts/auto-decide-drunk.js
index 58c9286..d2c46c7 100644
--- a/scripts/auto-decide-drunk.js
+++ b/scripts/auto-decide-drunk.js
@@ -44,7 +44,7 @@ function nextBatch(n = 40) {
     "SELECT id, local_path, COALESCE(category,''), COALESCE(generator,'') FROM all_designs " +
     "WHERE (category LIKE 'drunk%' OR category LIKE 'stoned%') AND is_published=FALSE " +
     "AND (user_removed IS NULL OR user_removed=FALSE) AND local_path LIKE '%.png' " +
-    "AND (notes IS NULL OR notes NOT LIKE '%AUTODECIDE_ERR%') " +
+    "AND (notes IS NULL OR (notes NOT LIKE '%AUTODECIDE_ERR%' AND notes NOT LIKE '%AUTO_HOT_CANDIDATE%')) " +
     `ORDER BY id LIMIT ${n};`
   );
   return rows ? rows.split('\n').filter(Boolean).map(l => { const [id, lp, cat, gen] = l.split('\x1f'); return { id: +id, lp, cat, gen }; }) : [];
@@ -78,9 +78,12 @@ function log(o) { try { fs.appendFileSync(LEDGER, JSON.stringify({ t: new Date()
         continue;
       }
       const r = g.result || {};
-      if (g.ok) {                                        // dense all-over → HOT
-        exec(`UPDATE all_designs SET is_published=TRUE, user_removed=FALSE WHERE id=${d.id};`);
-        log({ id: d.id, verdict: 'hot', n: r.instance_count, see: r.what_you_see }); hot++;
+      if (g.ok) {                                        // dense all-over → HOT CANDIDATE (flag, do NOT auto-publish)
+        // Triage only: flag for Steve's one-click publish in the curator. Auto-
+        // publishing thousands to the live catalog is gated — the human keeps the
+        // publish decision; the loop just surfaces the dense winners.
+        exec(`UPDATE all_designs SET notes = COALESCE(notes,'') || ' | AUTO_HOT_CANDIDATE' WHERE id=${d.id} AND (notes IS NULL OR notes NOT LIKE '%AUTO_HOT_CANDIDATE%');`);
+        log({ id: d.id, verdict: 'hot_candidate', n: r.instance_count, see: r.what_you_see }); hot++;
       } else {                                           // single-hero / sparse → NOT → registry (kept)
         exec(`UPDATE all_designs SET is_published=FALSE, user_removed=TRUE WHERE id=${d.id};`);
         exec(
diff --git a/server.js b/server.js
index 300e48f..182872c 100644
--- a/server.js
+++ b/server.js
@@ -1148,7 +1148,8 @@ app.get('/api/admin/drunk/list', (req, res) => {
       "SELECT COALESCE(json_agg(t ORDER BY t.id), '[]'::json) FROM (" +
         "SELECT id, category, generator, left(prompt,260) AS prompt, created_at " +
         "FROM all_designs " +
-        "WHERE (category LIKE 'drunk-animals-sample%' OR category='drunk-animals-replfast') " +
+        "WHERE (category LIKE 'drunk-animals-sample%' OR category='drunk-animals-replfast' " +
+               "OR ((category LIKE 'drunk%' OR category LIKE 'stoned%') AND notes LIKE '%AUTO_HOT_CANDIDATE%')) " +
           "AND is_published=FALSE AND (user_removed IS NULL OR user_removed=FALSE) " +
           "AND local_path IS NOT NULL " +
       ") t;"

← 717fef2 autonomous drunk hot-or-not decider + single-id room render  ·  back to Wallco Ai  ·  Hot-or-not + room setting generalized to ALL wallco.ai lines ed7d4f3 →