← 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
M OVERNIGHT_LEDGER.mdM public/learn.html
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 →