10 Pflicht-Auflagen · alle eingearbeitet

Was zwei unabhängige Reviews verlangt haben — und wo es im Code steht.

Bevor Code geschrieben wurde, haben zwei getrennte Analysen (ChatGPT und Claude Chat) den Architektur-Entwurf geprüft. Beide haben dieselben kritischen Stellen gefunden. Diese zehn Auflagen waren Pflicht. Hier ist das Mapping.

1

PostgreSQL ab Tag 1

✓ live

SQLite verboten als Projektstandard. Provider strikt postgresql, eigener Container, eigenes Passwort.

prisma/schema.prisma · provider = postgresql · Migration 20260516084835_init_remember4u_v2
2

Argon2id für User · bcrypt nur für PIN mit Rate-Limit

✓ live

@node-rs/argon2 mit 64 MiB Memory, 3 Iterations für User-Passwörter. bcrypt nur für 4-stellige Notfall-PIN — mit dokumentierter Begründung. PinAttempt-Tabelle protokolliert jeden Versuch. Max. 5 Fehlversuche pro QR-Token in 10 Minuten, dann Sperre.

src/lib/hash.ts · src/lib/pin-ratelimit.ts · prisma/schema.prisma → model PinAttempt
3

OhanaStatusExport NICHT aktiv im MVP

✓ live

Tabelle bleibt als Phase-2-Vorbereitung. Endpoint antwortet HTTP 503 mit klarer Begründung. Kein POST, kein GET nimmt Daten entgegen.

src/app/api/ohana/status/route.ts · live verifizierbar unter /api/ohana/status
Live-Test: /api/ohana/status
4

MirrorSession ohne Personenbezug

✓ live

MirrorSession-Modell vollständig entfernt. Mirror4U-Aufrufe erzeugen kein DB-Insert mit seniorId, contextState oder Belastungsmuster. Sichtbarer Disclaimer auf jeder Atem-Seite.

src/app/mirror/[key]/page.tsx · Schema: kein MirrorSession-Modell mehr
5

SeniorProfile aufgespalten

✓ live

Fünf getrennte Modelle: SeniorProfile (Basis), MedicalProfile (Diagnosen/Allergien/Pflegegrad), EmergencyProfile (QR/PIN/Notfallkontakte), PrivateNote (nur Senior), FamilySharedInfo (Familie). Normale Profilansicht lädt KEINE Diagnosen mit.

prisma/schema.prisma → 5 Modelle · src/app/notfallkarte/*
6

DataClass + AccessGrant + ConsentRecord statt Boolean-Flags

✓ live

Postgres-Enum DataClass mit 13 Werten. AccessGrant pro Person + Datenklasse + Permission. ConsentRecord widerrufbar. AuditEvent loggt jeden Zugriff. Margaretes Seed hat 21 explizite AccessGrants.

prisma/schema.prisma → enum DataClass + model AccessGrant + model ConsentRecord · prisma/seed.ts
7

MVP-Kern-Reduktion · P0/P1 sichtbar getrennt

✓ live

Senior-Start zeigt zuerst P0 (Heute, Tabletten, Hilfe, Notfallkarte, Atem, Einrichtung, Freigaben), danach P1 mit P1-Pill (Tagesfragen, Essen, Trinken, Nachricht). Fokus klar.

src/lib/modules.ts · src/components/Tile.tsx
8

Schicht-Reihenfolge eingehalten

✓ live

Senior-Mode auf / · Help4U-Schale unter /familie · Hinweis-Banner: "nachrangig zu Remember4U, wird erst nach Senior-Kern produktiv ausgebaut".

src/app/page.tsx · src/app/familie/page.tsx
9

Mirror4U-Subdomain über ENV-Variable

✓ live

MIRROR4U_BASE_URL aus .env. Leer = kein externer Link. Lokal aktuell leer, nur Inhouse-Voice-Player über Web Speech API.

src/lib/mirror4u.ts · .env auf VPS
10

TelefonSeelsorge 116 123 als Hauptnummer

✓ live

Footer, Compliance-Hinweise, Mirror-Seiten, Krisenprotokolle nutzen 116 123 als Haupteintrag. Notfall-Atem-Voice spricht "eins eins sechs · eins zwei drei". HelpGuide-Eintrag markiert als Hauptnummer.

src/app/layout.tsx · src/app/mirror/[key]/page.tsx · prisma/seed.ts → voiceScripts + guide

Freigabe-Matrix (Seed-Default für Margarete)

DatenklasseAnna
Tochter
Lotte
Nachbarin
Pflege
dienst
Dr. Weber
Hausarzt
Peter
Freund
profile_basicmanageviewview
calendarmanageview
medicationmanageviewview
allergymanageviewview
diagnosismanageview
emergencymanageviewview
caremanageviewview
documentmanage
bridge_messagemanage
private_note
counseling

Margarete selbst entscheidet pro Person + Datenklasse, was sichtbar ist. Peter ist nur Telefon-Freund — sieht nichts. Private Notizen und seelsorgerische Inhalte bleiben grundsätzlich nur bei ihr.