IMP-03: e-mail-regeln-zuordnung-tags-klassifizierung

Regelwerk für automatische Zuordnung, Verschlagwortung und
Klassifizierung importierter E-Mails nach Absender, Betreff, Postfach
und Anhangstyp.

- store.go: Postgres-Store für Regeln (Absender-/Betreff-/Postfach-/
  Anhangstyp-Muster als reguläre Ausdrücke, Category einwertig, Tag
  mehrwertig, Priority — niedrigere Zahl = höhere Priorität).
- engine.go: Engine.Evaluate wertet Regeln in Prioritätsreihenfolge aus,
  "first match wins" für Category, alle zutreffenden Regeln tragen zu
  Tags bei. Muster werden beim Erzeugen der Engine einmal kompiliert.
- Bewusst keine Funktion zum rückwirkenden Neuklassifizieren bestehender
  Nachrichten — nur explizite RunOnce-artige Neuauswertung wirkt.

Prüfungen (alle real durchgeführt, siehe mail/docs/IMP-03-PRUEFPROTOKOLL.md):
1. TestEvaluate_ConflictingRulesRespectDocumentedPriority: höherpriorisierte
   Regel gewinnt real bei widersprüchlichen Kategorien.
2. TestNewEngine_NewRuleDoesNotAffectAlreadyCapturedResult: bereits
   erfasstes Ergebnis bleibt real unverändert nach neuer Regel.
3. TestEvaluate_TwentyPlusRulesStayPerformant: 31 Regeln, 2,64µs/Auswertung.

Kein Umbau: kein bestehendes Paket angefasst.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
sysops
2026-09-01 00:02:56 +02:00
co-authored by Claude Sonnet 5
parent 7238568918
commit 089d7e6d96
5 changed files with 504 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
# 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.