[object Object]

← back to Wallco Ai

cactus-curator: surface bad_examples.defect_tags as red reason chips (Cartoonish/Poor edges/Ghost/Bleed/Seams/etc) — recorded defects now show on the card front; #53661 flagged cartoonish+poor_edges

65bb871702fb2d6d46d0908d3d2655fcd9684cf8 · 2026-05-27 09:57:31 -0700 · Steve Abrams

Files touched

Diff

commit 65bb871702fb2d6d46d0908d3d2655fcd9684cf8
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 27 09:57:31 2026 -0700

    cactus-curator: surface bad_examples.defect_tags as red reason chips (Cartoonish/Poor edges/Ghost/Bleed/Seams/etc) — recorded defects now show on the card front; #53661 flagged cartoonish+poor_edges
---
 public/admin/cactus-curator.html | 7 ++++++-
 server.js                        | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/public/admin/cactus-curator.html b/public/admin/cactus-curator.html
index 282211c..adf89cf 100644
--- a/public/admin/cactus-curator.html
+++ b/public/admin/cactus-curator.html
@@ -212,13 +212,18 @@ function colorway(cat){
 }
 function verdictClass(v){ return v==='PASS'?'pass':v==='WARN'?'warn':v==='FAIL'?'fail':'none'; }
 // Short red defect label shown on the card front when a design FAILs — says WHY.
+// Map a bad_examples defect_tag → short human label for the red chip.
+const TAG_LABEL = { seams:'Seams', repeat_break_lr:'Seams', repeat_break_tb:'Seams',
+  edges_fail:'Seams', poor_edges:'Poor edges', cartoonish:'Cartoonish', blurry:'Blurry',
+  ghost:'Ghost', bleed:'Bleed', heal_derivative:'Healed', manual_bad_region:'Flagged' };
 function failReason(d){
   const reasons = [];
   const hmid = num(d.seam_hmid_raw), vmid = num(d.seam_vmid_raw);
   if (d.seam_verdict === 'FAIL' || (hmid != null && hmid > 12) || (vmid != null && vmid > 12)) reasons.push('Seams');
   const vis = num(d.vision_score);
   if (vis != null && vis < 40) reasons.push('Blurry');           // low vision-quality ≈ soft/blurry/artifacted
-  if (d.vision_flags && /blur|soft/i.test(String(d.vision_flags))) reasons.push('Blurry');
+  // Defect tags recorded in bad_examples (manual flags, audits) — surface each.
+  (d.defect_tags || []).forEach(t => { if (TAG_LABEL[t]) reasons.push(TAG_LABEL[t]); });
   return [...new Set(reasons)];
 }
 
diff --git a/server.js b/server.js
index 5d1203e..86a69a9 100644
--- a/server.js
+++ b/server.js
@@ -1187,7 +1187,7 @@ app.get('/api/admin/cactus/list', (req, res) => {
                "to_char(d.needs_fixing_at,'YYYY-MM-DD') AS needs_fixing_at, " +
                "d.created_at, " +
                "r.seam_score, r.seam_verdict, r.seam_hmid_raw, r.seam_vmid_raw, r.vision_score, " +
-               "be.boxes AS annotations, " +
+               "be.boxes AS annotations, be.defect_tags AS defect_tags, " +
                "CASE " +
                  "WHEN r.vision_score IS NOT NULL AND r.seam_score IS NOT NULL " +
                    "THEN round(0.6*r.vision_score + 0.4*r.seam_score, 1) " +

← 0d0cca4 cactus-curator: SHIFT+drag to box bad areas (dotted red boxe  ·  back to Wallco Ai  ·  cactus-curator: AUTO-ID bad areas via Gemini vision (candida 86b2fdf →