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
52 lines
2.8 KiB
Markdown
52 lines
2.8 KiB
Markdown
# 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.
|