[object Object]

← back to Wallco Ai

drunk-curator HOT = always publish (Steve directive 'dont stop if we say publish'): UI sends force:true on every HOT; server wraps force-publish in BEGIN; SET LOCAL settlement.allow_override='true'; UPDATE; COMMIT — bypasses both runPublishGate AND the PG settlement_publish_check trigger (banana/9-color/etc); notes stamped 'curator-force-publish 2026-05-28' for provenance

d7db846ea115c97c0d682e025ada58be55a644cc · 2026-05-28 09:30:10 -0700 · Steve Abrams

Files touched

Diff

commit d7db846ea115c97c0d682e025ada58be55a644cc
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu May 28 09:30:10 2026 -0700

    drunk-curator HOT = always publish (Steve directive 'dont stop if we say publish'): UI sends force:true on every HOT; server wraps force-publish in BEGIN; SET LOCAL settlement.allow_override='true'; UPDATE; COMMIT — bypasses both runPublishGate AND the PG settlement_publish_check trigger (banana/9-color/etc); notes stamped 'curator-force-publish 2026-05-28' for provenance
---
 data/cactus-decisions.jsonl     | 80 +++++++++++++++++++++++++++++++++++++++++
 public/admin/drunk-curator.html |  6 +++-
 server.js                       | 11 +++++-
 3 files changed, 95 insertions(+), 2 deletions(-)

diff --git a/data/cactus-decisions.jsonl b/data/cactus-decisions.jsonl
index 22059f6..c6faa03 100644
--- a/data/cactus-decisions.jsonl
+++ b/data/cactus-decisions.jsonl
@@ -3762,3 +3762,83 @@
 {"ts":"2026-05-28T14:03:04.303Z","id":39307,"action":"live"}
 {"ts":"2026-05-28T14:03:07.728Z","id":39288,"action":"live"}
 {"ts":"2026-05-28T14:03:17.818Z","id":40538,"action":"bad"}
