rebreak-monorepo/docs/specs/diga/03-requirements-v0.md
chahinebrini 21c1e31877 docs(diga): Nacht-Session — Eval-Records, Akte 10/11, Magic-Scope-Entscheidung
- Lyra-Eval Live-Runs (2x): Crisis-Recall-Gate auf Produktionsmodell
  (Groq llama-3.3-70b) BESTANDEN (6/6=100%); gpt-4o-mini-Fallback 83%
  -> Modellwahl sicherheitsrelevant -> Model-Pinning vorgeschlagen.
  Records unter docs/specs/diga/eval-records/.
- 05d: Mail- + Anonymitäts-Strang (+18 Zeilen); username-GAP verifiziert
  + Fix dokumentiert. 04 (R-LYRA-01, R-DATA-07) + 05b nachgezogen.
- Dok 07 Gebrauchsanweisung, Dok 09 PMS-Plan, Dok 10 QMS-Templates (v0).
- Scope-Entscheidung Gründer 2026-06-11: RebreakMagic (inkl. Desktop)
  vorerst NICHT im zertifizierten DiGA-Scope (01/03/07 umgesetzt).
- graphify-Artefakte (Hook-Rebuild) mitgenommen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 06:36:33 +02:00

269 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Anforderungen / Requirements — Rebreak · v0 (Entwurf)
> **Dok 03 der DiGA-Technischen-Akte.** Norm-Bezug: **IEC 62304 §5.2** (Software-
> Anforderungsanalyse), MDR Anh. I (GSPR §17 — Software). Erstellt von Dr. Marlene
> Brandt (`diga-regulatory`). **Drafting** — Validierung durch Regulatory-/QM-Profi
> ausstehend.
>
> **Methodik:** Die Anforderungen sind aus dem **bestehenden, funktionsfähigen Produkt**
> abgeleitet (`apps/rebreak-native/`, `backend/`) — wir dokumentieren den Ist-Stand
> nachvollziehbar, wir erfinden keine Soll-Funktionen. Jede Anforderung hat eine
> stabile **ID** (`REQ-<Bereich>-<Nr>`) als Anker für die Traceability-Matrix.
>
> **Andockpunkte:**
> - **Dok 01 Zweckbestimmung** — jede REQ dient dem dort beschriebenen Zweck (Schutz /
> Begleitung / Motivation). Claims in §2/§3 von Dok 01 sind `[Gründer-Entscheidung]`.
> - **Dok 04 Risiko-Akte** — sicherheitsrelevante REQs sind dort als Risikomaßnahme
> gespiegelt (Spalte „Risiko-Bezug").
> - **Dok 05b Test-Verifikation (Ahmed)** — die REQ-IDs sind der Mapping-Anker, den
> Ahmed für Test-IDs in Maestro-Flows und Vitest-Describes referenzieren wird
> (`05b §3.3`). Diese Liste **schließt diese Lücke** (05b §3.2: „Dok 03 noch nicht
> erstellt").
> - **Dok 08 Datenschutz (Hans)** — datenschutz-relevante REQs verweisen auf die
> dortigen Befunde (Art.-9-Daten, Anonymität, Mail-Agent).
---
## 0. Lesehilfe
- **Typ:** `F` = funktional · `NF` = nicht-funktional (Qualität/Constraint).
- **Priorität:** `M` = Muss (Kern-/Sicherheitsfunktion) · `S` = Soll · `K` = Kann.
- **Quelle:** Datei/Endpoint, aus dem die Anforderung abgeleitet ist (Nachweis).
- **Risiko-Bezug:** verknüpfte Risiko-ID aus Dok 04 (sofern sicherheitsrelevant).
- `[Gründer-Entscheidung]` = inhaltliche Festlegung liegt beim Gründer.
- `[Profi-Validierung]` = muss von Regulatory-/QM-Profi bestätigt werden.
> **Wichtige Einordnung `[Profi-Validierung]`:** Welche dieser REQs **sicherheits-
> relevant im Sinne IEC 62304** sind (und damit die Software-Sicherheitsklasse B/C
> mitbestimmen), ist mit dem Regulatory-Profi festzulegen. Die hier mit `M` +
> Risiko-Bezug markierten REQs sind der Kandidaten-Kreis.
---
## 1. Schutz / Blocker (geräteweite Zugangserschwerung)
Kern-Wirkmechanismus 1 (Dok 01 §5.1). Quelle: `lib/protection.ts`,
`modules/rebreak-protection/`, `backend/server/api/protection/*`, `…/blocklist/*`,
`…/url-filter/*`, `…/cooldown/*`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-PROT-001 | F | M | Das System blockt den Zugriff auf bekannte Glücksspiel-Domains (globale Blocklist, Größenordnung ~208330k Domains, inkl. nicht-lizenzierter Offshore-Seiten); die Blockierung erfolgt per DNS-NXDOMAIN-Antwort (kein Sinkhole / keine Block-Page — siehe Hinweis unter Tabelle). | `blocklist/download.get.ts`, `url-filter/blocklist.bin.get.ts` | R-FALSE-01, R-DATA-09 |
| REQ-PROT-002 | F | M | iOS: Schutz Schicht 1 ist ein geräteweiter URL-Filter (NEFilter via System-/MDM-Profil oder PacketTunnel-VPN); er bleibt aktiv, auch wenn die App geschlossen/aus dem App-Switcher entfernt ist. | `protection.ts: isNeFilterActive/activateUrlFilter` | R-FALSE-01 |
| REQ-PROT-003 | F | M | Android: Schutz arbeitet über lokales DNS-VPN (Schicht 1, Filterung ohne externen Traffic) + Accessibility-Service als Tamper-Lock (Schicht 2). | `protection.ts: activate/activateFamilyControls` | R-FALSE-01, R-BYP-01 |
| REQ-PROT-004 | F | S | iOS Schicht 2 (Auffangnetz): kuratierte länderabhängige Top-Gambling-Liste (≤50 Domains, ManagedSettings/webContent), greift falls Schicht 1 nicht aktiv ist. | `protection.ts: applyWebContentFilter`, `protection/webcontent-domains.get.ts` | R-FALSE-01 |
| REQ-PROT-005 | F | S | Die Liste der Schicht 2 wechselt automatisch beim Wechsel in ein anderes Land (Erkennung über Mobilfunk-Netz/MCC). | `protection.ts: syncWebContentDomains` | R-FALSE-02 |
| REQ-PROT-006 | F | M | Deaktivierung des Schutzes ist nicht unmittelbar möglich: Sie löst einen serverseitig verankerten **Cooldown** aus (24 h iOS-Magic / 6 h Android), während dessen der Schutz aktiv bleibt. | `cooldown/request.post.ts`, `protection.ts: requestDeactivation` | R-BYP-01 |
| REQ-PROT-007 | NF | M | Der Cooldown ist **server-time-authoritativ** (JWT-Claim `cooldown_ends_at`), um Manipulation der lokalen Geräteuhr zu verhindern. | `protection.ts` (Header-Kommentar), `cooldown/status.get.ts` | R-BYP-02 |
| REQ-PROT-008 | F | M | Nach abgelaufenem Cooldown **muss** ein legitimer Schutz-Ausstieg funktionieren (Android: Device-Admin + Tamper-Lock werden vor `disable()` entfernt, damit Deinstallation/Abschaltung möglich ist). | `protection.ts: forceDisable` | R-BYP-03 |
| REQ-PROT-009 | F | S | Self-Healing: Wird der Filter (VPN/NEFilter) durch OS-Kill/Reinstall/User-Aktion inaktiv, reaktiviert das System ihn bei App-Start/Foreground (`reconcileVpn`), sofern er aktiv sein soll. | `protection.ts: reconcileVpn` | R-FALSE-03 |
| REQ-PROT-010 | F | S | Bypass-Erkennung: Sagt das Backend `protectionShouldBeActive=true`, läuft aber weder VPN noch NEFilter und ist das Gerät nicht MDM-managed, signalisiert das System die Phase `recoveringFromBypass`. | `protection.ts: getCombinedState` | R-FALSE-03, R-BYP-01 |
| REQ-PROT-011 | F | K | Pro/Legend-Nutzer können eigene Trigger-Domains zum persönlichen Schutz (Schicht 1) hinzufügen (Pro 10 / Legend 20 Slots, rückfüllbar, gemeinsamer Pool Web+Mail). | `custom-domains/*`, `05b §2.2` | R-FALSE-04 |
| REQ-PROT-012 | F | M | Eine einmal hinzugefügte Custom-Domain kann der Nutzer **nicht selbst entfernen** (Anti-Impuls-Halt); nur das Rebreak-Team kann sie entfernen. | `custom-domains/[id].delete.ts` (admin-gated), COACH_SYSTEM_PROMPT | R-BYP-04 |
| REQ-PROT-013 | NF | M | Die Blocklist-Synchronisation auf das Gerät muss erfolgen; der Nutzer wird darüber informiert, dass frisch hinzugefügte Domains erst nach Foreground-Pull/DNS-Cache-Ablauf greifen (kein sofortiger Schutz). | `useBlocklistSync.ts`, MEMORY: blocklist.bin Sync-Lag | R-FALSE-05 |
> `[Gründer-Entscheidung]` REQ-PROT-006: Die konkreten Cooldown-Dauern (24 h / 6 h) sind
> eine therapeutisch begründete Produktfestlegung — in der klinischen Bewertung (Dok 06)
> mit der Uni Bremen zu plausibilisieren.
>
> **Design-Entscheidung Block-Mechanismus (Stand 2026-06-10):** Geblockte Domains werden
> per **DNS-NXDOMAIN** abgewiesen — **bewusst kein Sinkhole / keine branded Block-Page /
> kein Redirect auf eine Hinweisseite**. Begründung: (a) eine Block-Page über HTTPS scheitert
> an der TLS-Zertifikats-Wall (Browser-Fehler statt sauberer Hinweis), (b) ein Sinkhole/
> Redirect erzeugt eine zentral beobachtbare Liste „dieser Nutzer wollte auf Casino X" →
> Fingerprinting-/Privacy-Risiko bei Art-9-Betroffenen. NXDOMAIN ist damit auch eine
> **Risiko-Mitigation** (Stigma-/Detection-Schutz) — als solche in Dok 04 (R-DATA-09)
> gespiegelt. `[Gründer-Entscheidung]` bestätigt.
---
## 2. Selbstbindung (RebreakMagic / Lock-Modus)
Kern-Wirkmechanismus 1, stärkste Stufe (Dok 01 §5.1). Quelle: `backend/MAGIC_API.md`,
`backend/server/api/magic/*`, COACH_SYSTEM_PROMPT.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-MAGIC-001 | F | S | Nutzer können mehrere Geräte (iPhone/iPad/Mac, Windows) per RebreakMagic in einen Lock-Modus versetzen, in dem der Schutz nicht mehr einfach in den OS-Einstellungen abschaltbar ist. | `magic/register.post.ts`, `MAGIC_API.md` | R-BYP-01 |
| REQ-MAGIC-002 | F | M | Das Lösen des Lock-Modus erfordert einen **24-Stunden-Cooldown** (`request-release``releaseAvailableAt = +24h`), währenddessen der Schutz aktiv bleibt; der Cooldown ist jederzeit abbrechbar. | `magic/devices/[deviceId]/request-release.post.ts` | R-BYP-01 |
| REQ-MAGIC-003 | NF | M | RebreakMagic-Setup setzt einen authentifizierten Rebreak-Account voraus (JWT); kein anonymer Lock. | `magic/register.post.ts` (Bearer-Auth) | — |
| REQ-MAGIC-004 | NF | S | Selbstbindung darf den legitimen, dokumentierten Ausstiegsweg nicht dauerhaft verschließen (24 h Cooldown ist der vorgesehene Pfad — siehe Warnhinweis Dok 07). | `MAGIC_API.md: processMagicReleases` | R-BYP-03 |
| REQ-MAGIC-005 | F | K | **Desktop-Schutz (Legend):** macOS- (`rebreak-magic-mac`, SwiftUI) und Windows-Client (`rebreak-magic-win`, Tauri/Rust) erzwingen geräteweiten DNS-Glücksspiel-Filter (DoH/AdGuard) inkl. Browser-DoH-Bypass-Gegenmaßnahmen; ein SYSTEM-Tamper-Service hält den Schutz unter Windows aktiv. | `rebreak-magic-mac/`, `rebreak-magic-win/`, MEMORY: chromium-dns-bypass | R-FALSE-01, R-BYP-01 |
| REQ-MAGIC-006 | F | K | Desktop-Hard-Lock: Das DNS-Schutzprofil ist non-removable verankert (Removal-Password / Profil-Lock); das Klartext-Passwort wird dem Nutzer **nur** beim dokumentierten Offboarding (Kündigung/Account-Löschung) offengelegt — server-zeitgesteuerte Deaktivierung als Release-Pfad. | `rebreak-magic-mac/` Profile-Lock, MEMORY: magic-hardlock-offboarding | R-BYP-03 |
> **Scope-Entscheidung Gründer (2026-06-11):** RebreakMagic (geräteweite Selbstbindung
> via DNS-Profil / MDM, inkl. Desktop-Clients) ist **vorerst NICHT** Teil der
> zertifizierten DiGA-Funktion — es bleibt ein abgegrenztes, optionales Zusatz-Feature
> außerhalb des Medizinprodukt-Scopes. Die REQ-MAGIC-Zeilen bleiben zur Produkt-
> Vollständigkeit dokumentiert, zählen aber nicht zum Verifikationsumfang der Akte.
> Entscheidung ist nach der BfArM-Beratung revidierbar. `[Profi-Validierung]` der
> Abgrenzungs-Formulierung.
---
## 3. Mail-Schutz (Trigger-Mail-Entfernung)
Kern-Wirkmechanismus 1 (Dok 01 §5.1). Quelle: `backend/imap-idle/`,
`backend/server/utils/mail-classifier.ts`, `…/api/mail/*`, `…/mail-connections/*`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-MAIL-001 | F | S | Das System überwacht verbundene Postfächer in Echtzeit (IMAP-IDLE-Daemon, kein Polling) und scannt bei neuer Mail auf Glücksspiel-/Casino-Absender. | `imap-idle/index.mjs`, `mail/scan-internal.post.ts` | R-MAIL-01 |
| REQ-MAIL-002 | F | S | Erkannte Trigger-Mails werden entfernt, bevor die Geräte-Benachrichtigung triggert; scannt alle Ordner (Inbox, Spam, Papierkorb, Archiv). | COACH_SYSTEM_PROMPT (Mail-Schutz), `mail-classifier.ts` | R-MAIL-01 |
| REQ-MAIL-003 | F | M | Die Klassifikation ist primär **deterministisch** (gewichteter Score; Hard-Block ab Score ≥ 80; Mittelband 2579 deterministische Schwelle); LLM nur in definiertem Mittelband-Fall. | `mail-classifier.ts: SCORE_HARD_BLOCK_THRESHOLD=80` | R-MAIL-02, R-MAIL-03 |
| REQ-MAIL-004 | F | M | Eine Whitelist verhindert das Löschen legitimer Mails (Whitelist-Hit → kein Block, Score 0). | `mail-classifier.ts: whitelistHit` | R-MAIL-02 |
| REQ-MAIL-005 | NF | M | Es werden keine Mail-**Inhalte** (Body) gelesen/persistiert — nur Absender & Betreff zur Klassifikation. **`[Profi-Validierung]` + Hans (Dok 08 §2.1):** Umfang im Code/VVT zu belegen. | COACH_SYSTEM_PROMPT, Dok 08 §2.1 | R-DATA-02 |
| REQ-MAIL-006 | NF | M | Postfach-Zugriff nur nach ausdrücklicher Einwilligung (`consent_at`); Connections ohne Consent werden gehalten, aber **nicht gescannt**. | `mail-connections/consent.post.ts`, Dok 08 §2.1 | R-DATA-03 |
| REQ-MAIL-007 | NF | M | Credentials (App-Passwörter, OAuth-Tokens) werden AES-256-GCM at rest verschlüsselt; OAuth wird bevorzugt. | Dok 08 §2.1 (Code-verifiziert durch Hans) | R-DATA-01 |
---
## 4. Lyra (KI-Coach) & Krisen-Behandlung
Kern-Wirkmechanismus 2 (Dok 01 §5.2). **Höchste Sicherheitsrelevanz.** Quelle:
`backend/server/api/coach/*`, `apps/rebreak-native/lib/sosPrompts.ts`,
`…/sosConstants.ts`, `app/help/crisis.tsx`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-LYRA-001 | F | M | Im SOS-Modus begleitet Lyra deeskalierend durch akuten Spielimpuls (kurze, validierende, nicht-wertende Antworten) und führt nach 23 Schritten zu Atemübung oder Ablenkungs-Spiel. | `sosPrompts.ts: SOS_BOOT`, `sos-stream.post.ts` | R-LYRA-01 |
| REQ-LYRA-002 | F | M | Lyra **muss** sich gegenüber dem Nutzer als KI / **kein Therapeut/Arzt** zu erkennen geben, wenn relevant. | COACH_SYSTEM_PROMPT („Du bist KEIN Therapeut…") | R-LYRA-02 |
| REQ-LYRA-003 | F | M | Bei ernsthaften Krisen **muss** Lyra auf professionelle Hilfe verweisen (DE: check-dein-spiel.de / 0800 1372700; AT; CH). | COACH_SYSTEM_PROMPT („BEI ERNSTHAFTEN KRISEN…") | R-LYRA-03 |
| REQ-LYRA-004 | F | M | Die App stellt unabhängig von Lyra eine statische Krisen-/Hilfe-Seite mit Hotlines (BZgA 0800 1 372 700, Seelsorge, Notruf 112) bereit — auch wenn der LLM ausfällt. | `app/help/crisis.tsx` | R-LYRA-03, R-LYRA-04 |
| REQ-LYRA-005 | NF | M | Bei LLM-/Upstream-Fehler im SOS-Stream **muss** das System sauber degradieren (definierter Fehler 502/503, Frontend-Fallback auf `/coach/message`) und darf nicht stumm hängen. | `sos-stream.post.ts` (Fehlerpfade) | R-LYRA-04 |
| REQ-LYRA-006 | NF | M | Lyra **darf keine** Demografie-/Profildaten aus dem Gespräch extrahieren oder als strukturierte DiGA-Daten speichern (strikte Trennung Narrativ ↔ Profilfeld). | COACH_CASUAL_SYSTEM_PROMPT, MEMORY: demographics-Trennung | R-DATA-04 |
| REQ-LYRA-007 | NF | M | An den LLM-Provider (Groq/USA bzw. OpenRouter) **dürfen keine** direkten Identifikatoren (Klarname, E-Mail, User-ID) übermittelt werden. **`[Profi-Validierung]` + Hans (Dok 08 §2.2, K1):** Payload zu belegen. | Dok 08 §2.2 | R-DATA-05 |
| REQ-LYRA-008 | F | S | Im SOS-Modus unterlässt Lyra Sales-/Pricing-/Gründer-Story-/RebreakMagic-Inhalte (Krisen-Fokus-Lock). | COACH_SYSTEM_PROMPT (SOS-MODE LOCK) | R-LYRA-05 |
| REQ-LYRA-009 | F | S | Lyra vermeidet pathologisierendes Vokabular („süchtig"/„Sucht") — bewusste Tonalitäts-Entscheidung. | COACH_SYSTEM_PROMPT (Sprache & Haltung) | — |
| REQ-LYRA-010 | NF | M | SOS-Sessions werden für die DiGA-Auswertung gespeichert (voller Chat-Verlauf, Art-9-Daten). **`[Profi-Validierung]` + Hans (Dok 08):** Rechtsgrundlage/Löschkonzept. | `prisma SosSession`, `sos/session.post.ts` | R-DATA-06 |
> `[Profi-Validierung]` **Kritisch (vgl. Dok 05b §1.4, §2.1):** Für REQ-LYRA-001/003
> existiert **keine** LLM-Eval-Suite — d.h. korrekte Krisen-Erkennung und korrekter
> Hotline-Verweis sind aktuell **nicht reproduzierbar verifiziert**. Eine Anforderung
> ohne Verifikation ist für ein Medizinprodukt unzureichend (IEC 62304 §5.3/§5.6).
> Diese Lücke ist in Dok 04 als **Top-Risiko** geführt (R-LYRA-01/-03).
---
## 5. SOS-Werkzeuge (Atemübung, Spiele, Urge-Logging)
Kern-Wirkmechanismus 2/3 (Dok 01 §5.2/§5.3). Quelle: `sosConstants.ts`,
`app/urge.tsx`, `app/games.tsx`, `backend/server/api/urge/*`, `…/sos/session.post.ts`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-SOS-001 | F | M | Der SOS-Screen ist niedrigschwellig erreichbar (Header-Dropdown / SOS-Navigation). | `05b §2.1`, `app/urge.tsx` | R-LYRA-04 |
| REQ-SOS-002 | F | S | Geführte 4-7-8-Atemübung (4 s ein / 7 s halten / 8 s aus, 3 Runden) mit visuellem Guide. | `sosConstants.ts: BREATH_PHASES, TOTAL_ROUNDS` | — |
| REQ-SOS-003 | F | S | Ablenkungs-Spiele (Memory, TTT, Snake, Tetris) als bewusste Überbrückung der ~1520-min-Impulsphase — **kein Glücksspiel**. | `app/games.tsx`, `games/*` | R-SOS-01 |
| REQ-SOS-004 | F | S | Urge-/Überwindungs-Erfassung: Emotion, `wasOvercome`, `breathingDone` werden geloggt (DiGA-Auswertung). | `prisma UrgeLog`, `urge/index.post.ts` | R-DATA-06 |
| REQ-SOS-005 | F | K | SOS-Insights/-Aggregation für den Nutzer (Muster über Sessions). | `profile/me/sos-insights.get.ts` | — |
> `[Gründer-Entscheidung]` REQ-SOS-003: Spiele als therapeutisches Ablenkungs-Element
> sind eine Produkt-/Wirkmechanismus-Aussage — in Dok 06 (klinisch) zu untermauern,
> und in Dok 04 (R-SOS-01) auf das Risiko „Spielmechanik triggert" zu prüfen.
---
## 6. Streak / Protected Days (Motivation & Tracking)
Kern-Wirkmechanismus 3 (Dok 01 §5.3). Quelle: `prisma Streak/StreakEvent`,
`backend/server/api/streak/*`, `stores/blockerStats.ts`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-STREAK-001 | F | S | Das System zählt geschützte/spielfreie Tage (`currentDays`, `longestDays`) und protokolliert Ereignisse (started/reset/milestone/relapse). | `prisma Streak/StreakEvent`, `streak/index.*` | R-FALSE-06 |
| REQ-STREAK-002 | F | K | Geschätzte Ersparnis (`avgMonthlySavings`) und Meilenstein-Badges als Motivation. | `prisma Streak.avgMonthlySavings`, `DiGaMilestoneModal.tsx` | — |
| REQ-STREAK-003 | NF | S | Ein neu registrierter Nutzer hat einen plausiblen (nicht-null/nicht-fehlerhaften) Streak-Wert (Regressions-Guard). | `05b §2.4 onboarding/new-user-streak-guard` | — |
> `[Profi-Validierung]` REQ-STREAK-001 (R-FALSE-06): Die Anzeige „X spielfreie Tage"
> darf keine falsche Gewissheit erzeugen — die Zählung basiert auf App-Signalen, nicht
> auf einem lückenlosen Verhaltensnachweis (Bargeld/Fremdgerät unerfasst). Labeling
> in Dok 07.
---
## 7. Community / DM / Anrufe
Begleitend (Dok 01 §5.3, anonyme Community). Quelle: `backend/server/api/community/*`,
`…/chat/*`, `…/calls/*`, `app/dm.tsx`, `app/call.tsx`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-COMM-001 | F | K | Anonyme Community (Posts, Kommentare, Likes, Domain-Voting) — Nutzer ausschließlich per Nickname sichtbar. | `community/*`, MEMORY: Anonymität-Nickname | R-DATA-07 |
| REQ-COMM-002 | F | K | Direktnachrichten (DM) zwischen Nutzern, inkl. Realtime-Empfang. | `chat/dm.post.ts`, `chat/dm/[userId].get.ts` | R-DATA-07 |
| REQ-COMM-003 | F | K | Peer-Anrufe (VoIP/WebRTC) zwischen Nutzern (Vertrauensperson-Unterstützung). | `calls/ring.post.ts`, `calls/ice-servers.get.ts` | — |
| REQ-COMM-004 | F | M | Moderationsprozess: Melden/Löschen einzelner Posts, Ban-Mechanismus. | `admin/moderation/*` | R-DATA-07 |
| REQ-COMM-005 | NF | M | **Anonymitäts-Invariante:** Klarname/E-Mail/Username erscheinen in **keiner** API-Response, Realtime-Payload, Push-Notification oder Log. **`[Profi-Validierung]` + Hans (Dok 08 §2.4):** zu belegen (05b §2.3: ungetestet). | MEMORY: Anonymität, Dok 08 §2.4 | R-DATA-07 |
---
## 8. Authentifizierung, Geräte-Limit & Onboarding
Quelle: `backend/server/api/auth/*`, `…/devices/*`, `app/(auth)/*`, `app/onboarding/*`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-AUTH-001 | F | M | E-Mail-basierte Authentifizierung (Login/Signup/Reset) via Supabase (self-hosted, Hetzner DE). | `auth/login.post.ts`, Dok 08 §2.5 | R-DATA-01 |
| REQ-AUTH-002 | F | M | Geräte-Limit (Pro 1 / Legend 3); Gerätewechsel lockt das alte Gerät + Email-Notify, um Impuls-Bypass über Zweitgeräte zu verhindern. | `devices/check-lock.post.ts`, `device-lock-email.ts` | R-BYP-01 |
| REQ-AUTH-003 | F | S | Geräte-Freigabe (Release) mit Bestätigungs-/Approval-Flow. | `devices/[id]/request-release.post.ts`, `devices/approvals/*` | R-BYP-01 |
| REQ-AUTH-004 | F | S | Onboarding führt durch Schutz-Aktivierung (iOS: NEFilter/VPN; Android: a11y einmalig). | `app/onboarding/index.tsx`, MEMORY: android-protection-onboarding | R-FALSE-01 |
| REQ-AUTH-005 | NF | M | App-Lock (Biometrie) für den App-Zugang ist optional verfügbar. | `stores/appLock.ts`, `components/AppLockGate.tsx` | — |
---
## 9. Demographie (DiGA-Evidenz-Daten)
Quelle: `backend/server/api/profile/me/demographics.*`, `app/profile/edit.tsx`.
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-DEMO-001 | F | S | Erfassung freiwilliger Demografie (Geburtsjahr, Geschlecht, Beschäftigungsstatus, Bundesland, optional Beruf/Branche) für die DiGA-Wirksamkeitsauswertung. | `demographics.patch.ts`, `demographics.zod.test.ts` | R-DATA-06 |
| REQ-DEMO-002 | NF | M | Erfassung **strikt user-initiiert** über das Profil-Formular; keine Kopplung der App-Nutzung an die Preisgabe (Freiwilligkeit). | MEMORY: demographics user-initiated, Dok 08 §2.5 | R-DATA-04 |
| REQ-DEMO-003 | NF | M | Eingabe-Validierung (Zod) für alle Felder, Grenzen, Enum-Werte. | `demographics.zod.test.ts` (05b §2.5) | — |
| REQ-DEMO-004 | F | S | Nutzer kann eigene Demografie-Daten löschen. | `demographics.delete.ts` | R-DATA-06 |
---
## 10. Querschnittliche nicht-funktionale Anforderungen
| ID | Typ | Prio | Anforderung | Quelle | Risiko-Bezug |
|---|---|---|---|---|---|
| REQ-NFR-001 | NF | M | Art-9-Daten (Suchterkrankung, Krisen, mentale Gesundheit) werden mit höchster Schutzstufe behandelt; Hosting DE/EU (Hetzner, Supabase self-hosted). | Dok 08 §1, §2.5 | R-DATA-* |
| REQ-NFR-002 | NF | M | Drittland-Transfers (Groq/USA, Cloudflare, Stripe) erfordern SCC + TIA + (Groq) Zero-Data-Retention. **Owner: Hans (Dok 08 §2.2/§2.3).** | Dok 08 §2.2/§2.3 | R-DATA-05 |
| REQ-NFR-003 | NF | M | Betroffenenrechte: Auskunft/Export (Art. 15/20) + echtes Cascade-Delete (Art. 17) inkl. OAuth-Token-Revoke. **Owner: Hans (Dok 08 H4).** | `user/delete.delete.ts`, Dok 08 §2.7 | R-DATA-08 |
| REQ-NFR-004 | NF | M | Verfügbarkeit der Schutzfunktion: degradiert sicher bei Backend-Ausfall (Schutz bleibt lokal aktiv; konservativ „kein Cooldown" angenommen statt Schutz aufzuheben). | `protection.ts: getCooldownStatus catch` | R-FALSE-03 |
| REQ-NFR-005 | NF | S | Mehrsprachigkeit (DE primär; EN/TR/AR vorhanden) inkl. Krisen-Hotlines je Land. | `lib/i18n.ts`, `sos-stream.post.ts: LANG` | R-LYRA-03 |
| REQ-NFR-006 | NF | S | SOUP-/3rd-party-Komponenten sind inventarisiert und gepflegt (→ Dok 05). | `package.json` | — |
---
## 11. Offene Punkte & Abgrenzungen
- **Sicherheitsklassen-Zuordnung je REQ** (IEC 62304 §4.3, Klasse A/B/C) ist **noch
offen** — `[Profi-Validierung]`. Kandidaten für die höchste Klasse: alle `M`-REQs in
§1 (Schutz), §4 (Lyra/Krise), §3 (Mail-Block-Korrektheit).
- **Verifikationsnachweis je REQ** wird in Dok 05b (Ahmed) geführt; aktuell bestehen
dort dokumentierte Lücken (insb. Lyra-Eval, Schutzwirkung-E2E, Anonymitäts-Invariante).
- **Genauer Mail-Verarbeitungsumfang** (Body-Lesen? Treffer-Persistenz?) ist von Hans
(Dok 08 §2.1) als „zu verifizieren" markiert — REQ-MAIL-005 hängt daran.
| Status | Wert |
|---|---|
| Requirements gesamt | **64** (REQ-IDs) |
| davon `M` (Muss) | 35 |
| davon `S` (Soll) / `K` (Kann) | 21 / 8 |
| davon sicherheits-/risiko-verknüpft | 43 |
| Bereiche | 10 (Schutz, Magic, Mail, Lyra, SOS, Streak, Community, Auth, Demografie, NFR) |
> **Scope-Hinweis Desktop (REQ-MAGIC-005/006):** Der Mac-/Windows-Desktop-Schutz
> („Rebreak Magic") ist als **Legend-Zusatzfunktion** geführt und in Dok 05 §2.1 als
> Komponente benannt (SOUP-Detail v1 offen). **Per Gründer-Entscheidung 2026-06-11
> vorerst NICHT im zertifizierten DiGA-Scope** — abgegrenztes Zusatz-Feature, wie
> RebreakMagic insgesamt (s. Kasten oben unter §2). Nach BfArM-Beratung revidierbar.
---
*v0-Entwurf. Diese Liste ist der Traceability-Anker für Dok 04 (Risiko) und Dok 05b
(Test). Sicherheitsklassen, Vollständigkeit und Verifikationszuordnung bedürfen der
Profi-Validierung.*