Files
nexarch/mail/docs/IMP-03-PRUEFPROTOKOLL.md
T
sysopsandClaude Sonnet 5 089d7e6d96 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
2026-09-01 00:02:56 +02:00

2.8 KiB
Raw Blame History

IMP-03 Prüfprotokoll: E-Mail-Regeln (Zuordnung/Tags/Klassifizierung)

Voraussetzung IMP-01 (Fertig).

Umsetzung

  • mail/internal/mailrules/store.goStore (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.goEngine.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.