← 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
M public/admin/cactus-curator.htmlM server.js
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 →