M0: arc42-Konzeptdokument, Gherkin-Anforderungen und OpenAPI-Vertrag

- doc/architecture.md: arc42-Detaildokument mit Mermaid-Diagrammen
  (Bausteinsicht, Klassendiagramm, Statusmodell, 5 Sequenzdiagramme),
  Speicherkonzept, DEC-01..19-Entscheidungen mit Trade-offs
- doc/requirements/: 7 Features als Gherkin-Szenarien (TDD-Grundlage)
  mit Traceability-Tabellen Szenario <-> Stdlib-Testname
- doc/openapi.yaml: API-Vertrag fuer alle 9 Endpunkte (Quelle der Wahrheit)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Christoph Kroczek
2026-07-13 15:20:48 +02:00
parent f52e4f62b0
commit 6e6cb0dc8d
10 changed files with 1291 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
# 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` |