Some checks failed
QA Gate (P0/P1) / Test affected app (pull_request) Has been cancelled
Root-cause analysis live re-decoded all 124 historically-undecoded prod VINs; 38 already decode now. These 4 fixes target confirmed code bugs that drop or mask real decodes (see undecoded-vin-rca.md): Q2 — PL24 circuit breaker now only counts transient transport faults. A definitive upstream negative (NotFound/BadRequest) no longer trips the global 30s breaker that was starving PL24 for every subsequent VIN (the sibling-VIN inconsistency in the report). Live-proven on VR7. Q3 — previewVin / multi-candidate path no longer returns an empty success: the pcat/emex candidate branches fill brandName (from catalogId / WMI), fixing the 6 "HTTP 200 with null brand+model" cases. Q1 — EMEX fetch retries transient proxy failures with a FRESH ProxyAgent per attempt (rotates the DataImpulse port; ~42% blip rate observed), plus an opt-in direct fallback (EMEX_DIRECT_FALLBACK). HTTP answers are never retried. Q4 — VIN resolve cache keys namespaced by DECODE_CHAIN_VERSION and the negative TTL drops 6h -> 30m, so a decode-chain fix self-heals stale negatives on deploy instead of masking phantom-undecoded VINs for hours. The admin cache-buster uses the same key builder. Tests: 179 passed (+ new Q2/Q3/Q4 specs). typecheck + biome clean. Deploy note: prod EMEX_PROXY_PORT_START/END are both 823 (single port); widen to a real range (e.g. 10001-10099) in Coolify so Q1's port rotation takes full effect. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>