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:
1 parent
2a4dc868d9
commit
9795f98006
27 files changed
+2212
-31
No files matched your search
@@ -9,7 +9,7 @@ import {
|
||||
|
||||
/**
|
||||
* Secrets the server must read back (TOTP secrets, webhook signing secrets,
|
||||
* backup files) are encrypted with a key of their own per purpose, never
|
||||
* voice notes, backup files) are encrypted with a key of their own per purpose, never
|
||||
* with a JWT secret. Each purpose has a key ring: the current key from
|
||||
* `<VARIABLE>` seals, the previous one from `<VARIABLE>_PREVIOUS` still
|
||||
* opens, so a key can be rotated without losing data. A sealed value names
|
||||
@@ -33,13 +33,14 @@ export const ENCRYPTION_KEY_VARIABLES = {
|
||||
mfa: 'MFA_ENCRYPTION_KEY',
|
||||
webhook: 'WEBHOOK_ENCRYPTION_KEY',
|
||||
backup: 'BACKUP_ENCRYPTION_KEY',
|
||||
voice: 'VOICE_ENCRYPTION_KEY',
|
||||
} as const;
|
||||
|
||||
export type EncryptionKeyVariable =
|
||||
(typeof ENCRYPTION_KEY_VARIABLES)[keyof typeof ENCRYPTION_KEY_VARIABLES];
|
||||
|
||||
/** Purposes sealed in the `k…:` string format; backups have their own envelope (backup-crypto.ts). */
|
||||
export type SecretPurpose = 'mfa' | 'webhook';
|
||||
export type SecretPurpose = 'mfa' | 'webhook' | 'voice';
|
||||
|
||||
export interface RingKey {
|
||||
id: string;
|
||||
|
||||
Reference in new issue
Block a user