fix: localize the primary data-quality evidence summary (live-caught on Unraid)

Live validation on the deployed fix branch caught a real bug: every data-quality
issue's top-of-page "Evidence summary" line rendered the raw, always-English legacy
evidence.summary string unconditionally -- in all three languages -- even though the
backend has been emitting structured, localizable evidence.signals for a while
(app/services/data_quality.py already documented this exact intent). The frontend
side of that conversion was never finished.

- DataQualityIssueDetail.tsx now renders evidence.signals through the operator's
  locale as the primary summary; the raw evidence.summary string is only visible
  inside "Technical details" (via the existing EvidenceDisclosure JSON dump).
- The four DQ-DEMO-* seed rows that anchor the guided demo's scripted scenarios now
  carry real, accurate signals computed at seed time (duplicate-customer's similarity
  score is the actual SequenceMatcher ratio on the seeded names, not invented) instead
  of only a legacy English sentence.
- Rows with no structured signals (generic filler seed data) fall back to the raw
  text rather than showing a blank summary; the one known placeholder string gets its
  own localized rendering so it never displays as English filler either.
- New regression test: the vehicle_status_conflict evidence summary must show
  localized text and must never contain the specific raw English sentence that was
  live-visible before this fix, in all 3 languages.

151 backend tests, Ruff, mypy green; full local Playwright suite green (a couple of
sequential-run-only flakes, both confirmed to pass in isolation and unrelated to this
change).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
NuklearRabbit
2026-08-04 00:44:06 +02:00
co-authored by Claude Sonnet 5
parent cda2c32bd0
commit 2e4fb43f09
7 changed files with 188 additions and 14 deletions
@@ -101,6 +101,17 @@
"whyItMatters": "Een foutieve status kan een niet-beschikbaar voertuig boekbaar laten lijken, of een beschikbaar voertuig verbergen voor het wagenpark."
}
},
"evidence": {
"duplicate.exact_email": "Identiek e-mailadres",
"duplicate.exact_phone": "Identiek telefoonnummer",
"duplicate.same_postal_code": "Dezelfde postcode",
"duplicateSimilarName": "Sterk gelijkende naam (score {{score}})",
"missingField": "Ontbrekend veld: {{field}}",
"overlapReservedBookings": "Overlappende reserveringen: {{refs}}",
"odometerRegression": "Boeking {{laterRef}} registreerde {{laterKm}} km, lager dan de {{earlierKm}} km van eerdere boeking {{earlierRef}}.",
"upcomingBookingMissingInspection": "Boeking {{bookingRef}} start binnenkort maar de vereiste operationele inspectie ontbreekt nog.",
"seedPlaceholder": "Synthetisch demogegeven zonder verder detail."
},
"duplicateCustomer": {
"heading": "Vergelijken en samenvoegen",
"description": "Kies de klant die behouden blijft en bekijk elk afwijkend veld.",