feat(255): Tracking-Number Hard-Override + Verb-Heuristik für Sendung #256

Merged
admin-mrrm merged 1 commit from feat/255-tracking-override into main 2026-05-14 15:38:35 +02:00
Owner

Summary

Adressiert #255. Zwei deterministische Hebel gegen die Bestellung↔Sendung-Verwechslung aus #251-Kalibrierung:

  1. Tracking-Number Hard-Override: Carrier-Patterns (UPS/Hermes/DHL/DPD) nach packages/shared-types/src/tracking-patterns.ts extrahiert. Wenn detectTrackingNumber(mailSnippet) trifft → ['Sendung'], NLI/Llama gar nicht erst aufrufen. False-Positive-Risiko praktisch null durch scharfe Patterns.
  2. Verb-Tempus-Heuristik: Wenn NLI top=Bestellung UND Snippet matched versandt|verschickt|unterwegs|erreicht|wird geliefert|ausgeliefert → flip zu Sendung. Narrow scope: nur Bestellung→Sendung-Switch.

Beide respektieren die rejection-store: wenn User "Sendung" geblockt hat, greifen weder Override noch Heuristik.

API TrackingParserService konsumiert jetzt detectTrackingNumber aus shared-types — bestehende 12 Service-Tests bleiben unverändert grün.

Test plan

  • Mobile: pnpm vitest run src/services/model-manager.spec.ts — 22/22 (10 neu)
  • API: pnpm test — 202/202 grün (12 bestehende tracking-parser-Tests unverändert)
  • Typecheck mobile + api grün
  • Smoke nach Bundle-Refresh: Mail mit DHL-Sendungsnummer im Body → wird als Sendung getaggt ohne NLI-Log-Eintrag

Closes #255.

## Summary Adressiert #255. Zwei deterministische Hebel gegen die Bestellung↔Sendung-Verwechslung aus #251-Kalibrierung: 1. **Tracking-Number Hard-Override:** Carrier-Patterns (UPS/Hermes/DHL/DPD) nach `packages/shared-types/src/tracking-patterns.ts` extrahiert. Wenn `detectTrackingNumber(mailSnippet)` trifft → `['Sendung']`, NLI/Llama gar nicht erst aufrufen. False-Positive-Risiko praktisch null durch scharfe Patterns. 2. **Verb-Tempus-Heuristik:** Wenn NLI top=Bestellung UND Snippet matched `versandt|verschickt|unterwegs|erreicht|wird geliefert|ausgeliefert` → flip zu Sendung. Narrow scope: nur Bestellung→Sendung-Switch. Beide respektieren die `rejection-store`: wenn User "Sendung" geblockt hat, greifen weder Override noch Heuristik. API `TrackingParserService` konsumiert jetzt `detectTrackingNumber` aus shared-types — bestehende 12 Service-Tests bleiben unverändert grün. ## Test plan - [x] Mobile: `pnpm vitest run src/services/model-manager.spec.ts` — 22/22 (10 neu) - [x] API: `pnpm test` — 202/202 grün (12 bestehende tracking-parser-Tests unverändert) - [x] Typecheck mobile + api grün - [ ] Smoke nach Bundle-Refresh: Mail mit DHL-Sendungsnummer im Body → wird als Sendung getaggt ohne NLI-Log-Eintrag Closes #255.
feat(255): Tracking-Number Hard-Override + Verb-Heuristik für Sendung-Erkennung
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
6141fabc5d
NLI verwechselte Bestellung↔Sendung zuverlässig falsch (#251-Kalibrierung):
"Ihre Bestellung wurde versandt!" → NLI top=Bestellung, obwohl Sendung
korrekt wäre. Zwei deterministische Hebel:

1. Hard-Override: Tracking-Patterns (UPS/Hermes/DHL/DPD) nach
   packages/shared-types verschoben. Wenn parseTrackingNumber im
   mailSnippet trifft, return ['Sendung'] — NLI/Llama werden gar nicht
   erst aufgerufen. Patterns sind so scharf, dass FP praktisch null.
2. Verb-Tempus-Heuristik: wenn NLI top=Bestellung UND Snippet enthält
   versandt|verschickt|unterwegs|erreicht|wird geliefert|ausgeliefert
   → flip zu Sendung. Narrow scope (nur Bestellung→Sendung-Switch),
   damit andere Labels unangetastet bleiben.

Beide respektieren die rejection-store: wenn User "Sendung" geblockt
hat, wird weder Override noch Heuristik aktiv.

API tracking-parser.service konsumiert jetzt detectTrackingNumber aus
shared-types; bestehende Service-Tests (12) bleiben unverändert grün.

Mobile: 22/22 grün (10 neue Tests), API: 202/202 grün.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!256
No description provided.