fix(insights): distinguish client-side VIN validation rejects from provider failures #4
Reference in New Issue
Block a user
Delete Branch "fix/insight-vin-validation-distinction"
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?
TL;DR
Insight pipeline
cmpvfrjgc000114fzc7cdyh66("PL24 sağlayıcısında timeout") yanlış çıktı: kullanıcı trial sırasında VIN alanına VW yedek parça numarası girdi (500 907 521,5Q0 907 521), client-side regex reddetti, provider'a hiç gitmedi. Pipeline yine de P1 provider issue üretti.Bu PR root cause'u dört katmanda kapatıyor (defense in depth).
Reproducing session
019e8400-5204-7d0c-b73d-1e3ed0e22adb(Ahmet üstün, iPhone, trial, /dashboard/search → /)WVWZZZAUZGW055026başarılı decode → kategorilerde 3 tur döndü →/'a çıkıp parça numarasını VIN inputuna yazdı →vin_decode_failed × 2, error: "Geçersiz şase numarası. 17 karakter olmalı, I, O, Q harfleri kullanılamaz."provider_qualityinsight üretti.Root cause
tagger.tsvin_decode_failed'larıprovider_attempted ?? sourceile grupluyordu.provider_attemptedyokkensource: "landing"(UI lokasyonu) provider sanıldı, 1-provider seti synth edildi →vin_decode_fail_pattern(P1) tag'i.compress.tsformatCustomwhitelist'indeerror,source,vinyoktu — LLM gerçek hata mesajını hiç görmedi. Pattern 3 mekanik hipotezi "check provider health" diyordu, koşulsuz.prompts.ts pickPromptTagvin_decode_fail_patternvarsa direktprovider_quality'ye yönlendiriyordu, input kalitesi kontrolü yoktu.provider_qualityv3 promptFix (4 katman)
1.
tagger.tsisClientValidationReject(e):errorregex'i (TR + EN) + VIN şekli kontrolü (≠17 char veya I/O/Q içeriyor).vin_decode_client_validation_fail(P3),vin_decode_fail_patternDEĞİL.provider_attemptedZORUNLU (source fallback'i kaldırıldı).2.
compress.tsformatCustomwhitelist'ineerror,source,vineklendi → LLM artık tam hatayı görüyor.3.
prompts.ts pickPromptTagvin_decode_client_validation_fail→ux_friction(provider kuralından ÖNCE check ediliyor — spesifik sinyal kazanıyor).4.
provider_qualityv4 prompt (yeni versiyon)confidence: 0.15ile düşür ve hipotezde "Bu provider hatası değil — ux_friction kategorisi" yaz.provider_attemptedveya upstream endpoint 5xx şartı.Deploy semantics
seed-runtime.ts::upsertSeedData()worker boot'unda v3'ü deaktive edip v4'ü insert ediyor — manuel SQL gerekmiyor. Tagger + compress değişiklikleri direkt etkili (DB'ye bağımlı değil).Cleanup
Mevcut yanlış insight
cmpvfrjgc000114fzc7cdyh66'yi panel UI'dan dismiss et veyafounderSeverityOverride='P3'set et. (Bu PR'da otomatik dismiss yok — geçmiş veriyi temizleme manuel.)🤖 Generated with Claude Code
Reproducing insight cmpvfrjgc000114fzc7cdyh66 (a P1 "PL24 timeout" false positive): trial user typed VW part numbers ("500 907 521", "5Q0 907 521") into the VIN field on /; client-side regex rejected them with "Geçersiz şase numarası. 17 karakter olmalı". No provider was called. The pipeline still tagged the session as `vin_decode_fail_pattern`, routed to `provider_quality`, and the LLM dutifully invented a PL24 outage. Root cause spans three files: 1. tagger.ts grouped vin_decode_failed by `provider_attempted ?? source`. When `provider_attempted` is missing, `source: "landing"` (a UI location) was treated as a provider name, so a 1-provider set was synthesized and `vin_decode_fail_pattern` (P1) was emitted. 2. compress.ts formatCustom whitelist excluded `error`, `source`, `vin`. The LLM therefore never saw "Geçersiz şase numarası" or the offending input. Pattern 3 mechanical hypothesis told it "check provider health" regardless. 3. prompts.ts pickPromptTag routed any `vin_decode_fail_pattern` straight to `provider_quality` with no input-quality check, and the v3 system prompt had no guardrail for client-side validation rejects. Fix: - tagger: detect client-side rejects by `error` regex (Turkish + English) and by VIN shape (length != 17 or contains I/O/Q). When all fails are client rejects, emit new tag `vin_decode_client_validation_fail` at P3 instead of `vin_decode_fail_pattern` at P1. Real provider failures now require `provider_attempted` to be set (no more `source` fallback). - compress: add `error`, `source`, `vin` to the formatCustom property whitelist so the LLM can see the actual failure context. Split Pattern 3 into client-reject vs. real-provider-failure branches with distinct Turkish hypotheses. - prompts: route `vin_decode_client_validation_fail` to `ux_friction` before the provider rule. Ship provider_quality v4 with an explicit guardrail instructing the model to return confidence ≤0.15 and reclassify when the inlined event properties show client-side rejection. The seed-runtime upsert path deactivates the active v3 template on next worker boot and inserts v4 in its place — no manual SQL needed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.