L10b Betrieb & Aufräumen: Lotse-Betrieb – Aufbewahrung KI-Protokoll und Token-Kontingent

Aufräumpunkt k (Spec §31):
- Aufbewahrung: services/lotse/retention.ts leert input/output und createdById von
  AiGeneration-Einträgen älter als AI_GENERATION_RETENTION_DAYS (Default 180), Metadaten bleiben,
  Audit je Mandant. Queue/Processor ai-retention, täglicher BullMQ-Job-Scheduler beim Start des
  craftvia-worker.
- Kontingent: services/lotse/budget.ts (Tokens ein+aus je Kalendermonat, TenantSettings-Wert vor
  Env AI_MONTHLY_TOKEN_LIMIT, 0 = unbegrenzt). Lotse-Entwurf und Sprachnotiz-Zusammenfassung
  → blocked budget_exceeded mit Klartext; Import-Extraktion fällt auf manuelle Erfassung zurück
  (Hinweis ai_budget_exceeded). /settings/lotse: Kontingent setzen, Verbrauch anzeigen.
- scripts/test-betrieb-audit.ts: Audit nach Commit/Rollback/verschachtelt, Merge atomar und in
  äußerer Transaktion, Audit „read", Aufbewahrung (Frist, Metadaten, Idempotenz, Mandant B),
  Kontingent (Mandant/Env/Vormonat/unbegrenzt, Rollen, Audit).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 18:19:19 +02:00
co-authored by Claude Opus 5
parent 8aedc642ca
commit b0aedb5d23
19 changed files with 437 additions and 15 deletions
+7 -1
View File
@@ -76,7 +76,8 @@
"no_transcript": "Die Sprachnotiz hat noch keinen Text.",
"pending": "Die Transkription läuft noch.",
"conflict": "Inzwischen geändert. Bitte Seite neu laden.",
"invalid": "Bitte Eingaben prüfen."
"invalid": "Bitte Eingaben prüfen.",
"budget_exceeded": "Das monatliche KI-Kontingent des Betriebs ist aufgebraucht. Bitte den Bericht selbst schreiben oder das Büro fragen."
},
"settings": {
"back": "Einstellungen",
@@ -96,6 +97,11 @@
"du": "du"
},
"save": "Speichern",
"budget": "Monatliches KI-Kontingent (Tokens)",
"budgetHint": "Leer = Vorgabe der Plattform ({platform}). 0 = unbegrenzt. Ist das Kontingent aufgebraucht, bereitet der Lotse bis Monatsende nichts mehr vor.",
"budgetUnlimited": "unbegrenzt",
"budgetUsage": "Verbraucht seit {since}: {used} von {limit}",
"budgetExceeded": "Kontingent aufgebraucht",
"dataTitle": "Welche Daten an wen gehen",
"draftProvider": "Berichtsentwurf und Zusammenfassung",
"transcriptionProvider": "Transkription von Sprachnotizen",