[object Object]

← back to Dw Photo Capture

learn: surface logo fingerprint + flag rejected logos (overnight cycle 4)

39a065c59dacd429d17d936a22c749a6ccfdd0e5 · 2026-06-25 23:47:37 -0700 · Steve Abrams

Each /learn card now shows how the VLM read that vendor's reference logo — a green
'🏷 reads X · typeface' for validated logos, and a red '⚠ logo rejected — read as X'
for the 6 logos the validation pass dropped (Versace→Savannah, Hollywood→Hollywood
Reporter, Mid Century→20th Century Fox, etc.) so Steve can review the misfires at a
glance. Reads logo_valid/logo_reads already in /api/vendor-profiles. $0 (local).

Files touched

Diff

commit 39a065c59dacd429d17d936a22c749a6ccfdd0e5
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jun 25 23:47:37 2026 -0700

    learn: surface logo fingerprint + flag rejected logos (overnight cycle 4)
    
    Each /learn card now shows how the VLM read that vendor's reference logo — a green
    '🏷 reads X · typeface' for validated logos, and a red '⚠ logo rejected — read as X'
    for the 6 logos the validation pass dropped (Versace→Savannah, Hollywood→Hollywood
    Reporter, Mid Century→20th Century Fox, etc.) so Steve can review the misfires at a
    glance. Reads logo_valid/logo_reads already in /api/vendor-profiles. $0 (local).
---
 OVERNIGHT_LEDGER.md | 3 ++-
 public/learn.html   | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/OVERNIGHT_LEDGER.md b/OVERNIGHT_LEDGER.md
index c866f6f..d4f04b1 100644
--- a/OVERNIGHT_LEDGER.md
+++ b/OVERNIGHT_LEDGER.md
@@ -13,7 +13,7 @@ All scanner work is **local + $0**. Only metered cost is DTD Codex (~$0.03/run).
 - [ ] Wire logo fingerprints into /api/identify as a tiebreaker (was option B; safe after A)
 - [ ] analyzeOcr unit tests (project values pure/testable functions)
 - [x] Barcode UX: distinct "▍▍ BARCODE" lock label on a barcode read
-- [ ] /learn: show logo `conf`, flag rejected logos, surface `matched_on` for review
+- [x] /learn: shows logo fingerprint + flags rejected logos with their read-as
 - [ ] Faster VLM path: moondream fast-mode toggle for /api/identify (env already supports model)
 - [ ] Auto-fire /api/identify in background on a lock-with-code-but-no-vendor (non-blocking)
 - [ ] /code-review (or claude-codex) pass on the full session diff; fix findings
@@ -26,3 +26,4 @@ All scanner work is **local + $0**. Only metered cost is DTD Codex (~$0.03/run).
 | 1 | — (clear win) | run project selfcheck after all session changes | lint clean, server checks ok, 0 dead links/console errors | $0 |
 | 2 | gated→draft (officer-yolo rule) | draft weekly vendor-refresh launchd job to pending-approval + stage plist | queued for Steve; vp-engineering APPROVE | $0 |
 | 3 | — (clear win) | barcode lock shows distinct "▍▍ BARCODE" label (exact read vs OCR guess) | served HTTP 200, inline JS valid | $0 |
+| 4 | — (clear win) | /learn surfaces logo fingerprint (reads-as + typeface) and flags the 6 rejected logos with what they actually read as | HTTP 200, 6 rejects visible (Versace→Savannah etc.) | $0 |
diff --git a/public/learn.html b/public/learn.html
index b07e0a7..7c045d3 100644
--- a/public/learn.html
+++ b/public/learn.html
@@ -35,6 +35,8 @@
   .chip .n{color:var(--muted);font-weight:400}
   .ex{font:400 11px/1.3 ui-monospace,Menlo,monospace;color:var(--muted);word-break:break-all}
   .when{font:500 10.5px/1 ui-monospace,Menlo,monospace;color:var(--muted);display:inline-flex;gap:5px;align-items:center}
+  .lfp{font:500 11px/1.3 ui-monospace,Menlo,monospace;color:var(--green)}
+  .lfp.bad{color:var(--red)}
   .empty{color:var(--muted);padding:40px 0;text-align:center}
   a{color:var(--gold)}
 </style>
@@ -76,6 +78,9 @@ function card(v){
     <div class="stats"><span>codes <b>${v.n||0}</b></span><span>scans <b>${v.learned_scans||0}</b></span>
       ${v.common_len?`<span>len <b>${v.common_len}</b></span>`:''}</div>
     <div class="chips">${prefs}</div>
+    ${v.logo_valid===false
+      ? `<div class="lfp bad" title="logo file matched this vendor by name but its mark reads as another brand — rejected, not trusted">⚠ logo rejected — read as \u2018${v.logo_reads||'?'}\u2019</div>`
+      : (v.logo_reads ? `<div class="lfp" title="how the VLM read this vendor's reference logo">🏷 reads \u2018${v.logo_reads}\u2019${v.logo_typeface?` · ${v.logo_typeface}`:''}</div>` : '')}
     ${ex?`<div class="ex">${ex}</div>`:''}
     <div class="when" title="${v.updated_at||''}">🕓 ${fmtWhen(v.updated_at)||'—'}</div>
   </div>`;

← dfefc4a Scan UX: distinct BARCODE lock label (overnight cycle 3)  ·  back to Dw Photo Capture  ·  Add 🎨 Recognize Pattern: VLM reads a swatch, finds this + v edd68a9 →