Zum Inhalt springen

Zustandsmaschine

Lebenszyklus einer Email: Zustände und Übergänge

Die Aktionsmatrix entscheidet, was mit einer Email passieren soll. Aber wann genau befindet sich eine Email in welchem Zustand? Und welche Übergänge sind erlaubt?

Das email2rag-System definiert eine Zustandsmaschine (en: State Machine) mit möglichen Zuständen. Jede Email durchläuft eine Teilmenge davon, je nachdem welchen Weg sie durch die Pipeline nimmt.

fetchedabgeholt
parsedStruktur zerlegt
classifiedKategorie bestimmt
indexedVektoren gespeichert
awaiting_reviewEntwurf wartet
approvedfreigegeben
sentversendet
archivedabgelegt
rejectedabgelehnt
failedFehler
partially_indexedQdrant-Fehler

Relevanz: "Kern" sind die Zustände, die jede Email durchläuft. "Betrieb" sind Zustände, die nur bei Fehlern oder Teilausfällen auftreten.

ZustandBedeutungWer setzt ihnNächster SchrittRelevanz
fetchedVom Mailserver abgeholtIMAP-PollerMIME-ParsingKern
parsedStruktur zerlegt (Header, Body, Anhänge)ParseStepLLM-KlassifikationKern
classifiedKategorie und Konfidenz bestimmtClassifyStepIndexierungKern
indexedVektoren und Chunks gespeichertChunkStepEntwurf oder ArchivierungKern
draft_readyEntwurf generiert, bereit für Operator-ReviewDraftStepReview (awaiting_review)Kern
awaiting_reviewEntwurf liegt zur menschlichen Prüfung bereitDraftStepFreigabe oder AblehnungKern
approvedMensch hat den Entwurf freigegebenOperator (Dashboard)VersandKern
sentAntwort wurde versendetSMTP-WorkerArchivierungKern
rejectedEntwurf wurde abgelehntOperator (Dashboard)Neuer Entwurf oder ArchivierungKern
archivedVerarbeitung abgeschlossen, abgelegt. Wer den Übergang auslöst, hängt von der Archivierungs-Regel der Kategorie ab: entweder bestätigt der Operator manuell, oder ein Hintergrundlauf archiviert automatisch nach Ablauf der hinterlegten AufbewahrungsfristOperator oder Retention-CronKeine (Endzustand bis Retention-/DSGVO-Löschung)Kern
failedVerarbeitung fehlgeschlagenPipelineErrorHandlerRetry oder Dead LetterBetrieb
partially_indexedKern verarbeitet, aber Qdrant/ArangoDB fehltPipelineErrorHandlerAutomatisches NachindexierenBetrieb
deletedEndzustand nach Admin- oder Retention-/DSGVO-Löschung. Benutzer-initiiertes Löschen ist systemweit verboten (siehe Zielsystem und Sicherheit-DSGVO)Admin (CLI/UI) oder Retention-CronKeine (Endzustand, MariaDB-Zeile entfernt nach Speicher-Pfad aus E3-Normregister)Betrieb

Der Hauptweg

Die meisten Emails durchlaufen den Hauptweg: fetched → parsed → classified → indexed → awaiting_review → approved → sent. Das ist der vollständige Pfad von der Ankunft bis zur versendeten Antwort.

Im Testsystem befinden sich Emails in verschiedenen Zuständen: einige warten auf Freigabe (awaiting_review), andere sind archiviert oder bereits freigegeben. Die Verteilung ändert sich mit jeder verarbeiteten Email.

Abzweigungen und Sonderwege

Nicht jede Email geht den ganzen Weg. Es gibt Abzweigungen:

  • Archivierung: Spam, Newsletter und Information gehen nach der Klassifikation direkt in den Zustand archived, ohne Entwurf.
  • Ablehnung: Ein Mensch kann einen Entwurf ablehnen (rejected). Die Email bleibt gespeichert, bekommt aber keinen neuen Entwurf.
  • Teilweise indexiert: Wenn die Vektorspeicherung in Qdrant fehlschlägt, landet die Email bei partially_indexed statt indexed. Die Pipeline läuft trotzdem weiter. Konkretes Beispiel: MariaDB hat die Email gespeichert, die Kategorie wurde gesetzt, aber Qdrant war beim Embedding-Versuch nicht erreichbar. Der Zustand partially_indexed hält den Teilfortschritt fest, damit ein späterer Indexer-Lauf nur die fehlenden Schritte nachzieht.
  • Fehlgeschlagen: Bei schwerwiegenden Fehlern (LLM-Timeout, Parsing-Fehler) wird der Status auf failed gesetzt.

Die unsichtbare Grenze: Wann SEEN gesetzt wird

Ein kritisches Detail ist die Commit-Grenze (en: Commit Boundary) zum Mailserver. Die Email wird auf dem IMAP-Server erst als gelesen markiert, nachdem sowohl die Roh-Nachricht gespeichert als auch die MIME-Struktur geparst wurde. Bricht das System vorher ab, bleibt die Email auf dem Server als ungelesen und wird beim nächsten Polling erneut abgeholt.

Diese Grenze ist die zentrale Sicherung dafür, dass keine Email verloren geht. Alles davor ist reversibel, alles danach ist in der Datenbank gesichert.