fix(vin): Q5 WMI brand map + Q6 PL24 nissan/van routing (RCA, verified)

Second batch from undecoded-vin-rca.md. Every entry verified (authoritative
WMI registry + prod sibling + VDS fingerprint + live PL24 probe) before adding
— a wrong brand label or a dead PL24 route both have real downside.

Q5 — WMI_BRAND_MAP (packages/shared, UX/telemetry only; does NOT change which
catalog decodes). Adds 9: W1V=Mercedes-Benz, VXF=Fiat, YAR=Toyota, NL1=Hyundai,
KPA=SsangYong, PL1=Proton, LSV=Volkswagen, LVV=Chery, ZCF=Iveco. Resolves the
RCA conflicts: VXF=Fiat (not Opel), YAR=Toyota ProAce (not Opel); NL1=Hyundai
(not TOGG — MY char predates TOGG). Deliberately NOT added: WF1/WAA/W0W (1-char
corruptions of WF0/WAU/WVW — mapping them would mislabel typo classes), VE1
(unresolved, deferred).

Q6 — PL24_WMI_SERVICE_MAP (real decode routing). Both target services are
proven live, so these only append WMIs to working routes (no dead-route →
isDecodeable()=true → 25s-budget/circuit-breaker hazard):
- SJN/VSK/MNT → nissan_parts (Sunderland/Spain/Thailand) — regression restore,
  dropped in the 757905f refactor; nissan_parts proven (JN1 decodes in prod).
- W1V → mercedesvans_parts (Sprinter/Vito) — retires the RCA "never tried" flag:
  mercedesvans_parts decodes WDF44770513186937 live today via the same P5 path.

Tests: shared getBrandFromWmi (adds + corruption-skips return null), pl24 route
map. Full api suite green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-03 23:55:22 +03:00
parent 26fae98246
commit 3df3e224e4
4 changed files with 79 additions and 0 deletions

View File

@@ -16,6 +16,7 @@ import {
validateVinCheckDigit,
extractWmi,
extractModelYear,
getBrandFromWmi,
formatTRY,
kurusToLira,
liraToKurus,
@@ -782,3 +783,33 @@ describe("ERROR_CODES", () => {
expect(ERROR_CODES.CORGI_ERROR).toBe("INT_003");
});
});
describe("getBrandFromWmi — RCA Q5 additions", () => {
// Verified WMI->brand additions (undecoded-vin-rca.md Q5). UX/telemetry only.
const ADDED: Array<[string, string]> = [
["W1V", "Mercedes-Benz"],
["VXF", "Fiat"], // resolved Fiat (not Opel)
["YAR", "Toyota"], // resolved Toyota ProAce (not Opel)
["NL1", "Hyundai"],
["KPA", "SsangYong"],
["PL1", "Proton"],
["LSV", "Volkswagen"],
["LVV", "Chery"],
["ZCF", "Iveco"],
];
it.each(ADDED)("maps %s -> %s", (wmi, brand) => {
expect(getBrandFromWmi(wmi)).toBe(brand);
});
it("is case-insensitive", () => {
expect(getBrandFromWmi("w1v")).toBe("Mercedes-Benz");
});
it("does NOT map likely VIN corruptions (would mislabel typo classes)", () => {
// WF1->WF0(Ford), WAA->WAU(Audi), W0W->WVW(VW) were deliberately skipped.
expect(getBrandFromWmi("WF1")).toBeNull();
expect(getBrandFromWmi("WAA")).toBeNull();
expect(getBrandFromWmi("W0W")).toBeNull();
expect(getBrandFromWmi("VE1")).toBeNull(); // deferred — unresolved
});
});

View File

@@ -182,6 +182,21 @@ export const WMI_BRAND_MAP: Record<string, string> = {
ZAR: "Alfa Romeo", // Alfa Romeo (145/146)
ZLA: "Lancia", // Lancia (Kappa) — CarBrandLogo'da logo yok
WMA: "MAN", // MAN — ticari araç/kamyon
// ── RCA undecoded-VIN audit eklemeleri (2026-06-03) ──
// Çoğu UX/telemetri amaçlı: sert "marka desteklenmiyor" yerine "X olarak
// tanındı" mesajı (decode routing'i DEĞİŞTİRMEZ). WMI'lar authoritative
// registry + prod sibling + VDS parmak izi ile doğrulandı (undecoded-vin-rca.md Q5).
// Bilerek EKLENMEDİ (bozulma): WF1→WF0(Ford), WAA→WAU(Audi), W0W→WVW(VW) — typo sınıfı.
W1V: "Mercedes-Benz", // Mercedes-Benz Vans — Sprinter/Vito (+ PL24 mercedesvans routing)
VXF: "Fiat", // Stellantis France — Fiat LCV (Scudo/Ducato sınıfı)
YAR: "Toyota", // Toyota ProAce ailesi (Stellantis Vigo, Toyota markalı)
NL1: "Hyundai", // Hyundai Assan (HAOS) — Türkiye ticari
KPA: "SsangYong", // SsangYong / KG Mobility — Kore (katalog yok; logo fallback)
PL1: "Proton", // Proton — Malezya (katalog yok)
LSV: "Volkswagen", // SAIC Volkswagen — Çin
LVV: "Chery", // Chery — Çin (CarBrandLogo'da logo yok)
ZCF: "Iveco", // Iveco — İtalya (Daily; ticari)
};
/**