+{"ts":"2026-05-28T16:25:00.767Z","id":38507,"action":"bad"}
+{"ts":"2026-05-28T16:25:00.888Z","id":38506,"action":"bad"}
+{"ts":"2026-05-28T16:25:00.987Z","id":38511,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.083Z","id":38515,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.169Z","id":38509,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.256Z","id":38510,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.393Z","id":38508,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.486Z","id":38514,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.564Z","id":38501,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.644Z","id":38502,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.716Z","id":38503,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.797Z","id":38513,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.876Z","id":38505,"action":"bad"}
+{"ts":"2026-05-28T16:25:01.956Z","id":38504,"action":"bad"}
+{"ts":"2026-05-28T16:25:02.030Z","id":38512,"action":"bad"}
+{"ts":"2026-05-28T16:25:35.529Z","id":38427,"action":"bad"}
+{"ts":"2026-05-28T16:25:35.633Z","id":38425,"action":"bad"}
+{"ts":"2026-05-28T16:25:35.731Z","id":38416,"action":"bad"}
+{"ts":"2026-05-28T16:25:35.842Z","id":38424,"action":"bad"}
+{"ts":"2026-05-28T16:25:35.962Z","id":38419,"action":"bad"}
+{"ts":"2026-05-28T16:25:36.056Z","id":38418,"action":"bad"}
+{"ts":"2026-05-28T16:25:36.144Z","id":38423,"action":"bad"}
+{"ts":"2026-05-28T16:25:36.244Z","id":41476,"action":"bad"}
+{"ts":"2026-05-28T16:25:36.366Z","id":38422,"action":"bad"}
+{"ts":"2026-05-28T16:25:36.493Z","id":38421,"action":"bad"}
+{"ts":"2026-05-28T16:25:36.629Z","id":41475,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.214Z","id":41479,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.340Z","id":41501,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.434Z","id":41483,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.538Z","id":41485,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.658Z","id":41486,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.791Z","id":41490,"action":"bad"}
+{"ts":"2026-05-28T16:26:15.927Z","id":41496,"action":"bad"}
+{"ts":"2026-05-28T16:26:31.303Z","id":38414,"action":"bad"}
+{"ts":"2026-05-28T16:26:31.449Z","id":38431,"action":"bad"}
+{"ts":"2026-05-28T16:26:31.567Z","id":38417,"action":"bad"}
+{"ts":"2026-05-28T16:26:31.685Z","id":38449,"action":"bad"}
+{"ts":"2026-05-28T16:26:31.826Z","id":38429,"action":"bad"}
+{"ts":"2026-05-28T16:26:31.963Z","id":38451,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.108Z","id":38432,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.282Z","id":38442,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.441Z","id":38457,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.573Z","id":38458,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.718Z","id":38459,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.842Z","id":38456,"action":"bad"}
+{"ts":"2026-05-28T16:26:32.938Z","id":38446,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.037Z","id":38460,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.128Z","id":38433,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.247Z","id":38452,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.380Z","id":38461,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.521Z","id":38435,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.660Z","id":38448,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.809Z","id":38453,"action":"bad"}
+{"ts":"2026-05-28T16:26:33.962Z","id":38463,"action":"bad"}
+{"ts":"2026-05-28T16:26:34.100Z","id":38438,"action":"bad"}
+{"ts":"2026-05-28T16:26:34.246Z","id":38454,"action":"bad"}
+{"ts":"2026-05-28T16:26:34.408Z","id":38466,"action":"bad"}
+{"ts":"2026-05-28T16:26:34.565Z","id":38455,"action":"bad"}
+{"ts":"2026-05-28T16:26:34.689Z","id":38470,"action":"bad"}
+{"ts":"2026-05-28T16:26:34.786Z","id":38439,"action":"bad"}
+{"ts":"2026-05-28T16:26:48.907Z","id":38472,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.032Z","id":38476,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.152Z","id":38477,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.298Z","id":38479,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.398Z","id":38480,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.498Z","id":38488,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.621Z","id":38701,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.726Z","id":38714,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.848Z","id":38755,"action":"bad"}
+{"ts":"2026-05-28T16:26:49.976Z","id":38762,"action":"bad"}
+{"ts":"2026-05-28T16:26:50.106Z","id":38769,"action":"bad"}
+{"ts":"2026-05-28T16:26:50.234Z","id":38490,"action":"bad"}
+{"ts":"2026-05-28T16:26:50.341Z","id":38804,"action":"bad"}
+{"ts":"2026-05-28T16:26:50.455Z","id":38836,"action":"bad"}
+{"ts":"2026-05-28T16:27:28.383Z","id":53730,"action":"live"}
+{"ts":"2026-05-28T16:27:29.830Z","id":53726,"action":"live"}
+{"ts":"2026-05-28T16:27:30.504Z","id":53720,"action":"live"}
+{"ts":"2026-05-28T16:28:21.490Z","id":53861,"action":"live"}
+{"ts":"2026-05-28T16:28:22.283Z","id":53824,"action":"live"}
+{"ts":"2026-05-28T16:28:23.095Z","id":53857,"action":"live"}
diff --git a/public/admin/drunk-curator.html b/public/admin/drunk-curator.html
index c40d91d..d38f7b2 100644
--- a/public/admin/drunk-curator.html
+++ b/public/admin/drunk-curator.html
@@ -646,7 +646,11 @@ async function decide(v){
   // unsaved item loops back on reload (Codex-confirmed root cause 2026-05-27).
   let j={};
   try{
-    const res = await fetch(q('/api/admin/drunk/decide'),{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:d.id,verdict:v})});
+    // Steve directive 2026-05-28: clicking HOT here is the human curator's
+    // override — the publish-gate must NOT block it. The 'Publish anyway' path
+    // becomes the default (force:true on every HOT). Fix/NOT/etc unaffected.
+    const body = (v === 'hot') ? {id:d.id, verdict:v, force:true} : {id:d.id, verdict:v};
+    const res = await fetch(q('/api/admin/drunk/decide'),{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)});
     j = await res.json().catch(()=>({}));
     if(!res.ok || !j.ok){ throw new Error(j.error||('HTTP '+res.status)); }
   }catch(err){
diff --git a/server.js b/server.js
index d193672..95b5450 100644
--- a/server.js
+++ b/server.js
@@ -1595,7 +1595,16 @@ app.post('/api/admin/drunk/decide', express.json({ limit: '4kb' }), (req, res) =
         return res.json({ ok: true, id, verdict: 'hot', published: false, gate_held: true,
                           reasons: gate.reasons || [], checks: gate.checks || {} });
       }
-      psqlExecLocal(`UPDATE all_designs SET is_published=TRUE, user_removed=FALSE, needs_fixing_at=NULL WHERE id=${id};`);
+      // Force-HOT bypasses both gates: runPublishGate (JS) AND the PG-level
+      // settlement_publish_check() trigger. Without the SET LOCAL override the
+      // UPDATE silently no-ops for designs that trip the settlement constraint
+      // (e.g. banana+palms, 9-color blowup) — the response says ok:true but the
+      // row stays is_published=FALSE. Wrapping in a tx + SET LOCAL fixes that.
+      // Steve directive 2026-05-28: "always publish — dont stop if we say publish".
+      const publishSql = force
+        ? `BEGIN; SET LOCAL settlement.allow_override = 'true'; UPDATE all_designs SET is_published=TRUE, user_removed=FALSE, needs_fixing_at=NULL, notes = COALESCE(notes,'') || ' | curator-force-publish 2026-05-28' WHERE id=${id}; COMMIT;`
+        : `UPDATE all_designs SET is_published=TRUE, user_removed=FALSE, needs_fixing_at=NULL WHERE id=${id};`;
+      psqlExecLocal(publishSql);
       // Auto-spawn a photoreal room render for the HOT pick — detached + non-blocking
       // so the curator stays snappy. Lands in room_mockups JSONB / data/rooms.
       try {

← e1ba323 drunk-curator = canonical Hot-or-Not agent: add 🛒 Etsy buck  ·  back to Wallco Ai  ·  HOT-always-publish: bypass passesAestheticGate at server loa 49f4fa9 →