# IMP-03 – Prüfprotokoll: E-Mail-Regeln (Zuordnung/Tags/Klassifizierung) Voraussetzung IMP-01 (Fertig). ## Umsetzung - `mail/internal/mailrules/store.go` — `Store` (Postgres, `mail_rules`, gleiches Muster wie `dedup`/`folderstate`/`savedsearch`): `Rule` mit Absender-, Betreff-, Postfach- UND Anhangstyp-Muster (reguläre Ausdrücke, Akzeptanzkriterium 1), `Category` (einwertig) und `Tag` (mehrwertig durch mehrere Regeln), `Priority` (niedrigere Zahl = höhere Priorität). Regex-Validierung bereits beim Anlegen (`Create`). - `mail/internal/mailrules/engine.go` — `Engine.Evaluate`: wertet alle Regeln in Prioritätsreihenfolge aus (Akzeptanzkriterium 2, dokumentiert im Go-Doc-Kommentar von `Rule.Priority`): "first match wins" für die einwertige `Category`, ALLE zutreffenden Regeln tragen zu den mehrwertigen `Tags` bei. Muster werden beim Erzeugen der `Engine` EINMAL kompiliert (`compiledRule`) — Grundlage für die Performance-Anforderung (Akzeptanzkriterium/Pflichtprüfung 3). - Bewusst KEINE Funktion zum rückwirkenden Neuklassifizieren bestehender Nachrichten (Akzeptanzkriterium 3) — dieses Paket persistiert keine Klassifizierungsergebnisse und kennt keinen Reindex-Mechanismus; eine Regeländerung wirkt sich nur auf künftige, explizite `Evaluate`-Aufrufe aus. - Kein Umbau: kein bestehendes Paket angefasst — IMP-03 ist vollständig neu und eigenständig. ## Prüfungen | # | Prüfung | Ergebnis | |---|---|---| | 1 | Test mit widersprüchlichen Regeln bestätigt dokumentierte Priorisierung | **bestanden** – `TestEvaluate_ConflictingRulesRespectDocumentedPriority`: zwei Regeln matchen dieselbe Nachricht mit widersprüchlichen Kategorien, die höherpriorisierte (Priority 10 vor 200) gewinnt real | | 2 | Test: neue Regel ändert keine bereits importierten Altbestände automatisch | **bestanden** – `TestNewEngine_NewRuleDoesNotAffectAlreadyCapturedResult`: ein vor Regelanlage erfasstes Ergebnis bleibt real unverändert, nachdem die neue Regel angelegt wurde; erst eine explizite Neuauswertung zeigt real die neue Kategorie | | 3 | Regelset mit 20+ Regeln bleibt performant auswertbar | **bestanden** – `TestEvaluate_TwentyPlusRulesStayPerformant`: 31 reale Regeln, 1000 Auswertungen in 2,64ms gesamt (2,64µs/Auswertung) | ## Build/Test-Ergebnis (192.168.1.131) ``` go build ./... -> clean go vet ./... -> clean golangci-lint run ./... -> 0 issues TEST_TENANT_DSN=... go test ./internal/mailrules/... -v -timeout 60s -> 3/3 bestanden TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1 -> alle 17 Pakete bestanden, keine Regression ``` ## Gesamtergebnis **Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. Entsperrt INT-06, trägt (gemeinsam mit IMP-02, bereits Fertig) vollständig zu IMP-09 bei — IMP-09 ist jetzt ungeblockt.