Graded scan pins wrong catalog identity: EN Fossil Articuno 2/62 PSA slab resolved to Japanese ipb_ja-2 (スリープ/Drowzee) via graded_cache number collision #538
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Prod scan at 2026-08-30 15:14 UTC (tester IP 12.50.143.136). PSA-slabbed 1999 Fossil Articuno-Holo 1st Edition 2/62, PSA 9, cert 79165854.
The graded lane itself worked: cert read from the slab QR (cert_src=qr), Card Hedge fmv-by-cert resolved the cert to '1999 Pokemon Fossil Articuno-Holo 1st Edition 2' (card=True fmv=True), match=high, custody-check calls show the app rendered the slab.
THE BUG — wrong catalog identity pinned:
app.routes.external_scan: graded-scan identity veto (graded_cache) label='articuno'/'2/62' dropped=[('bp-2','Hitmonchan'),('pl3-2','Blaziken FB'),…]
app.routes.external_scan: graded-scan ocr-first identity game=pokemon card_id=ipb_ja-2 via=graded_cache number='2' name='スリープ'
ipb_ja-2 is a JAPANESE card named スリープ (Drowzee), a bare number-2 collision — not Fossil Articuno. The client then received card_id=ipb_ja-2 (its own follow-up: GET /external/scrydex-listings?...&name=Articuno&card_id=ipb_ja-2&company=PSA&grade=9), so the PSA-9 comps ran against the wrong card, and detail/image/identity downstream is the Japanese Drowzee wearing the cert's 'Articuno' display title. To the vendor it looks like the scan matched some random plain card.
Mechanism (backend/app/routes/external_scan.py ~L3970-4060): EN Fossil Articuno 2/62 apparently isn't in the sparse graded price cache, so after the label veto + language gate the only surviving number-hit was the JP row, and the 'one distinct card = unambiguous' acceptance pinned it. The code comment already warns this gate is weak ('a bare number often has exactly one cached holder and looks unambiguous while being flatly wrong'). Two gates failed to save it: _graded_label_contradicts didn't treat スリープ as contradicting 'articuno' (non-Latin name comparison?), and _graded_language_filter didn't drop a Japanese card on an English label read.
Suggested direction: (a) on an English-script label read, a JP-set candidate should never satisfy the unambiguous single-holder gate without name alignment; (b) treat a non-Latin cache name vs a Latin label name as a contradiction in the veto; (c) when the cache has no name-aligned survivor, fall through to Scrydex search rather than cache-pinning a number collision. Note the Card Hedge cert title ('…Fossil Articuno-Holo 1st Edition 2') was in hand and names the set — it could anchor/veto the identity choice.
Filed from a Claude Code session