# Feature: Optionale LLM-Anreicherung Als Nutzer möchte ich, dass Dokumente semantisch angereichert werden (Titel, Zusammenfassung, Tags, Dokumentdatum, Sprache), ohne dass ein nicht erreichbares LLM die Verarbeitung blockiert. ```gherkin Funktionalität: Optionale LLM-Anreicherung Szenario: Erfolgreiche Anreicherung Angenommen ein Dokument mit extrahiertem Text und ein erreichbares LLM Wenn die Enrich-Stage läuft Dann wird ein Event "DocumentEnriched" mit title, summary, tags, doc_date und language aufgezeichnet Und das verwendete Modell und die Prompt-Version sind im Event dokumentiert Szenario: LLM nicht erreichbar führt zu Wiederholung mit Backoff Angenommen das LLM ist nicht erreichbar Wenn die Enrich-Stage fehlschlägt Dann wird ein Event "ProcessingFailed" mit retryable=true aufgezeichnet Und der nächste Versuch wird mit exponentiellem Backoff eingeplant Szenario: Nach erschöpften Versuchen läuft die Pipeline weiter Angenommen das LLM bleibt über die maximale Versuchszahl hinaus nicht erreichbar Wenn der letzte Versuch fehlschlägt Dann wird ein Event "EnrichmentSkipped" aufgezeichnet Und das Dokument wird trotzdem indexiert und abgelegt Szenario: Unbrauchbare LLM-Antwort ist wiederholbar Angenommen das LLM liefert kein valides JSON Wenn die Enrich-Stage die Antwort nicht parsen kann Dann wird der Fehler als retryable behandelt Szenario: Übersprungene Anreicherung ist nachholbar Angenommen ein abgelegtes Dokument mit "EnrichmentSkipped" Wenn POST /v1/documents/{id}/reprocess mit from_stage "enrich" aufgerufen wird Dann wird nur die Anreicherung erneut ausgeführt Und bereits abgeschlossene Schritte laufen nicht erneut ``` ## Traceability | Szenario | Go-Test (Pakete `internal/llm`, `internal/pipeline`) | |---|---| | Erfolgreiche Anreicherung | `TestEnrichStage_SuccessEmitsDocumentEnriched` | | LLM nicht erreichbar führt zu Wiederholung mit Backoff | `TestEnrichStage_UnreachableLLMIsRetryableWithBackoff` | | Nach erschöpften Versuchen läuft die Pipeline weiter | `TestPipeline_EnrichExhaustedSkipsAndContinues` | | Unbrauchbare LLM-Antwort ist wiederholbar | `TestEnricher_MalformedJSONIsRetryable` | | Übersprungene Anreicherung ist nachholbar | `TestReprocess_FromEnrichOnlyRunsEnrich` |