feat: Schlüssel und gemeinsamer Kern für Sprachnotizen (T7 L2 Tasks 5+6)

Task 5: Schlüsselbund-Zweck voice (VOICE_ENCRYPTION_KEY), AES-256-GCM-
Hilfen für Text und Bytes mit AAD capture:<id>:<art>, voice-config
(Modell, Tageslimit, Aufnahme, Whisper-Grösse) und anthropic-config
(nie geloggt, nur worker/all), Startprüfung verlangt den Schlüssel in
Produktion in jeder Rolle, rekey versiegelt offene Sprachnotizen neu
(Audio einzeln gelesen, CAS mit Status), Secret-Vorlagen und
ensure-secrets.sh ergänzt.

Task 6: Text-Normalisierung und Bereinigung (Steuer- und Formatzeichen,
Codepoint-Kürzung), Zitatprüfung mit Dezimalzahlen als ein Wort
(Ruling 7), Felderliste passend zu CreateInspectionDto, versiegeltes
Transkript mit Grenzen, Fachwörter und Skalen mit Paritätstests.

Rollout: Ein Image mit diesem Stand startet in Produktion nur mit
VOICE_ENCRYPTION_KEY in apicore-backend-secret (ARCHITECTURE Annahme 22).

Gates: Backend tsc, eslint, 922 Unit-Tests, e2e 100 Suites / 1004 Tests.

Refs #27 #28

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-16 09:41:47 +02:00
1 parent 2a4dc868d9
commit 9795f98006
27 files changed
+2212 -31

No files matched your search

+10 -2
View File
@@ -6,10 +6,13 @@
# bash deploy/k8s/scripts/ensure-secrets.sh --dry-run # nur anzeigen
#
# Werte:
# - MFA_/WEBHOOK_/BACKUP_ENCRYPTION_KEY: zufaellig (48 Byte, base64url). Die
# - MFA_/WEBHOOK_/BACKUP_/VOICE_ENCRYPTION_KEY: zufaellig (48 Byte, base64url). Die
# App verlangt mindestens 32 Zeichen; "dummy" wuerde den Start abbrechen.
# Diese Schluessel nie wieder aendern ohne *_PREVIOUS (sonst sind MFA-
# Geheimnisse, Webhook-Secrets und Backups nicht mehr lesbar). Sichern!
# Geheimnisse, Webhook-Secrets, Backups und offene Sprachnotizen nicht mehr
# lesbar). Sichern!
# VOICE_ENCRYPTION_KEY muss vor dem Rollout des T7-Backend-Images existieren:
# die App verlangt ihn in Produktion in jeder Rolle und startet sonst nicht.
# - OPEN_METEO_API_KEY: leer = freie Open-Meteo-API (ein Fantasiewert wuerde
# die kostenpflichtige API mit falschem Schluessel ansprechen).
# - TELEGRAM_BOT_TOKEN (Secret apicore-telegram, nur Worker): "dummy". Die App
@@ -83,9 +86,14 @@ ensure_keys apicore-backend-secret \
MFA_ENCRYPTION_KEY random \
WEBHOOK_ENCRYPTION_KEY random \
BACKUP_ENCRYPTION_KEY random \
VOICE_ENCRYPTION_KEY random \
OPEN_METEO_API_KEY empty
ensure_keys apicore-telegram \
TELEGRAM_BOT_TOKEN dummy
# apicore-anthropic (ANTHROPIC_API_KEY, nur Worker, optional) legt der Inhaber
# selbst an; dieses Skript erzeugt es nicht. Ohne Schluessel bleibt die
# Auswertung der Sprachnotizen aus (EXTRACT_DISABLED), alles andere laeuft.
echo "Fertig. Laufende Pods lesen neue Werte erst nach einem Neustart."