Zum Hauptinhalt springen

Timesheet — Medidentas

Arbeitszeit-Erfassung je Session (Everything-as-Code). Pflege: am Session-Ende aktualisieren (docs/konventionen/agents.md §5.1).

Methodik

  • Eine Zeile je Session. Start/Stop in lokaler Zeit (Europe/Berlin), Dauer in Stunden.
  • Zeitstempel-Methode (B, seit 2026-07-01): Der Agent stempelt Start/Stop halbautomatisch aus der System-Uhr (nach Europe/Berlin umgerechnet) — Start = erste Aktion der Session, Stop = Abschluss; als Anker dienen konkrete Zeitstempel (Commits, CI-Runs). Keine echte Hook-Automatik (die würde nur Agent-Laufzeit messen, nicht die abrechenbare Arbeitszeit); Werte sind auf ~5 Min gerundet und bei Bedarf vom Nutzer korrigierbar. Ältere Zeilen mit —/~ bleiben bis zum Nachtrag.
  • Session-ID ist sprechend & branch-abgeleitetab MED-D-51 mit Projekt-Kürzel: MED-<Datum>-<branch-slug> (z. B. MED-2026-07-06-med-id-prefix; Bestandszeilen ohne Präfix bleiben) → git-weit eindeutig (mehrere Sessions je Branch/Tag mit Zähl-Suffix -2/-3; OP-PM-1). Diese Datei nutzt merge=union → parallele Sessions konkatenieren; regelmäßig glätten (Duplikate raus, chronologisch).
  • KW-Aggregat je Session aktualisieren (verbindlich): Die Tabelle „Aggregat (KW)" am Dateiende wird in jeder Session mitgezogen — die laufende Kalenderwoche bekommt die neue Session-Dauer aufaddiert (und eine neue KW-Zeile, sobald die Woche wechselt) plus die Gesamtsumme unten. So sind die Zeit- Statistiken jederzeit aktuell (nicht erst „nach Wochenschluss geglättet"). Die Einzel-Session-Zeilen bleiben die maßgebliche Quelle; das Aggregat ist die abgeleitete Sicht (bei Bedarf aus den Zeilen neu summierbar).
  • Gap-Regel: > 1 h seit letzter Interaktion → User nach Stop fragen, neue Session beginnen.
  • Tätigkeit kurz halten (was wurde erreicht, welche IDs).

Sessions

Session-IDDatumStartStopDauer (h)Tätigkeit
MED-2026-08-27-akten-cockpit-design-4kspzi-392026-08-2718:2019:401.33Onboarding-3-Schritte-Flow (MED-D-285, Slice B) + Cockpit-Aufräumen (MED-D-286), 0.126.00.127.0, MINOR. (a) MED-D-285: onboarding-public.component.ts von flacher Seite auf 3-Schritte-Stepper (① Grunddaten → ② „wo fehlt was?"-Lücken-Report, G-2 → ③ Einwilligung), aria-current/✓, Weiter/Zurück, Gate unverändert; handynummer-Autocomplete. (b) MED-D-286 (2 Nutzer-Screenshot-Anstöße): Beratungsmandate-Kacheln aus „Basis-Informationen" + Sidebar-Phasen-Statistik entfernt, Dead-Code bereinigt (auftragBuckets/praxisName u. a.). Reine Client-Änderungen über bestehende Endpunkte; ng build grün, Server unverändert (692 Vitest), Doku-Check grün. Offen: interne Steuerberater-Erfassung (Art.-14), Slice C (DocuSign). Anlass: Nutzer „b" + UI-Anstöße.
MED-2026-08-27-akten-cockpit-design-4kspzi-382026-08-2715:4517:151.50Onboarding-Grunddaten-Katalog erweitert, datensparsam (MED-D-284, 0.125.00.126.0, MINOR). Nutzer: „Onboarding verbessern, klarer Flow … Grunddaten (Name, Handynummer, Steuernummer, Personalausweis, Steuerberater) … wo fehlt was? … Daten erfassen, dann Einverständnis per DocuSign plus weitere Formulare." Zwei Explore-Agenten (Onboarding-Modul + Grunddaten-Modell) → Ist-Analyse: zwei lose gekoppelte Halbwelten, Steuernummer/Steuerberater/Handynummer fehlen. AskUserQuestion: reguliertes PII → datensparsam (keine Steuer-ID/Ausweisnummer, Ausweis bleibt Upload); erster Slice → Kundenstrecke. Slice A gebaut: 6 neue plain mandant-Spalten (Migration v56, Wertobjekte Kontakt/Steuer/Steuerberater), NICHT hash-versioniert (fixe VERSIONIERTE_FELDER-Kette nicht angetastet); STAMMDATEN_FELDER + STAMM_ZIELE/ONBOARDING_STAMM_REGELN erweitert; RISK-34 (PII-Begründung G-6); Weltmodell/Lastenheft/Decision-Log gepflegt. +1 Vitest → 692 (ausfuellgrad 75→55). Server tsc + Vitest 692 · Client ng build · Doku-Check grün. Offen: Slice B (Mehrschritt-Strecke) + C (DocuSign-Einverständnis statt SES). Anlass: Nutzer-Feature „klarer Onboarding-Flow".
MED-2026-08-27-akten-cockpit-design-4kspzi-372026-08-2715:1015:450.58CodeRabbit-Nachlese #320 zu MED-D-283 (Portal S2, in-PR vor Merge, keine Versionsänderung). 10 Findings gesichtet: übernommen (a) Login-AtomaritätloginMitToken reordert: Session ZUERST persistiert, Token-Claim als letzter atomarer Schritt (kein verbrannter Link bei Schreibfehler; neues findeAnmeldeToken-Read in repo/d1-repo/memory-repo; Widerruf der nie ausgegebenen Session bei verlorenem Rennen); (b) Sperr-Check in sessionKonto (gesperrtes Konto → Session 401); (c) istEmail an beiden Portal-E-Mail-Eingängen (app.ts). +2 Vitest (Enumeration-Resistenz ohne testMode, gesperrte-Session→401) + volle Cookie-Attribut-Assertions → 691. Doku-Konsistenz: Testzähler auf 691/57 (README/MVP-Scope/Test-Uebersicht/Management-Summary), Aktivierungsstatus vereinheitlicht (S2 umgesetzt/S5-Gate: Turnstile+OP-DM-8) über Portal-Doc/Risikoregister/Feature-Liste/Timesheet, MVP-Non-Goal FR-1 präzisiert (S2 gebaut, UI/S3 offen), CHANGELOG-PR-Link #320. Bewusst nicht: Timing-Seitenkanal (dormant → S5-Härtung via Rate-Limiting), Quote-Nits (MED-D-144). Server tsc + Vitest 691 + Doku-Check grün. Anlass: CodeRabbit-Review #320 (Drive-to-green).
MED-2026-08-27-akten-cockpit-design-4kspzi-362026-08-2713:4015:101.50Kunden-Self-Service-Portal — Slice S2 (passwortlose Auth-Routen, flag-gated) (MED-D-283, 0.124.00.125.0, MINOR). Nutzer: „passwortlos zum Testen, los" (MED-KB-13(a)). api/portal-service.ts (anmelden/login/session/abmelden/kontoAnlegen) auf S1-Fundament; Routen /oeffentlich/portal/{anmelden,login,ich,abmelden} + Staff /api/mandanten/:id/portal-konto; No-Enumeration, atomarer Einmal-Token-Claim, HttpOnly/Secure/SameSite-Cookie (Session-Hash at rest), Idle+Absolut-TTL. Flag-gated (PORTAL_AKTIV/PORTAL_TEST_MODE in index.ts/wrangler.toml, Golden Rule/RISK-33). Magic-Link über Benachrichtigungs-Seam (PII-arm). +7 Vitest (api/portal.test.ts) → 689. Server tsc + Vitest 689 + Doku-Check grün. Offen: Rate-Limiting/Turnstile + DSGVO/AVV + realer Mailversand (OP-DM-8) (S5), Client-UI (S3). Anlass: Nutzer-Freigabe passwortlos.
MED-2026-08-27-akten-cockpit-design-4kspzi-352026-08-2712:2513:401.25Kunden-Self-Service-Portal — Slice S1 (Fundament, dormant) + #317-Doku-Nachlese (MED-D-282, 0.123.10.124.0, MINOR). Server: Migration v53–v55 (portal_konto/portal_anmelde_token/portal_session) + Drizzle-Schema (Bearer-Werte nur als Hash); domain/portal-auth.ts (SHA-256/WebCrypto, TTL+Einmalgebrauch, Idle+Absolut-Session-TTL); Repo mit atomarem Token-Claim (verbraucheAnmeldeToken, kein Replay). +15 Vitest (portal-auth.test.ts) → 681. Keine öffentliche Route (dormant). #317-Nachlese: Risiko-Zähler 33, Lastenheft-Timer-Absatz vereinheitlicht (Segment-Modell + buchenVerteilt-Aggregation), AD-001 Beratungsauftrag; Historie (MED-D-278/280) nicht re-editiert (G-4). Server tsc + Vitest 681 + Doku-Check grün. Anlass: Portal-Feature (Nutzer) + #317-Review.
MED-2026-08-27-akten-cockpit-design-4kspzi-342026-08-2712:0512:250.33Gesprächsprotokoll aus der Sidebar in eigenen Reiter (MED-D-281, 0.123.00.123.1, PATCH). Nutzer: „Gesprächsprotokoll aus der Sidebar entfernen und als eigenen Tab neben Praxen erstellen." Meeting-Doku-Panel (md-mandant-meetings, R11) aus der linken Rail (seit MED-D-273) in einen eigenen Reiter „Gesprächsprotokoll" neben „Praxen" verschoben: REGISTER-Eintrag + [hidden]-Panel id="meetings", Sidebar-Block entfernt, Bindings unverändert. ng build(prod) grün. Anlass: Nutzer-UI-Wunsch.
MED-2026-08-27-akten-cockpit-design-4kspzi-332026-08-2711:2012:050.75CodeRabbit-Nachlese #315+#316 (Doku-Konsistenz + Portal-Design-Härtung, MED-D-280; App bleibt 0.123.0). #315+#316 mergten vor Landung der Reviews → reale Findings forward-gefixt. Portal-Design-Härtung (prägt S1-Schema): Bearer-Token/Session nur als Digest/HMAC at rest, atomarer Claim (CAS), Idle+Absolut-TTL getrennt, EU/CH-Residenz konditional, quelle=bestehendes self_service (nicht neuer portal-Wert), Risikoregister-BLUF 32/21/zwei-Score-9. Sweep-Nachlese: Lastenheft-Timer als pre-MED-D-275 markiert (🟠 Major Doku↔Doku), H1 „Mandant-Struktur", je-Beratungsauftrag, Grammatik-Fragmente, „ganzer Mandant". Quote-Nits übersprungen (MED-D-144). Doku-Check grün. Anlass: CodeRabbit #315/#316.
MED-2026-08-27-akten-cockpit-design-4kspzi-322026-08-2710:2011:201.00Kunden-Self-Service-Portal — Design (S0, MED-D-279/MED-OP-PORTAL-1; Doku-only, App bleibt 0.123.0). Nutzer: „Self-Service-Portal für Kunden, submitted≠actual, 4-Augen-Freigabe." Wahl (AskUserQuestion): echtes Kunden-Login → design-first. Bestandsaufnahme (Reuse-Map): submitted-vs-actual + 4-Augen (feld-sichtung.ts) + versionierte Übernahme + unguessbare Tokens (Ausfuellformular.token) + Turnstile existieren bereits → Portal = persistente Identitäts-/Übersichts-Schicht darüber (G-1/G-2). Design-Doc architektur/Kunden-Self-Service-Portal.md (passwortlos/Magic-Link, Datenmodell portal_konto/portal_anmelde_token/portal_session, RBAC-Trennung, Compliance Zero-Trust/DSGVO, Slice-Plan S0–S5). Kaskade: Decision-Log MED-D-279, Risikoregister RISK-33, Kunden-Besprechungspunkte MED-KB-13, Lastenheft, Feature-Liste, README, CLAUDE.md, HANDOFF §2. Doku-Check grün. Anlass: Nutzer-Feature-Auftrag.
MED-2026-08-23-akten-cockpit-design-4kspzi-312026-08-2318:0018:450.75CodeRabbit-#314-Forward-Fix + Doku-Prosa-Sweep „Akte“→„Mandant“ (MED-OP-DOCS-2 abgeschlossen, MED-D-278; App bleibt 0.123.0). Zuerst #314 (Rename-PR): 7 CodeRabbit-Minor-Findings gefixt (Grammatik service.ts/model.ts/einstellungen.ts, Route-Ref HANDOFF, MD028 Akte-Struktur.md, 20 stale Datei-Refs + Top-Prosa Feature-Liste.md; Quote-Nits per MED-D-144 übersprungen) → Server tsc+666 Vitest+Client ng build+Doku-Check grün, gemergt (0.123.0 live: App-Deploy success, APP_VERSION 0.123.0 auf main). Danach MED-OP-DOCS-2: tiefere Doku-Prosa gesweept — „Akte“→„Mandant“ grammatik-korrekt in 20 lebenden Referenz-Docs (7 parallele Subagenten) + Glossar-Quelle (npm run glossar) + 2 stale Code-Refs in Test-Uebersicht; Historie/Design-Handoff/Eigennamen/Dateinamen bewusst unangetastet (G-4). Keep-Begriff-Bilanz ausgeglichen, keine Fehldeklination, Doku-Check grün. Anlass: CodeRabbit #314 + Nutzer-Auftrag (Doku-Nachlese).
MED-2026-08-23-akten-cockpit-design-4kspzi-302026-08-2315:3018:002.50CodeRabbit-#313-Härtung Runden 2–4 + Merge + Umbenennung „Akte“→„Mandant“ (MED-D-276 Abschluss + MED-D-277, 0.122.00.123.0, MINOR). #313: Runde 2 atomare Buchung (claim-first, keine Doppelbuchung), Verlassen-Guard-Bypass, SW-Zustandshärtung; Runde 3 nebenläufigkeits-sichere Segment-Räumung (loescheTimerSegmenteMitIds, MED-OP-TIME-5); Runde 4 Crash-nach-Ledger-Write verhindert + korrigierenaufschluesselung konsistent; dauerMinuten-Deckelung bewusst NICHT (Kern-Feature). 666 Vitest, CI grün → #313 gemergt (0.122.0 live verifiziert: App-Deploy success, Worker modified_on>Merge, APP_VERSION 0.122.0). MED-D-277: Nutzer „Entferne den Begriff Akte“ → Tier A (alle sichtbaren „Akte“→„Mandant“) + Tier B (14 Client-Dateien akte-*mandant-*/neutral, Selektoren md-akte-*md-mandant-*, Route /akte/druck, Enum andere_akteanderer_mandant); behalten: Aktenreife/Akteur/Programmname/Design-Artefakte/Log-Historie. Client tsc+ng build+Server tsc+666 Vitest+Doku-Check grün. Offen: Doku-Prosa-Nachlese MED-OP-DOCS-2. Anlass: Nutzer-Auftrag + CodeRabbit-Review #313.
MED-2026-08-23-akten-cockpit-design-4kspzi-292026-08-2314:4515:300.75CodeRabbit-#313-Härtung des Timer/Push-Features (MED-D-276, bleibt 0.122.0, in-PR vor Merge). CodeRabbit fand 13 Punkte (mehrere Major) am frischen MED-D-275-Feature; die realen vor dem Merge behoben: Segment-Konsistenz aller Timer-Aktionen (starten öffnet/buchen+verwerfen räumen/korrigieren schließt Segmente); Direkt-buchen verweigert Fehlzuordnung über mehrere Mandanten (verteilen_noetig→409, Client leitet ins verteilte Overlay); Push härter+datensparsamer (kein user_agent, Endpoint-Allowlist HTTPS+Provider, unsubscribe user-scoped, non-blocking waitUntil+5-s-Timeout); vordergrund 400 bei malformter mandantId; partieller UNIQUE-Index v52 (ein offenes Segment); Stopp-Übergänge pushen→SW schließt Notification; Doc-Korrekturen (Dauerformel/dauerMinuten/Web-Push-Stack). +8 Vitest (654→662). Server tsc+Vitest+Client ng build+Doku-Check grün. Bewusst offen: server-seitiger Rest-Zeit-Guard (🟡). Anlass: CodeRabbit-Review #313.
MED-2026-08-23-akten-cockpit-design-4kspzi-282026-08-2312:1514:452.50Durchlaufender Timer + Vordergrund-Segmente + Buchungs-Overlay + Live-Push (MED-D-275, 0.121.0->0.122.0, MINOR). Recherche (Explore) des Zeiterfassungs-Subsystems + Push-Infra-Check; Design-Doc (DSGVO/VAPID). Server: timer_segment+push_subscription (v50/v51), Timer-Service vordergrund/aufschluesselung/buchenVerteilt, Routen, daten-loser Web-Push-Sender (VAPID-JWT via WebCrypto), Cron; Repo d1+memory. Client: schlanker /sw.js+PWA-Manifest, push.service, Zeitbuchungs-Overlay, Cockpit-Chip+?zeitbuchung=1, Akte→timerVordergrund. +6 Vitest (648→654). Server tsc+Vitest+Client ng build+Doku-Check grün; Risikoregister RISK-32 + Compliance. Anlass: Nutzer-Timer-Feature.
MED-2026-08-23-akten-cockpit-design-4kspzi-272026-08-2311:1512:151.00Akte-UX-Aufräumen im Live-Durchklick (MED-D-271/272/273, 0.120.1->0.121.0, MINOR). MED-D-271: Neuer Mandant als Overlay; MED-D-272: Overflow-Fix Akte/Overlay + Rail-Nachschärfungen aus zwei Nutzer-Screenshots (Zuständigkeits-Select · „Stand"-Pille · Self-Service-Kopf · TaskCard-Detail); MED-D-273: „Mandate"-Reiter-IA — Mandat-Anlegen als „+"/Overlay, „Formulare zum Ausfüllen"→„Alle Dokumente"-Reiter, Gesprächsnotizen/Meeting-Doku in die Sidebar (statt Self-Service-Kurzfassung), Dead-Code-Bereinigung. tsc(Client)+ng build(prod) grün. Anlass: Nutzer-Screenshots + IA-Wünsche.
MED-2026-08-23-akten-cockpit-design-4kspzi-262026-08-2311:0011:150.25CodeRabbit-Nachlese #310: Statistik-Retry-Race + Endpunkt-Doc (MED-D-270, 0.120.0->0.120.1, PATCH). CodeRabbit fand auf dem gemergten #310 zwei reale Minor-Punkte: (1) der „Erneut versuchen"-Retry konnte bei Mehrfachklick Requests überholen — ein spät scheiternder älterer fragebogenStatistik()-Call verdeckte geladene Daten → monotoner statistikSeq-Guard (nur die jüngste Antwort setzt den Zustand, wie MED-D-263); (2) Endpunkt hieß in der Doku fragebogen-statistik, echte Route GET /api/fragebogen/statistik → in CHANGELOG/HANDOFF/Timesheet/Feature-Liste/Decision-Log korrigiert. Client-Component-Tests bewusst übersprungen (Server-Gate bereits getestet, rbac.test.ts; Client build-only) → Backlog. tsc(Client)+ng build(prod) grün. Anlass: CodeRabbit-Review #310.
MED-2026-08-16-akten-cockpit-design-4kspzi-252026-08-1610:3011:200.85Statistiken als eigener Cockpit-Bereich (MED-D-269, 0.119.1->0.120.0, MINOR). Nutzer (Screenshot): „Fragebogen-Statistik gehört in einen separaten Bereich „Statistiken" neben dem Leitstand." Gebaut: vierter Cockpit-Modus „Statistiken"; das Fragebögen-Statistik-Widget (DM-9) aus der Verwaltung dorthin verschoben (Signal+Load+trichterAnteil+Template umgezogen, aus Verwaltung entfernt), Admin-Gate beibehalten (G-5), Nicht-Admin-Hinweis. Client-only, vorhandener GET /api/fragebogen/statistik-Endpunkt. tsc(Client)+ng build(prod) grün. Doku: Decision-Log MED-D-269, HANDOFF §2, Feature-Liste, Test-Uebersicht, version.ts, lebende Stempel. Anlass: Nutzer „Statistiken-Bereich".
MED-2026-08-16-akten-cockpit-design-4kspzi-242026-08-1610:1810:300.20A11y-Fix Mandanten-Zeilen = native Buttons (MED-D-268, 0.119.0->0.119.1, PATCH). CodeRabbit-Nachlese #307: role="listitem" auf dem <button> überschrieb die Button-Rolle (Screenreader kündigt die Zeile nicht als Button an); beide aufgesetzten ARIA-List-Rollen entfernt -> native Buttons, konsistent mit den bestehenden Cockpit-Listen. ng build grün. Quote-Nits bewusst nicht übernommen. Anlass: CodeRabbit-Review #307.
MED-2026-08-16-akten-cockpit-design-4kspzi-232026-08-1609:0010:181.30Mandanten-Liste als aufgeräumter Einstieg (MED-D-267, 0.118.1->0.119.0, MINOR). Nutzer: „Einstieg aufräumen / Mandanten-Liste mit Filtern?" → per AskUserQuestion geklärt (Liste wird Landing; Filter Lifecycle-Status/Betreuungsmodell/offene Fakturierung). Explore-Durchlauf kartierte den Ist-Zustand (Cockpit = Fokus-Aufgabenstrom, keine durchblätterbare Liste; Bausteine GET /api/mandanten/labels.ts vorhanden). Gebaut: dritter Cockpit-Modus „Mandanten" (Default-Ansicht) — Filterleiste (Suche + Lifecycle-/Betreuungs-Chips + „Zu fakturieren" + Reset) + computed mandantenListe (rein abgeleitet) + #mandantenTpl + Segment-Button; Klick → oeffneMandant. tsc(Client)+ng build(prod) grün; Tastatur-Shortcuts fokus-gegated, ⌘K// in allen Modi. Client-only → keine neuen Vitest. Doku: Decision-Log MED-D-267, HANDOFF §2, Feature-Liste, Test-Uebersicht, Sanity-Checkliste (Frage 1), version.ts, lebende Stempel. Anlass: Nutzer „Einstieg aufräumen".
MED-2026-08-02-akten-cockpit-design-4kspzi-222026-08-0211:4011:580.30Runbook-Präzisierung (MED-D-266, reine Doku). CodeRabbit-Nachlese #305: §8 korrigiert — der form_data-Rücklauf liest generisch alle Tab-Typen (nur das Prefill ist text-only); §9 „alle vorbefüllten Datenfelder". Gegen den Code (formularRuecklauf) bestätigt. check-doc-consistency.sh grün. Quote-Nits bewusst nicht übernommen. Anlass: CodeRabbit-Review #305.
MED-2026-08-02-akten-cockpit-design-4kspzi-212026-08-0211:1711:400.38Runbook-Korrektur Datumsfelder (MED-D-265, reine Doku, keine Versionsänderung). CodeRabbit-Nachlese auf dem gemergten #304: Prefill sendet nur textTabs → ein Date-Tab für person.geburtsdatum bliebe leer. Runbook §9 Teil A Schritt 3 korrigiert (vorbefüllte Felder auf Text-Tabs, Date-Tabs nur für Unterzeichner-eigene Daten); neuer offener Punkt MED-OP-FORM-7 (§8). Quote-Nits bewusst nicht übernommen (Korpus „…“). check-doc-consistency.sh grün. Anlass: CodeRabbit-Review #304.
MED-2026-08-02-akten-cockpit-design-4kspzi-202026-08-0210:3511:170.70Runbook Fremdformular-Template + Doku-Welle-7-Teil (MED-D-264, reine Doku, keine Versionsänderung). Nutzer „ja" (Anleitung als Repo-Doc ablegen). Neu: Fremdformulare.md §9 Runbook (Template Klick-für-Klick anlegen: DocuSign-Tabs mit tabLabel=Weltmodell-Schlüssel → Verwaltung-Registrierung → Test; inkl. kanonischer tabLabel-Referenztabelle aus WELTMODELL_ATTRIBUTE). §8 korrigiert (MED-OP-FORM-6 „teilweise gebaut" statt „nicht bauen", Hausformular-Auto-Routing via dokumenttyp/MED-D-257 live) → B49 (MED-OP-DOKU-9) teilweise erledigt. Mitgezogen: die im #300-Merge verlorene cad8c82-Politur (Test-Uebersicht „bis zu 100 Seiten" + True-North-Satz; Decision-Log-Quote-Rationale). check-doc-consistency.sh grün. Doku: Fremdformulare.md §8/§9, HANDOFF §2+MED-OP-DOKU-9, Decision-Log MED-D-264, Test-Uebersicht, CHANGELOG. Anlass: Nutzer „ja" (Runbook ablegen).
MED-2026-08-02-akten-cockpit-design-4kspzi-192026-08-0209:3510:351.00CodeRabbit-Nachlese #299: stale-Attribut-Fix + Template-Paginierung (MED-D-263, 0.118.0->0.118.1, PATCH). #299 (MED-D-262) auto-mergte vor Review-Abschluss → CodeRabbit meldete 10 Befunde. Major (Funktionskorrektheit): templateGewaehlt akkumulierte die auto-erkannten Weltmodell-Attribute über Templatewechsel hinweg → falsche FremdformularVorlage.attribute; Fix: dsAutoErkannt-Tracking + Reset bei jedem Wechsel (Dropdown UND manuelle GUID via neuem templateIdManuellGesetzt) + Out-of-order-Guard gegen veraltete templateFelder-Antworten. Minor: listeTemplates() paginiert jetzt über nextUri (>2000 Templates). Nitpick: Fehler-Body im Wurf. +2 Vitest (646->648). tsc(Client+Server)+vitest(648)+ng build grün. Bewusst NICHT: Markdown-Quote-Nits (Repo nutzt „…") + CHANGELOG-PR-Link (MED-D-144). Doku: Decision-Log MED-D-263, HANDOFF §2, CHANGELOG, Test-Uebersicht (648), Sanity-Checkliste, Management-Summary, version.ts, lebende Stempel. Anlass: CodeRabbit-Review #299 (Drive-to-green des gemergten PR).
MED-2026-07-26-akten-cockpit-design-4kspzi-182026-07-2603:0004:151.25DocuSign-Templates ziehen + Felder anzeigen (MED-D-262, 0.117.1->0.118.0, MINOR). Nutzer: „Ziehe die vorhandenen DocuSign-Templates automatisch (Refresh-Kreisel) + zeige die Felder" + Options-Frage „Felder in DocuSign zeigen?" → per AskUserQuestion A/B/C erklärt (C vertieft), Nutzer wählte A (Konvention + App-Anzeige). Gebaut: Provider-Lesemethoden listeTemplates/templateFelder (DocuSign-Adapter + Fake-Stub), Admin-Routen, Verwaltung-Dropdown + Refresh-Kreisel + echte Feld-Anzeige mit Weltmodell-Match (✓/⚠), erkannte Felder auto-vorgemerkt. Reine Lese-Aufrufe. +2 Vitest (644->646). Mitgezogen: CodeRabbit-#298-Befund (Management-Summary-DocuSign-Status korrigiert). tsc(Client+Server)+vitest(646)+ng build+check-doc-consistency.sh grün. Grenze: live gegen echten DocuSign-Account erst beim Testen. Doku: Decision-Log MED-D-262, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (646), Management-Summary, version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Templates ziehen + Felder zeigen".
MED-2026-07-26-akten-cockpit-design-4kspzi-172026-07-2602:3503:000.42B41: Feld-Editor-Token-Fix (Vorzieh-Fix aus MED-OP-UX-12, MED-D-261, 0.117.0->0.117.1, PATCH). Nutzer „Ja" (B41 vorziehen). Der akte-feld-editor nutzte undefinierte CSS-Tokens --fg/--fg-faint/--gruen → hartkodierte Dark-Hex-Fallbacks griffen immer → Feldname-Text im Light-Theme nahezu unsichtbar. Fix: auf var(--text)/var(--mut)/var(--green) (theme-fähig) umgestellt, Fallbacks entfernt. Reine CSS → ng build grün, keine neue Unit (644). Mitgezogen: CodeRabbit-#297-Belegpfad-Nit im Audit-Doc. B41 in MED-OP-UX-12 als erledigt markiert (B42/B43 offen). check-doc-consistency.sh grün. Doku: Decision-Log MED-D-261, HANDOFF §2/§4, CHANGELOG, version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Ja" (B41 vorziehen).
MED-2026-07-26-akten-cockpit-design-4kspzi-162026-07-2601:3502:351.00Selbst-Rollenwahl in der UI (interim Admin-Bootstrap, MED-D-260, 0.116.1->0.117.0, MINOR). Nutzer: „Die Benutzer-Rolle soll zunächst in der UI auswählbar sein" (nachdem die Fremd-Formular-Verwaltung unsichtbar war). Diagnose via D1-Query: benutzer-Tabelle leer (0 Admins), AUTH_BOOTSTRAP_ADMIN greift nicht → jeder ist berater → Admin-Sektion (@if istAdmin()) unsichtbar. Sicherheits-Weiche per AskUserQuestion geklärt → gewählt „freie Selbst-Wahl". Gebaut: POST /api/ich/rolle (eigene Rolle setzen, ohne benutzer_verwalten-Guard, auditiert benutzer.eigene_rolle_gesetzt) + Verwaltung-Karte „Meine Rolle" (Dropdown, für alle sichtbar, lädt admin-Listen bei Wechsel nach). Proaktiv als RISK-31 geflaggt (Privilege-Escalation, akzeptiert-interim, nur hinter Cloudflare Access, Rückbau-Bedingung dokumentiert). +2 Vitest (642->644). tsc(Client+Server)+vitest(644)+ng build grün. Doku: Decision-Log MED-D-260, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (644), Risikoregister RISK-31, version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Rolle in der UI wählbar".
MED-2026-07-26-akten-cockpit-design-4kspzi-152026-07-2600:3501:351.00Meisterwerk-Audit-Refresh App + Doku auf v0.116.1 (MED-D-259, MED-OP-REVIEW-1, keine Versionsänderung). Nutzer: „Ja" (auf die Anregung, die 2 veralteten Audits zu aktualisieren — Bezugspunkt v0.99.12, 17 Minor zurück, Stale-Regel). Methode: 2 parallele Evidenz-Läufe (App-Client-Code-Sweep + Doku-Sweep), Datei:Zeile-Belege, Zitate gegengeprüft. App: Design-System-Kern hält ohne Regress; neue Flächen (DocuSign/Fremdformulare/Cockpit-Fokus/Mandate-Overlay) überwiegend sauber; neue Defekte in den 2 jüngsten Komponenten → B41 (hoch: Feld-Editor undefinierte Tokens → unsichtbarer Text), B42 (Rücklauf-Falsch-Leere), B43 (<24px) → MED-OP-UX-12; B36–B40 (MED-OP-UX-11) unverändert offen. Doku: mechanisch makellos (Stempel 0.116.1, 642/55, IDs geloggt); Doku↔Code-Drift → B49 (hoch: Fremdformulare.md beschreibt gebautes MED-OP-FORM-6 als „nicht bauen"), B50/B51/B52 → MED-OP-DOKU-9. Beide Audit-Docs neu gefasst; HANDOFF (MED-OP-REVIEW-1 + 2 neue Backlogs), Decision-Log MED-D-259, CHANGELOG. check-doc-consistency.sh grün (Audit-Staleness-Warnung entfällt). Reine Doku, kein Version-Bump (Zeitdokument, agents.md §6.7 Regel 4). Anlass: Nutzer „Ja" zur Audit-Aktualisierung.
MED-2026-07-26-akten-cockpit-design-4kspzi-142026-07-2623:4500:350.83CodeRabbit-Nachlese zu MED-D-257 (#292 gemergt, MED-D-258, 0.116.0->0.116.1, PATCH). #292 auto-mergte vor Review-Abschluss → Forward-Fix (frische Änderung, Branch neu von main). Drei reale Befunde: (A) eIDAS-Untergrenze (Major/RISK-2)versuchAusfuellbaresTemplate reichte ff.niveau durch; jetzt signiert es mit dem stärkeren aus Template-Niveau und Matrix/Override (staerkeresNiveau über SIGNATUR_NIVEAU-Ordnung), damit eine SES-Fassung keinen QES-Dokumenttyp abschwächt. (B) Eindeutiges Routing (Major)anlegen lehnt eine zweite aktive Vorlage je Hausformular-Dokumenttyp ab (sonst mehrdeutiger .find-Match). (C) G-8 — Verwaltung-Dropdown aus DOKUMENTTYP_LABEL abgeleitet statt hartkodiert; Client-Typ `Dokumenttyp
MED-2026-07-26-akten-cockpit-design-4kspzi-132026-07-2622:4023:451.08Hausformular auf ausfüllbare DocuSign-Fassung routen — Baustein 2 (MED-D-257, 0.115.0->0.116.0, MINOR, MED-OP-FORM-6). Nutzer wählte „Rücklauf-Weg 1: Kunde füllt in DocuSign → AD-009". Löst das MED-D-256-OFFEN: eine Weg-B-Vorlage (ausfüllbares DocuSign-Template, MED-D-248) ist jetzt optional an einen Hausformular-Dokumenttyp verknüpfbar — neues Feld FremdformularVorlage.dokumenttyp (Migration v49 ADD COLUMN, Model/Schema/Repos/anlegen-Validierung). SignaturService.anfordern routet beim Versenden eines verknüpften Hausformulars ohne Datei automatisch auf dieses Template (neuer Helper versuchAusfuellbaresTemplate: vorlageFuerBezeichnung→Dokumenttyp→aktive Vorlage; baueTabWerte-Prefill; anfordernAusTemplate; Identitäts-Mapping am bestehenden Dokument → AD-009-Rücklauf greift; Template-Niveau; PII-arm auditiert). Kunde füllt die offenen Felder selbst in DocuSign → AD-009 (MED-D-247). Kein Match → flache PDF bleibt (MED-D-256 Fallback). Nur E-Mail-Versand (anfordern), nicht Vor-Ort. Verwaltung-UI: Dropdown „Ausfüllbare Fassung von (Hausformular)". +3 Vitest (637→640). tsc(Client+Server)+vitest(640)+ng build+check-doc-consistency.sh grün (nur pre-existing Audit-Veraltet-Hinweise). Nicht-Code-Voraussetzung (Kunde): echtes DocuSign-Template anlegen (Tabs tabLabel=Weltmodell-Attribut) + verknüpfen, dann greift das Routing live. Doku: Decision-Log MED-D-257, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (640), version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Rücklauf-Weg 1: Kunde füllt in DocuSign → AD-009".
MED-2026-07-26-akten-cockpit-design-4kspzi-122026-07-2621:2522:401.25Eigenformular beim Versenden erzeugen + vorbefüllen (MED-D-256, 0.114.2->0.115.0, MINOR). Nutzer (Live, Makler-Alleinauftrag): „das Formular sollte erstellt und vorausgefüllt werden — die Eingaben vom Kunden sollen dann zurückfließen." Explore-Agent-Befund: der R12-DokumentgenerierungService existiert + kennt die Makler-Vorlage, aber der Unterschriften-Assistent rief ihn nie auf → 422 kein_inhalt. Baustein 1 gebaut: vorlageFuerBezeichnung (Dokument trägt nur Bezeichnung, keinen dokumenttyp → Titel-Match) + SignaturService.erzeugeEigenformular (befuelleVorlage→erzeugePdf→Ablage-PUT→nextcloudPfad am bestehenden Dokument), aufgerufen in anfordern/vorOrtVorbereiten wenn Bytes fehlen; Fremdformular ohne Vorlage bleibt kein_inhalt. Reuse der R12-Engine (G-1/G-2), kein Client-Change. +2 Vitest (635→637), 2 Test-Bezeichnungen auf Nicht-Vorlage umgestellt. tsc+vitest(637)+ng build+check-doc-consistency.sh grün. OFFEN — Baustein 2 (MED-OP-FORM-6): flache PDF ohne ausfüllbare Felder → Kunden-Rücklauf braucht die Weg-B-Fassung (Makler als DocuSign-Template); Empfehlung dokumentiert, wartet auf Kunden-Steuerung. Doku: Decision-Log MED-D-256, HANDOFF §2/§4 (MED-OP-FORM-6), CHANGELOG, Feature-Liste, Test-Uebersicht (637), version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Formular erstellen+vorausfüllen, Kundeneingaben zurückfließen".
MED-2026-07-26-akten-cockpit-design-4kspzi-112026-07-2620:0521:251.33Härtung nach dem DocuSign-Live-Vorfall: Push-Guardrail + Fehler-Redaktion (MED-D-255, 0.114.1->0.114.2, PATCH). Nachdem #288 versehentlich ein Duplikat gemergt hatte (DocuSign-Fix nie auf main — Commit auf detached HEAD, Push schob stale Ref) + Neuauflage #289: (A) Push-Guardrail gebaut — .githooks/pre-push bricht detached-HEAD-Push ab, core.hooksPath je Session via session-start-hook.sh, 4-Schritt-Push-Disziplin in agents.md §7. (B) CodeRabbit-#289-Nachlese am Signatur-Dienst: providerFehlerText redigiert E-Mails ([email]) vor 502/Log (G-6); Ablage-Read + Empfänger-Auflösung mit im try/catch (R2-Read-Fehler → provider_fehler, nicht 500), symmetrisch anfordern/vorOrtVorbereiten. +2 Vitest (633→635). Prod-Verifikation: #289 deployed (Worker modified_on > Merge-Zeit), die neue 422-Meldung „keine abgelegte Datei" erscheint live. tsc+vitest(635)+ng build+check-doc-consistency.sh grün. Doku: Decision-Log MED-D-255, HANDOFF §2, CHANGELOG, agents.md §7, Test-Uebersicht (635), version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Wie können wir so etwas in Zukunft verhindern?" + CodeRabbit #289.
MED-2026-07-26-akten-cockpit-design-4kspzi-102026-07-2618:5020:051.25DocuSign-Fehler im Live-System sprechend machen (MED-D-254, 0.114.0->0.114.1, PATCH, Bugfix). Nutzer meldete per Screenshot: beim „Versenden" im Unterschriften-Assistenten die generischen Toasts „Verbindung zum Server fehlgeschlagen" + „Anfrage fehlgeschlagen". Diagnose: die beiden Toasts stammen aus dem Interceptor (5xx) + dem Assistenten (!vorgaenge.length); der echte Grund war verborgen, weil die Signatur-Anfrage-Routen jeden DocuSign-Wurf als unbehandelten 500 durchreichten. Prod-Befund via Cloudflare-MCP-D1 (read-only, PII-arm): DocuSign funktioniert (2 signiert/1 gesendet), alle Erfolge mit hat_datei=1 → fileless Dokument = wahrscheinlichster Auslöser. Fix: SignaturService.anfordern/vorOrtVorbereiten prüfen beim echten Provider vorab (Bytes/Empfänger) + fangen Provider-Würfe ab → kein_inhalt/kein_empfaenger/provider_fehler(detail); Routen mappen via signaturFehlerAntwort auf 422/502 (statt 500), provider_fehler server-seitig PII-arm geloggt; Client-Interceptor bevorzugt bei 5xx die Server-Klartextmeldung, Assistent zeigt den konkreten Grund. +5 Vitest (628→633). tsc(Client+Server)+vitest(633)+ng build+check-doc-consistency.sh grün. Ehrliche Grenze: der exakte Live-Grund zeigt sich erst beim nächsten Versand mit der neuen Meldung (beide Ursachen abgedeckt). Doku: Decision-Log MED-D-254, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (633), version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „Bei DocuSign kommt immer noch eine Fehlermeldung im Live-System".
MED-2026-07-26-akten-cockpit-design-4kspzi-92026-07-2618:2518:500.42CodeRabbit-Nachlese zu MED-D-252 (#286 gemergt, MED-D-253, keine Versionsänderung). #286 auto-mergte vor Review-Abschluss → Forward-Fix (frische Änderung, Branch neu von main). Übernommen: (1) offenBeiKappe je Kontext-Zeile 3× ausgewertet → einmal via @let kontextOffen gecacht; (2) Kategorie-Chips im „Zu fakturieren"-Modus ausgeblendet (dort wirkungslos); (3) Doku-Konsistenz — Sanity-Checkliste #2-Zeile um „Zu fakturieren" ergänzt, Timesheet-Gesamt 196.4→196.2 an KW-Summe angeglichen, Management-Summary ≈185h→≈196h synchronisiert. Bewusst NICHT: N+1 in cockpit() (bereits N+1, Aggregat = eigener OP), CHANGELOG-Branch-Link (MED-D-144), Straight-Quote-Nitpicks (Repo nutzt durchgängig „…"), MD038 (nicht reproduzierbar, nicht im CI-Gate). ng build + check-doc-consistency.sh grün; 628 Vitest unverändert (reine Client-/Doku-Änderung). Doku: Decision-Log MED-D-253, CHANGELOG, Sanity-Checkliste, Timesheet, Management-Summary. Anlass: CodeRabbit-Review #286 (Drive-to-green des gemergten PR).
MED-2026-07-26-akten-cockpit-design-4kspzi-82026-07-2616:5518:251.50Cockpit-Fokus entschlackt + Mandant-Filter/-Suche + „Zu fakturieren" (MED-D-252, 0.113.1->0.114.0, MINOR). Nutzer: „Wie können wir diese Seite entschlacken? … einfacher Weg, um einen bestimmten Mandaten zu öffnen oder zu filtern, zB wo rechnungen offen sind." → gewählt „a+1+2+3". Recherche: die Fokus-Seite (cockpit.component.ts, 1258 Zeilen) baut auf offene Punkte als Items; Filterung lag nur in der versteckten Command-Palette. Umgesetzt: (A) „Als Nächstes" nach Mandant gruppiert (restGruppen), „Brennt" je Mandant dedupliziert (schlimmster Rückstand + Zähler), Kontext-Liste auf 6 gekappt (offenBeiKappe); (1+2) sichtbare Filterleiste — Mandant-Suche (fokusSuche) + Kategorie-Chips (fokusKat), speist sichtbareItems → Bahn/Brennt/Rail; Ring bleibt Tagesganzes; „Zurücksetzen" + eigener Leerzustand; (3) abgeleiteter MandantCockpit.offeneFakturierungMinuten (Server cockpit() summiert abrechenbar && !abgerechnet, G-2) + „Zu fakturieren"-Chip/Modus (Mandantenliste, Absprung Akte). CSS .mw-fchip. +1 Vitest (627→628, app.test.ts). tsc(Client+Server)+vitest(628)+ng build+check-doc-consistency.sh grün. Ehrliche Grenze: Server+Build+Unit verifiziert, Client-Strecke im Browser noch nicht interaktiv durchgeklickt. Abgrenzung „offen zu fakturieren" ↔ echte Rechnung (SevDesk) als Kundenpunkt MED-KB-12 festgehalten. Doku: Decision-Log MED-D-252, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (628), Kunden-Besprechungspunkte MED-KB-12, version.ts, CLAUDE.md, lebende Stempel. Anlass: Nutzer „a+1+2+3".
MED-2026-07-26-akten-cockpit-design-4kspzi-72026-07-2616:2016:550.58CodeRabbit-Nachlese zu Weg B (#284 gemergt, MED-D-251, 0.113.0->0.113.1, PATCH). #284 auto-mergte vor dem Review → Forward-Fix (frische PATCH-Änderung, Branch neu von main). Übernommene Befunde: (1) Unique je Template — Migration v48 (Dedup-UPDATE + CREATE UNIQUE INDEX idx_ff_vorlage_template), schema.templateId.unique(), Service-Vorabprüfung in anlegen + Memory-Repo-Guard; (2) kein verwaistes Dokumentstarten erstellt den Envelope (anfordernAusTemplate) vor createDokument (kein deleteDokument-Primitiv); (3) Fake markiereSigniert erhält formularWerte (spread ...vorher); (4) Client-Ladefehler (weltmodellAttribute/fremdformularVorlagen) surfacen statt still schlucken; (5) Wording „Tab-Name"→„Tab-Label (tabLabel)". +2 Vitest (625→627). tsc(Client+Server)+vitest(627)+ng build+check-doc-consistency.sh grün. Bewusst NICHT: MED-Präfix auf die Entität-ID (ungültig — nackte ULID via neueId()) + Straight-Quote-Nitpicks. Doku: Decision-Log MED-D-251, HANDOFF §2/§4, CHANGELOG, Feature-Liste, Test-Uebersicht (627), Management-Summary, Sanity-Checkliste, CLAUDE.md, version.ts, lebende Stempel. Anlass: CodeRabbit-Review #284 (Drive-to-green des gemergten PR).
MED-2026-07-26-akten-cockpit-design-4kspzi-62026-07-2613:2016:203.00Weg B gebaut: Fremd-Formular-Vorlagen über DocuSign-Templates/Tabs, live gegen DocuSign Demo verifiziert (MED-D-250, 0.112.0->0.113.0, MINOR). Nutzer „B implementieren" (setzt MED-D-248 um). Vertikale Umsetzung: neue Entität FremdformularVorlage {name, templateId, attribute[], niveau} (Migration v47, JSON-Attribut-Array, kein PDF-Blob/PII, G-1/G-6) + Repo (memory+d1+schema); Provider anfordernAusTemplate(TemplateAnforderung) (DocuSign-Adapter via compositeTemplates = Server-Template + Inline-Template mit Unterzeichner + vorbefüllten Text-Tabs), Fake mit letzteTemplate-Seam + Round-trip über formularRuecklauf; Domäne baueTabWerte (tabLabel=Attribut→Wert aus Stammdaten) + identitaetsMapping (macht die AD-009-Rücklauf-Maschine unverändert nutzbar, kein Zweitpfad); FremdformularVorlageService (Katalog-CRUD + starten = Dokument mit Identitäts-Mapping + Vorgang + vorbefüllter Template-Envelope). Routen /api/weltmodell-attribute (G-8-Katalog), /api/fremdformular-vorlagen (Admin einstellungen_verwalten), /api/mandanten/:id/fremdformular-vorlagen/:id/starten (Mandant-Scope-Chokepoint). Client: Verwaltung — Vorlagen registrieren (Name/Template-ID/Attribut-Mehrfachauswahl/Niveau) + Liste/Löschen; Akte „Alle Dokumente" — „Fremd-Formular aus Vorlage · vorbefüllt starten". Live verifiziert per temp. Node-Skript gegen demo.docusign.net: JWT → Template angelegtEnvelope aus Template (compositeTemplates) mit vorbefülltem Text-Tab → form_data {anschrift.plz:"40210"} zurückgelesen (Prefill landet) → Envelope gevoidet; Skript danach entfernt, nie Secret-Werte ausgegeben. +8 Vitest (617→625, neue api/fremdformular-vorlage.test.ts). tsc(Client+Server)+vitest(625)+ng build+check-doc-consistency.sh grün. Ehrliche Grenze: Client-Strecke build/unit-verifiziert, im Browser noch nicht durchgeklickt; der DocuSign-Template-Kern ist live belegt. Konvention (KB-11): Template-Rolle Unterzeichner. Doku: Fremdformulare.md §6/§8, Decision-Log MED-D-250, HANDOFF §2/§4, Feature-Liste, Test-Uebersicht (625), CLAUDE.md, version.ts, lebende Stempel. Anlass: Nutzer „B implementieren".
MED-2026-07-26-akten-cockpit-design-4kspzi-52026-07-2613:0513:200.25CodeRabbit-Nachlese zu MED-D-248 (#282 gemergt, MED-D-249, keine Versionsänderung). #282 auto-mergte vor dem Review → Forward-Fix (frische Änderung, Branch neu von main). 2/3 Befunde: (a) Katalog-Feldname überall auf {name, templateId, attribute[], eIDAS-Niveau} vereinheitlicht (war teils Niveau; klärt MD038); (b) MED-KB-11 (5) umformuliert — Kunden-Korrektur-Schleife ist per MED-D-89/MED-OP-FORM-4 verbindlich (nicht „ob nötig"), offen nur die Anwendung auf signierte Formulare; Fremdformulare.md §8 ergänzt. Bewusst NICHT: CHANGELOG-PR-Link (Repo-Konvention MED-D-144). Reine Doku. check-doc-consistency.sh grün. Anlass: CodeRabbit-Review #282 (Drive-to-green des gemergten PR).
MED-2026-07-26-akten-cockpit-design-4kspzi-42026-07-2612:3513:050.50PR #281 (0.110–0.112) gemergt + Entscheidung: Fremd-Formular-Einbindung = DocuSign-Templates/Tabs (Weg B, MED-D-248, keine Versionsänderung). (1) PR #281 (MED-D-245/246/247) als Ready + Auto-Merge/Squash → CI grün (Server/Client/Doku-Site + Doku-Konsistenz) → gemergt; CodeRabbit nur rate-limited (kein Befund). (2) Nutzerwahl „B" + „wie binden wir diese Formulare ein?": Weg B dokumentiert — je Formular einmalig ein DocuSign-Template mit Tabs (Ankertext bevorzugt), tabLabel = Weltmodell-Attribut-Schlüssel (Mapping = Identität → Prefill+Rücklauf ohne separate Feldnamen-Tabelle), Medidentas hält nur {name,templateId,attribute[],Niveau} (kein PDF-Blob, G-1/G-6); Laufzeit Envelope aus Template + Prefill + Signieren + form_data-Rücklauf (AD-009 unverändert). Deckt flache Bank-PDFs (die Weg A/pdf-lib nicht füllen kann); Weg A bleibt Schnellpfad für AcroForm-PDFs; Eigenbau-Editor (Weg C) bewusst verworfen (G-1). OP festgehalten (Nutzer): MED-OP-FORM-6 — Eigen-Formulare (R12) ebenfalls als DocuSign-Templates → Eigen+Fremd an einer Stelle; jetzt nicht bauen. Kundenklärung MED-KB-11. Reine Doku-/Entscheidungs-PR, kein Code. Doku: Fremdformulare.md §8, Decision-Log MED-D-248, HANDOFF §4 (MED-OP-FORM-5/-6), Kunden-Besprechungspunkte MED-KB-11, CHANGELOG. Anlass: Nutzer „pr, merge; dann erkläre mit Optionen … Fremd-Formulare" → „B. Wie binden wir diese Formulare ein? OP: … festhalten".
MED-2026-07-26-akten-cockpit-design-4kspzi-32026-07-2610:0512:352.50Formular-Rücklauf-Prüfung (AD-009, DocuSign form_data → Review-and-apply), live gegen DocuSign Demo verifiziert (MED-D-247, 0.111.0->0.112.0, MINOR). Nutzer: „AD-009, nutze für die Verifikation die env-Angaben hier in der Session." Zuerst geprüft: die Session-Env trägt jetzt echte DocuSign-Demo-Credentials (Private-Key 1676 Zeichen mit PEM-Header, GUIDs — anders als beim ersten Turn, wo nur Platzhalter da waren) → live-Verifikation aus der Session möglich. Recherche: der Prefill (Slice 1, MED-D-235) + die Feld-Sichtungs-Maschine (baueVorschlaege/bauePatch, MED-D-84/89) existieren bereits → AD-009 = Gegenrichtung + Anbindung, kein Neubau der Review-Logik (G-1/G-2). Gebaut: Provider formularRuecklauf(externalId) (optional); DocuSign-Adapter GET …/form_data; Fake setzeFormularWerte; Domäne ATTRIBUT_ZU_STAMMZIEL (nur verlustfrei rückschreibbare Person/Kontakt/Anschrift, satisfies STAMM_ZIELE) + ruecklaufRegeln; SignaturService.formularRuecklauf (Diff, on-demand, nichts persistiert, G-6) + ruecklaufUebernehmen (nur gewählt+gültig → versionierter updateMandant, neue Quelle formularquelle-Spalte plain TEXT → migrationsfrei) + Audit; 2 Routen mit Dokument-Scope-Guard; Client „Rücklauf prüfen"-Overlay (Diff-Liste, Checkbox je gültigem Feld). Live verifiziert per temp. Node-Skript gegen demo.docusign.net: JWT-Auth → Envelope mit Text-Datenfeld (captive In-Person, kein E-Mail-Versand) → form_data {f_plz:"40210"} zurückgelesen (exakter Adapter-Pfad) → Envelope gevoidet (Cleanup); Skript danach entfernt, nie Secret-Werte ausgegeben. +7 Vitest (610→617). tsc(Client+Server)+vitest(617)+ng build+check-doc-consistency.sh grün. Ehrliche Grenze: Client-Overlay build/unit-geprüft, im Browser noch nicht durchgeklickt (die Attrappe liefert ohne Seam leere Rückläufe; der reale form_data-Pfad ist gegen DocuSign belegt). Doku: design-decisions.md AD-009 (💡→✅), Fremdformulare.md Slice-2 ✅, Decision-Log MED-D-247, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (617), CLAUDE.md, version.ts, lebende Stempel. Anlass: Nutzer „AD-009 + Verifikation aus der Session".
MED-2026-07-26-akten-cockpit-design-4kspzi-22026-07-2609:0510:051.00Abgelaufene Dokumente als abgeleitete Aufgabe (nicht persistiert), AD-005 (MED-D-246, 0.110.0->0.111.0, MINOR). Nutzer-Entscheidung: „Aufgaben zu abgelaufenen Dokumenten u.ä. nicht persistieren, sondern ableiten — hält das Backlog sauber." Recherche: ein R3-Dokument mit überschrittenem gueltigBis war in beiden Ableitungs-Sichten unsichtbar (blieb geprüft/dokumentVorhanden → nicht dokumenteOffen; kein Auto-Setter auf Status abgelaufen) — AD-005 war nie gebaut. Umgesetzt, rein abgeleitet (G-2): reiner Helfer dokumentAbgelaufen(d, jetzt); AktenreifeInput.dokumenteAbgelaufen → eigener Reifepunkt (dokument/Stufe aktiv/wichtig = fällig, kein Abschluss-Blocker, D-41) + naechsteSchritte-Schritt dokumente-erneuern + offenePunkte()-Eintrag (überfällig, faelligAm = Gültigkeitsdatum). Getrennt von dokumenteOffen. Keine Wiedervorlage/Aufgabe persistiert (per Test bewiesen). Client: „erneuern"-TaskCard rendert bereits über naechsteSchritte (Akte) + Cockpit; roter „abgelaufen"-Chip in der Dokumentzeile jetzt auch abgeleitet aus gueltigBis (dokAbgelaufen()). +7 Vitest (603→610). tsc(Client+Server)+vitest(610)+ng build+check-doc-consistency.sh grün (nur pre-existing Audit-Veraltet-Hinweise). Doku: design-decisions.md AD-005 (💡→✅), Decision-Log MED-D-246, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Uebersicht (610), CLAUDE.md, version.ts, lebende Stempel. Anlass: Nutzer „ableiten statt persistieren".
MED-2026-07-26-akten-cockpit-design-4kspzi2026-07-2608:1509:050.83Build-Version dauerhaft in der UI (inkl. Build-Zeitpunkt) + Design-Übernahme-Statusabgleich (MED-D-245, 0.109.1->0.110.0, MINOR). Nutzer: „Zeige immer die Build-Version in der UI mit an inkl. Zeitpunkt des Builds" + Frage nach offenen Punkten/Abweichungen der Screenshot-Design-Übernahme. Befund: die App-Shell-Kopfzeile trug v… · build … · {Zeitpunkt} schon — aber die zwei Vollbild-Hauptsichten (Cockpit /, Akte /mandant/:id) rendern mit eigener Chrome ohne diese Shell (Cockpit zeigte gar keine Version, Akte nur die SemVer). Beide tragen jetzt den vollen Stempel: Cockpit-Header-Chip (version-Signal + buildZeitText, .mw-nowrap-Atom neu in styles.css) + Akte-„Stand:"-Zeile (version-Signal von string auf {version,build,buildZeit} erweitert). Reine Client-Anzeige über den bestehenden GET /api/health; kein Server-/Persistenz-Change, BUILD_NUMBER/BUILD_ZEIT bleiben git-gestempelt (gen-build-number.mjs, OP-PM-1). Öffentliche Kundenstrecken bewusst außen vor (keine Shell/kein /api). Doku-Konsistenz (OP-DOCS-1): überholte „Stammdaten-Overlay read-only"-Notiz in Akten-Cockpit-Redesign.md §4 auf MED-D-241-Stand (direkt editierbar) korrigiert. Design-Übernahme-Status (Antwort an den Nutzer, keine Code-Änderung): alle 6 Slices S1–S6 + 10 akte-patterns-Komponenten ✅; offen bleiben nur die an die echte DocuSign-Anbindung (OP-SIGN-1) gekoppelten Punkte — DocumentRow-Send-Zustände (versendet/„Erinnern"/„Signiert hochladen"), AD-009 Formular-Rücklauf-Prüfung (MED-OP-FORM-5 Slice 2), AD-005-Auto-Aufgabe bei Ablauf, echter Feld-Editor, persistierte versendet/nicht_erforderlich-Enum-Flags — plus die bewussten dokumentierten Divergenzen (Token statt Prototyp-Literal, Swipe-Direkt-Commit). ng build grün, vitest unverändert (603, reine UI-Anzeige). Doku: CHANGELOG, Decision-Log MED-D-245, HANDOFF §2, Feature-Liste, Akten-Cockpit-Redesign.md, CLAUDE.md, version.ts, lebende Stand-Stempel. Anlass: Nutzer „Build-Version anzeigen + Design-Status".
MED-2026-07-25-akten-cockpit-design-4kspzi-42026-07-2523:5000:150.42AD-006-Nachlese: Sicherheits-Forward-Fix zum gemergten #279 (MED-D-244, 0.109.0->0.109.1, PATCH). CodeRabbit-Review zu #279 (AD-006) fand einen realen, sicherheitsrelevanten Befund: die Routen POST /api/dokumente/:docId/signatur + /signatur/vor-ort trugen keinen Sichtbarkeits-Guard — mit dem neuen Empfänger-Override hätte ein Berater ein fremdes Dokument (fremde docId) an eine beliebige E-Mail senden können (Daten-Exfiltration). Befund gegen ladeDokScope/die Routen verifiziert (real). Fix: ladeDokScope (bisher nur Fremdformular-Strecke) auf gemeinsamen Scope hochgezogen + vor leseEmpfaenger/anfordern/vorOrtVorbereiten in beide Signatur-Routen → Fremd-Mandant 404 (kein Existenz-Leak), Schreiben verlangt mandant_bearbeiten. Zwei weitere valide Befunde: vor Ort ohne Empfänger-E-Mail (In-Person eingebettet); Hinweis "… geht an diese Person" → "… bei Bedarf ändern". Bewusst NICHT: CLAUDE.md-Refactor + CHANGELOG-PR-Link (MED-D-140/144). +1 Vitest HTTP-Guard (602→603, fremd→404 ohne Provider-Aufruf, eigen→201). Log-Hygiene: 2 stale CHANGELOG-Dubletten (merge=union) geglättet — u. a. eine mit Klarnamen-PII (aus MED-D-240-Fix, re-appended). tsc(Client+Server)+vitest(603)+ng build+check-doc-consistency.sh grün (nur pre-existing Audit-Veraltet-Hinweise MED-OP-REVIEW-1). Doku: CHANGELOG, Decision-Log MED-D-244, HANDOFF §2, Feature-Liste, Test-Uebersicht (603), CLAUDE.md, version.ts+Stempel. Anlass: CodeRabbit-Review #279 (Drive-to-green des gemergten PR).
MED-2026-07-25-akten-cockpit-design-4kspzi-32026-07-2523:1023:500.67PR #278 gemerged + AD-006 editierbarer Empfänger gebaut (MED-D-243, 0.108.0->0.109.0, MINOR). (1) Merge #278 (AD-014) grün auto-gemerged. (2) AD-006 (Nutzer: "AD-006"): Explore-Recherche ergab, dass der Assistent-Kern ✅ ist — es fehlte nur das editierbare Empfänger-Feld im Versenden-Schritt; der Provider-Vertrag (unterzeichner) trug den Empfänger schon. Ein optionaler empfaenger-Override durch alle Schichten gefädelt: Client-Feld (vorbelegt aus Mandant-Kontakt + Zeichnungsberechtigter-Hinweis aus Bankkonto-Daten) → api.service → Routen (leseEmpfaenger-Validierung: Remote-E-Mail Pflicht/400, vor Ort optional) → SignaturService (Override schlägt Mandant-Default). Kein neues PII persistiert (nur Versand, G-5/G-6); Provider unverändert (G-1). +2 Vitest (600→602, aufzeichnender Stub-Provider). tsc(Client+Server)+vitest(602)+ng build+check-doc-consistency.sh grün. Doku: CHANGELOG, Decision-Log MED-D-243, HANDOFF §2, Feature-Liste, Test-Uebersicht (602), CLAUDE.md, version.ts+Stempel. Anlass: Nutzer "AD-006".
MED-2026-07-25-akten-cockpit-design-4kspzi-22026-07-2522:0022:350.58PR #277 gemerged + AD-014 "Über den Link hochgeladen"-Liste gebaut (MED-D-242, 0.107.0->0.108.0, MINOR). (1) Merge #277: Konflikt-Auflösung main->Branch — echte ID-Kollision (main-#276 hatte MED-D-240 für eine Nachlese, mein Branch ebenfalls) → Design-Arbeit branchweit auf MED-D-241 umnummeriert (14 Dateien), Decision-Log-Konflikt aufgelöst; CI triggerte erst nach lokalem Git-Push (user-Proxy) statt Bot-Identität → auto-merge grün. (2) AD-014 (Nutzer: "AD-014-Upload-Liste"): Handoff-Recherche ergab, dass "Über den Link hochgeladen" = angeforderte Dokumente + Upload-Status (nicht je-Token-Uploads; Upload-Links sind je Dokument). Das Self-Service-Panel zeigt jetzt mandantweit angefordert/erhalten mit Prüfen-Aktion — reine Client-Sicht über api.dokumente + api.dokumentStatusSetzen, keine neue Persistenz/Migration/Public-Endpunkt (G-1/G-2/G-8). ng build + Doku-Check grün; 600 Vitest unverändert (getestete Endpunkte). Doku: CHANGELOG, Decision-Log MED-D-242, HANDOFF §2, Feature-Liste, CLAUDE.md, version.ts+Stempel. Anlass: Nutzer "PR, merge, dann nächstes" -> "AD-014-Upload-Liste".
MED-2026-07-25-akten-cockpit-design-4kspzi2026-07-2515:3018:553.42Akten-Cockpit-Design-System exakt übernommen (Handoff "Akten-Cockpit 1a Detail", MED-D-241, 0.106.2->0.107.0, MINOR). Nutzer: "Übernehme das Design System exakt — bei Widersprüchen zu bisherigen Festlegungen frage mich." claude_design-MCP nicht autorisierbar (kein interaktives /design-login) → Handoff-ZIP (Prototyp .dc.html + akte-patterns.md + design-decisions.md AD-001…015 + 17 Screenshots). Befund über 5 Recherche-/Diff-Subagenten: Design = MED-D-188 bereits gebaut → präzise Rekonziliation gegen den finalen Prototyp, kein Neubau. 4 AskUserQuestion-Weggabelungen (Stammdaten "Prototyp exakt"/Lifecycle-Wording+Edit behalten/Assistent ergänzen+Technik behalten/Onboarding angleichen+getrennt). Umgesetzt (Client, mandant-detail selbst + 4 Sub-Komponenten via parallele Impl-Agenten): LifecycleRing 5 SVG-Bögen + Tooltip; "Mandats-Status"→"Lebenszyklus des Kunden" (AD-001); volles Rail-Stammdaten-Grid; "Anstehende Aufgaben"-TaskCards + rotes "N blockierend"-Pill in die Kontext-Spalte (redundante Mittelkarte entfernt); editierbare Stammdaten (Server-PATCH um telefon/geburtsdatum/strasse/plz/ort erweitert — Persistenz/Version/Audit trugen die Felder schon, G-4; löst MED-D-147 auf Nutzerwunsch ab); Versions-Pille "Stand: vN·Datum"; VersionedField "vN·bis Datum·Wert·Quelle"; Wording in Bank/Self-Service/Mandat-Overlay/Assistent. Compliance proaktiv: Steuernummer/Steuer-ID NICHT übernommen (§139b AO/DSGVO → RISK-30/MED-KB-10). Deferiert ehrlich (kein Fake): AD-014-Upload-Liste + AD-006-Empfänger-Feld. +1 Vitest (599→600). tsc(Client+Server)+vitest(600)+ng build+check-doc-consistency.sh grün. Doku: Decision-Log MED-D-241, CHANGELOG, HANDOFF, Feature-Liste, Test-Uebersicht, Risikoregister, Kunden-Besprechungspunkte, CLAUDE.md, version.ts+Stempel. Anlass: Nutzer "Übernehme das Design System exakt".
MED-2026-07-25-docusign-credentials-check-22026-07-2518:2018:350.25Nachlese zu #275: CodeRabbit-Doku-Befunde (MED-D-240, keine Versionsaenderung). Nach Auto-Merge von #275 trafen 3 valide CodeRabbit-Befunde ein → Forward-Fix (gemergter PR abgeschlossen, frische Aenderung, Branch neu von main): (1) PII-Wording (Klarname → „kein eingeloggter Nutzer-Account", G-5/G-6); (2) Deploy §7d + HANDOFF-OP-SIGN-1-Rest nennen die embedded-In-Person-Strecke (MED-D-236) explizit als noch-nicht-durchgeklickt/kein-Prod-Rechtssignatur-Pfad; (3) unpaariger Literal „Invalid character" → gerade Quotes. Bewusst nicht: Bullet-Konsolidierung + falscher #274-Link. check-doc-consistency gruen. Anlass: CodeRabbit-Review #275.
MED-2026-07-25-docusign-credentials-check2026-07-2513:4815:121.40DocuSign end-to-end verifiziert (Demo-E2E + Parser-Haertung MED-D-238, 0.106.1->0.106.2, PATCH; Webhook-Write-back in Prod MED-D-239; OP-SIGN-1). Nutzer: „checke die credentials fuer docusign" → „teste ende-zu-ende mit den Demo-Credentials" → „verifiziere den Webhook-Write-back gegen den deployten Worker" → „wrap-up, pr, merge". (1) Zwei Credential-Ebenen getrennt (MCP-Connector=Prod na3 vs. App-Secrets=Demo). (2) Demo-Credentials im Env → echten DocuSignSignatur-Adapter live gegen demo.docusign.net (temp. Skript, danach entfernt): JWT/Consent/Envelope(c4fe2244…)/status/erinnern/Webhook-HMAC/void ✅. Bug: pkcs8PemToBuffer warf „Invalid character" — Demo-Key hatte kaputten PEM-Footer (4 statt 5 Hyphens) → Parser delimiter-/\n-tolerant gehaertet, +1 Vitest (598→599). (3) Webhook-Write-back in Prod belegt (Cloudflare-MCP D1-Query + curl-Probe): 2 vollstaendig durchgelaufene docusign-Vorgaenge (signiert/unterschrieben + R2 + Audit); Ausloeser=Webhook via Audit-actor=system + 54-s-Push. (4) Wrap-up: main war weiter (#274 belegte MED-D-235/236/237 + Version 0.106.1) → meine IDs auf MED-D-238/239 umnummeriert, auf main neu aufgetragen (Code auto-gemerged, Doku frisch), 599 Tests gruen. Doku: CHANGELOG, Decision-Log MED-D-238/239, HANDOFF §4, Deploy.md §7d, Feature-Liste, Test-Uebersicht, CLAUDE.md, version.ts+Stempel; Aggregat je Session. Anlass: Nutzer „wrap-up, pr, merge".
MED-2026-07-25-app-ux-process-review-2pabmc-host2026-07-2513:5514:200.42In-Person-Host = eingeloggter Berater (MED-D-237, 0.106.0->0.106.1, PATCH; OP-SIGN-1). Nutzerfrage „Muessten die Host-Werte nicht vom eingeloggten Berater kommen?" → ja (korrekter DocuSign-Audit-Trail, G-4). Server leitet den In-Person-Host aus der eingeloggten Identitaet ab (akteurVon(c).email + benutzer.anzeigename) und reicht ihn an vorOrtVorbereiten/vorOrtSignaturUrl durch (Provider/DocuSign-Adapter um optionalen host-Parameter, Typ VorOrtHost erweitert); DOCUSIGN_HOST_* bleiben Fallback. Kein Client-Change (Host serverseitig). Harte Voraussetzung dokumentiert: Berater-E-Mail muss DocuSign-Account-Nutzer sein; Anlage+Ansicht nutzen denselben Host (DocuSign matcht). +1 Vitest (597→598); tsc+vitest+ng build+check-doc-consistency gruen. Live gegen DocuSign weiter offen (OP-SIGN-1). Doku: Decision-Log MED-D-237, CHANGELOG, HANDOFF §2, Feature-Liste, Test-Uebersicht, Unterschriften.md, Deploy.md §7d-2c, CLAUDE.md, version.ts+Stempel; Aggregat je Session. Anlass: Nutzer-Rueckfrage zum Host.
MED-2026-07-25-app-ux-process-review-2pabmc-inperson2026-07-2512:4013:551.25Echte Vor-Ort-/In-Person-Signatur (DocuSign embedded) + irrefuehrenden 409 entfernt (MED-D-236, 0.105.0->0.106.0, MINOR; OP-SIGN-1). Nutzerfund (Screenshot): bei echtem DocuSign warf „Vor Ort abschliessen" einen 409 — der Vor-Ort-Weg lief nur ueber die Attrappe (abschliessenDemo, die echte Provider bewusst nicht bieten). Nutzer „ja" auf Bau + Secrets vorhanden. Echte In-Person-Signatur gebaut: SignaturProvider um vorOrtVorbereiten (captive/embedded recipient → kein E-Mail-Versand) + vorOrtSignaturUrl (recipient view) erweitert; DocuSign-Adapter implementiert beide (In-Person-Envelope mit clientUserId, Host = Berater via DOCUSIGN_HOST_NAME/_EMAIL). Service vorOrtVorbereiten() (In-Person wo verfuegbar, sonst Fake-Fallback → eingebettet-Flag) + vorOrtSignaturUrl(); neue Routen + same-origin-Sentinel /oeffentlich/signatur/vor-ort-fertig. Client: iFrame laedt die Signatur-URL (sequenziell bei mehreren Dok.), erkennt signing_complete same-origin → abgleich+Write-back → Dokument erhalten. Demo-Banner/-Schnellabschluss nur noch beim Fake (istEcht-Gate). Sicherheitsriegel unveraendert (echter Adapter ohne abschliessenDemo → Attrappe weiter 409). +5 Vitest (592→597); tsc+vitest+ng build+check-doc-consistency gruen. Ehrliche Grenze (wie MED-D-220): echter In-Person-Roundtrip noch nicht live gegen DocuSign verifiziert (keine Secrets/Netz in der Session) → OP-SIGN-1 offen, Runbook Deploy.md §7d (In-Person-Schritt 8 ergaenzt). Doku: Decision-Log MED-D-236, CHANGELOG, HANDOFF §2, Feature-Liste, Test-Uebersicht, Unterschriften.md, Deploy.md, CLAUDE.md, version.ts+Stempel; Aggregat je Session. Anlass: Nutzer „ja" (Bau echt vor Ort).
MED-2026-07-25-docusign-live-runbook2026-07-2511:3011:500.33DocuSign-Live-Verifikation-Runbook (MED-D-234, keine Versionsaenderung, reine Doku). Nutzerfrage „Kannst du DocuSign testen?": Unit-Tests gelaufen (10/10 gegen gemocktes fetch), Live-Test aus der Session unmoeglich (keine Secrets — dormant, G-5; kein Sandbox-Konto/Consent). Rueckfrage → Nutzer waehlte „nur Unit-Tests reichen", dann „Runbook". Der bestehende Deploy.md-§7d-Runbook beschrieb das Scharfschalten, aber nicht die Verifikation danach (OP-SIGN-1-Rest). Ergaenzt: „7d-Live-Verifikation (Smoke-Test)" — 7 Schritte gegen Demo-Account (Konfiguration greift · JWT/Consent · Envelope/Zustellung · Webhook-Write-back Kern · Pull-Fallback RISK-6 · Dormant-Negativtest · QES-AES-Hinweis) + Abnahmekriterium. Bewusst kein Provider-Health-Endpoint (G-6). Cross-Link aus Unterschriften.md. check-doc-consistency gruen. Anlass: Nutzer „Runbook".
MED-2026-07-25-wording-markierung-zentral2026-07-2511:1011:300.33S6-Feinschliff: Wording-Zentralisierung Kunden-Feldmarkierung (MED-D-233, 0.104.2->0.104.3, PATCH). Nutzer „S6 Rest" (zweiter/letzter S6-Feinschliff-Rest = Wording). Das Enum→Deutsch-Mapping von FeldMarkierung (weiss_nicht→„weiß ich nicht", nachgeliefert→„wird nachgeliefert") stand 3x dupliziert: lokale Map MARKIERUNG_TEXT (formular-public), hartkodierter Chip-Button-Text (pub-bausteine, das Kundeneingabe-Bauteil), Inline-Ternaer (akte-formulare, Berater-Sicht). → ein MARKIERUNG_LABEL in labels.ts (G-3, analog B33), alle drei Stellen darauf umgestellt. Wertident (kein Textunterschied); tsc+ng build gruen, Server/Tests unberuehrt (574). Bewusst nur die eindeutige 3fach-Dopplung gehoben — einmalig genutzte lokale Maps (KLASSE_LABEL) bleiben lokal (YAGNI). Damit S6-Feinschliff vollstaendig (mit MED-D-232) → Akten-Cockpit-Redesign ohne offene Politur-Reste. Doku: Decision-Log MED-D-233, CHANGELOG, Feature-Liste, Akten-Cockpit-Redesign (S6-Note), version.ts+Stempel; Aggregat je Session. Anlass: Nutzer „S6 Rest".
MED-2026-07-25-motion-token-reduced-motion2026-07-2510:5011:100.33S6-Feinschliff: Motion-Kurve zentralisiert + Reduced-Motion gehaertet (MED-D-232, 0.104.1->0.104.2, PATCH). Nutzer waehlte Track 3 (niedrigprio Politur, globale Motion-Kurve). Die Design-Ease-out-Kurve cubic-bezier(0.22,1,0.36,1) (Fidelity MED-D-219) stand als 6x Literal (5x styles.css, 1x inline im Aktenreife-Ring cockpit.component.ts) → ein Token --mw-ease im Basis-:root (theme-unabhaengig), ueberall var(--mw-ease) (G-2). Zusaetzlich prefers-reduced-motion: reduce von nur Scrim/Overlay-Panel auf die dekorativen Entrance-Pops/Fades (.mw-card/.mw-cmd/.mw-cmd-overlay/.mw-empty) erweitert (WCAG 2.3.3); BankRow-Peek bereits ueber no-preference gegatet. Wertident (kein visueller Unterschied, reine Zentralisierung + A11y); Verifikation via ng build (validiert CSS-Parse + var-Aufloesung) — kein Browser-Run noetig, da Kurvenwert byte-identisch. Server/Tests unberuehrt (574). Wording-Zentralisierung (zweiter S6-Rest) bewusst als eigener spaeterer bounded Slice belassen. Doku: Decision-Log MED-D-232, CHANGELOG, Feature-Liste, Akten-Cockpit-Redesign (S6-Note), version.ts+Stempel; Aggregat je Session. Anlass: Nutzer „3".
MED-2026-07-25-app-ux-welle-9-rest2026-07-2510:2510:500.42App-UX-Welle 9 Rest: Auftrag-Playbook-Fehler sichtbar + MED-OP-UX-8 abgeschlossen (MED-D-231, 0.104.0->0.104.1, PATCH). Nutzer waehlte „App-UX-Welle 9 Rest (B8–B12)". Bestandsaufnahme zeigte: B8 (Cockpit-Chip-Overflow), K1 (AKTION_LABEL['beratungsdoku.geprüft']), K2 (aria-describedby+role=alert am Lifecycle-Fehler), K3 (Fragebogen-Legende, bewusst produkt-eigen) waren bereits bei frueheren Wellen erledigt — HANDOFF-Backlog veraltet. Einziger echter Rest: auftrag.playbook_fehler (Produkt-/Status-Playbook scheitert) wurde nur auditiert, nie dem Nutzer gemeldet (anders als der Mandant-Pfad seit B15). Fix: transientes playbookFehler-Flag aus anlegen/statusSetzen (Muster 1:1 vom Mandant-Pfad, kein Entitaets-Feld), Route flacht es auf die Antwort, Client warnt „⚠ Standard-Aufgaben konnten nicht angelegt werden". +2 Vitest (572→574). tsc+vitest+ng build gruen; Verifikation via Server-Unit-Tests (forcierter Playbook-Fehler) + ng build. Doku: Decision-Log MED-D-231, CHANGELOG, HANDOFF §5 (MED-OP-UX-8 ✅), Test-Uebersicht, version.ts+Stempel; Aggregat je Session fortgeschrieben. Anlass: Nutzer „naechster Schritt" + Track-Wahl.
MED-2026-07-25-akte-fremdformular-delta-d2026-07-2510:0010:250.42Akten-Cockpit Delta D: Fremdformular-Markierung + Feld-Editor-Hinweisbox im Pruefen-Schritt (MED-D-230, 0.103.0->0.104.0, MINOR). Nach Merge von #268 (Delta C, still bestaetigt + unsubscribed; GitHub-GraphQL war zunaechst rate-limited -> per Check-in nachgeholt, Nutzer schaltete #268 manuell ready, dann direkt gemergt) frisch von main. Nutzer-Entscheidung „erst C mergen, dann D". Der an OP-SIGN-1 gekoppelte, aber jetzt schon baubare Teil von Delta D: (1) Fremdformular-Klassifikation rein abgeleitet — ein Dokument ist Eigenformular, wenn seine Bezeichnung eine bekannte Vorlage (DOKUMENTTYP_LABEL, G-2 = eine Quelle) traegt, sonst Fremdformular; keine neue Persistenz/Enum-Flags (die bleiben deferiert). (2) Markierung am Dokument: amber „Fremdformular"-Pill in der Schritt-1-Dokumentliste. (3) Neutrale Hinweisbox statt Formular-Vorschau: bei gewaehlten Fremdformularen wird die (bei unbekannter Feldstruktur sinnlose) Vorschau durch eine Box „Fremdformular — Felder im Feld-Editor setzen" + Button „Im Feld-Editor öffnen →" ersetzt; die Vorschau bleibt nur fuer Eigenformulare. KEIN Eigenbau-Feld-Editor (G-1) — der Button meldet ehrlich „folgt mit der DocuSign-Anbindung (OP-SIGN-1)" (kein Attrappen-Editor, MED-KB-5). Rein Client, kein Server-/Enum-Change; Server-Tests unveraendert 572. tsc+ng build gruen; Verifikation via Build (validiert Template) — kein e2e-Harness im Repo. Doku: Decision-Log MED-D-230, CHANGELOG, Feature-Liste, HANDOFF, Akten-Cockpit-Redesign, version.ts+Stempel; Aggregat je Session fortgeschrieben. Anlass: Nutzer „erst C mergen, dann D".
MED-2026-07-25-akte-pruefen-schritt-ausbau2026-07-2509:1510:000.75Akten-Cockpit Delta C: Pruefen-Schritt des Unterschriften-Assistenten ausgebaut (MED-D-229, 0.102.0->0.103.0, MINOR). Nutzer waehlte per Rueckfrage Delta C = „Pruefen-Schritt ausbauen" (A/B/C/D war im Repo nie ausbuchstabiert -> Kandidaten vorgelegt). Assistent-Schritt 1 (§2.5) um drei Bloecke erweitert: (1) Pflichtdaten-Checkliste (Name/E-Mail/Anschrift/Geburtsdatum, ✓ aus Stammdaten/● fehlt, abgeleitet read-only); (2) SEPA-Konto-Auswahlkarten (nur SEPA-Kontext) + Inline „Neues Konto erfassen" via bestehende Bankkonto-Route, effektivKontoId steuert den SEPA-Write-back; (3) Formular-Vorschau read-only. mandant-Input neu, Assistent laedt Bankkonten selbst. Scope-Entscheidung: KEIN Inline-Schreiben fehlender Mandant-Stammdaten (kreuzt die MED-D-147-editierbar-Grenze/Audit-Design) -> fehlende Felder markiert + Verweis Self-Service/Formular. Rein Client, kein Server-/Enum-Change; Server-Tests unveraendert 572. tsc+ng build gruen; Verifikation via Build (validiert Template) — kein e2e-Harness im Repo. Doku: Decision-Log MED-D-229, CHANGELOG, Feature-Liste, HANDOFF, Akten-Cockpit-Redesign, version.ts+Stempel; Aggregat je Session fortgeschrieben (MED-D-228). Anlass: Nutzer „naechster schritt" + Slice-Wahl.
MED-2026-07-25-timesheet-aggregat-mgmt-summary2026-07-2508:5509:150.33Timesheet-KW-Aggregat-Konvention + Management-Summary „investierte Zeit" (keine Versionsaenderung, reine Doku/Konvention). Nutzer: „Das Aggregat pro KW muss immer auch aktualisiert werden" + „wir brauchen eine Management-Summary — wo stehen wir, was steht an, wieviel Zeit investiert". Umgesetzt: (1) Timesheet-Methodik + agents.md §4 — das KW-Aggregat + Gesamtsumme wird jetzt je Session mitgezogen (nicht mehr „nach Wochenschluss geglaettet"); (2) Gesamt-Zeile ins Aggregat (~174 h, KW27–KW30); (3) Management-Summary „Investierte Zeit"-Zeile (~174 h, Link zum Timesheet) — „wo stehen wir"/„was steht an" standen bereits in §4/§5. check-doc-consistency gruen. Anlass: Nutzer-Vorgaben Aggregat + Management-Summary.
MED-2026-07-25-akte-slice-b-inperson-signing2026-07-2508:1508:550.67Akten-Cockpit Slice B: Vor-Ort→Erhalten + gefuehrte In-Person-Strecke + Write-back-Automatik (MED-D-227, 0.101.0->0.102.0, MINOR; MED-D-192-Rest). Nach Merge von #262/#263/#264 (alle drei sauber gemergt, still bestaetigt + unsubscribed). Selbst-Audit der Signatur-Strecke gegen akte-patterns §2.5: vorOrtAbschluss (Demo) lief durch denselben abgleich-Write-back wie der echte E-Sig-Pfad -> Dokument faelschlich unterschrieben+Item geprueft (Falsch-Nachweis, Attrappe erzeugt keine rechtsgueltige Signatur, G-4/MED-KB-5), widersprach der MED-D-223-Entscheidung 1. (1 Server) gemeinsamer erhaltenAblegen-Helfer mit Sign-on-Paper -> Vor-Ort landet auf erhalten (Pruefung offen), Vorgang signiert, Demo-Fassung in die Ablage, Audit signatur.vor_ort_abgeschlossen, Onboarding-Item unangetastet, idempotent; echter DocuSign-Webhook-abgleich bleibt auf unterschrieben/geprueft. (2 Client) gefuehrte In-Person-Strecke im Assistenten (Uebergabe -> Kunden-Signaturansicht mit "Jetzt signieren" -> Danke/Rueckgabe -> Schritt 3, Vollflaechen-Takeover) statt Ein-Klick. (3 Client) Write-back-Automatik: bei Abschluss SEPA-Konto -> gueltig (ersetzt manuellen Button) + ausloesende Aufgabe -> erledigt (neuer aufgabeId-Input aus dem Task-Einstieg), best-effort+idempotent, Ergebniskarte. Labels ergaenzt. Server-Vitest 571->572 (Vor-Ort->erhalten + Idempotenz + Audit-Assertion). tsc+vitest+ng build gruen; Verifikation via Server-Unit-Tests + ng build (validiert Template-Kontrollfluss) — kein seedbarer e2e-Harness im Repo, kein Playwright-Klickdurchlauf. Doku: Decision-Log MED-D-227, CHANGELOG, Feature-Liste, Test-Uebersicht, HANDOFF, Akten-Cockpit-Redesign, Design-Entscheidungen-Akte, version.ts+Stempel. Anlass: Nutzer "Nach Merge aller drei steht Akte Slice B an".
MED-2026-07-25-ci-cache-gh-hosted2026-07-2507:2507:450.33CI-Speedup fuer GH-hosted Runner (MED-D-225, keine Versionsaenderung). Nutzerfrage "Can we speed up the pipelines? GH hosted runners." Diagnose: CI war fuer self-hosted Dauer-Runner getunt (warmes ~/.npm + .angular/cache via clean:false) -> auf GH-hosted ephemer wirkungslos, npm ci/ng build kalt. Fix (Subagent-Implementierung, Diff+YAML nachgeprueft): konditionaler cache:npm an allen setup-node (nur GH-hosted via fork oder CI_RUNNER == 'ubuntu-latest', cache-dependency-path je Lockfile) in ci.yml/app-deploy/docs-deploy; .angular/cache per actions/cache@v4 nur GH-hosted im client-build; auto-rerun.yml auf GH-hosted stillgelegt (bleibt Fallback). Self-hosted unregressiert (cache:leer). Alle 4 YAML validiert. agents.md §6.6 aktualisiert. Erwartung CI ~2m->~60-75s. Doku: Decision-Log MED-D-225, CHANGELOG, agents.md. Anlass: Nutzer "ja".
MED-2026-07-25-nachlese-med-d-225-docfix2026-07-2507:5508:100.25Nachlese MED-D-225: Doku-Korrekturen aus CodeRabbit-Review #264 (MED-D-226, keine Versionsaenderung). 5 valide Minor-Befunde gegen auto-rerun.yml/ci.yml verifiziert + gefixt: auto-rerun-Bedingung war invertiert beschrieben (Guard != 'ubuntu-latest' aktiviert self-hosted, nicht umgekehrt) in CHANGELOG + Decision-Log; rohes `
MED-2026-07-25-akte-documentrow-statemachine2026-07-2506:2007:050.75Akten-Cockpit Slice A: DocumentRow-Zustandsmaschine (AD-008, MED-D-223, 0.100.0->0.101.0, MINOR). Nutzer lieferte das Akten-Cockpit-Design erneut (inline-AD-Kommentare); Gap-Audit (Subagent) zeigte: Spec identisch zum gebauten Import MED-D-218, echte Delta = die an DocuSign gekoppelten/deferierten Punkte. Slice A gebaut (Subagent-Implementierung, unabhaengig nachverifiziert): DocumentRow statisch->zustandsgetrieben je AD-008 (fehlt->Zur Unterschrift; offener Vorgang gesendet->wartet-auf-Signatur-Pill+Erinnern+Signiert-hochladen; erhalten/geprueft->keine Sendaktion; abgelaufen->Chip+gueltig-bis-Meta); versendet ABGELEITET aus offenem Vorgang (G-2); 2 Server-Seams POST /signaturen/:id/erinnern (Provider-erinnern?, Fake noop, DocuSign resend) + /signiert-hochladen (Sign on Paper -> Dokument erhalten, Vorgang signiert); Labels in labels.ts. +8 Vitest (563->571). Nutzerentscheidungen: vor-ort/paper->erhalten (Spec), versendet abgeleitet, Reihenfolge A+B/C/D. tsc+vitest+ng build gruen. Doku: Decision-Log MED-D-223, CHANGELOG, Feature-Liste, Test-Uebersicht, HANDOFF, version.ts+Stempel; MED-OP-VALID-2 (Textfeld-Struktur-KI) als OP erfasst. Anlass: Nutzer "Erstelle Umsetzungsplan + a+b,c,d".
MED-2026-07-25-fix-403-toast-on-get2026-07-2507:1007:200.17Fix: 403-Toast-Fehlalarm beim Akte-Oeffnen (MED-D-224, keine Versionsaenderung). Nutzer-Bugreport (Screenshot "Keine Berechtigung fuer diese Aktion." blitzt beim Oeffnen der Akte). Diagnose: eager GET /api/benutzer/zuweisbar (admin-only mandant_zuweisen) -> 403 fuer Berater-Rolle; Komponente schluckt den Fehler, globaler fehler.interceptor.ts toastet davor. Fix: 403 nur bei schreibenden Methoden toasten (req.method !== GET) — Hintergrund-GET-403 = Rollen-Lesegrenze, keine Nutzer-Aktion; behebt die Klasse eager-admin-GET-Fehlalarme, schreibende 403s toasten weiter. tsc gruen. Doku: Decision-Log MED-D-224, CHANGELOG. Anlass: Nutzer-Bugreport.
MED-2026-07-24-deploy-docs-docusign-webhook2026-07-2417:5018:050.25Deploy-Runbook §7d: DocuSign-Connect-Webhook praezisiert (keine Versionsaenderung, reine Doku). Zwei Nutzer-Rueckfragen beantwortet + im Runbook geschaerft: (1) HMAC-Key wird von DocuSign GENERIERT (nicht frei gewaehlt) - Connect Keys -> Add Secret Key -> Wert kopieren -> GitHub-Secret DOCUSIGN_WEBHOOK_HMAC; Adapter liest nur X-DocuSign-Signature-1 (erster Key). (2) Webhook-Events: Adapter haengt per Envelope selbst eventNotification fuer completed/declined/voided an (JSON restv2.1, envelopeSummary, ohne Dokumente - G-6, Worker holt PDF per API); bei Konto-Level-Connect entsprechend JSON + Completed(Pflicht)/Declined/Voided + envelopeSummary + HMAC, keine Dokumente; Doppel-Pushes idempotent (abgleich). Belegt gegen docusign.ts (parseWebhook + eventNotification-Block). Doku: Deploy.md §7d, CHANGELOG. Anlass: Nutzer-Rueckfragen HMAC/Events.
MED-2026-07-24-docusign-secrets-sync-haertung2026-07-2417:2017:450.42Secret-Sync-Haertung (CodeRabbit-Nachlese #256, MED-D-222, keine Versionsaenderung, CI/Config + Doku). PR #256 (MED-D-221) war bereits gemergt, CodeRabbit meldete danach 3 Befunde am Sync-Schritt. 2 valide umgesetzt: (1 Stabilitaet) sync() fehlertolerant - fehlgeschlagenes wrangler secret put bricht die Schleife nicht mehr ab (set -eo pipefail), sammelt betroffene Namen, Schritt endet sichtbar rot (::error:: + exit 1) statt stiller partieller Sync unter continue-on-error; per Mock-Lauf verifiziert (1 Fehler -> restliche laufen, exit 1). (2 Widerruf) dokumentiert, bewusst kein Auto-Delete (destruktiv bei temporaer leerem Secret) - echter Widerruf = wrangler secret delete (Deploy.md §7d). 1 Befund bewusst nicht uebernommen: CHANGELOG-PR-Link (Konvention MED-D-144, Branch-Name bei Same-Commit-Eintraegen). Gilt auch fuer NextCloud-Secrets (selber Schritt). YAML + bash -n valide. Doku: Decision-Log MED-D-222, CHANGELOG, Deploy.md §7d. Anlass: CodeRabbit-Review #256.
MED-2026-07-24-docusign-github-secrets2026-07-2416:4517:150.50DocuSign-Credentials via GitHub-Secrets (MED-D-221, keine Versionsaenderung, CI/Config + Doku; OP-SIGN-1). Nutzerfrage "koennen wir die Credentials per GitHub Secrets setzen?" - ja, Praezedenz existiert (NextCloud-Secrets laufen bereits so). app-deploy.yml-Sync-Schritt um die 5 DOCUSIGN_*-Secrets (INTEGRATION_KEY/USER_ID/ACCOUNT_ID/PRIVATE_KEY PKCS#8/WEBHOOK_HMAC) erweitert -> beim main-Deploy idempotent wrangler secret put in den Worker (leere uebersprungen, continue-on-error; PKCS#8-PEM behaelt Zeilenumbrueche ueber die Env-Variable). Trennung geheim/nicht-geheim: Credentials -> GitHub-Secrets (RISK-8/G-5); Go-Live-Toggle SIGNATUR_PROVIDER=docusign + DOCUSIGN_WEBHOOK_URL als auskommentierte, nicht-geheime Vars in wrangler.toml (Everything-as-Code G-2, Go-Live = sichtbarer Commit). Credentials allein schalten nichts scharf (Compliance-Gate RISK-4). Deploy.md §7d neu gefasst (GitHub-Secrets-Weg + expliziter Go-Live-Schalter). YAML validiert, check-doc-consistency gruen. Kein App-Code -> keine Versionsaenderung. Doku: Decision-Log MED-D-221, CHANGELOG, HANDOFF §3/§4. Anlass: Nutzerfrage GitHub-Secrets.
MED-2026-07-24-docusign-adapter2026-07-2415:1016:401.50DocuSign-HTTP-Adapter gebaut (MED-D-220, 0.99.13->0.100.0, MINOR; OP-SIGN-1). Nutzer "integriere jetzt docusign - es liegt ein developer account vor" (Teil 2 von "1, dann 2"). Erster echter E-Signatur-Provider hinter der SignaturProvider-Abstraktion (signatur/docusign.ts): JWT Grant (RS256 in-Worker via WebCrypto/PKCS#8, das Node-SDK laeuft nicht auf Workers -> hand-gerollter REST via fetch + Token-Cache); Envelope-Flow (Dokument-Bytes aus der Ablage R4->R3, base64->Envelope mit Signer=Mandant + signHere-Tab); Status/Download der signierten Fassung (/documents/combined) in den bestehenden abgleich-Write-back; Connect-Webhook POST /oeffentlich/signatur/docusign-webhook (im /oeffentlich*-Access-Bypass, X-DocuSign-Signature-1 per HMAC-SHA256 konstant-zeit verifiziert, fail-closed ohne Key -> 401; Pull-abgleich bleibt Fallback, RISK-6). Zwei Weggabelungen per Rueckfrage: QES -> "als AES mit sichtbarem Hinweis" (Dev-Account-Grenze, echte QES erst mit CSP, RISK-2); Slice = "Adapter + Connect-Webhook". Sicherheitsriegel bleibt: kein abschliessenDemo -> vorOrtAbschluss 409 (echte Vorgaenge nie faelschbar, MED-D-198). Dormant ohne Secret (docuSignKonfigAusEnv->null -> Fallback fake/503, deploy-sicher, G-5). Interface SignaturAnforderung um dokumentInhalt+unterzeichner erweitert; signatur-service.ts loest Ablage-Bytes + Mandant-Email auf (nur fuer echte Provider); Repo getSignaturByExternalId. +10 Vitest gegen gemocktes fetch (JWT/Envelope/Status/Download/Webhook-HMAC/Bytes-Aufloesung; 553->563/51 Dateien). tsc+vitest gruen. Bewusst NICHT live verifiziert: kein Dev-Secret + kein Netz-Egress in der Build-Sandbox -> Unit-Test gegen Mock; Scharfschalt-Runbook Deploy.md §7d. Aktiviert RISK-4 (US-Transfer/AVV) + RISK-2 (QES-AES) konkret. Doku: Unterschriften.md (DocuSign-Abschnitt+OP-SIGN-1-Rest), Compliance/Risikoregister, Deploy §7d, Decision-Log MED-D-220, CHANGELOG, HANDOFF §2/§3/§4, Feature-Liste, Test-Uebersicht, version.ts + Stand-Stempel. Anlass: Nutzer "integriere jetzt docusign".
MED-2026-07-24-akten-cockpit-fidelity2026-07-2413:3015:051.58Akten-Cockpit Design-Handoff-Import + Pixel-Fidelity-Pass (MED-D-218 Import/Doku + MED-D-219 Fidelity, 0.99.12->0.99.13, PATCH). Nutzer lieferte das Design-Paket nach (zip) + "Implement .dc.html, design-decisions.md in docs/produkt/ einarbeiten"; Scope-Rueckfrage -> "Pixel-Fidelity-Pass" (Cockpit ist bereits gebaut/live). MED-D-218: Handoff nach docs/design/akten-cockpit-handoff/ importiert (akte-patterns.md, .dc.html, design-decisions.md, Screenshots 01-17); AD-001..AD-015 in docs/produkt/Design-Entscheidungen-Akte.md eingearbeitet; Landkarte + Redesign-Doc umgestellt. MED-D-219: Fidelity-Agent (12 Befunde), 8 Pixel-Fixes (BankRow-Motion-Kurve+Peek, IBAN .8rem, SEPA amber "ohne gueltiges SEPA", ‹-Chevron, Assistent-Overlay 720/z70 via neue [breite]/[erhoeht]-Inputs, Signaturniveau SES-Default, VersionedField ⟲-Text-Toggle), 5 bewusste Divergenzen dokumentiert (DocumentRow-Send-Aktionen an DocuSign gekoppelt u.a.). tsc+ng build+check-doc-consistency.sh gruen; live Playwright: Computed-Styles bestaetigt (SEPA amber, toggle accentText, bankrow-face cubic-bezier, scrim-erhoeht z70), 0 Konsolenfehler. Doku: Decision-Log MED-D-218/219, HANDOFF-Stempel, Feature-Liste, CHANGELOG, version.ts. Anlass: Nutzer "Import + Implement + design-decisions einarbeiten".
MED-2026-07-24-audit-refresh-v099122026-07-2412:1013:251.25App- + Doku-Meisterwerk-Audit aufgefrischt auf v0.99.12 + Design-System-Abnahme (MED-D-217, MED-OP-REVIEW-1, keine Versionsaenderung). Nutzer "Refresh beide Audits + Design/Screenshot-Abnahme". 4 parallele Dimensions-Reviews (Agent-Fan-out: Welle-11-Verifikation B27-B34+Regress · Mobile/A11y/Kundenstrecken · Doku-Doku+Doku-Code · Design-System-Fidelity 10 Komponenten) + Live-Begehung (wrangler dev + Playwright, 1440/390). App: B27-B34 alle im Code behoben/kein Regress; Sprache 8->9, Feedback/Kundenstrecken/A11y ->8,5, Konsistenz ->8. Design-System VOLLSTAENDIG uebernommen: 10/10 Komponenten Fidelity voll, 5 Reiter + 4 Overlays, World-2-Tokens only, Zustandsmodelle erfuellt, Screen-01-17-Intents abgedeckt, live 0 Overflow/0 Konsolenfehler. Abnahme-Grenze ehrlich: Rohartefakte (akte-patterns.md/.dc.html/Screenshots 01-17) nur im claude.ai/design-Projekt (DesignSync getrennt) -> kein Pixel-Diff. Neuer App-Backlog B36-B40 -> MED-OP-UX-11. Doku: B41-B48 geschlossen, Test-Tabelle 553/50 rekonziliert (vitest bestaetigt), Stempel 0.99.12 deckungsgleich; kein neuer Doku-Backlog (A-1 Strikethrough mitgezogen, A-2 by-design). Beide Audit-Docs neu gefasst. Doku: Decision-Log MED-D-217, HANDOFF (MED-OP-REVIEW-1 + MED-OP-UX-11), CHANGELOG. Anlass: Nutzer "Refresh beide Audits + Abnahme".
MED-2026-07-24-welle11-s3-konsistenz2026-07-2411:0512:051.00UX-Welle 11 S3: Konsistenz & Kundenstrecken-Politur (Band C/D, MED-D-216, 0.99.11->0.99.12, PATCH; App-Audit B33+B34+B32a; schliesst MED-OP-UX-10 ab). Fortsetzung "weiter 1, dann 2" (Teil 2). B33 (G-8): 4 lokale Enum-Label-Maps nach labels.ts (StammdatenQuelle/ArtefaktTyp/OffenKategorie/KontoPruefstatus); AuftragStatus-Doppelvokabel -> AUFTRAG_STATUS_LABEL (Lang) + AUFTRAG_STATUS_KURZ_LABEL (Kurz), eine Quelle. B34: 4 Consent-Checkboxen -> .md-consent-check 24x24px (WCAG 2.5.8); formular-public Fehler amber->md-error-rot + onboarding/fragebogen Speicherfehlschlag in roten fehler-Kanal; ladeTurnstile 3x -> ladeTurnstileScript() in pub-bausteine.ts; Turnstile-Ausnahme als MED-D-216 + Code-Kommentar. B32(a): Basis-.md-status-* um erhalten ergaenzt. Zurueckgestellt (B35): B32(b) Modal-Fokus-Falle-Konsolidierung + Pill-Render + Inline-Styles (keine ungefragten Refactorings). Reine Client-Aenderung. tsc+ng build+check-doc-consistency.sh gruen; live wrangler dev + Playwright: Leitstand-Chip "1 Auftrag . 1 Anbahnung" via zentrales Label, Consent 24x24px, mandant-detail sauber, 0 Konsolenfehler. Doku: Decision-Log MED-D-216, HANDOFF (MED-OP-UX-10 ✅), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter 1, dann 2".
MED-2026-07-24-welle11-s2-a11y2026-07-2410:1511:000.75UX-Welle 11 S2: A11y-Restmeile (Band B, MED-D-215, 0.99.10->0.99.11, PATCH; App-Audit B29+B30+B31). Nutzer "weiter 1, dann 2" (Teil 2). B29: 5 Akten-Reiter jetzt echte WAI-ARIA-Reiterleiste -> role="tablist"+aria-label, roving tabindex, neue registerTaste() fuer Pfeil-/Pos1-/Ende-Tastatur-Nav, id je Reiter; role="tabpanel"/aria-controls bewusst ausgelassen (Reiter-Inhalt ueber mehrere [hidden]-Sektionen verstreut, kein 1-Panel-je-Reiter -> falsche ARIA vermieden, Wrap-Refactor als eigene Slice offen). B30: role="alert" ausserhalb des Kerns -> oeffentliche Submit-Fehler (lead/onboarding/fragebogen/formular-public), Audit-Trail-"Nachweis unvollstaendig" (mandant-akte), Dentmarking-/Verwaltungs-Fehler. B31: Light-Theme --mut #7c8a7e (~3,6:1) -> #5f6d62 (5,45:1 AA). Reine Client-Aenderung. tsc+ng build+check-doc-consistency.sh gruen; live gegen wrangler dev + Playwright: tablist praesent, roving tabindex 1x0/4x-1, ArrowRight wechselt Auswahl+Fokus, Home zurueck, --mut computed 5,45:1, 0 Konsolenfehler. Band C/D (B32-B34) folgt als S3. Doku: Decision-Log MED-D-215, HANDOFF (MED-OP-UX-10 Band B ✅), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter 1, dann 2".
MED-2026-07-24-nachlese-2492026-07-2409:3010:100.67CodeRabbit-Nachlese zu Welle 11 S1 (#249) (MED-D-214, 0.99.9->0.99.10, PATCH). 5 valide Befunde (Review 5/5 Checks gruen). (1 Major) Vor-Ort-Abschluss-Fehler verwarf den bereits angelegten Signatur-Vorgang (B27-Klasse tiefer) -> inner try/catch, Vorgang bleibt in Sitzung, erfolg-Zaehler fuer "X von Y". (2 Minor) Dentmarking Stale-Response bei Retry -> per-Praxis Latest-Load-Guard (pxLadeGen, MED-D-210-Klasse). (3 Minor) Verwaltung globales ladeFehler-Latch klebt -> Record+computed, jeder Loader loescht nur seinen Fehler. (4+5) README/MVP-Scope-Status um Welle-11-Politur; CLAUDE-0.2.0 als Startwert klargestellt. Reine Client-/Doku-Aenderung. tsc+ng build+check-doc-consistency.sh gruen; verwaltung-Banner live verifiziert (500->Banner, sauber ohne, 0 Fehler). Doku: Decision-Log MED-D-214, HANDOFF, version.ts+Stempel. Anlass: CodeRabbit-Review #249.
MED-2026-07-24-welle11-s1-peripherie2026-07-2408:4009:300.83UX-Welle 11 S1: Peripherie-Ehrlichkeit (Band A, MED-D-213, 0.99.8->0.99.9, PATCH; App-Audit B27+B28). Nutzer "weiter 2". B27: Unterschriften-Assistent-versenden() meldete Teil-Sammelfehlschlag als Totalausfall -> per-Dokument try/catch, bereits angelegte Vorgaenge in die Sitzung, "X von Y versendet"-Meldung. B28: 3 stille Rand-Loads sichtbar gemacht (je Fehler-Signal + role=alert-Banner): mandant-akte Druckansicht (True North #3, "Export unvollstaendig"), verwaltung (Admin-Daten), akte-dentmarking (Betriebsdaten je Praxis + Retry). Reine Client-Aenderung. tsc+ng build+check-doc-consistency.sh gruen; live gegen wrangler dev + Playwright: Druck-Akte + Verwaltung Route-500 -> Banner, sauberer Load ohne Banner, 0 nicht-500-Konsolenfehler. Band B (B29-B31 A11y) folgt als S2, niedrig (B32-B34) als S3. Doku: Decision-Log MED-D-213, HANDOFF (MED-OP-UX-10 B27/B28 erledigt), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter 2".
MED-2026-07-24-doku-welle-62026-07-2407:4508:350.83Doku-Welle 6: Governance einholen (MED-D-212, MED-OP-DOKU-8, keine Versionsaenderung). Nutzer "weiter 1". B41 Compliance/Risiko-Stand auf 2026-07-24 + Gesamtsichtungs-Note; B42 RISK-28 um 1:n-Bankkonto-PII (MED-D-195); B43 Unterschriften.md Status+Vor-Ort-Assistent-§+sequenceDiagram+vor-ort-Route; B44 Bankkonto-Feldtabelle R1-F33..F43 + Pruefstatus-stateDiagram in Lastenheft; B45 R1-R12→R1-R13; B46 Test-Uebersicht auf 553/50 rekonziliert (3 Zeilen ergaenzt + 6 stale Zaehlungen per vitest korrigiert); B47 Weltmodell-classDiagram um Bankkonto; B48 nextcloud_ref-Rest. Reine Doku. check-doc-consistency.sh gruen; alle 3 neuen Mermaid-Diagramme validiert (valid=true); vitest 553/50 als Grundwahrheit fuer B46. B49.3 optional offen. Doku: Decision-Log MED-D-212, HANDOFF (MED-OP-DOKU-8 ✅), CHANGELOG. Anlass: Nutzer "weiter 1".
MED-2026-07-24-meisterwerk-audit2026-07-2406:2007:401.33Meisterwerk-Audit App + Doku aufgefrischt auf v0.99.8 (MED-D-211, keine Versionsaenderung). Nutzer "Meisterwerk Audit fuer App und Doku". 8 parallele Dimensions-Reviews (Agent-Fan-out) + Live-Begehung (wrangler dev + Playwright, 1440/390px). App: alle 12 B14–B26 behoben/kein Regress, Mobile+A11y 6→8, Live sauber (Dialog-Semantik/Fokus/ESC, 0 Overflow, 0 Konsolenfehler); Backlog B27–B34 → MED-OP-UX-10. Doku: 8/8 B33–B40 geschlossen, Stempel/Testzahl 0.99.8/553 deckungsgleich, Check gruen; Backlog B41–B48 → MED-OP-DOKU-8 (Governance-Coverage-Rueckstand: Compliance/Risiko stale, Bankkonto-PII + Vor-Ort-eSignatur ungedeckt, Bankkonto fehlt in Lastenheft). Beide Audit-Docs neu gefasst (Bezugspunkt v0.99.8/caa33d0). HANDOFF MED-OP-REVIEW-1 + 2 neue OP-Backlogs. Doku: Decision-Log MED-D-211, CHANGELOG. Anlass: Nutzer "Meisterwerk Audit App+Doku".
MED-2026-07-24-nachlese-2452026-07-2406:1506:500.58CodeRabbit-Nachlese zu #245 (MED-D-210, 0.99.7->0.99.8, PATCH). 3 Post-Merge-Befunde. (1) Race in mandant-detail#laden() [Major, valide]: Latest-Load-Guard (ladeGeneration-Zaehler) um die 6 Sekundaer-Loader — Alt-Batch-Callbacks wirken nur, wenn juengste Generation. Deterministisch live verifiziert (Alt-500-Straggler nach Retry laesst Banner korrekt weg). (2)+(3) Typografische Quotes [Minor, valide]: MED-D-145-Verstoss (diese Session eingefuehrt) in CHANGELOG+Feature-Liste -> Komplett-Sweep (34+7 -> 0). Abgelehnt: PR-Link-statt-Branch im CHANGELOG (MED-D-144). Reine Client-/Doku-Aenderung. tsc+ng build+check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-210, HANDOFF, version.ts + Stand-Stempel. Anlass: CodeRabbit-Review #245.
MED-2026-07-23-b26-restschuld2026-07-2305:2506:050.67B26-Restschuld (substanzielle Teilmenge): verbleibende Sub-Loader sichtbar + Sub-0,7rem-Lesetext-Floor (MED-D-209, 0.99.6->0.99.7, PATCH). Nutzer "B26 Restschuld" + Scope-Rueckfrage "Substanzielle Reste". Sub-Loader: die 4 noch stillen Loader (generierungen/individualdokumente/lzUeb/auftraege) setzen jetzt das geteilte nebendatenFehler-Signal -> tab-uebergreifendes role=alert-Banner oben im
+ Retry statt still unvollstaendiger Daten; Banner-Wortlaut generalisiert. Schrift-Floor: 6 Lesetext-Regeln (.md-kpi-q/.md-step-st/.md-group-lbl/.md-sev/.mw-next .typ/.mw-vfield-pill) auf 0.7rem; Glyphen-Boxen (.mw-sq/.mw-avatar/.mw-assist-step-n) + Brand-Micro-Type unangetastet. Reine Client-Aenderung. tsc+ng build+check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright: auftraege-Route-500 -> Haupt-Banner+Retry statt Leerstand, nach Retry weg; .mw-next .typ=11,2px (0,62->0,7), Avatar-Glyph bleibt 9,9px; 0 Body-Overflow 1440/390; 0 Konsolenfehler. Bewusst weiter zurueckgestellt (Nutzer-Wahl): ~134 Cockpit-Inline-Styles (reiner Churn). Doku: Decision-Log MED-D-209, HANDOFF, Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "B26 Restschuld".
MED-2026-07-23-b26-restbefunde2026-07-2304:4505:250.67B26-Aufraeum: konkrete Restbefunde des App-Audits v0.99.0 (MED-D-208, 0.99.5->0.99.6, PATCH). Nutzer "B26". B8 (aeltester offener UX-Befund): Cockpit-Lane-Kopf-Chip-Overflow -> Phase+Chips in EINEM Ellipsis-Container (md-grow+mw-oh+min-width:0), offen-Label bleibt rechts, [title]=Volltext. B18-Rest (namentliche Falle): Bankkonten/Praxen-Load-Fehler in mandant-detail#laden() setzt nebendatenFehler -> barrierefreies Banner (role=alert) + "Erneut versuchen" im Stammdaten-Overlay statt "keine Konten". bdAnlegenUndBinden: Waisen-Schutz (nach Binde-Fehler neu laden + ehrlicher Hinweis, Doku im Verknuepfen-Picker). Reine Client-Aenderung. tsc+ng build+check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright: B8 injizierter 392px-Chip -> Lane-Kopf-Overflow 0 (scrollWidth==clientWidth); B18 Route-500 -> Banner+Retry statt Leerstand, nach Retry weg; 0 nicht-500-Konsolenfehler. Bewusst weiter zurueckgestellt: Sub-0,7rem-Schrift, Inline-Style-Restschuld, uebrige Sub-Loader. Doku: Decision-Log MED-D-208, HANDOFF, Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "B26".
MED-2026-07-23-welle10-s5-politur2026-07-2304:0004:450.75UX-Welle 10 Slice 5: Abschluss-Politur B21-B25 (MED-D-207, 0.99.4->0.99.5, PATCH). Nutzer "weiter". B21: md-status-erhalten/-fehlt bekommen Farbregel (blau/rot statt farblos-grau, mw-scope+base). B22: Onboarding-Item-Kategorie via neuem ONBOARDING_KATEGORIE_LABEL als Klartext; Assistent nutzt DOKUMENT_STATUS_LABEL. B23: beratungsdoku.geprüft-Audit-Label ergaenzt; MODELL_LABEL (cockpit) = Alias auf BETREUUNG_LABEL. B24: Fragebogen-Consent-Stern -> Klartext "(Pflicht)"; Turnstile-ngOnDestroy-Cleanup in onboarding-/fragebogen-public; formular-public bewusst ohne Turnstile (Ausnahme im Decision-Log begruendet). B25: stale Overlay-Key-/S5-Kommentare nachgezogen. Reine Client-/Doku-Aenderung. tsc+ng build+check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright: Kategorie-Pillen=Klartext; erhalten=blau rgb(63,124,158)/fehlt=rot; 0 Konsolenfehler. Damit Welle 10 (MED-OP-UX-9) B14-B25 vollstaendig (B26 zurueckgestellt). Doku: Decision-Log MED-D-207, HANDOFF (MED-OP-UX-9 ✅), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter".
MED-2026-07-23-welle10-s4-a11y2026-07-2303:0503:550.83UX-Welle 10 Slice 4: A11y-Abschluss — Touch-Ziele >=24px (B16) + Fehlertexte als Live-Region (B19) (MED-D-206, 0.99.3->0.99.4, PATCH). Nutzer "weiter". B16: .mw-slider-seg/.mw-sepa/.mw-bankrow-archbtn/.mw-vfield-pill mit min-height:24px+inline-flex (WCAG 2.5.8; Optik bleibt kompakt). B19: Lifecycle-Select aria-describedby -> Fehlertext (nur bei Fehler); alle 14 dynamischen md-error-<p> in mandant-detail mit role="alert". Reine Client-Aenderung (CSS+Template-Attribute). tsc+ng build+check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright: B16 — SliderSeg/SEPA/Archiv messen exakt 24px (23/1/2 Elemente; vN-Pille rendert nur bei Feld-Historie, CSS greift dennoch); B19 — Pill oeffnen -> aktiv bei unvollstaendigem Onboarding -> 409 -> Fehler-<p role=alert> + Select aria-describedby=lcstatus-fehler (vorher null); 0 nicht-HTTP-Konsolenfehler. Damit B14-B20 erledigt (alle hoch/mittel); offen: niedrig-Politur B21-B25 + Sub-Loader-Nachzug. Doku: Decision-Log MED-D-206, HANDOFF (B16/B19 erledigt), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter".
MED-2026-07-23-welle10-s3-ladefehler2026-07-2302:1503:050.83UX-Welle 10 Slice 3: Ladefehler in den Akte-Panels sichtbar machen (MED-D-205, 0.99.2->0.99.3, PATCH; App-Audit B18). Nutzer "weiter". Die Register-Panels schluckten Ladefehler still (error: () => set([])) → "keine Daten" statt "konnte nicht laden". Fix: je Panel ein ladeFehler-Signal + barrierefreies Banner (role="alert") mit Retry-Button (Vorbild verlaufFehler). Umgesetzt in akte-einladungen/-meetings/-formulare/-auftraege. Reine Client-Aenderung. tsc+ng build+check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright (Route-Interception): erzwungenes 500 auf /api/mandanten/:id/auftraege → Banner+role=alert+Retry statt Leerstand; nach Retry Banner weg + Zeile geladen; 0 nicht-HTTP-Konsolenfehler. Folgepunkt: die mit detail() verzahnten mandant-detail-Sub-Loader (~1483-1490) bleiben vorerst still. B19/B16/B21-B25 folgen. Doku: Decision-Log MED-D-205, HANDOFF (MED-OP-UX-9 B18 teilw. erledigt), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter".
MED-2026-07-23-welle10-s2-feedback2026-07-2301:2502:150.83UX-Welle 10 Slice 2: Playbook-Teilfehlschlag ehrlich melden (MED-D-204, 0.99.1->0.99.2, PATCH; App-Audit B15, hoch, True North #2). Nutzer "Welle 10". Nach einem Lifecycle-Wechsel erschien immer ein Erfolgs-Toast, auch wenn die Standard-Wiedervorlage nicht angelegt werden konnte. Server (minimal): MandantService.aktualisieren liefert transientes playbookFehler-Flag, PATCH-Route haengt es an. Client: lifecycleSetzen warnt bei true (⚠-Text, Undo bleibt); Verlaufs-Labels *.playbook_fehler mit ⚠-Praefix. +1 Vitest (552->553), Fehler-Test um playbookFehler:true-Assertion ergaenzt. tsc+vitest(553/553)+ng build+check-doc-consistency.sh gruen; live gegen wrangler dev (Antwort traegt playbookFehler, Happy-Path false, unregressiert; Fehler-Pfad server-vertraglich unit-getestet). Bewusst als eigener Slice (B15 = einziger hoch-Befund, self-contained); B18/B19 folgen als Slice 3. Doku: Decision-Log MED-D-204, HANDOFF (MED-OP-UX-9 B15 erledigt), Feature-Liste, Test-Uebersicht, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "Welle 10".
MED-2026-07-23-welle10-s1-nachlese2026-07-2301:0501:250.33CodeRabbit-Nachlese zu PR #238 (MED-D-203, keine Versionsaenderung; MED-OP-UX-9). #238 mergte per Auto-Merge vor dem Review. 4 Befunde -> 1 echt (Code) + 2 Doku uebernommen, 1 begruendet abgelehnt. Code: AkteOverlayComponent.onKey bekam ein Fokus-Ownership-Gate (panel.contains(activeElement)) — verhindert, dass ESC dieses Overlay schliesst, waehrend ein anderes Modal (Verlassen-Modal) den Fokus haelt (document:keydown feuert vor window:keydown). Doku: README+MVP-Scope „UX-Wellen 1–8"->"1–10", Feature-Liste Mandat-Zeile praezisiert. Nicht uebernommen: CHANGELOG-PR-Link (Konvention MED-D-144, append-only). ng build+check-doc-consistency.sh gruen, Live-A11y 6/6 unveraendert. Doku: Decision-Log MED-D-203, CHANGELOG. Anlass: CodeRabbit-Review #238.
MED-2026-07-23-welle10-s1-overlay-shell2026-07-2323:5501:051.17UX-Welle 10 Slice 1: geteilte Overlay-Shell + echte Dialog-A11y (MED-D-202, 0.99.0->0.99.1, PATCH; MED-OP-UX-9). Nutzer "Welle 10". Erster + hoechstprioriger Slice aus dem App-Audit (MED-D-201): B14 (hoch) + B20, faltet B2/B3/B17. Neue AkteOverlayComponent (md-overlay): role=dialog/aria-modal/aria-label + Initial-Fokus + Fokus-Falle + Fokus-Rueckgabe + ESC (Muster Verlassen-Modal). Alle 4 Overlays (Stammdaten/Zeiten/Signatur/Mandat) migriert -> ein Bauteil statt 4x Markup. Nebenbei: Mandat-Kopf angeglichen (B2), doppelte ESC-Mechanik + Shell-ESC-Bypass entfernt (ESC -> schliesseOverlay(), raeumt bankPeek, B3), Mandat-Overlay Mobile-Reflow (Titel-Ellipsis + flex-wrap -> Schliessen-Knopf auf 390px erreichbar, scrollWidth 528->371, B17). Reine Client-Aenderung, kein Server-Change. tsc+ng build gruen (NG8011 am Kopf-Slot durch 2 @if behoben). Live gegen wrangler dev + Playwright (A11y 6/6): dialog-Attribute+Fokus im Panel, ESC schliesst+Fokus-Rueckgabe, Tab-Falle haelt (40x Tab), Mandat-Overlay+Scrim-Klick, Mobile-Schliessen erreichbar, 0 Konsolenfehler. Doku: Decision-Log MED-D-202, HANDOFF (MED-OP-UX-9 B14/B20/B2/B3/B17 erledigt), Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Naechster Slice: B15 (Playbook-Feedback) + B18/B19. Anlass: Nutzer "Welle 10".
MED-2026-07-23-app-ux-process-review2026-07-2323:0023:550.92App-UX-Audit aufgefrischt auf v0.99.0 (MED-D-201, keine Versionsaenderung; MED-OP-REVIEW-1). Nutzer "Ja" (zweiter Teil: App-Audit nach dem Mandat-Overlay). Bezugspunkt war seit v0.83.0 16 Minor alt (stale). Fuenf parallele Dimensions-Review-Subagenten (Feedback · Sprache G-3/G-8 · Kundenstrecken · Design/Mobile/A11y · Eine Handschrift) gegen den v0.99.0-Stand + Live-Begehung (wrangler dev + Playwright, Desktop 1440 + Mobil 390). Ergebnis: Alt-Befunde B9/B10 behoben (MED-D-154/156), 5-Reiter-IA + 4 Overlays live bestaetigt, 0 Konsolenfehler, kein 390px-Body-Overflow. Neuer Backlog B14-B26 → MED-OP-UX-9 (Welle 10, absorbiert offene MED-OP-UX-8-Reste): hoch = Overlays keine echten Dialoge (B14) + Playbook-Teilfehlschlag als Erfolg gemeldet (B15); mittel = Touch-Ziele <24px (B16), Mandat-Overlay Mobile-Overflow/Schliessen-Button abgeschnitten (B17, live), set([])-Ladefehler (B18), aria-describedby 0x (B19); niedrig = Overlay-Shell-Duplikation+Mandat-Kopf-Divergenz (B20), Pill-Vokabeln (B21), rohe Enums (B22), Label-Drift (B23), Kundenstrecken (B24), stale Kommentare (B25). Den frisch gebauten Mandat-Overlay selbstkritisch mitgeprueft (B17/B20 betreffen ihn, ehrlich erfasst). Doku-Konsistenz-Stale-Warnung geloescht. Doku: UX-Prozess-Review-2026-07.md (neu), Decision-Log MED-D-201, HANDOFF (MED-OP-UX-8→9, MED-OP-REVIEW-1), CHANGELOG. Reines Doku-Update. Anlass: Nutzer "Ja" + Stale-Regel.
MED-2026-07-23-mandat-overlay2026-07-2322:2523:000.58Mandat-Overlay: Mandate-Reiter als kompakte Liste + Detail-Overlay (MED-D-200, 0.98.0->0.99.0, MINOR). Nutzer "Ja" (verbleibende Design-Arbeit abschliessen: Mandat-Overlay + App-Audit) — der in S1 zurueckgestellte 4. Design-Overlay. Der Mandate-Reiter listete jeden Auftrag als voll ausgeklappte lange Karte untereinander → unuebersichtlich. Jetzt kompakte eine Zeile je Auftrag (Produkt · Praxis · Reife · Status · "Oeffnen") + Klick oeffnet die vollstaendige Auftrags-Akte im Scrim-Overlay (.mw-scrim/.mw-overlay-panel, gleiches Muster wie Stammdaten-/Zeiten-/Signatur-Overlay). Reine Client-Restrukturierung in akte-auftraege.component.ts (kein Server-Change, keine Extraktion): offen-Signal + offenerAuftrag-computed, oeffnen/schliessen, ESC via HostListener. Flacker-frei: Container an offen(), Inhalt an offenerAuftrag(); laden() jetzt In-Place-Reload (ladeVon(id,leeren=false)) → Overlay bleibt beim Speichern offen; Mandantenwechsel leert + setzt offen zurueck. Bug behoben: Backticks im HTML-Kommentar beendeten das Template-Literal (TS1005). tsc+ng build gruen (nur vorbestehende NG8102-Warnungen), Server unveraendert. Live gegen wrangler dev + Playwright verifiziert (9/9): 2 Oeffnen-Buttons/kompakte Liste, kein Scrim initial, Oeffnen/ESC/Scrim-Klick, Overlay bleibt ueber Mutation+Reload offen, 0 Konsolenfehler. Damit alle 4 Design-Overlays gebaut. Doku: Decision-Log MED-D-200, Akten-Cockpit-Redesign.md, HANDOFF, Feature-Liste, CHANGELOG, CLAUDE.md, version.ts + Stand-Stempel. Naechster Schritt: App-Audit (UX-Prozess-Review, MED-OP-REVIEW-1) auffrischen. Anlass: Nutzer "Ja".
MED-2026-07-23-s6-feinschliff2026-07-2321:4022:250.75Akten-Cockpit-Redesign S6 (Feinschliff): TaskCard -> Redesign vollstaendig (MED-D-199, 0.97.0->0.98.0, MINOR; LETZTER Slice). Automatische Programm-Fortsetzung nach S5-Merge (#233). Kritisch gescopet (True North): von den 10 akte-patterns-Komponenten war nur TaskCard (§2.9) unbebaut; gezielt nur das gebaut. Die Fristen-&-Aufgaben-Zeilen sind jetzt Karten mit Faelligkeits-Akzent (rot ueberfaellig/amber bald ≤7 Tage/neutral/gruen erledigt) + Badge; signatur-/SEPA-/ruecklauf-Aufgaben mit Assistent-Einstieg (schliesst die letzte TaskCard->ovSig-Kante). Bewusst KEIN Sub-Komponent (viel inline-State in der Zeile; Extraktion = Churn, analog S1) -> reiner Praesentations-Feinschliff, alle Bedienelemente erhalten. ng build gruen, Server-Vitest 552/552 (kein Server-Change), check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright verifiziert (9/9): 3 TaskCards, ueberfaellig/bald-Badges, ferne Aufgabe ohne Badge, Signatur-Aufgabe mit Assistent-Einstieg (oeffnet Overlay), farbige Akzent-Kante, 0 Konsolenfehler. Damit alle 10 Komponenten gebaut -> MED-OP-AKTE-2 (Akten-Cockpit-Redesign MED-D-188) ✅ vollstaendig. Nicht im Feinschliff (dokumentiert): Motion-Kurve/Wording-Sweep (niedrigprioritaer), Mandat-Overlay (Mandate-Rework), realer Signatur-/E-Mail-Adapter. Doku: Decision-Log MED-D-199, Akten-Cockpit-Redesign.md (S6 ✅ + §4 alle 10 gebaut), HANDOFF (MED-OP-AKTE-2 geschlossen), Feature-Liste, CHANGELOG, CLAUDE.md, version.ts + Stand-Stempel. Empfehlung: App-Audit (UX-Prozess-Review v0.83.0, MED-OP-REVIEW-1) auffrischen -> bewertet nun das fertige Redesign. Anlass: Programm-Abschluss.
MED-2026-07-23-s5-unterschriften-assistent2026-07-2319:5521:401.75Akten-Cockpit-Redesign S5: Unterschriften-Assistent gegen die Fake-Provider (MED-D-198, 0.96.0->0.97.0, MINOR; groesster Slice, Server+Client). Automatische Programm-Fortsetzung nach S4-Merge (#232). Kritische Bestandsaufnahme vorab (Explore-Subagent) der vorhandenen Signatur-Infrastruktur -> nur den Delta gebaut. Neue AkteUnterschriftenAssistentComponent (Overlay, neuer Key signatur): 3 Schritte Pruefen/Versenden/Verfolgen + Vor-Ort-Strecke, eIDAS-Slider (auto Rechtsmatrix/manuell), Sammel-Umschlag (Client-Buendelung), Frist->Wiedervorlage, durchgehender Attrappe-Banner (MED-KB-5). Einstiege DocumentRow/Dokumente-Tab/BankRow-SEPA. Server-Delta minimal+sicher: abschliessenDemo?-Seam nur am Fake (echte Vorgaenge nie faelschbar), vorOrtAbschluss+Route (409 bei echtem Provider), Niveau-Override; Write-back via bestehenden abgleich-Pfad. +5 Vitest (547->552). tsc+ng build+check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright verifiziert (9/9): Banner, 3 Schritte, 2 unterschriftsreife Dokumente, Vor-Ort-Abschluss, Verfolgen=signiert, Write-back Dokument unterschrieben, SEPA-Einstieg, 0 Konsolenfehler. Deferiert (True North): versendet/nicht_erforderlich-Enum (S2-Entscheidung), auto SEPA-/Wiedervorlage-Verknuepfung. Doku: Decision-Log MED-D-198, Akten-Cockpit-Redesign.md (S5 ✅), HANDOFF, Feature-Liste, Test-Uebersicht, CHANGELOG, version.ts + Stand-Stempel. Nur noch S6 offen. Anlass: Programm-Fortsetzung.
MED-2026-07-23-s4-versionedfield2026-07-2318:5519:551.00Akten-Cockpit-Redesign S4: VersionedField mit Feld-Historie (MED-D-197, 0.95.0->0.96.0, MINOR). Automatische Programm-Fortsetzung nach S3b-Merge (#231). Kritische Recherche vorab (True North): §2.7/§2.8 waren groesstenteils schon gebaut (MED-D-179 Versionierung + flache Liste + Stand-Pille in der Rail; MED-D-170 Self-Service-Link-Karte) → nur den genuinen Delta gebaut statt Bestehendes nachzubauen: per-Feld-Historie (§2.7) + Versions-Pille im Overlay-Kopf. Neue AkteVersionedFieldComponent (md-versioned-field): je Feld aktueller Wert + vN-Pille → aufklappbare Feld-Historie, client-seitig aus den bereits geladenen hash-verketteten Snapshots abgeleitet (kein Zweit-Fetch, G-2); stammVersionen eager in laden(). §2.8 Self-Service als erfuellt bewertet (Link-Verwaltung MED-D-170; Uploads im "Alle Dokumente"-Reiter; keine Duplizierung, G-2 — in der Doku begruendet). Bug behoben: title-Attribut mit literalem \" schloss das HTML-Attribut vorzeitig (NG5002-Build-Fehler). ng build gruen, Server-Vitest 547/547 (kein Server-Change), check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright verifiziert (9/9): Kopf-Pille Stand:v4, 8 VersionedFields, E-Mail-Feldhistorie v3/v2, CRM v4, nie geaendertes Telefon ohne Pille, 0 Konsolenfehler. Doku: Decision-Log MED-D-197, Akten-Cockpit-Redesign.md (S4 ✅), HANDOFF, Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Naechster Slice: S5. Anlass: Programm-Fortsetzung.
MED-2026-07-23-s3b-bankrow2026-07-2317:4518:551.17Akten-Cockpit-Redesign S3b: BankRow-UI mit Swipe-to-Archive (MED-D-196, 0.94.0->0.95.0, MINOR; schliesst S3 ab). Nutzer "3b - baue sukzessive weiter, pr und merge automatisch bis das Design vollstaendig umgesetzt ist" (gruenes Licht fuer den Programm-Rest). Reine Client-Anbindung an die S3a-Routen. Neue AkteBankrowComponent (md-bankrow): je Konto Inhaber/Kontext/IBAN-4er-Gruppen/Zeichnungsberechtigung + Pruefstatus-Slider (Neu/Geprueft) + SEPA-Toggle (getrennte Achsen) + Swipe-to-Archive (Geste ueber Schwelle committet direkt, Undo-Toast). Design-Anpassung (MED-D-193): immer sichtbarer Desktop-/Tastatur-Archiv-Button ergaenzt, da die interne Akte ein Maus-Workflow ist und ein rein hinter der Zeile verstecktes Archivieren fuer Maus/Tastatur unerreichbar waere. Bug gefunden+behoben: Peek-Teach re-triggerte bei jedem laden()-Reload (Zeile nudgte bei jedem Toggle) → auf einmalig-beim-Overlay-Oeffnen gegated. ApiService + Bankkonto/KontoPruefstatus-Typen erweitert. Alt-IBAN-Felder bleiben mit Hinweis (zwei-phasig). Hinweis: Handoff-Projekt diese Session nicht in DesignSync-Projektliste → BankRow getreu aus Akten-Cockpit-Redesign.md §4/§5 + S2-StatusSlider-Muster + World-2-Tokens. ng build gruen, Server-Vitest 547/547 (kein Server-Change), check-doc-consistency.sh gruen. Live gegen wrangler dev + Playwright verifiziert (11/11): Render/Slider/SEPA/Anlegen/Desktop-Archiv/Swipe-Geste/append-only, 0 Konsolenfehler. Doku: Decision-Log MED-D-196, Akten-Cockpit-Redesign.md (S3 ✅), HANDOFF, Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Naechster Slice: S4. Anlass: Nutzer-Startsignal fuer den Programm-Rest.
MED-2026-07-23-s3a-bankkonten2026-07-2316:2017:351.25Akten-Cockpit-Redesign S3a: 1:n-Bankkonten (Backend) + crash-sicherer Backfill (MED-D-195, 0.93.0->0.94.0, MINOR). Nutzer "weiter mit s3". S3 bewusst in S3a (Backend) + S3b (BankRow-UI) gesplittet. Neue Entitaet Bankkonto (R1-F33): Inhaber/IBAN/Zeichnungsberechtigung + zwei getrennte Achsen pruefstatus (neu/geprueft/archiviert) + sepaGueltig, Praxis-Kontext oder privat. Domain/enums.ts/schema.ts/Migration v45 (Tabelle + UNIQUE-Index quell_schluessel)/Repo (memory+d1, CRUD)/BankkontoService (audit, PII-arm)/Routen (scope-guarded GET/POST + PATCH). Verlustfreier, crash-/nebenlaeufigkeitssicherer Backfill aus mandant.ibanPrivat/praxis.iban (stabiler quellSchluessel + DB-UNIQUE + ON CONFLICT DO NOTHING + .returning()-Zaehlung, kein "erledigt"-Flag; Alt-Felder zwei-phasig lesbar, kein DROP; index.ts-Hook analog stammBackfilled). Design-kritische Teile (Entitaet/Migration/Backfill) selbst gebaut, kein Subagent noetig. +12 Vitest (CRUD + Idempotenz/Concurrency/Crash/identische-IBAN); Server 535->547 gruen, tsc gruen. Live gegen wrangler dev/miniflare verifiziert (nicht nur Unit): Migration bootet, Seed via API, Restart → Backfill angelegt:2, Zweit-Boot idempotent (0), CRUD-Routen + 400-Validierung, Alt-Felder lesbar. S3b (BankRow-UI Swipe-to-Archive) folgt. check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-195, Akten-Cockpit-Redesign.md (S3🟡), Weltmodell-Data-Dictionary (Bankkonto-Entitaet), HANDOFF, Feature-Liste, Test-Uebersicht, CHANGELOG, version.ts + Stand-Stempel. Anlass: Nutzer "weiter mit s3".
MED-2026-07-23-s2-nachlese2026-07-2315:5516:150.33CodeRabbit-Nachlese zu S2 (PR #228): 8 Befunde forward behoben (MED-D-194, keine Versionsaenderung). #228 mergte per Auto-Merge vor den Findings; alle 8 echt/sinnvoll. Code (2 Major): Busy-Guard an statusSetzen/dokStatusSetzen (Race, Muster MED-D-178); Erforderlich-Pille aus mutablem Status (ohne optionale Items als Pflicht zu labeln). A11y/CSS: aria-label an RequirementCheckbox; .mw-reqbox-Klickflaeche ≥24×24 via ::before. Doku: Plan-Doc S2-Backend ja→nein (UI-Mapping) + onboarding-only-Praezisierung; agents.md-Footer-Datum; Management-Summary-Rest-Stempel 0.93.0; HANDOFF S1–S6→S3–S6. Vorab die Live-Begehung (wrangler dev + Playwright, 11/11 grün) hatte S1+S2 bestaetigt, S1 gemergt, S2 auf main rebased + gemergt. tsc+ng build+check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-194, CHANGELOG. Anlass: CodeRabbit-Review PR #228.
MED-2026-07-23-s2-dokument-zustandsmaschine2026-07-2313:0513:450.67Akten-Cockpit-Redesign S2: Dokument-Zustandsmaschine (MED-D-192, 0.92.00.93.0, MINOR; auf S1 gestapelt). Nutzer "Weiter geht es mit der Design-Uebernahme". Design-Konflikt (Design-Wording Fehlt/Erhalten/Geprueft + Flags vs. Server-Enum angefordert/erhalten/geprueft/...) per reversiblem Default UI-Mapping aufgeloest (kein Server-/Enum-/Schema-Change). Neue Komponente AkteStatusSliderComponent (md-status-slider) + CSS direkt gebaut; die zwei Integrationen (Onboarding-Items + RequirementCheckbox/Trenner; Ablage-Dokumente + Ablauf-Chip) via Coding-Subagent gegen Build-gruen-Spec, Diff reviewt. Verifiziert: Fortschritt zaehlt nur Erforderliches (bereits serverseitig domain/progress.ts, kein Change). Toter Code entfernt. tsc+ng build gruen, Server-Vitest 535/535, check-doc-consistency.sh gruen. Plus MED-D-193: Design-Sync-Konvention in agents.md verankert (Konflikte → Nutzer-Rueckfrage; auf Nutzerwunsch (a) in diesen PR gefaltet). Zu S5 verschoben: Assistent-abhaengige DocumentRow-Zustaende. Doku: Decision-Log MED-D-192/193, Akten-Cockpit-Redesign.md (S2 ✅), HANDOFF, Feature-Liste, CHANGELOG, version.ts + Stand-Stempel. Naechster Slice: S3.
MED-2026-07-23-s1-ia-fundament2026-07-2312:3513:000.42Akten-Cockpit-Redesign S1: IA-Fundament & Overlay-Shell (MED-D-191, 0.91.00.92.0, MINOR). Erster Bau-Slice (Nutzer-"go" aus dem Plan MED-D-188). Handoff-Spec (akte-patterns.md §2.4/§2.10) + praeziser Struktur-Map des 2384-Zeilen-Components (Explore-Subagent) → Reiter 6→5 (Basis-Informationen Default · Mandate · Alle Dokumente · Fristen & Aufgaben · Praxen), generische Overlay-Shell (Scrim/ESC/Scrim-Klick) mit Stammdaten- & Zeiten-Overlay, LifecycleRing-Avatar (Conic-Ring). Design-kritische Teile (REGISTER/Overlay-CSS/Ring) direkt gebaut, mechanische Template-Edits via Coding-Subagent gegen Build-gruen-Spec; Diff reviewt. Mandat-/Assistent-Overlay bewusst zurueckgestellt (S5). tsc+ng build gruen (nur vorbestehender NG8102-Hinweis), check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-191, Akten-Cockpit-Redesign.md (S1 ✅), HANDOFF MED-OP-AKTE-2, Feature-Liste, CHANGELOG, version.ts + Stand-Stempel (9 Dateien). Naechster Slice: S2. Anlass: Nutzer-"go".
MED-2026-07-23-akten-cockpit-plan-nachlese-22026-07-2312:2512:320.12CodeRabbit-Nachlese zum Slice-Plan (PR #225): 2 Migrations-Praezisierungen, forward behoben (MED-D-190, keine Versionsaenderung). #225 mergte per Auto-Merge vor den Findings. Beide schaerfen den S3-Backfill-Abschnitt. (1) Backfill crash-/concurrency-sicher (Major): DB-erzwungene Eindeutigkeit ueber stabilen Herkunfts-Schluessel + UNIQUE-Index + ON-CONFLICT/Upsert (Muster MED-D-179) statt nachgelagertem Flag; Tests fuer abgebrochenen/nebenlaeufigen Lauf; MED-OP-MIGRATE-1 nur noch Deploy-Ordnung. (2) Abnahme-Matrix erweitert (Major): leere Felder, Initialzustand neu/sepa_gueltig=false, identische IBANs getrennt, Doppel-/Crash ohne Duplikate. check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-190, CHANGELOG. Anlass: CodeRabbit-Review PR #225.
MED-2026-07-23-akten-cockpit-plan-nachlese2026-07-2312:1512:250.17CodeRabbit-Nachlese zum Slice-Plan (PR #224): 4 von 5 echt, forward behoben (MED-D-189, keine Versionsaenderung). #224 mergte per Auto-Merge vor den Findings. Alle Fixes auf lebenden Docs. (1) MD028 in Akten-Cockpit-Redesign.md — Kopf-Blockquotes mit > ueberbrueckt. (2) HANDOFF MED-OP-AKTE-2 (Major): "Slice 1 gebaut"/"Bank zurueckgestellt" widersprach dem Plan → korrigiert (nur MED-D-179 gebaut, S1-S6 offen, Bank jetzt S3). (3) SBOM/Topologie-Querverweis auf Architektur-Uebersicht.md (Major). (4) S3-Backfill/Kompatibilitaet-Abschnitt (Major): ibanPrivat/ibanBankkonto verlustfrei/zwei-phasig, MED-OP-MIGRATE-1, Abnahme keine Waise. Nicht: CHANGELOG-PR-Link (MED-D-144). check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-189, CHANGELOG, HANDOFF. Anlass: CodeRabbit-Review PR #224.
MED-2026-07-23-akten-cockpit-analyse2026-07-2311:4012:150.58Akten-Cockpit-Redesign: voller Slice-Plan (MED-D-188, MED-OP-AKTE-2, keine Versionsaenderung). Nutzer-Auftrag "Implement Akten-Cockpit 1a (Detail).dc.html" + "bei Abweichungen entscheiden lassen". Handoff via DesignSync-MCP gezogen (Projekt "Mandanten-Akte verbessern"): get_project/list_files/get_file auf design_handoff_akten_cockpit/README.md + akte-patterns.md (verbindliche Spec, 10 Komponenten). Gegen den Ist-Stand (6-Reiter-Cockpit, Server-Dokumentstatus, versionierte Mandant-Stammdaten, Einzel-IBAN) diff't → Ziel = 5 Reiter + 4 Overlays, Basis-Informationen default. Da Mehr-PR-Programm: drei Weggabelungen per AskUserQuestion entschieden (Plan-first; Assistent jetzt gegen die Fakes MED-KB-5/OP-DM-8; 1:n-Bankkonten jetzt, kehrt MED-D-179 um). Neues Doc Akten-Cockpit-Redesign.md (Ziel-IA-Mermaid gegen Validator geprueft; Slices S1-S6; Compliance eIDAS/Bank-PII/Zero-Trust vermerkt); Akte-Struktur.md-Forward-Pointer, docs/README.md-Landkarte, HANDOFF MED-OP-AKTE-2 aktualisiert. Kein Code-/Schema-Change. check-doc-consistency.sh gruen. Doku: Decision-Log MED-D-188, HANDOFF, CHANGELOG. Anlass: Nutzer-Design-Import + AskUserQuestion.
MED-2026-07-23-b41-nachlese2026-07-2311:0011:100.17CodeRabbit-Nachlese zu B41 (PR #222): 4 von 8 Befunden echt, forward behoben (MED-D-187, keine Versionsaenderung). #222 mergte per Auto-Merge vor den Findings (Timing wie MED-D-158/178/184). Echt: (1) MED-D-145 gerade Anfuehrungszeichen — Akte-Struktur.md-Neufassung + 4 eigene #222-Log-Zeilen von deutschen typografischen Oeffnern auf ASCII-Quotes normalisiert (bei gemergten Log-Zeilen nur exakt-Match auf meine eigenen Zeilen, inhaltserhaltend, analog MED-D-158). (2) MD028 (Leerzeile in Blockquote) in Akte-Struktur.md — benachbarte Blockquotes mit > ueberbrueckt. (3) Audit-Nav-Widerspruch §3 — audit ist kein Aktenreife-Sprungziel (nicht in SPRUNGZIEL_REGISTER), nur ueber den Kontext-Rail-Link; Text entwidersprochen. (4) SBOM/Topologie-Querverweis auf Architektur-Uebersicht.md ergaenzt. Bewusst nicht: Timesheet-Wochenaggregat KW30 (Rollup explizit vorlaeufig/aufgeschoben, OP-PM-1; Zeile folgt Nachbar-Konvention). check-doc-consistency.sh gruen. Anlass: CodeRabbit-Review PR #222.
MED-2026-07-23-b41-akte-struktur-currency2026-07-2310:3510:550.33B41: Akte-Struktur.md-Currency-Pass — letzter offener MED-OP-DOKU-7-Punkt (MED-D-186, keine Versionsänderung). docs/architektur/Akte-Struktur.md beschrieb noch die Vor-Cockpit-prozessgegliederte Akte (§3 "Register = Prozessphasen", Phasen-Zeitstrahl, mandant.prozessphase/phase: ProzessPhase) — überholt durch MED-D-151 (Prozessphase-Achse entfernt) + MED-D-156 (Akten-Cockpit-Redesign). Komplett neu gefasst auf das aktuelle Vollbild-3-Spalten-Cockpit aus mandant-detail.component.ts: Person-Rail · 6 arbeits-gegliederte Register (Übersicht [Standard] · Mandate · Dokumente · Fristen & Aufgaben · Stammdaten & Onboarding · Zeiterfassung) · Kontext-Rail; Verlauf/Audit nur über den Sidebar-Link, kein Nav-Reiter. Kritische Korrektur zum teed-up Auftrag: die live-IA sind 6 Tabs mit uebersicht-Default, NICHT die 5-Tab-"Basis"-Default-IA aus MED-D-179 (entschieden, aber nicht gebaut → MED-OP-AKTE-2) — so vermieden, dass die Doku eine ungebaute IA beschreibt (Doku↔Code-Drift). Aktenreife-Datenmodell (§4) auf stufe: LifecycleStatus/StufeReife/jeStufe nachgezogen (war phase: ProzessPhase/PhaseReife/jePhase); Reife-Ring-Wegfall als Anzeige-Hinweis vermerkt (MED-OP-REIFE-1, Datenmodell unberührt); auf MED-D-151/156/95/172/80 querverlinkt. "Vor-Cockpit"-Hinweis in der docs/README.md-Akte-Struktur-Zeile entfernt. MED-OP-DOKU-7 damit vollständig geschlossen (B33–B41). check-doc-consistency.sh grün. Doku: Decision-Log MED-D-186, HANDOFF §4/§5, CHANGELOG. Anlass: teed-up B41 (Wrap-up, then fresh start b41).
MED-2026-07-23-risk-count-fix2026-07-2306:0506:100.08Risikoregister-BLUF-Zählstand 2829 (CodeRabbit-Nachlese PR #220, keine Versionsänderung). RISK-29 war in PR #220 hinzugefügt, aber der Kopf-Zählstand nicht mitgezogen; korrigiert. 18 vorrangig ≥6 bleibt (RISK-29 = Score 4). CodeRabbit-CHANGELOG-Verbositäts-Nit bewusst nicht übernommen (Repo-Changelog-Stil ist detailliert). check-doc-consistency.sh grün.
MED-2026-07-22-ci-runner-b41-teeup2026-07-2217:2017:400.33CI-Runner-Entscheidung dokumentiert + B41 teed up (MED-D-185/RISK-29, keine Versionsänderung). Nach dem self-hosted hot-Runner-Wedge in Doku-Welle 5a (Run 30+ min queued, nicht cancelbar) wurde CI_RUNNER=ubuntu-latest (GitHub-hosted) gesetzt; Nutzer: belassen. Everything-as-Code-Record der GitHub-Settings-Entscheidung: Decision-Log MED-D-185 + RISK-29 (gemindert). HANDOFF §5: B41 (Akte-Struktur.md Vor-Cockpit-Currency-Pass, letzter offener MED-OP-DOKU-7-Punkt) als teed-up Nächste-Session-Task. check-doc-consistency.sh grün. Anlass: Nutzerentscheidung "keep" + B41-Erklärung.
MED-2026-07-22-doku-welle-5c-nachlese2026-07-2217:0017:200.33CodeRabbit-Nachlese zu Doku-Welle 5c (PR #218): 4 echte Fixes forward, keine Versionsänderung (MED-D-184). #218 mergte, bevor die Findings adressiert waren. (1) Compliance-BLUF-Overclaim "Retention" → "hash-verkettet; Retention offen (OP-AUDIT-1)" (Security). (2) Lastenheft-Diagramm vorherHashvorher_hash (Mermaid neu validiert). (3) Dokumentenverwaltung-NextCloud.md Z.14 "in NextCloud abgelegt" → R2-produktiv/NextCloud-read-only. (4) HANDOFF "Empfohlen: 5a zuerst" (obsolet) → rückblickende Lehre. Alle auf lebenden Docs. Rest MED-OP-DOKU-7: nur B41. check-doc-consistency.sh grün. Doku: Decision-Log MED-D-184, CHANGELOG, HANDOFF. Anlass: CodeRabbit-Review PR #218.
MED-2026-07-22-doku-welle-5c2026-07-2216:1517:000.75Doku-Welle 5c: Diagramm-/BLUF-/Handwerks-Rest (B37–B40, MED-D-183, keine Versionsänderung). Dritter Slice der MED-OP-DOKU-7. B37: ER-Feld nextcloud_refnextcloud_pfad (Code-Feldname R3-F06) + R2 in Dokumentenverwaltung-NextCloud.md; NextCloud-Kante "Fallback"→"read-only-Sicht" in Architektur-Uebersicht.md. B38: BLUF vor Compliance.md + Risikoregister.md. B39: <TOOL>-n-Präfix in Entwicklungsansatz.md §4.2. B40: Hash-Ketten-Diagramm (Mermaid, validiert) in Lastenheft.md §4.4. Forward-Reparatur der Timesheet-Zeile 24 (5a+5b 7-Spalten-Merge → zwei saubere 6-Spalten-Zeilen, analog MED-D-178). CI-Infra-Nachwehen 5a/5b: self-hosted hot-Runner-Wedge, auf ubuntu-latest via CI_RUNNER-Var + PR-close/reopen entwedgt. Rest MED-OP-DOKU-7: nur B41 (Akte-Struktur.md). check-doc-consistency.sh grün. Doku: Decision-Log MED-D-183, HANDOFF §4, CHANGELOG. Anlass: Doku-Welle-5-Loop.
MED-2026-07-22-doku-welle-5b2026-07-2215:4516:150.5Doku-Welle 5b: Feature-Nachzieharbeit (B35/B36, MED-D-182, keine Versionsänderung). Zweiter Slice der MED-OP-DOKU-7. B35 (G-8): StammdatenVersion (MED-D-179) als Entität ins Weltmodell-Data-Dictionary.md §2 (append-only, per-Mandant hash-verkettet) — war in Lastenheft/Feature-Liste/Test-Übersicht dokumentiert, fehlte nur im Dictionary. B36 (Landkarte): Kosten.md (G-7) in den docs/README.md-Architektur-Index (war CLAUDE-Tiefenquelle, fehlte im Index). Reine Doku-Nachzieharbeit, check-doc-consistency.sh grün. Doku: Decision-Log MED-D-182, HANDOFF §4 (MED-OP-DOKU-7 5b ✅), CHANGELOG. Anlass: Doku-Welle-5-Loop. Anmerkung: CI-Infra-Zwischenfall bei 5a (wedged self-hosted Run, auf ubuntu-latest umgestellt via CI_RUNNER-Var).
MED-2026-07-22-doku-welle-5a2026-07-2215:1515:450.5Doku-Welle 5a: Wahrheit wiederherstellen + Check-Loch schließen (B33/B34, MED-D-181, keine Versionsänderung). Erster Slice der aus dem Doku-Audit v0.91.0 abgeleiteten MED-OP-DOKU-7. B33: README.md (einziges verbliebenes veraltetes Einstiegs-Doc) auf 0.91.0 + Frontier-Features + Testzahl 535/49; docs/README.md-Prozessmodell-Landkartenzeile auf aktuelle Achsen (Auftrag-Status statt Prozessphase, MED-D-151). B34: check-doc-consistency.sh §8 um Prong B (Überschriften-Stempel ## Status + SemVer auf Folgezeile) + Testzahl-Abgleich erweitert — Regressionstest bestätigt, dass der gehärtete Check die zuvor durchrutschende stale README abfängt. Kein Versions-Bump (reine Doku-/Tooling-Korrektur; PATCH-Bump würde Stempel-Cascade über ~9 Docs erzwingen). Doku: Decision-Log MED-D-181, HANDOFF §4 (MED-OP-DOKU-7 5a ✅), CHANGELOG. Anlass: Doku-Welle-5-Loop (Nutzer: "next slice, pr, merge until all slices done").
MED-2026-07-22-doku-review-audit2026-07-2214:3015:150.75Doku-Meisterwerk-Audit auf v0.91.0 aufgefrischt (MED-D-180, MED-OP-REVIEW-1, keine Versionsänderung). Nutzer-Auftrag "Doku-Review-Audit aktualisieren" — der Doku-Review stand auf Bezugspunkt v0.78.1 (13 Minor zurück, Stale-Regel agents.md §6.7 überschritten, mechanischer Check meldete ihn veraltet). Neu-Ausgabe docs/betrieb/Doku-Review-2026-07.md @ v0.91.0/bcd0eec. Methode: vier parallele Verifikations-Durchsichten (17 offene Alt-Befunde; Stand-Stempel-/Testzahl-Sweep ~40 Docs; Feature-Doku-Abdeckung + ID-/Weltmodell-Konsistenz; Pyramidal-/Diagramm-/Landkarten-Stichprobe) + check-doc-consistency.sh. Kernbefund (positiv, Wirksamkeits-Kontrolle von Doku-Welle 4): 15/17 Alt-Befunde gelöst, keiner regressiv; Wurzelursache B18 von 5 auf 1 veraltetes Doc (README.md) geschrumpft; alle 6 großen Features seit v0.78.1 dokumentiert. Eine falsche Agenten-Meldung ("MED-D-179 undokumentiert") per direktem grep widerlegt und verworfen. Neuer Backlog B33–B40 → MED-OP-DOKU-7 (Doku-Welle 5). Audit bleibt Zeitdokument (agents.md §6.7.4), Befunde als OP überführt. Doku: Decision-Log MED-D-180, HANDOFF §4 (MED-OP-DOKU-7 + MED-OP-REVIEW-1-Zeile), CHANGELOG. Anlass: Nutzer-Auftrag + Stale-Regel.
MED-2026-07-22-stammdaten-versionierung2026-07-2211:3014:303.0Stammdaten-Versionierung — Slice 1 (MED-D-179, 0.90.00.91.0, MINOR). Nutzer-Vorgabe aus der Durchsicht des überarbeiteten Design-Mockups "Akten-Cockpit 1a (Detail)" (via DesignSync-MCP gezogen, Projekt "Mandanten-Akte verbessern") — "Alle Stammdaten sollen immer versioniert sein, z. B. alte Anschriften; jede Aktualisierung erzeugt eine neue Version". Vor dem Bau die vier im Mockup enthaltenen Features + neuer Scope (Bankkonten-1:n, Steuerfelder) mit dem Nutzer geklärt und per AskUserQuestion drei Weggabelungen entschieden (IA folgt Mockup/"Übersicht" raus; Bankkonten späterer Slice; Slice 1 = Stammdaten-Versionierung zuerst). Neue append-only, per-Mandant hash-verkettete StammdatenVersion (dediziert statt PII-arme Audit-Tabelle) + reines Modul stammdaten-version.ts; Versionierung im Repo-Chokepoint updateMandant/createMandant (lückenlos, G-4); Migration v44 + idempotenter App-Level-Backfill; Route + Client-"Stand: vN"-Pille + Verlauf. Live gegen echtes D1 verifiziert (wrangler dev: Migration v44, Backfill 20 Mandanten, PATCH→v2 mit intakter Kette, kein Bump bei lifecycle-only). +12 Vitest (523→535, 47→49 Dateien), tsc+ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-179, HANDOFF §2/§4 (MED-OP-AKTE-2), CHANGELOG, Feature-Liste, Test-Übersicht, Lastenheft §4.1, version.ts/CLAUDE. Anlass: Nutzer-Design + Vorgabe "Alle Stammdaten immer versioniert".
MED-2026-07-22-app-ux-process-review-772026-07-2210:5511:150.33Zweiter CodeRabbit-Lauf gegen PR #212 (bereits gemergt): 8 Befunde — 4 behoben, 2 aus Konventionsgründen abgelehnt, 1 durch die Merge-Race unanwendbar geworden, 1 nicht reproduzierbar (keine Versionsänderung, MED-D-178). PR #212 mergte per Auto-Merge, bevor dieser Fix gepusht war — Branch erneut frisch von origin/main aufgesetzt, landet als eigene Folge-PR. Echt behoben: wvErledigen/wvOeffnen setzten nie arbeitet() (Doppelklick-Schutz griff nie) — Busy-Flag ergänzt. Veraltete 522-Testzahlen in Test-Uebersicht/Management-Summary/MVP-Scope auf 523 nachgezogen. Durch die Merge-Race unanwendbar: CHANGELOG-Einträge von PR #212 rückwirkend zusammenführen (ein erster eigener Versuch dazu war selbst ein append-only-Fehler — sofort erkannt und vor dem Push zurückgesetzt). Aus Konventionsgründen abgelehnt: CLAUDE.md-Kürzung; dieser Eintrag um einen Link auf die aktuelle Folge-PR ergänzen (MED-D-144-Ausnahme). Nicht reproduzierbar: Lastenheft-Testzahl. +0 Vitest (523 unverändert), tsc+ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-178, CHANGELOG, HANDOFF §2. Anlass: zweiter CodeRabbit-Review-Lauf auf PR #212.
MED-2026-07-22-app-ux-process-review-762026-07-2210:2010:550.58CodeRabbit-Nachlese zu MED-D-176 (MED-D-177, PR #212, während der Review noch offen): 1 von 7 Befunden echt, keine Versionsänderung. 6 Befunde waren Artefakte eines falschen Diff-Vergleichspunkts (Branch-Divergenz seit PR #210 ließ GitHub den Merge-Base vor PR #210 statt auf dem echten main-Kopf berechnen) — Branch per git checkout -B … origin/main + Cherry-Pick sauber neu aufgesetzt. Echt behoben: PATCH /api/wiedervorlagen/:id + Nachbarrouten hatten keinen darfSehen/mandant_bearbeiten-Scope-Guard (schon vor MED-D-176 bestehend) — neuer wiedervorlageScopeGuard, +1 RBAC-Test (vorab gegen ungefixten Stand verifiziert, schlägt fehl). Grammatikfehler in MED-D-176-Zeile korrigiert. Bewusst nicht übernommen: CHANGELOG-PR-Link (MED-D-144-Konvention). +1 Vitest (523 gesamt), tsc+ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-177, CHANGELOG. Anlass: CodeRabbit-Review auf PR #212.
MED-2026-07-22-app-ux-process-review-752026-07-2209:2010:201.0Akten-Cockpit 1a (Detail): Mockup-Re-Sync per DesignSync-MCP (MED-D-176, 0.90.0). Auf Nutzerauftrag das aktuelle Akten-Cockpit 1a (Detail).dc.html aus claude.ai/design ("Mandanten-Akte verbessern") gezogen und gegen mandant-detail.component.ts/akte-auftraege.component.ts geprüft — dieses Mockup wurde bereits mehrfach umgesetzt/nachgezogen (MED-D-156/159/162/164/170). Ergebnis: die meisten Differenzen sind bereits bewusst getroffene Entscheidungen (inline Beratungsdoku statt Modal-Overlay; konsolidiertes "Jetzt dran" statt Sidebar-Dopplung; der Mockup-eigene Aktenreife-Ring ist im Mockup selbst hart display:none gesetzt) — bewusst NICHT zurückgebaut. Zwei echte Kleinigkeiten nachgezogen: "Fristen & Aufgaben"-Anlage-Formular per + Aufgabe-Button ein-/ausklappbar (wvFormOffen, wvFormToggle()) statt dauerhaft sichtbar; erledigte Wiedervorlagen per neuem "Wieder öffnen"-Button (wvOeffnen()) reaktivierbar. Reine Client-Änderung. tsc+ng build grün, vitest (522, unverändert) grün, Playwright-Verifikation der Toggle-/Reopen-Interaktion erfolgreich. Doku: Decision-Log MED-D-176, CHANGELOG. Anlass: Nutzerauftrag "Implement Akten-Cockpit 1a (Detail).dc.html".
MED-2026-07-21-app-ux-process-review-742026-07-2119:3519:450.17CodeRabbit-Nachlese zu MED-D-174 (MED-D-175, PR #211, während der Review noch offen): 1 von 2 Befunden echt, keine Versionsänderung. Behoben: MVP-Scope.mds Status-Absatz behauptete pauschal "Slices 1–13 sind feature-complete", widersprach aber der eigenen Backlog-Tabelle (Slice 9 = 🟡 "Kern gebaut", echte Transkription offen) — präzisiert. Bewusst nicht übernommen: timer.test.ts um einen mandant_bearbeiten-403-Test ergänzen — verifiziert, dass aktuell keiner der drei Rollen diese Fähigkeit fehlt, ein solcher Test müsste eine nicht-existente Rolle erfinden (dieselbe unabgedeckte Lücke wie beim bestehenden mandantScopeGuard). tsc+ng build grün (reiner Doku-Fix), Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-175, CHANGELOG. Anlass: CodeRabbit-Review auf PR #211.
MED-2026-07-21-app-ux-process-review-732026-07-2119:0019:350.58CodeRabbit-Nachlese zu MED-D-172 (MED-D-173+MED-D-174, PR #210, bereits gemergt): 4 von 9 Befunden echt + 1 separat gefundener zweiter append-only-Verstoß (0.89.00.89.1, PATCH). PR #210 mergte per Auto-Merge, bevor der Fix gepusht war. Zuerst entdeckt: die MED-D-171-Zeile in Decision-Log/CHANGELOG/Timesheet war in einem lokalen Zwischenschritt versehentlich überschrieben statt ergänzt worden (MED-D-173: alle drei Dateien auf Original-Wortlaut zurückgesetzt, Korrekturrunde bekommt eigene Zeile). Danach die eigentlichen Befunde (MED-D-174): canDeactivate() pausierte den Timer vor statt nach der Schwellen-Prüfung (blieb bei schnellem Verlassen still pausiert stehen) — Reihenfolge korrigiert; /api/timer/start+/api/timer/buchen hatten keine darfSehen/mandant_bearbeiten-Prüfung (echter RBAC-Sicherheitsfund, analog MED-OP-AUTH-2) — nachgezogen, +3 Tests; Lastenheft-Anführungszeichen korrigiert; Konflikt-Test-Assertion + fehlendes konflikt:true-Feld in der Antwort ergänzt. Bewusst nicht übernommen: CLAUDE.md-Kürzung, Test-Uebersicht-Zielgruppe (bereits über Lesepfade geroutet), HANDOFF-Zielgruppen-Vorspann (kein Präzedenzfall). +3 Vitest (522 gesamt), tsc+ng build grün, gegen echten Browser verifiziert. Doku: Decision-Log MED-D-173/174, HANDOFF §2, CHANGELOG. Anlass: CodeRabbit-Review auf PR #210.
MED-2026-07-21-app-ux-process-review-712026-07-2111:2513:151.83Aktiver Timer — ein Timer je Benutzer statt je Browser-Tab (MED-D-172, 0.88.00.89.0, MINOR, OP-TIME-3): Nutzer-Bugreport "mehrere Akten gleichzeitig offen, dann Zeiterfassung nur auf dem aktiven Kunden, der vorne ist — verlassen und schließen nicht möglich". Erste Recherche im canDeactivate/beforeUnload-Guard fand keinen echten Deadlock; auf eine deklinierte Rückfrage hin zunächst nur den Hintergrund-Tab-Uhr-Staleness-Fix (visibilitychange) angesetzt — dann bat der Nutzer explizit um die tiefere, korrekte Lösung: "i actually want one timer only per logged-in user". Neue serverseitige Entität AktiverTimer (Erweiterung von R13 Leistungszeit statt neues Modul, Felder R13-F12..F17, Tabelle aktiver_timer, Migration v43) — genau eine Zeile je Benutzer (G-2), ephemer bis zum Buchen. Neuer AktiverTimerService (starten/pausieren/fortsetzen/korrigieren/buchen/verwerfen) + Routen GET/PATCH /api/timer, POST /api/timer/{start,pause,fortsetzen,buchen,verwerfen}; starten() überschreibt nie einen bereits für einen anderen Mandanten laufenden Timer (liefert 409/konflikt:true statt stillem Ersatz). Client (mandant-detail.component.ts): lokale Timer-Signale durch aktiverTimer()-Server-State ersetzt; timerHierAktiv()/timerAnderswo() steuern Bedienelemente vs. Hinweis "läuft in einer anderen Akte" (Link + Live-Uhr); visibilitychange synct beim Tab-Wechsel den echten Server-Stand. Bewusstes Verhaltens-Update: beforeUnload warnt nicht mehr wegen des Timers (geht durchs Schließen nicht mehr verloren) — nur noch bei ungespeicherten Beratungsdoku-Texten. Gegen echten Browser verifiziert (wrangler dev + Playwright, zwei Tabs/zwei Mandanten): Auto-Start in A, B zeigt korrekt "läuft anderswo" statt eigenen Timer; Pause/Fortsetzen/Buchen wirken sofort serverseitig; ein eigener kosmetischer Bug (Banner zeigte immer den grünen Punkt, auch pausiert) per Screenshot selbst entdeckt und korrigiert. +25 Vitest (timer.test.ts, 519 gesamt), tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-172, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Übersicht, Lastenheft §4.11. Anlass: Nutzer-Bugreport + Klarstellung "i actually want one timer only per logged-in user".
MED-2026-07-21-app-ux-process-review-702026-07-2110:4411:100.43CodeRabbit-Review zu MED-D-170/MED-D-169 (PR #208, noch offen): 6 von 8 Befunden echt (MED-D-171, keine Versionsänderung): Behoben: typografische Anführungszeichen in den neuen MED-D-170-Zeilen (CHANGELOG/Decision-Log/HANDOFF) korrigiert; CLAUDE.mds Status-Absatz präzisiert (nur Self-Service-Karte in der linken Rail, Onboarding-Umschalter in der Item-Liste); 4-Tasten-Umschalter bekam aria-pressed (Screenreader) + No-op-Guard gegen unnötige API-Requests beim Klick auf bereits aktiven Zustand (offen→angefordert bleibt möglich); Feature-Liste-Zeile von Abschnitt 3 nach Abschnitt 1 verschoben. Bewusst nicht übernommen: die zwei CHANGELOG-Zeilen zusammenführen (eigenständige Entscheidungen, analog Decision-Log). tsc + ng build grün (kein Server-Change) + Doku-Konsistenz-Check grün; wrangler dev + Playwright erneut verifiziert (aria-pressed korrekt, zweiter Klick auf aktives "Nötig" löst keinen API-Call aus, Testdaten zurückgesetzt). Doku: Decision-Log MED-D-171, HANDOFF §2, CHANGELOG. Anlass: <github-webhook-activity>-Events (CodeRabbit-Review auf PR #208).
MED-2026-07-20-app-ux-process-review-692026-07-2023:0023:450.75Akten-Cockpit-Detail: Self-Service-Link-Kurzfassung + Onboarding-4-Tasten-Umschalter (MED-D-170, 0.87.00.88.0, MINOR): Design-Import per claude_design-MCP (Projekt "Mandanten-Akte verbessern", Mockup "Akten-Cockpit 1a (Detail)"). Explore-Agent verglich Mockup gegen bestehenden Code — Übersicht-Tab bereits vollständig, Praxen/Dokumente/Wiedervorlagen/Zeiterfassung/Verlauf bereits über .mw-scope auf dieselben Tokens gemappt (kein sichtbarer Restyle-Bedarf); zwei echte Gaps identifiziert und umgesetzt: (1) linke Rail bekommt Self-Service-Link-Karte, liest <md-akte-einladungen>-Signal per viewChild (G-8, kein Zweit-Fetch); (2) Onboarding-Items bekommen 4-Tasten-Umschalter (Geprüft/Da/Nötig/Später) statt 5-wertigem Dropdown, frontend-only über bestehendem ItemStatus. Bewusst nicht übernommen: Tab-Split (revidiert frühere Merge-Entscheidung), Mandate-Modal (eigenständige UX-Entscheidung), der im Mockup selbst display:none gesetzte Aktenreife-Ring (bereits MED-D-164 descoped). tsc + ng build + 494 Vitest (server unverändert) grün; wrangler dev + Playwright gegen echte Seed-Daten ("Mustermann Dr. Max"): Klick auf "Geprüft" → Button-Highlight ändert sich + Fortschritt springt server-seitig auf 1/7·14 % (per curl gegengeprüft), danach zurückgesetzt; Self-Service-Rail-Karte zeigt reale Einladungsdaten (Status "geöffnet", Link, Kopieren/Neuen-Link-Buttons), keine Konsolenfehler. Doku: Decision-Log MED-D-170, HANDOFF §2, CHANGELOG, Feature-Liste. Anlass: Nutzeranstoß (Design-Import-Auftrag).
MED-2026-07-20-app-ux-process-review-682026-07-2022:5023:000.17CodeRabbit-Review zu MED-D-168 (PR #207, bereits gemerged): 1 von 1 Befund echt (MED-D-169, keine Versionsänderung): PR #207 mergte per Auto-Merge, bevor der Fix gepusht war (fünfte Runde in Folge). Behoben: HANDOFF.md sagte "2 von 4 Befunden echt", erklärte aber nur 3 (2 Fixes + 1 Nitpick) — der vierte, bereits im Decision-Log/CHANGELOG dokumentierte "bewusst nicht übernommen"-Befund ergänzt. tsc (client) + Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-169, CHANGELOG. Anlass: <github-webhook-activity>-Events (CodeRabbit-Review auf PR #207).
MED-2026-07-20-app-ux-process-review-672026-07-2022:2522:500.42CodeRabbit-Review zu MED-D-167 (PR #206, bereits gemerged): 2 von 4 Befunden echt (MED-D-168, keine Versionsänderung): Review traf erstmals ein, während der PR noch offen war — doch mergte auch #206 per Auto-Merge, bevor der Fix gepusht war (vierte Runde in Folge); Branch erneut frisch von origin/main aufgesetzt. Behoben: README.mds "Sicht noch offen" konnte weiterhin als offene Produktentscheidung gelesen werden — auf "NextCloud read-only-Sicht: fachlich entschieden, Umsetzung offen" präzisiert; CHANGELOG.mds Formatzeile behauptete strikten PR-Link-Zwang, während die tatsächliche, seit MED-D-144 wiederholt bestätigte Praxis Branch-Namen nutzt — als explizite Ausnahme in der Kopfzeile dokumentiert, löst den wiederkehrenden Doku↔Praxis-Widerspruch. Bewusst nicht übernommen: historische #203/#204-CHANGELOG-Einträge nachträglich um Links ergänzen (append-only-Verstoß, s. MED-D-166). Zurückgestellt: MED-KB-4-Umstrukturierung in Historie-Sektion (von CodeRabbit selbst als Heavy-Lift-Nitpick eingestuft). tsc (client) + Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-168, HANDOFF §2, CHANGELOG. Anlass: <github-webhook-activity>-Events (CodeRabbit-Review auf PR #206).
MED-2026-07-20-app-ux-process-review-662026-07-2022:0522:250.33CodeRabbit-Review zu MED-D-166 (PR #205, bereits gemerged): 2 von 3 Befunden echt (MED-D-167, keine Versionsänderung): PR #205 mergte erneut per Auto-Merge, bevor alle Befunde nachgezogen waren — Branch dritte Runde in Folge frisch von origin/main aufgesetzt. Behoben: README.mds "R2-Ablage (NextCloud künftig read-only, Sicht selbst offen)" widersprach der eigenen Kopfzeile (bereits im Präsens final "NextCloud ausschließlich als Read-Only-Sicht") — auf "R2-Ablage (NextCloud read-only, Sicht noch offen — MED-OP-FILES-1)" präzisiert; Kunden-Besprechungspunkte.mds MED-KB-4-Zeile ließ außerhalb des "Überholt"-Blocks unqualifiziert im Präsens stehen "der Mac-Sync-Wunsch ist mit dem offiziellen Desktop-Client erfüllt" — widersprach der eigenen Endaussage "kein Finder-Sync"; Satz in den Überholt-Block verschoben + ins Präteritum gesetzt. Bewusst nicht übernommen: CHANGELOG-PR-Links für #203/#204 nachtragen (etablierte Konvention seit MED-D-144/155/163/165; ein nachträglicher Edit historischer CHANGELOG-Zeilen allein für einen Link wäre derselbe Eingriffstyp, den MED-D-166 im Decision-Log gerade als Fehler korrigiert hat). Beobachtung: dritte aufeinanderfolgende reine Doku-Nachlese-PR mit demselben Auto-Merge-vor-Review-Timing — kein Workflow-Änderungsbedarf, da jede Runde sauber nachgezogen wurde, nur festgehalten. tsc+ng build+494 Vitest (unverändert)+Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-167, HANDOFF §2, CHANGELOG. Anlass: <github-webhook-activity>-Events (CodeRabbit-Review auf PR #205) nach dessen Merge.
MED-2026-07-20-app-ux-process-review-652026-07-2021:3522:050.5CodeRabbit-Review zu MED-D-165 (PR #204, bereits gemerged): 6 von 7 Befunden echt (MED-D-166, keine Versionsänderung): PR #204 mergte erneut per Auto-Merge, bevor alle Befunde nachgezogen waren — Branch erneut frisch von origin/main aufgesetzt. Behoben: Decision-Log.mds MED-D-165-Zeile hatte selbst das append-only-Prinzip verletzt (bestehende MED-D-164-Zeile direkt editiert statt nur die neue Zeile zu ergänzen) — Edit zurückgenommen, dieselbe Zeile hatte außerdem eine falsche "12 von 13"-Bilanz bei gleichzeitig zwei aufgelisteten Ausnahmen — korrigiert auf 11 behoben + 2 bewusst nicht übernommen = 13 (auch in CHANGELOG nachgezogen); Kunden-Besprechungspunkte.mds MED-KB-4-Status von 🟡 offen auf ✅ geklärt (der Zeilentext bestätigte längst "keine offene Kundenklärung mehr"), plus "Read-Only-Notfall-Backup"→"-Sicht" präzisiert (kein unabhängiges Backup, nur ein Blick auf dieselben R2-Dokumente); Feature-Liste.mds zwei NextCloud-Detailzeilen (Upload-Link/Webhook, Sandbox-Wurzel) um "seit R2-Aktivierung MED-D-61 ungenutzt, Code bleibt Fallback-Pfad" ergänzt (standen sonst unkommentiert neben der jetzt auf ✅/R2 umgestellten Zusammenfassungszeile); Management-Summary.mds §5 strich die jetzt redundante "Echte Dokumentenablage & E-Mail"-Zeile (Ablage produktiv, E-Mail hat bereits eigene Zeile); README.mds "R2-Ablage (NextCloud read-only)" konnte als bereits ausgeliefert gelesen werden, obwohl nur die Rolle final ist (Bau offen, MED-OP-FILES-1) — präzisiert. Bewusst nicht übernommen: hartes "retired/legacy" an den Feature-Liste-Zeilen (der NextCloudClient-Vertrag bleibt eine aktive Storage-Abstraktion, nur der Webhook-Pfad ist bei R2-Backend ungenutzt). tsc+ng build+494 Vitest (unverändert)+Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-166, HANDOFF §2, CHANGELOG. Anlass: <github-webhook-activity>-Events (CodeRabbit-Review auf PR #204) nach dessen Merge.
MED-2026-07-20-app-ux-process-review-642026-07-2021:0021:350.58CodeRabbit-Review zu MED-D-164 (PR #203, bereits gemerged): 11 von 13 Befunden echt und behoben, 2 bewusst nicht übernommen (MED-D-165, keine Versionsänderung): PR #203 mergte per Auto-Merge, bevor alle Befunde nachgezogen waren — Branch per git fetch origin main && git checkout -B … origin/main frisch aufgesetzt (die MED-D-164-Commits sind bereits per Squash in main). Behoben: .md-wordmark-suffix fehlte white-space: nowrap (styles.css); Rest-"Medidentas"-Erwähnungen in den bereits umbenannten Identitäts-Dateien nachgezogen (README.md, Management-Summary.md, Produkt-und-Marketing.md, Entwicklungsansatz.md); README.mds "Dokumente / NextCloud + R2-Ablage" → "R2-Ablage (NextCloud read-only)"; Produkt-und-Marketing.mds "Dokumente in NextCloud"-Bullet auf R2-Realität korrigiert; Management-Summary.mds BLUF+Status-Tabelle widersprachen der eigenen späteren "✅ produktiv"-Zeile zu R2 — vereinheitlicht; Feature-Liste.mds zusammenfassende Dokumenten-Verwaltung-Zeile von 🟡/Fake auf ✅ (R2 seit MED-D-61 produktiv) umgestellt; Decision-Log.mds MED-D-164-Text nannte MED-OP-REIFE-1 nur inhaltlich, nicht als wörtliche ID — ergänzt; Dokumentenverwaltung-NextCloud.mds "Final entschieden"-Absatz widersprach sich selbst (behauptete "nur noch der Bau offen", nannte im selben Atemzug das offene Zugriffslog-/Rollen-Scope-Problem) — umformuliert: final ist nur die Rolle, Zugriffskonzept bleibt eigener offener Punkt; Kunden-Besprechungspunkte.mds MED-KB-4-Zeile behielt den alten "Zu bestätigen"-Absatz unkommentiert neben der neuen Bestätigung — als überholt annotiert statt gelöscht (G-4). Bewusst nicht übernommen: CHANGELOG-PR-Link (etablierte Branch-Namen-Konvention); docs/README.mds Tabellenzeilen, die wörtlich fremde (bewusst nicht umbenannte) Überschriften zitieren — Umbenennung dort hätte neue Doku↔Doku-Inkonsistenz erzeugt. tsc+ng build+494 Vitest (unverändert)+Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-165, HANDOFF §2, CHANGELOG. Anlass: <github-webhook-activity>-Events (CodeRabbit-Review auf PR #203) nach dessen Merge.
MED-2026-07-20-app-ux-process-review-632026-07-2019:3021:001.5Drei Nutzeranstöße: Aktenreife-Ring descoped, NextCloud-Rolle final, Marke "Medidentas Digital" (MED-D-164, 0.86.00.87.0, MINOR): (1) Nutzeranstoß "Nimm die Aktenreife erstmal raus - halte das als OP für später" — Rückfrage zum Umfang (nur Ring vs. auch Badges/Jetzt-dran vs. auch Cockpit), Nutzer wählte "nur der Ring". Ring-Markup + verwaiste Methoden (zuPunkt/offenGesamt/reifeLabel/ringOffset/ringUmfang) + Importe entfernt, tsc bestätigt sauber; als MED-OP-REIFE-1 in HANDOFF §4 vermerkt. (2) Nutzeraussage "NextCloud ist rein read-only-Sicht auf die Dokumente in der App" bestätigt formal den seit MED-KB-4 (12.07.) skizzierten, bislang vorläufigen Plan — HANDOFF MED-OP-FILES-1, Dokumentenverwaltung-NextCloud.md §Nachtrag, Kunden-Besprechungspunkte.md MED-KB-4 auf "final entschieden" aktualisiert; dabei den MED-D-163-vertagten CodeRabbit-Fund "Ablage (NextCloud)"→"Ablage (R2)" behoben + 5 weitere gleichartige Stellen (Cockpit-Hinweis, Verwaltung-Hilfetext, 3 Fehlermeldungen) korrigiert; bewusst nicht gesweept: tiefere Lastenheft/Architektur-Diagramm-Stellen (Umfang über den Anstoß hinaus). (3) Nutzeranstoß "Nenne die App 'Medidentas Digital'" — Rückfrage zum Umfang (Identität+UI-Oberflächen vs. jede Erwähnung inkl. Rechtsträger-Text) ergab "Identität+UI-Oberflächen"; Identitäts-Sätze in 7 Docs, In-App-Wortmarke (.mw-brand-suffix/.md-wordmark-suffix, gedämpfter "Digital"-Zusatz statt Wortmarken-Umbau) + Browser-Tab-Titel + 4 öffentliche Kundenseiten umbenannt; bewusst unverändert: Domain/Package/Repo/Branch-Schema + "© medidentas GmbH" (Rechtsträger, anderer Namensraum). tsc+ng build grün, 494 Vitest unverändert grün, Doku-Konsistenz-Check grün, wrangler dev+Playwright (Akte/Cockpit/öffentliche Onboarding-Seite, 1440px): Ring weg, Wortmarke korrekt, "Ablage (R2)", keine Konsolenfehler. Doku: Decision-Log MED-D-164, HANDOFF §2/§4, CHANGELOG, Feature-Liste, Kunden-Besprechungspunkte MED-KB-4, Versions-Stempel (9 Dateien). Anlass: Nutzeranstöße "NextCloud ist rein read-only-Sicht...", "Nenne die App 'Medidentas Digital'", "Nimm die Aktenreife erstmal raus...".
MED-2026-07-20-app-ux-process-review-622026-07-2017:2017:450.42CodeRabbit-Review zu MED-D-162 (PR #202): 3 von 5 Befunden echt (MED-D-163, keine Versionsänderung): Jeder Befund einzeln gegen den tatsächlichen Code/die Konvention verifiziert statt blind übernommen. Echt, behoben: akte-auftraege.component.ts-Toast "Beratungsauftrag angelegt." → "Mandat angelegt." (Konsistenz mit dem bereits umbenannten "+ Mandat anlegen"-Button, Mandat = etabliertes UI-Wort seit MED-D-158); mandant-detail.component.ts a.reife.offen[0] bekommt ?? 'Details'-Fallback (laut auftrag-reife.ts heute unmöglich, da reif direkt offen.length===0 ist, aber günstige Härtung); typografische „Zeiterfassung"-Anführung in der neuen MED-D-162-Prosa (Feature-Liste.md/Decision-Log.md) auf gerade Anführungszeichen korrigiert (MED-D-145-Konvention gilt für **/*.md, nicht für den identischen UI-Text im .ts-Template). Bewusst nicht übernommen: CHANGELOG-Bullet-Auftrennung (widerspricht etablierter Absatz-Konvention); "Ablage (NextCloud)"→"(R2)" (echter, aber vorbestehender Befund — Titel hieß schon vor MED-D-162 "(NextCloud)", Mockup spezifiziert denselben Wortlaut — als Rest an MED-OP-FILES-1 in HANDOFF §4 vermerkt statt isoliert gepatcht). tsc+ng build+494 Vitest (unverändert)+Doku-Konsistenz-Check grün. Zwischenzeitlich ein CI-Fehlschlag auf "Doku-Konsistenz" für den bereits gepushten Commit beobachtet — gegen denselben Commit in einem isolierten Worktree lokal reproduziert: Skript lief grün (exit 0), also transienter Infra-Flake statt echtes Problem; Re-Run angestoßen statt am Content herumzudoktern. Doku: Decision-Log MED-D-163, HANDOFF §4, CHANGELOG. Anlass: CodeRabbit-Review-Kommentare auf PR #202 nach dem Merge-Kandidaten-Push.
MED-2026-07-20-app-ux-process-review-612026-07-2015:4517:201.58Akten-Cockpit auf strikte Mockup-Konformität nachgezogen (MED-D-162, 0.85.10.86.0, MINOR): Nutzerauftrag "Use the claude_design MCP … Implement: Implement this strictly according to this design" — Original-Mockup ("Akten-Cockpit 1a (Detail)", MED-D-156) erneut per DesignSync-MCP importiert (get_project/list_files/get_file), per dediziertem Recherche-Agent gegen die aktuelle Implementierung Section-für-Section diff't. 26 reale Abweichungen gefunden (Fake-Daten-Unterschiede bewusst ausgeklammert). Behoben: Tab-Leiste 8→6 (Onboarding+Stammdaten verschmolzen, Verlauf aus der Nav entfernt — bleibt per Link erreichbar); neue tabBadge()-Methode zeigt reale Zahlen auf jedem Tab; Mandats-Status-Widget Pill+"Schritt X von 5"+5-Segment-Balken (Guard/409/Undo-Toast unverändert); ⌘K-Chip; Kontext-Chip an "Jetzt dran" (aus bestehender kategorie, G-2); situative Primäraktion auf Mandate-Karten (Fortschrittsleiste bewusst nicht nachgebaut, keine echte Prozentzahl vorhanden); "⚠ Offen in diesem Mandat"-Kasten mit Schweregrad-Chips; "noch keine Leistungszeit gebucht"-Hinweis (neuer leistungszeit-Input, kein neuer Fetch); Wortlaut-Fixes (Ablage (NextCloud), Fristen & Aufgaben, + Mandat anlegen, UC-8-Leak entfernt); .mw-stat-Kacheln; persistenter Bestätigungshinweis nach Zeitbuchung (löscht sich beim Weitertippen); Akteur-Kürzel in Letzte Aktivität. Bewusst nicht verändert (begründet): Dentmarking bleibt eigenständige Karte (praxis- statt auftragsgebunden), Freies Dokument bleibt eigene Sektion (Reihenfolge stimmt bereits, Verschmelzung hätte CRUD-Funktionalität riskiert). Ein Zwischenfehler (Backtick in einem Template-Kommentar sprengte den TS-Template-Literal-String) sofort gefunden+korrigiert. 494 Vitest unverändert grün, tsc+ng build grün, wrangler dev+Playwright gegen "Mustermann Dr. Max" (1440px+390px): alle Fixes bestätigt, kein Overflow, keine Konsolenfehler. Doku: Decision-Log MED-D-162, HANDOFF §2, CHANGELOG, Feature-Liste, Versions-Stempel (9 Dateien). Anlass: Nutzerauftrag "Use the claude_design MCP … Implement this strictly according to this design".
MED-2026-07-20-app-ux-process-review-602026-07-2015:2515:450.33Zwei weitere Nutzeranstöße doku-only festgehalten (MED-D-161, keine Versionsänderung): (1) "OP: Beratungsmandate: Immobilienfinanzierung, Dexpansion (Dentale Expansion)" → neue MED-KB-9 in Kunden-Besprechungspunkte.md (Abgrenzungsfragen zum bestehenden 9-Produkt-Katalog — Immobilienfinanzierung vs. Praxisfinanzierung, Dexpansion vs. Dexman-Controlling — brauchen Kundenbestätigung, analog MED-KB-7-Prozess). (2) "OP: Textbausteine für Beratungsdoku" → neuer MED-OP-BAUSTEIN-1 in HANDOFF.md §4: Recherche zeigte Beratungsdoku.bausteine[] (R6-F05) existiert bereits, aber nur als vier hartcodierte Themen-Überschriften-Sets (domain/beratung-themen.ts) für Vollständigkeits-Check + Platzhalter-Hinweis — keine echte Textbaustein-Bibliothek mit Einfügen-Aktion/Admin-Editierbarkeit (FR-2/R6-F04 spezifizieren das bereits, war aber nie als benannter Punkt verfolgt); kein Kundenklärungsbedarf hier, reiner Bau-Rückstand. PR #200 (MED-D-160) mergte währenddessen — Branch vor dem Commit per git checkout -B … origin/main frisch aufgesetzt. Kein Code-/Schema-Change, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-161, HANDOFF §4, CHANGELOG, Kunden-Besprechungspunkte.md. Anlass: Nutzeranstöße "OP: Beratungsmandate: Immobiolinefinazierung, Dexpansion (Dentale Expansion)" und "OP: Textbausteine für Beratunsgdoku".
MED-2026-07-20-app-ux-process-review-592026-07-2015:0015:200.33VEM + eigenständige Darlehensübersicht als OP-DEX-10 festgehalten (MED-D-160, keine Versionsänderung): Nutzeranstoß "OP: DAM (Darlehensübersicht) und VEM (Vermögensmanagement) auch abbilden". Recherche in Dexman-Fachmodell.md/Dexman.md zeigte: DAM ist bereits als Zuliefer-Quelle erfasst (§3, speist DEX-9 Darlehensspiegel), aber nur als Rohdaten-Import in DexMans Darlehen-Blatt, keine eigenständige Sicht. VEM ist komplett neu — in keinem der drei bisher analysierten Excel-Bestandstools erwähnt. Da weder Excel-Datei noch Feldkatalog für VEM vorliegen, bewusst kein spekulativer Fachmodell-Abschnitt verfasst (analog dem Analyse-Stand von DAM/PM vor Session 2026-07-03) — stattdessen neuer, offen formulierter OP-DEX-10 in Dexman.md §10 + Dexman-Fachmodell.md §10 (Quellsystem-Tabelle um VEM-Zeile "noch nicht analysiert" ergänzt): Analyse-Session nachholen, Integrationspfad klären (VBA-Import wie DAM/PM vs. eigenständiges Modul mit eigener Oberfläche), Bedarf einer eigenständigen DAM-Sicht klären. OP-DEX-6..9-Range-Referenzen auf OP-DEX-6..10 nachgezogen (Dexman.md, Dexman-Fachmodell.md, HANDOFF.md §4/§5). Kein Code-/Schema-Change, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-160, HANDOFF §4/§5, CHANGELOG. Anlass: Nutzeranstoß "OP: DAM (Darlehensübersicht) und VEM (Vermögensmanagement) auch abbilden".
MED-2026-07-20-app-ux-process-review-582026-07-2012:1013:000.83Register-Tableiste + Timer-Kopf: Überlauf behoben (MED-D-159, 0.85.00.85.1, PATCH): Nutzer meldete per Screenshot "Fonts passen nicht (zoom 100%)" — vorab lokal geprüft, ob Space Grotesk tatsächlich fehlschlägt (Computed-Style + Canvas-Glyphenbreiten-Vergleich bestätigten: Font lädt korrekt), Nutzer bestätigte per Devtools-Netzwerk-Check ebenfalls "200, aus Speicher" — kein Font-Ladefehler. Zweiter Screenshot mit konkretem Fingerzeig ("Die Schrift überlappt … kam mit der Übernahme des neuen Designs") zeigte den echten Bug: die abgeschnittene "Zeiterfa[ssung]"-Registerkarte. Reproduziert statt geraten (wrangler dev + Playwright, Timer per Überschreiben-Button auf 22 Min gesetzt): Root-Cause .mw-seg (Cockpit-2–3-Optionen-Umschalter, flex: none, kein Wrap/Scroll) wird vom Akten-Cockpit-Redesign (MED-D-156) für die jetzt 8-teilige Register-Leiste weiterverwendet — sie überläuft die Mittelspalte und verschwindet hinter der später gemalten, opaken rechten Kontext-Spalte (kein DOM-Overlap, overlapArea:0 gemessen — reine Paint-Reihenfolge). Fix: neue, eng gescopte .mw-seg-scroll-Klasse (overflow-x:auto, Buttons flex:none/nowrap) nur an der Akte-Registerleiste, Cockpits Basis-.mw-seg unverändert; per Playwright bestätigt (scrollWidth 934px > clientWidth 777px, "Verlauf"-Tab per Scroll erreichbar/klickbar). Zweiter, verwandter Fund im selben Screenshot: .md-timer-head (ebenfalls flex:none) ließ die stets 8-stellige HH:MM:SS-Uhr über die Timer-Karte hinauslaufen, sobald das Label auf 2 Zeilen umbrach — flex-wrap:wrap ergänzt, Uhr fällt jetzt sauber in eine eigene Zeile (Bounding-Box-Überlauf vorher/nachher: +10px0px). Kein Server-/Schema-Change; 494 Vitest unverändert grün, tsc + ng build + Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-159, HANDOFF §2, CHANGELOG, Feature-Liste, version.ts/CLAUDE/README/Lastenheft/MVP-Scope/Sanity-Checkliste/Management-Summary/Test-Uebersicht. Anlass: Nutzer-Screenshot "Fonts passen nicht (zoom 100%)" → Rückfrage/Diagnose → zweiter Screenshot "Die Schrift überlappt … kam jetzt mit der Übernahme des neuen Designs".
MED-2026-07-20-app-ux-process-review-572026-07-2002:0502:350.5CodeRabbit-Nachlese zu MED-D-157 (MED-D-158, keine Versionsänderung): PR #197 mergte per Auto-Merge, bevor CodeRabbits Review eintraf (Draft-Skip-Timing, analog MED-D-131/143/152). Jeder der 8 Befunde einzeln gegen den bereits gemergten Code verifiziert. 6 echt: typografische Anführungszeichen in 4 selbst hinzugefügten Zeilen korrigiert + CHANGELOG-PR-Link nachgezogen; README.md-Überclaim "UX-Wellen 1–9" (Welle 9 laut HANDOFF weiterhin 🟡) zurück auf "1–8"; auftragLabelVon() zeigte nur produktLabel — bei mehreren Beratungsaufträgen desselben Produkts identisch in der Historie (selbst in der Live-Verifikation von PR #197 gesehen: zwei "Dentmarking-Gutachten"), jetzt mit Status ergänzt; app.tss auftragRef-Typ-Validierung akzeptierte Zahl/Objekt stillschweigend als "kein Mandat", jetzt expliziter 400 + .trim(), neuer Regressionstest. Bewusst nicht wörtlich übernommen: "Mandat"→"Beratungsauftrag"-Umbenennung im Decision-Log (Mandat ist das bewusst gewählte UI-Wort, G-3, keine Terminologie-Abweichung). Real, aber nicht isoliert gepatcht: migrate.tss fehlende Restart-Sicherheit ist systemisch seit v1, nicht v42-spezifisch — neuer benannter OP MED-OP-MIGRATE-1 statt Einzel-Patch (analog MED-OP-TEST-1). +1 Vitest (493→494, 46 Dateien), tsc + ng build + Doku-Konsistenz-Check grün, wrangler dev + Playwright erneut gegen "Mustermann Dr. Max" verifiziert (Label zeigt jetzt "Dentmarking-Gutachten — in Anbahnung"). Doku: Decision-Log MED-D-158, HANDOFF §4 (neuer OP), CHANGELOG. Anlass: eingehende <github-webhook-activity>-Events (CodeRabbit-Review-Kommentare) nach dem Merge von PR #197 → Nutzer "yes" zur Nachlese.
MED-2026-07-20-app-ux-process-review-562026-07-2000:3502:051.5Zeiterfassungs-"Mandat"-Zuordnung nachgeliefert (MED-D-157, 0.84.00.85.0, MINOR): direkte Fortsetzung nach dem Merge von PR #196 — Nutzerfrage "wurden die Design-Anpassungen schon vollständig übernommen?" deckte den in MED-D-156 dokumentierten offenen Punkt auf (Zeiterfassungs-Mandat-Zuordnung am Timer, bewusst zurückgestellt); Nutzer bestätigte "ja" zur Umsetzung als Folge-Slice. Branch war bereits gemergt (PR #196 squash-merged auf main) — gemäß Merge-Konvention frisch von origin/main neu aufgesetzt. Recherche-Agent klärte vorab die Feld-Semantik: Leistungszeit.beratungRef referenziert R6 Beratungsdoku (Auto-Seed-Herkunft), nicht Beratungsauftrag direkt — Wiederverwendung wäre ein Feld-Overload gewesen; stattdessen neues eigenständiges Feld auftragRef (R13-F11), analog dem bereits etablierten Muster bei Wiedervorlage/Dokument/Beratungsdoku (MED-D-101/104). Server: LeistungszeitService#erfassen() akzeptiert optionales auftragRef; app.ts-Route validiert Existenz + Mandanten-Zugehörigkeit via repo.getBeratungsauftrag() (sonst 400); migrate.ts v42 (ALTER TABLE leistungszeit ADD COLUMN auftrag_ref + Index); Schema/Memory-Repo/D1-Repo im bestehenden beratungRef-Muster mitgezogen. Client: neues Mandat-<select> am Live-Timer (Optionen aus dem bereits eager geladenen auftraege()-Signal, kein neuer Fetch), geteiltes Signal an der "Verlassen & buchen"-Modal, eigenes Signal im retroaktiven Erfassen-Formular — beide Buchungswege rufen leistungszeitErfassen(), beide bekommen den Picker; Historie zeigt "· Mandat: X" analog "· aus Beratung". Gegen echten Browser verifiziert (wrangler dev + Playwright, "Mustermann Dr. Max"): Auswahl → Buchen → Historie zeigt korrekte Zuordnung, retroaktives Formular ebenso, 390px ohne Overflow, keine Konsolenfehler. +2 Vitest (491→493, 46 Dateien), tsc + ng build + Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-157, HANDOFF §2/§5, CHANGELOG, Feature-Liste, Test-Übersicht, version.ts/CLAUDE/README/Lastenheft/MVP-Scope/Sanity-Checkliste/Management-Summary. Anlass: Nutzerfrage "wurden die Design-Anpassungen schon vollständig übernommen?" → "ja".
MED-2026-07-19-app-ux-process-review-552026-07-1920:4000:353.92Akten-Cockpit-Redesign (MED-D-156, 0.83.10.84.0, MINOR): Nutzerauftrag, ein per claude.ai/design erstelltes Mockup ("Akten-Cockpit 1a (Detail)") via DesignSync-MCP zu importieren und umzusetzen — die Akte (mandant-detail.component.ts) auf das Cockpit-Design (.mw-*/World-2) umzustellen statt der separaten hellen Brand-Optik. Plan-Mode-Workflow (Explore-Agenten → Plan-Agent → 4 AskUserQuestion-Weggabelungen, alle nach Empfehlung entschieden): Lifecycle-Pill bleibt klickbar + voll funktional; globaler Header für /mandant/:id durch Cockpit-Header ersetzt; Mandate-Tab voll verschmolzen (akte-auftraege.component.ts übernimmt komplette Beratungsdoku-Bearbeitung inline pro Auftrag inkl. neuer "Anlegen & verknüpfen"-Direktbindung); ein großer PR. Vollbild-3-Spalten-Layout aus bereits bestehenden Cockpit-CSS-Klassen (.mw-app/-header/-fokus/-rail/-ctx) statt neu erfundener Grids — .mw-scopes bestehender CSS-Var-Remap bedeutete, dass alle unangetasteten Register (Dokumente/Onboarding/Wiedervorlagen/Zeiterfassung/Verlauf/Stammdaten) unverändert blieben. G-4-Dirty-Check für unges­icherte Beratungsdoku-Entwürfe über viewChild(AkteAuftraegeComponent) ins Kind delegiert (Kind bleibt bei Tab-Wechsel im DOM, nur [hidden]). Dabei mitgeliefert: fehlender error:-Handler an lifecycleZuruecksetzen() (MED-OP-UX-8 Punkt 3). Zwei genuine Bugs erst in der Playwright-Live-Verifikation gefunden (von tsc/vitest/ng build nicht erfasst): eine übrig gebliebene Lifecycle-basierte Erst-Tab-Heuristik in laden() überschrieb den neuen Standard-Tab "Übersicht" beim ersten Laden (an "Mustermann Dr. Max" reproduziert, Onboarding-Status öffnete auf Register "Onboarding") — entfernt; die geteilte .mw-rail-Klasse trug eine Cockpit-spezifische Mobil-Transformation, die an der Akte zu einer horizontal überlaufenden Sidebar führte (scrollWidth=977px vs. clientWidth=390px bei 390px, live per DOM-Messung bestätigt) — per neuer, höher-spezifischer .mw-scope-Regel behoben, Cockpit selbst unverändert. Bewusst nicht gebaut: die im Mockup gezeigte Zeiterfassungs-"Mandat"-Zuordnung (bräuchte einen neuen Backend-Endpunkt, out of scope für diesen rein clientseitigen Umbau; offener Punkt HANDOFF §5). 491 Vitest (Server, unverändert) + tsc + ng build grün, wrangler dev + Playwright gegen zwei reale Testakten ("MED-D-1xx Test C" [2 Aufträge] · "Mustermann Dr. Max" [16 Aufträge]) verifiziert (Übersicht-Tab, verschmolzener Mandate-Merge-Flow, Lifecycle-Pill-Klick inkl. Abbrechen-Pfad, Timer/Aktenreife-Ring/Letzte-Aktivität, keine Konsolenfehler, 390px ohne Overflow nach den beiden Fixes). Doku: Decision-Log MED-D-156, HANDOFF §2/§4/§5, CHANGELOG, Feature-Liste, version.ts/CLAUDE/MVP-Scope/Management-Summary/Test-Uebersicht/Sanity-Checkliste/Lastenheft. Anlass: Nutzerauftrag "Use the claude_design MCP … Implement: Akten-Cockpit 1a (Detail).dc.html".
MED-2026-07-19-app-ux-process-review-542026-07-1920:2520:350.17CodeRabbit-Nachlese zu MED-D-154 (MED-D-155, keine Versionsänderung): PR #195s Review fand 4 Befunde, 3 echt — der eigene Versions-Stempel-Sync (0.83.00.83.1) hatte nur die vom Konsistenz-Check §8 geprüfte erste "Stand"-Zeile je Datei getroffen, drei Dateien trugen weitere Stellen mit dem alten Stand/Testzahl (Test-Uebersicht.md Tabellenzeile, MVP-Scope.md Status-Absatz, Management-Summary.md drei Stellen). Alle auf 0.83.1/491 korrigiert. Bewusst nicht übernommen: CHANGELOG-PR-Link statt Branch-Name (MED-D-144-Präzedenz). Kein Code-Change, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-155, HANDOFF §2, CHANGELOG.
MED-2026-07-19-app-ux-process-review-532026-07-1917:2017:500.5PHASE_LABEL-Dopplung behoben (MED-D-154, 0.83.00.83.1, PATCH): Nutzeranstoß "PHASE_LABEL-Dopplung" — Punkt 1 des Welle-9-Backlogs (MED-OP-UX-8) aus dem gerade abgeschlossenen App-Audit (MED-D-153, Befund B9). cockpit.component.tss lokale PHASE_LABEL-Konstante hatte vom kanonischen LIFECYCLE_LABEL abweichende Werte (aktiv:'Aktiv' statt 'Aktiv (betreut)'). Fix: const PHASE_LABEL = LIFECYCLE_LABEL (Alias statt Kopie); PHASE_STRIP/PIPELINE_PHASEN/PHASE_VAR (indizieren intern per Label-String, nicht Enum) auf PHASE_LABEL.<key> umgestellt, sonst hätte der reine Konstanten-Tausch die Sortier-/Farblogik gebrochen. Beim Nachsuchen nach demselben Fehlerbild eine zweite Dopplung gefunden: mandant-detail.component.ts#lifecycleLabel() hatte einen eigenen, zufällig noch wertgleichen Hardcode — ebenfalls auf LIFECYCLE_LABEL umgestellt. Live verifiziert (wrangler dev + Playwright): Cockpit zeigt jetzt korrekt "Aktiv (betreut)", kein Layout-Bruch, keine Konsolenfehler. 491 Vitest unverändert grün, tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-154, HANDOFF §2/§4, CHANGELOG, Versions-Stempel (0.83.0→0.83.1) in CLAUDE/MVP-Scope/Management-Summary/Test-Uebersicht/Sanity-Checkliste/Feature-Liste/Lastenheft.
MED-2026-07-19-app-ux-process-review-522026-07-1915:4017:101.5App-UX-Audit auf v0.83.0 aufgefrischt (MED-D-153, keine Versionsänderung): Nutzeranstoß "Was als Nächstes?" → Empfehlung Audit-Refresh vs. Beratungsauftrag-Roadmap → Nutzer "Fang mit dem Audit-Refresh an". Bezugspunkt v0.72.0/MED-D-107 war 11 Minor-Versionen alt, über der Stale-Schwelle (agents.md §6.7). Fünf parallele Dimensions-Review-Agenten (Feedback-Verlässlichkeit · Sprache G-3/G-8 · Kundenstrecken · Design/Mobile/A11y · neu: Eine Handschrift/Konsistenz, eigene Dimension diese Runde wegen des Umfangs der Welle-8/World-2-Konsolidierung) + Live-Begehung (wrangler dev + Playwright, Desktop 1440px + Mobil 390px, Testakten "Mustermann Dr. Max" [16 Beratungsaufträge, gezielt als Chip-Overflow-Stresstest gewählt] und "MED-D-1xx Test C (Multi-Auftrag)"). Ergebnis: alle carry-over Befunde B1–B4/B6/B7 verifizieren als weiterhin behoben/unverändert — kein Rückfall durch den MED-D-151-Umbau, obwohl dieser praktisch jede vorher gehärtete Fläche neu anfasste. Zwei neue, umbau-eigene Befunde live bestätigt: Cockpit-Chip-Overflow (rowScrollWidth=190px > rowClientWidth=180px per DOM-Messung) und PHASE_LABEL-Dopplung in cockpit.component.ts (G-8-Verstoß, weicht von LIFECYCLE_LABEL ab). Dazu Lifecycle-Undo ohne Fehlerbehandlung, Playbook-Fehler ohne UI-Signal, drei Kleinbefunde. Neuer Backlog B8–B13 → MED-OP-UX-8 (Welle 9). In-place-Überschreibung von docs/betrieb/UX-Prozess-Review-2026-07.md (Bezugspunkt bleibt im 2026-07-Monat, keine neue Datei — bestätigt per git log --follow-Präzedenzfall MED-D-107). Bewusst kein Code-Fix in dieser Runde (dies ist der Audit selbst). Doku: Decision-Log MED-D-153, HANDOFF §2/§4/§5, CHANGELOG.
MED-2026-07-19-app-ux-process-review-512026-07-1914:5015:350.75CodeRabbit-Nachlese zu MED-D-151 (MED-D-152, keine Versionsänderung): PR #192 mergte per Auto-Merge, bevor CodeRabbits Review eintraf (Draft-Skip-Timing, bekanntes Muster). Jeder der 14 Befunde einzeln gegen den bereits gemergten Code verifiziert. Major, echt: service.ts#aktualisieren()s Lifecycle-Playbook-Erzeugung lief ungeschützt vor den audit.record-Aufrufen — ein Repo-Fehler hätte den bereits persistierten Lifecycle-Wechsel unauditiert gelassen (500 statt 200), ein direkter Verstoß gegen das im selben Code kommentierte G-4-Ziel und inkonsistent zum bereits korrekten Best-effort-Muster in beratungsauftrag-service.ts. Mit try/catch isoliert, neues PII-armes mandant.playbook_fehler-Audit-Event + Label; Regressionstest vorab gegen den ungefixten Stand verifiziert (schlägt mit 500 fehl, mit Fix 200 + beide Audit-Events vorhanden). 11 Doku-Funde echt: CLAUDE.md/Beratungsauftraege.md-Achsen-Terminologie (fälschlich 3 statt 2 Achsen benannt) klargestellt; Prozessmodell.md (Blockquote-Leerzeile, ein typografisches Anführungszeichen, "Umbau P2" widersprach dem bereits ✅ Fahrplan-Eintrag, Wiedervorlagen fälschlich als Lifecycle-Stufe gelistet, auftragStatus→kanonisches Beratungsauftrag.status); Test-Uebersicht.md (Anführungszeichen + nie geschlossene Klammer im Intro); Feature-Liste.md (dieselbe Wiedervorlagen-Ungenauigkeit); Management-Summary.md/MVP-Scope.md (Fließtext-Körper hinkte dem bereits aktualisierten Kopf-Stempel hinterher, 484→490/C2a→C2b). Zusätzlich im eigenen Nachlese-Audit gefunden (nicht von CodeRabbit gemeldet, gleicher Root Cause — ein breiter sed-Stempel-Sync hatte nur die "Stand"-Zeile getroffen): Lastenheft.md §5.1/§5.1a/§5.2 (die fachliche Master-Spec) trug noch den vollständigen alten prozessphase-Sechs-Zustands-Diskurs inkl. Diagramm + POST /phase-Routenbeschreibung — komplett auf das Zwei-Achsen-Modell umgeschrieben (Lifecycle-Diagramm analog Prozessmodell.md §3); Sanity-Checkliste.md drei True-North-Prüfpunkt-Zellen ebenso. Bewusst nicht übernommen: CHANGELOG-PR-Link statt Branch-Name (bereits MED-D-144 geprüft und als etablierte Konvention verworfen, kein neuer Grund). 491 Vitest (490→491, 46 Dateien), tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-152, HANDOFF §2, CHANGELOG. Anlass: eingehende <github-webhook-activity>-Events (CodeRabbit-Review-Kommentare) nach dem Merge von PR #192.
MED-2026-07-19-app-ux-process-review-502026-07-1912:1514:502.58PROZESS_PHASE retiriert — LIFECYCLE_STATUS (grob) + AUFTRAG_STATUS (fein) (MED-D-151, 0.82.00.83.0, MINOR): Ausgangsfrage war nur eine Umbenennung (onboardingvorbereitung, Namenskollision mit LIFECYCLE_STATUS); Prüfung ergab, Mandant.prozessphase ist strukturell redundant zu Beratungsauftrag.status (MED-D-95). Nutzer bestätigte per Rückfrage "Es gibt separate Phasenmodelle für (1) Mandanten und (2) Beratungsmandate — korrekt?" und legte danach das finale Mapping fest (erstkontakt→lead, onboarding/beratung/unterschrift→onboarding, betreuung→aktiv) — kein neues DB-Feld nötig. Plan-Mode-Workflow (Explore → Plan-Agent → 2 weitere AskUserQuestion-Entscheidungen: Code-Katalog statt admin-editierbares Playbook; sofort Auftrag-Status-Chips im Cockpit statt nur grobe Lane-Reduktion) → Plan genehmigt → vollständig autonom umgesetzt. Neue domain/lifecycle.ts (ersetzt phasen.ts): LIFECYCLE_SPINE=['lead','onboarding','aktiv'], erster Guard auf lifecycleStatus (Eintritt aktiv verlangt vollständiges Onboarding + keine offenen Unterschriften, PATCH kann jetzt 409 liefern). Mandanten-Playbook auf 2 Einträge reduziert; termin/ruecklauf leben als neuer Code-Katalog AUFTRAG_STATUS_PLAYBOOK am Beratungsauftrag, feuern auf Statuswechsel (beratungsauftrag-service.ts). aktenreife.ts/naechste-schritte.ts von phase/jePhase auf stufe/jeStufe. DB: migrate.ts v40 (Mandant-Reconcile + DROP COLUMN prozessphase, monoton vorwärts, nie regressiv) + v41 (Playbook-Remap, deaktiviert statt gelöscht). Client: MandantCockpit.auftragStatusZusammenfassung (Chips je Karte), Leitstand-Lanes Lead·Onboarding·Aktiv·Ruhend, zweites Prozessphase-Select entfernt, Register „Beratung"/„Unterschrift" falten in „Beratungsaufträge", „Betreuung"→„Wiedervorlagen". Selbst diagnostiziert + korrigiert vor Sichtbarkeit: ein erster Entwurf führte einen neuen Audit-Aktionscode mandant.lifecycle_gewechselt ein (unnötiger Scope-Creep, brach einen bestehenden Test) — auf mandant.geaendert zurückgesetzt (MED-D-24-Präzedenz: Lifecycle-Wechsel bekommen keinen eigenen Aktionscode). Verifiziert: manuelles node:sqlite-Drift-Skript (temporärer SCHRITTE-Export, danach zurückgesetzt) + wrangler dev gegen die reale, aus vielen Vorsessions gewachsene lokale D1; 4 Browser-Szenarien per Playwright/Screenshot bestätigt (Solo-Mandant→aktiv inkl. jahrescheck, Onboarding-Guard 409, Unterschrift-Guard, Mehrfach-Auftrag mit unabhängigen Status+Chips "2 Aufträge · 1 Beratung · 1 Unterschrift"). +2 Vitest (488→490, 46 Dateien), tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-151, HANDOFF §2, CHANGELOG, Feature-Liste, Test-Übersicht, Prozessmodell.md/Beratungsauftraege.md, version.ts/CLAUDE. Anlass: "Wie können wir die Phase Onboarding eindeutiger bezeichnen?" → "in den beratungsmandaten anstatt Onboarding -> Vorbereitung..." → Rückfrage bestätigt Zwei-Achsen-Modell → Nutzer-Mapping-Vorgabe → Plan-Mode → genehmigt.
MED-2026-07-19-app-ux-process-review-492026-07-1910:5512:101.25MED-OP-VALID-1 Slice 4 — Onboarding-Formular an kanonischen Feld-Typ angeglichen (MED-D-150, 0.81.00.82.0, MINOR): nach Erklärung der drei Slice-2-Folgepunkte wählte der Nutzer "1" (Onboarding/Dentmarking-Angleichung). 2 parallele Explore-Agenten recherchierten: Onboarding (einwilligung.ts) hat mit StammdatenFeld.typ heute nur einen Render-Hinweis, keine Format-Validierung bei der Einreichung; Dentmarking nutzt dagegen ein eigenes, semantisch andersartiges Zahlen-Bereichs-Konzept (Wertebereich/bereichsHinweis() — min/max/Einheit statt Format-Typen), bereichsHinweis() existiert zudem nur client-seitig als manuell synchron gehaltenes Duplikat des Server-Parsers. Per AskUserQuestion entschieden: "nur Onboarding jetzt, Dentmarking separat" (keine erzwungene Vereinheitlichung eines andersartigen Konzepts). Umsetzung: ONBOARDING_STAMM_REGELN hebt telefon/plz von 'text' auf 'tel'/'plz' (bewusst nur hier, AUSFUELL_STAMM_REGELN unverändert); neue pruefeRegelWerte(); OnboardingFormularService.kontext()/entwurfSpeichern() liefern jetzt hinweise/vorschlaege (KiFeldVorschlag-Seam injiziert). Client (onboarding-public.component.ts): Inline-Hinweis + klick-übernehmbarer Formatvorschlag je Feld, verwerfen sich beim nächsten Editieren. Gegen echten Browser verifiziert (wrangler dev + Playwright): E-Mail "kaputt" → Hinweis; Telefon "0211 / 12-34-56" → Vorschlag "0211123456" → übernommen, keine Konsolenfehler. +5 Vitest (479→484, 46 Dateien), tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-150, HANDOFF §2/§4, CHANGELOG, Feature-Liste, Test-Übersicht, version.ts/CLAUDE/README/Lastenheft/MVP-Scope/Sanity-Checkliste/Management-Summary. Anlass: Erklärung der Slice-2-Folgepunkte → Nutzerwahl "1" → Rückfrage Dentmarking-Scope → "nur Onboarding jetzt, Dentmarking separat".
MED-2026-07-19-app-ux-process-review-482026-07-1909:1510:451.5MED-OP-VALID-1 Slice 3 — PLZ↔Ort-Plausibilität via OpenPLZ (MED-D-149, 0.80.00.81.0, MINOR): Fortsetzung nach einer Erklärungsrunde der drei verbliebenen Slice-2-Folgepunkte — Nutzer wählte Adressvalidierung, dann per "g-1: use OpenPLZ; note as a potential later improvement to use online service" den Provider (öffentliches, kostenloses DACH-Postleitzahlverzeichnis openplzapi.org, kein API-Key; ein bezahlter Online-Geocoding-Dienst bleibt spätere Option). Live per WebFetch recherchiert statt geraten. Neue PlzOrtProvider-Abstraktion + OpenPlzClient (DE→AT→CH-Fallback, 3s-Timeout je Land, fehlerresilient auf "nicht prüfbar" statt Blocker — ausschließlich weich, analog feld-typ.ts), pruefePlzOrt()-Helfer in app.ts an Praxis-Anlege-/PATCH-Route, zweiter Undo-Toast bei Ort-Vorschlag. Selbst gefundener Fehler vor Nutzer-Sichtbarkeit: erster Entwurf setzte den echten OpenPlzClient als createApp()-Default — ein 936ms-Testausreißer deckte einen echten Netzwerkaufruf in einem Unit-Test auf; korrigiert (test-sicherer FakePlzOrt-Default, echter Client nur in index.ts, analog NextCloud/Signatur-Muster). Gegen echten Browser + echte OpenPLZ-API verifiziert (wrangler dev + Playwright): PLZ "40210"/Ort "Köln" → Toast "meintest du „Düsseldorf"?" → Klick → Praxis tatsächlich korrigiert (Screenshot gesichert). +13 Vitest (466→479, 46 Dateien), tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-149, HANDOFF §2/§4, CHANGELOG, Feature-Liste, Test-Übersicht, version.ts/CLAUDE/README/Lastenheft/MVP-Scope/Sanity-Checkliste/Management-Summary. Anlass: Erklärung der Slice-2-Folgepunkte → Nutzerwahl Adressvalidierung → "g-1: use OpenPLZ..." → "yes".
MED-2026-07-12-meeting-notes-integration-mhcayh2026-07-1218:3519:050.5Kundenmeeting 12.07. eingearbeitet (Doku, keine Versionsänderung; MED-D-108): angehängte Gesprächsnotizen (Notion-Export) bereinigt (PII-frei/rollenbasiert, agents.md §8) und an die relevanten Stellen übernommen. Neu: docs/fachlich/Anforderungen-Meeting-2026-07-12.md (M1–M20/A1–A10). Bestätigungen (Akte=CRM+Ablage+Mandate MED-D-95, Betreuungsintensität Intensiv/Standard/Basis = gebautes betreuungsmodell D-35, Lifecycle, Weltmodell G-8, 3 Signaturstufen OP-SIGN-1, Audit-Lese-Log D-50, NextCloud entbehrlich MED-KB-4) + neue Festlegungen (Flat-Fee-Automatik OP-TIME-1, Dexman-Portal ohne Passwort Dexman.md DEX-1a, Leistungsstatistik-Selbstpflege/PVS-Stufe-2 OP-DEX-1, Mahnstufen-Banner OP-INVOICE-1, Sutor-Bankformulare MED-KB-8). Gepflegt: HANDOFF §3/§4, Kunden-Besprechungspunkte, Decision-Log, Beratungsaufträge, Dexman, CHANGELOG. Konsistenz-Check grün.
MED-2026-07-12-app-ux-process-review-142026-07-1217:4018:300.83Beratungsaufträge Slice C1 — Produkt-Playbooks (MED-D-104, 0.70.20.71.0, MINOR): domain/auftrag-playbook.ts (Standard-Folgeaufgaben je Produkt) + anlegen erzeugt sie als an den Auftrag gebundene, idempotente Wiedervorlagen (quelle=playbook); NeueWiedervorlage.auftragRef durchgereicht; Audit-Label. Scope: Slice C aufgeteilt (C1 jetzt; C2+ Cockpit/Lead-Auto-Anlage/Dexman offen). +2 Vitest (436/42), e2e via wrangler dev + D1.
MED-2026-07-12-app-ux-process-review-132026-07-1217:1517:400.42Slice B — Review-Politur (MED-D-103, 0.70.10.70.2, PATCH): 409-Meldung neutral (beide Konflikt-Fälle, +1 Test-Assertion), HANDOFF-Klammer + §4-Restrisiko-Note (nicht-atomare Bindung: gleichzeitiger Doppel-Submit via Tabs/Retry → möglich ungenaues Audit; Einzeloperator tragbar, bei Mehrbenutzer nachzuziehen), CHANGELOG-#136-Link. Status: Slice B funktional vollständig; einziges offenes Risiko = atomare Bindung (dokumentierter Deferral). Bewusst nicht: Identifier-Umbenennung (deutsche Codebasis-Konsistenz).
MED-2026-07-12-app-ux-process-review-122026-07-1216:3017:100.67Slice B — CodeRabbit-Review-Nacharbeit (MED-D-102, 0.70.00.70.1, PATCH): Bindungs-Besitz-Guard (Lösen/Umhängen fremder Auftrag → 409), Client-Lade-Token gegen Mandanten-Wechsel-Race, ArtefaktTyp aus enums (G-8), Gutachten-Load parallel, UI-Text-Fix, Doku-Sync 0.70.1/434. Bewusst nicht: Retro-UNIQUE (domänenfalsch) / volle Binding-Atomarität (Concurrency, Einzelnutzer). +1 Vitest (434/42).
MED-2026-07-12-app-ux-process-review-112026-07-1216:0017:151.25Beratungsaufträge Slice B (MED-D-101, 0.69.00.70.0, MINOR): auftragRef (nullable, Migration v38) an Beratungsdoku/Dokumente/Wiedervorlagen/Gutachten; Service sammleArtefakte/binden/loesen/retroAbleitung (idempotent) + reine auftragReife-Funktion (schlanke Checkliste); Routen (Artefakt-Liste/binden/loesen/retro); Client akte-auftraege zeigt Reife + gebundene Artefakte + Verknüpfen + Retro-Button. +6 Vitest (433/42), e2e via wrangler dev + D1 (Migration v38, Retro idempotent, Binding/Reife-Übergänge real geprüft). MED-OP-AUFTRAG-1 Slice B ✅.
MED-2026-07-12-app-ux-process-review-102026-07-1215:0015:450.75Beratungsauftrag-Produkt-Katalog finalisiert (MED-D-99, MED-KB-7 ✅, 0.68.10.69.0, MINOR): Katalog 5→9 Produkte (neu Investitionsberatung EE · Existenzgründung · Abrechnungsberatung · Praxisnachfolge; Geldanlage→Kapitalanlage umbenannt, Migration v37; Versicherungsoptimierung/Kapitalanlage/Investitionsberatung = Person oder Praxis). Server-Enum + Record-Katalog + Client-Typ + Tests; e2e via wrangler dev + D1 (Migration real verifiziert). Doku: Beratungsauftraege.md, Decision-Log MED-D-99, KB-7 ✅, CHANGELOG/Feature-Liste/HANDOFF/Test-Übersicht.
MED-2026-07-12-app-ux-process-review-92026-07-1211:4512:050.33Doku-Konsistenz-Nachzug (CodeRabbit-Review #132, Doku-only, 0.68.1 unverändert): Feature-Liste-Stand + Test-Übersicht-Stand auf 0.68.1, unbalancierte Klammer in der Beratungsaufträge-Zeile geschlossen, CHANGELOG-#132-Link, HANDOFF §4 um die drei bewussten Slice-A-Auslassungen (Listen-Zugriffslog · Freitext-notiz · Optimistic-Locking) ergänzt. Decision-Log MED-D-95 bewusst NICHT erneut verschoben (steht append-korrekt am Ende; ein Re-Move wäre ein weiterer History-Rewrite).
MED-2026-07-12-app-ux-process-review-82026-07-1211:0011:400.67Beratungsaufträge Slice A — CodeRabbit-Review-Nacharbeit (Follow-up zu #131, 0.68.00.68.1, PATCH): Server-Härtung (anlegen weist Praxis-Bezug bei nicht-praxisbezogenem Produkt ab → praxis_nicht_erlaubt; statusSetzen null-guard statt !-Assertion), Katalog compile-time-exhaustiv via Record<AuftragProdukt,…>; Doku-Fixes (Decision-Log MED-D-95 ans Ende, Feature-Liste-Stand/Status, CHANGELOG-PR-Link); +2 Vitest (427/42). Bewusst nicht geändert (begründet): Listen-Zugriffslog, Freitext-notiz, Repo-Optimistic-Locking.
MED-2026-07-12-app-ux-process-review-72026-07-1214:4515:451.00Beratungsaufträge — 3-Ebenen-Modell, Slice A (MED-D-95, 0.67.00.68.0, MINOR): Entität beratungsauftrag (v36) + Produkt-Katalog (domain/beratungsauftrag.ts) + Service/Routen + neues Register "Beratungsaufträge" (akte-auftraege), Dentmarking aus dem Erstkontakt dorthin umgezogen (akte-dentmarking); Design-Doc Beratungsauftraege.md, MED-OP-AUFTRAG-1 (Slices B/C) + MED-KB-7 (Katalog bestätigen); +6 Vitest (425/42), e2e via Playwright.
MED-2026-07-12-docs-review-process-automation2026-07-1209:2510:351.17Doku-Meisterwerk-Audit + Doku-Welle 1 (MED-D-97/96): Audit Doku-Review-2026-07.md (B1–B19, 3 Doku-Wellen); MED-OP-DOKU-1..3 + MED-OP-REVIEW-1 in HANDOFF §4; Regel-Audits (App+Doku) mit Bezugspunkt-Pflicht + Stale-Regel in agents.md §6.7 + check-doc-consistency.sh-Frische-Warnung; Welle 1 umgesetzt: HANDOFF entlogt (§2→1 Absatz, §4-Dubletten), CLAUDE.md-Standabsatz kompakt, Status-Sync README/Sanity/MVP-Scope/Management-Summary/Test-Übersicht/Lastenheft auf 0.65.0, G-8 + R2/MED-D-61 nachgezogen. Doku-only, 0.65.0 unverändert.
MED-2026-07-12-app-ux-process-review-62026-07-1213:1514:301.25UX-Welle 5 — Refactoring + Aktendeckel-Feedback (MED-D-94, 0.66.00.67.0, MINOR): Arbeitssicht in Register-Panels aufgeteilt (4 Komponenten + geteilte Übernahme/Vorgangs-Helfer, 3.190→2.662 Zeilen), Utility-Klassen; Nutzer-Feedback: Stammdaten-Reiter (IBAN raus aus dem Deckel) + beschriftete "Mandats-Status"/"Prozessphase"-Controls mit Erklärzeile; e2e via Playwright. MED-OP-UX-4 ✅.
MED-2026-07-12-app-ux-process-review-52026-07-1211:3512:150.67UX-Welle 4 — Feinschliff (MED-D-93, 0.65.00.66.0, MINOR): dunkles Theme für die interne App (Shell-Umschalter, Druck hell), Primäraktion+"…"-Menü je Dokument-Zeile, Komma-tolerante Zahlen (alsZahl G-2), Palette-Dialog-A11y, Kontrast-Pass; e2e via Playwright. MED-OP-UX-4 🟡 Kern (Rest = Datei-Aufteilung/Utility-Klassen).
MED-2026-07-12-app-ux-process-review-42026-07-1210:1011:000.83UX-Welle 3 — "eine Handschrift" (MED-D-92, 0.64.00.65.0, MINOR): pub-bausteine.ts über alle 4 Kundenstrecken (+ Formular-Fortschritt/Zwischenspeichern, Turnstile-Gating), ein Toast-System + --md-error, sichtbare Navigation + "Strg K", Cockpit-Mobile (Chip-Leiste/Bottom-Sheet/kein Overflow), Arbeitssicht (Experten-Import, Stepper anzeigend, Guard nur bei Interaktion + Dirty-Check); e2e via Playwright. MED-OP-UX-3 ✅ Kern, Rest → MED-OP-UX-4.
MED-2026-07-12-app-ux-process-review-32026-07-1209:0010:051.08UX-Welle 2 — "eine Sprache" (MED-D-91, 0.63.00.64.0, MINOR): zentrale labels.ts (Status/Niveaus/Rollen/Audit-Aktionen + Datums-Utility + eine Aktenreife-Stufen-Ableitung), Akte/Arbeitssicht/Cockpit/Verwaltung ohne rohe Enums/Doku-IDs; Feld-Sichtung: Feld-Labels, Fortschritt, Sammel-Akzeptieren, markierte Felder, 0-Felder-Fall; Korrektur-Marker (Server, +2 Vitest 419/41); e2e via Playwright verifiziert. MED-OP-UX-2 ✅.
MED-2026-07-12-app-ux-process-review-22026-07-1208:1509:000.75UX-Welle 1 — Verlässlichkeit & Rechtssicherheit (MED-D-90, 0.62.00.63.0, MINOR): Review-PR #123 gemerged; dann /formular/ als öffentliche Route + DSGVO/Marken-Kopf/Fehlerdifferenzierung, HTTP-Fehler-Auffangnetz + Toast global, Cockpit-Aktionen server-verankert (Schein-"Erinnern"/prompt() weg, Zuweisen-Auswahl), Lade-/Fehlerzustand, Arbeitssicht-Fehler im Sichtfeld, Google Fonts self-hosted; 417 Vitest + ng build + Playwright-e2e grün. MED-OP-UX-1 ✅.
MED-2026-07-12-app-ux-process-review2026-07-1202:3003:150.75UX- & Prozess-Review der Gesamt-App (Doku-only): 4 Code-Reviews + Live-Begehung (wrangler dev+D1, Desktop/Mobil) → docs/betrieb/UX-Prozess-Review-2026-07.md mit Befunden (Feedback-Verlässlichkeit, G-3, Ausfüll-Formular-Strecke ⚠DSGVO, Mobile) + Maßnahmenplan; neue OPs MED-OP-UX-1..3.
MED-2026-07-11-anschrift-restlich2026-07-1120:3521:300.92MED-OP-DATA-1 abgeschlossen: Rechnungsanschrift + Praxis-Anschrift strukturiert (MED-D-87, 0.59.10.60.0, MINOR): Auf Nutzer-"Beides direkt nachziehen" die beiden restlichen Einzeilen-Adressen ans Wertobjekt Anschrift gezogen. Branch von gemergtem main (#119/f85f221) neu aufgesetzt. (1) dienstleistungsauftrag_ausfuellen_v1: rechnungsanschriftrechnung_strasse/rechnung_plz/rechnung_ort (domain/ausfuellformular.ts, eigene Schlüssel; keine Rückübernahme) + ~18 Test-Submissions/Assertions angepasst. (2) Praxis: strukturierte Anschrift strasse/plz/ort (R1-F30..F32) über die 7-Touch-Kette (model/schema/migrate v34/repo.ts/memory+d1-repo) + Praxis-Routen (app.ts) + lead-service.ts (strukturiert statt standort-flatten); Legacy-standort bleibt Read-Fallback (kein Parser). Client: api.service Praxis-Typ/Payloads + mandant-detail Anlage/Edit-UI (3 Anschrift-Inputs statt Standort) + praxisAnschrift()-Anzeige in Detail & Akte. Verifikation: +1 Vitest (praxis strukturierte Anschrift, 397/40), tsc + ng build grün, e2e via wrangler dev + D1 (v34) (Praxis strasse/plz/ort verlustfrei; Dienstleistungsauftrag rechnung_* strukturiert eingereicht). MED-OP-DATA-1 ✅ geschlossen. Doku: Decision-Log MED-D-87, CHANGELOG, HANDOFF §2/§4, Weltmodell-Doc §3/§4, Feature-Liste, Test-Übersicht, version.ts/CLAUDE.
MED-2026-07-11-anschrift-strukturiert2026-07-1120:1020:350.42Anschrift im Ausfüll-Formular strukturiert — erste Umsetzung MED-OP-DATA-1 (MED-D-86, 0.59.00.59.1, PATCH): Auf Nutzer-"Ja" den ersten G-8-Angleichungsschritt gebaut. Branch von gemergtem main (#118/7846f05) neu aufgesetzt. kundendatenbogen_v1 (domain/ausfuellformular.ts): einzeiliges anschrift-Feld → drei Pflichtfelder strasse (Straße & Hausnummer) · plz · ort. domain/stammdaten-uebernahme.ts: AUSFUELL_STAMM_REGELN bildet strasse/plz/ort 1:1 verlustfrei ab (statt grober anschriftstrasse), plz/ort neu in STAMM_ZIELE. Kein Schema-/Migrations-Change (Mandant-Felder seit v33), kein neuer Endpunkt, Client-Formular rendert generisch aus dem Katalog (keine UI-Sonderlogik). Tests angepasst (Assertions, kein Zählungs-Delta): 396/40, tsc + ng build grün, e2e via wrangler dev + D1 (Kundendatenbogen strasse/plz/ort einreichen → übernehmen → Mandant strasse=Lindenstr. 14/plz=40210/ort=Düsseldorf, verlustfrei). Rest MED-OP-DATA-1: rechnungsanschrift + Praxis.standort einzeilig. Doku: Decision-Log MED-D-86, CHANGELOG, HANDOFF §2/§4, Weltmodell-Doc §4, Feature-Liste, Test-Übersicht, version.ts/CLAUDE.
MED-2026-07-11-weltmodell-data-dictionary2026-07-1119:4520:100.42Data Dictionary / Weltmodell als Leitprinzip (G-8) + kanonisches Wertobjekt Anschrift (MED-D-85, Doku-only, 0.59.0 unverändert): Auf Nutzer-Auftrag "Nimm auf, dass wir ein Data Dictionary / Weltmodell aufbauen und Entitäten immer gleich strukturieren; Anschrift = Straße mit Hausnummer, separat PLZ und Ort". Anlass: die grobe anschriftstrasse-Abbildung aus MED-D-84. Neues Leitprinzip G-8 (CLAUDE.md) + neues Doc docs/architektur/Weltmodell-Data-Dictionary.md (Entität vs. Wertobjekt, Katalog Name/Anschrift/Bankverbindung/Kontakt, Anschrift = strasse·plz·ort immer getrennt, Mermaid-Einbettung, Governance + je-PR-Pflege) + Tiefenquellen + docs/README + Decision-Log MED-D-85 + MED-OP-DATA-1 (HANDOFF §4: Einzeilen-Adressen Ausfüll-Formular anschrift/rechnungsanschrift + Praxis.standortAnschrift angleichen). Kein Code-Change. Verifikation: check-doc-consistency.sh grün. Branch zuvor von gemergtem main (#117/d5c4ef9) neu aufgesetzt.
MED-2026-07-11-writeback-stammdaten2026-07-1117:5019:301.67Formular-Antworten → Stammdaten zurückschreiben (Review-and-apply) + neue Kontakt-/Adress-PII (MED-D-84, 0.58.10.59.0, MINOR): Auf Nutzer-"then b" (nach #116-Merge) — Umfang "B" (Datenmodell um neue PII erweitern). Zuvor: PR #116 (Dentmarking-Hinweis) angelegt + auto-merge; "behind"-Block (main auf #115/b2442b1 voraus) via update_pull_request_branch gelöst → CI+CodeRabbit grün → gemerged; Branch von merged main neu aufgesetzt. Recherche (1 Explore-Agent: exakte Editier-Stellen Model/Schema/Repo/Service/Client). Server: neue Mandant-PII telefon/geburtsdatum/strasse/plz/ort (R1-F14..F18) über die 7-Touch-Kette (model/schema/migrate v33/MandantPatch/memory+d1-repo); neu domain/stammdaten-uebernahme.ts (rein, regel-getrieben AUSFUELL_STAMM_REGELN, Diff + Validierung IBAN Mod-97/Datum) + Methoden uebernahmeVorschlag/uebernehmen auf AusfuellformularService (nur ausgewählte+gültige, Audit stammdaten.uebernommen PII-arm, idempotent, mandant-scoped) + Routen GET/POST /api/mandanten/:id/ausfuellformulare/:token/{uebernahme-vorschlag,uebernehmen}. Client: Review-Panel "In Stammdaten übernehmen" (Diff + Checkboxen) im Register "Unterschrift" + read-only Kontakt/Anschrift in Arbeitssicht & Akte + api.service-Methoden/Typen. Verifikation: +16 Vitest (stammdaten-uebernahme.test.ts +9, ausfuellformular +7 → 396/40), tsc + ng build grün, end-to-end via wrangler dev + D1 (v33; Kundendatenbogen einreichen → Vorschlag 3 Felder → übernehmen → telefon/geburtsdatum/strasse gesetzt, plz/ort unberührt; Re-Vorschlag leer = idempotent). Compliance: neue PII-Persistenz G-6 begründet (Kontakt/Identität/Vertrag), EU-Residenz; MED-KB-6 (Feld-Verschlüsselung-at-rest + Retention) offen → Risikoregister. Onboarding-Rückübernahme als Folge-Increment (MED-OP-FORM-3). Doku: Decision-Log MED-D-84, CHANGELOG, HANDOFF §2/§4, Feature-Liste, Test-Übersicht, Risikoregister, version.ts/CLAUDE.
MED-2026-07-08-fragebogen-hinweis2026-07-0808:0008:250.42Dentmarking-Fragebogen: prominenter Hinweis oben (MED-D-83, 0.58.00.58.1, PATCH, UX): Auf Nutzer-Wunsch "auf dem Fragebogen zu Dentmarking oben anzeigen, dass mehr Daten besser sind — Bearbeitung in Schritten; Stammdaten großschreiben". Recherche: "Stammdaten" ist im UI überall bereits großgeschrieben, Fragebogen-Blöcke (dentmarking-katalog.ts) korrekt betitelt → Deutung: beide Wünsche = Kopf-Hinweis auf der öffentlichen Betriebskennzahlen-Fragebogen-Seite (fragebogen-public.component.ts, DM-1/DM-9). Neuer grün akzentuierter .md-fb-hinweis-Kasten ganz oben (vor dem Ausfüll-Score): "Je vollständiger Ihre Angaben, desto aussagekräftiger Ihr Gutachten" (Vollständigkeit großschreiben) + "nicht in einem Zugin mehreren Schritten ausfüllen, jederzeit zwischenspeichern, über denselben Link fortsetzen" (macht das DM-9-Zwischenspeichern sichtbar); Kontextzeile (Praxis · GJ) bleibt darüber, "weiß ich nicht/nachgeliefert"-Hinweis in den Kasten verschoben. Rein Client/Copy, kein Server-Change, keine neuen Endpunkte, keine neue PII, keine neuen Tests. Verifikation: ng build grün. Doku: Decision-Log MED-D-83, CHANGELOG, HANDOFF §2, Feature-Liste, version.ts/CLAUDE, Timesheet.
MED-2026-07-08-management-summary2026-07-0807:0507:500.75Management Summary + docs-site-Favicon + CodeRabbit-#108-Nacharbeit (Doku + Fixups, 0.58.0 unverändert): Auf zwei Nutzer-Wünsche. (1) Neues docs/produkt/Management-Summary.md — pyramidale Business/Management-Sicht (Ziel · Arbeitsweise G-1…G-7 · Fortschritt · Status · nächste Schritte zum MVP 1.0.0), Status-Tabelle + Mermaid-Timeline; verlinkt aus docs/README.md + CLAUDE-Tiefenquellen. (2) docs-site-Favicon = Herz-mit-Puls wie in der App: favicon.png/.svgdocs-site/static/img/, docusaurus.config.js PNG-Default (iOS/WebKit-sicher, analog MED-D-77/78) + SVG via headTags. (3) CodeRabbit-#108: bearbeiten lehnt leeren Titel ab (titel_leer→400, +1 Test → 380/39), Titel-Trim + leere-Aufgaben-Filter in den Routen, Regex entdoppelt, Doku-Versionsstände/Zitat/Broken-Link; zwei systemische Major-Befunde als MED-OP-AUTH-2 (By-ID-Scope, RBAC-flag-gated) + MED-OP-WV-2 (WV-Unique-Constraint, D1 single-writer) dokumentiert statt piecemeal gefixt. Zuvor: PR #108 (P5-Kern) erstellt + auto-merge (squash) → gemerged; CI-Gate-"Fehler" als superseded/cancelled-Run (Concurrency) diagnostiziert, echter Head grün. Verifikation: 380/39 Vitest + tsc + ng build + Docusaurus-Build grün. Anlass: Nutzer "Management Summary" + "Favicon in der Doku".
MED-2026-07-07-process-mapping-42026-07-0720:4522:452.0Gesprächsnotizen / Meeting-Doku (R11) — P5-Kern gebaut (MED-D-82, 0.57.00.58.0, MINOR; Kern von OP-MEET-1 / MED-D-79 P5): Auf Nutzer-"dann P5" (nach Merge PR #107). Branch von frisch gemergtem main neu aufgesetzt. Recherche (3 Explore-Agenten: R11-Design-Intent, R6/R12-Klonpfad, R5/Audit/RBAC/PDF/LLM-Seams). Rückfrage (Aufgaben-Modell + Slice-Umfang) vom Nutzer abgelehnt → doku-/architektur-konforme Defaults: Aufgaben = Wiedervorlagen (R5, G-2 "eine Wahrheit") + Kern-Slice. Neue Entität Meeting (Titel · Art · manuelles Protokoll, mandant-scoped): enums.ts (MEETING_ART/QUELLE + WIEDERVORLAGE_QUELLE+=aufgabe)/model.ts/schema.ts/migrate.ts v32/repo(memory+d1)/neu domain/meeting.ts (rein: Bezeichnung + aufgabeQuelleRef FNV-Hash) + ki/gespraechs-auswerter.ts (GespraechsAuswerter-Seam + deterministischer RegelAuswerter, Muster KiPruefer) + api/meeting-service.ts (erstellen/bearbeiten/aufgabenVorschlag/aufgabenUebernehmen→WV idempotent) + Routen. domain/zugriff.ts: meetingZUGRIFF_SENSIBEL (D-50, RISK-15). Client: Sektion "Gesprächsnotizen / Meeting-Doku" im Beratung-Register (Notiz anlegen · Protokoll editieren · "Aufgaben vorschlagen" → editierbare Vorschlagsliste mit R7-Delegation + Fälligkeit · übernehmen) + read-only Akte-Liste. Verifikation: +11 Vitest (meeting.test.ts+7, gespraechs-auswerter.test.ts+4; zugriff.test angepasst; 379/39), tsc + ng build grün, end-to-end wrangler dev + D1 (v32; Meeting → 2 Aufgaben-Vorschläge @berater@praxis.de/bis 2026-07-20 → 2 Wiedervorlagen quelle=aufgabe im WV-Register, delegiert; Re-Übernahme idempotent uebersprungen:2; Meeting-Liste angereichert). Compliance: RISK-15/DSGVO Art. 9 — kein Roh-Audio, keine Cloud-KI im Kern (nur quelle=manuell); Audit PII-arm. Nebenbei: Nutzer-Onboarding-Klärung (Fragebogen-Vorbefüllung ✅ gebaut; Rückschreiben in Stammdaten + echte DocuSign = offen) gespiegelt. Doku: Decision-Log MED-D-82, CHANGELOG, HANDOFF §2/§4 (OP-MEET-1 🟡), Prozessmodell §8 (P5 🟡), Meeting-Doku-und-Aufgaben.md, Lastenheft R11/A-8, MVP-Scope Slice 9, Feature-Liste, Test-Übersicht, version.ts/CLAUDE.
MED-2026-07-07-process-mapping-32026-07-0719:1020:351.42Freitext-Individualdokument → Layout → Unterschrift gebaut (MED-D-81, 0.56.00.57.0, MINOR; Freitext-Hälfte von OP-DOCGEN-2 / MED-D-79 P4): Auf Nutzer-"P4" den Slice umgesetzt, Umfang "voll" (Rückfrage). Recherche (2 Explore-Agenten: R12-Klonpfad + PDF/Signatur/eIDAS/Ablage). Neue Entität Individualdokument (Titel + Korpus + explizites eIDAS-Niveau), Status Entwurf→freigegeben→erzeugt→abgelegt→zur_unterschrift→signiert (letzterer abgeleitet, G-2): enums.ts/model.ts/schema.ts/migrate.ts v31/repo(memory+d1)/neu domain/individualdokument.ts (Blockbau) + api/individualdokument-service.ts + Routen. erzeugen rendert Freitext ins Hauslayout (je Absatz ein Block) → R3-Dokument (im Ledger MED-D-80, auditiert); zurUnterschriftSignaturService. Einzige Änderung an geteilter Signatur-Strecke: anfordern(dokumentId, niveauOverride?) (explizites Niveau schlägt Titel-Ableitung, rückwärtskompatibel). Client: Sektion "Freies Dokument" im Ledger-Register (Formular + status-abhängige Aktionen) + read-only Akte-Liste. Verifikation: +10 Vitest (individualdokument.test.ts, 365/37), tsc + ng build grün, end-to-end wrangler dev + D1 (v31; erstellen→bearbeiten→freigeben→erzeugen → R3-Dokument + %PDF- im Ledger → unterschrift mit explizitem Niveau AES). Compliance: echte E-Signatur weiter Fake (MED-KB-5), Niveau informativ + im UI als Demo kenntlich; Freitext = human-authored (RISK-14). Doku: Decision-Log MED-D-81, CHANGELOG, HANDOFF §2/§4 (OP-DOCGEN-2 Freitext ✅), Prozessmodell.md §8 (P4 ✅), Feature-Liste, Test-Übersicht, version.ts/CLAUDE.
MED-2026-07-07-process-mapping-22026-07-0718:1019:050.92Dokument-Ledger (quer-liegende Achse) + Wiedervorlagen-Badge gebaut (MED-D-80, 0.55.10.56.0, MINOR; realisiert MED-OP-DOC-2 + MED-OP-REG-1 = MED-D-79 P2/P3): Auf Nutzer-"Ja" den nächsten Code-Slice umgesetzt. Recherche (2 Explore-Agenten: exakte Editier-Stellen P2/P3). P3 (Server+Client): PhaseReife.hinweis = Summe anzahl nicht-blockierender Punkte je Phase (domain/aktenreife.ts), Client-Mirror + hinweisFuerPhase + zweiter neutraler .md-cnt-Badge in mandant-detail/mandant-akte; reif-Semantik unverändert (D-41). P2 (Client-only): neues Register dokumente "Dokumente & Unterschriften" (phase: null) — drei Dokument-Sektionen um-geeltert (kein Duplizieren/Dedup), SPRUNGZIEL_REGISTER biegt dokumente/unterschriften aufs neue Register; Akte-Parität (Lists aggregiert). Kein Server-Change außer Reife-Feld, keine neuen Endpunkte. Verifikation: +1 Vitest (aktenreife hinweis, 355/36), tsc + ng build grün, end-to-end wrangler dev + D1: Mandant + 2 Wiedervorlagen → jePhase[betreuung].hinweis=2/offen=0/reif unberührt; Nächster-Schritt zielt auf wiedervorlagen. check-doc-consistency.sh grün (version.ts↔HANDOFF/CLAUDE 0.56.0). Doku: Decision-Log MED-D-80, CHANGELOG, HANDOFF §2/§4 (OPs ✅), Prozessmodell.md §8, Akte-Struktur.md §3, Feature-Liste, Test-Übersicht, version.ts/CLAUDE.
MED-2026-07-07-process-mapping2026-07-0717:2018:050.75Prozessmodell als autoritative Landkarte + Vokabular-Regel + Fahrplan (MED-D-79, Doku-only, APP_VERSION unverändert 0.55.1): Auf Nutzer-Frage "Wie bilden wir die Geschäftsprozesse am besten ab/unterstützen sie?" (+ Präzisierung "Dokumente/Unterschriften an jeder Stelle · lückenlos tracken · Freitext ins Layout → Unterschrift"). Recherche (3 Explore-Agenten: Frontend-Register/Badges, Domain-Modell, Strategie-Docs) ergab: Prozess ist bereits reif abgebildet → Schärfen statt Neubau. Neues Doc architektur/Prozessmodell.md: (1) autoritative Achsen-Landkarte + Regel "DIE fachliche Phase = prozessphase; Onboarding.phase (R2-F04) = Teilschritt innerhalb onboarding" (Lastenheft R2/§5.2 + MVP-Scope §4.2 nachgezogen, OP-DOCS-1); (2) Dokumente & Unterschriften als quer-liegende Achse (Dokument-Ledger R3+R12+R4, "an jeder Stelle", lückenlos G-4, MED-D-56) — Phasen-Gates bleiben; (3) Freitext → Layout → Unterschrift über pdf-dokument.ts+SignaturService. Fahrplan P1–P5; neue OPs MED-OP-DOC-2/MED-OP-REG-1, OP-DOCGEN-2 erweitert. Cross-Links System-Charakter §1/Akte-Struktur/README/CLAUDE-Tiefenquellen. Compliance-Flag eIDAS (OP-SIGN-1, MED-KB-5). Verifikation: Mermaid validiert + check-doc-consistency.sh grün. Doku: Decision-Log MED-D-79, CHANGELOG, HANDOFF §4, Lastenheft, MVP-Scope, Feature-Liste unberührt (kein gebautes Feature). Nebenbefund gemeldet: Screenshot zeigt SEPA/Dienstleistungsauftrag "optional", Code (MED-D-70) = Pflicht → Deploy/Stand prüfen.
MED-2026-07-07-docs-guidelines-tech-standards2026-07-0716:3017:150.75drkv-Governance-Angleichung + In-App-Chatbot-Design (MED-D-73/MED-D-74, OP-ASSIST-1, Doku-only, keine Versionsänderung): Nutzer-Wunsch "Entwicklungsansatz-Guideline behalten · Taktano-Governance für alle übernehmen · Chatbot LLM+RAG auf Live-Daten & Doku · drkv-Standard-Tech-Stacks bewirtschaften (Echtzeit, moderne Frameworks, Chatbot App+Doku, Feedback)". Medidentas-Teil: (1) CLAUDE.md — neues Leitprinzip Dokumentation als Meisterwerk (aus Taktano) + Abschnitt Standard-Bausteine (drkv) (Echtzeit · moderne Frameworks · In-App-Chatbot · Feedback, kanonisch im Template) + True-North-Zusatz + Tiefenquellen-Zeile (MED-D-73). (2) Neues Design-Doc docs/architektur/In-App-Assistent.md (OP-ASSIST-1/MED-D-74): ein Chatbot App+Doku, RAG auf D1-Live-State (abgeleitet) + Doku, vorschlagend, RBAC (D-48) + Zugriffslog (D-50), PII-frei indexiert (G-6), EU-LLM, dormant; Feedback sammeln+anzeigen. (3) Entwicklungsansatz.md §4.6, docs/README.md, HANDOFF §4 (OP-ASSIST-1 ✅ Design), Feature-Liste, Decision-Log, CHANGELOG. Wichtig: vorhandenen OP OP-ASSIST-1 wiederverwendet (nicht neuen erfunden). Konsistent mit taktano + everything-as-code-template (Standard-Stack lebt kanonisch im Template, G-2).
MED-2026-07-07-devops-repo-setup-runbook2026-07-0710:4511:100.42DevOps-Runbook: Repo-Setup mit gh-Kommandos (Doku, keine Versionsänderung): Auf Nutzer-Fragen "wie setze ich auto-delete-head + auto-merge / wie bekommt der GitHub-MCP die Rechte / gh-Kommandos in die Einrichtungs-Doku" — neuer Abschnitt Deploy.md §7c mit konkreten gh api-Kommandos: (1) Merge-Methoden Squash-only + allow_auto_merge + delete_branch_on_merge, (2) Required Checks CI Gate+CodeRabbit als Ruleset (enforcement:active) oder klassische Branch-Protection, (3) Verifikation. Begründung dokumentiert: nicht via MCP-/Agenten-Token (kein Admin-Tool + bewusst kein Administration-Recht — Sicherheitsgrenze) → manuell/eigener Admin-PAT. agents.md §6.5 verweist fürs Setzen auf §7c. Zuvor beantwortet: General- vs. Branches-Settings, Ruleset-Dialog, Token-Permission-Ebenen (App vs. PAT), offizieller github-mcp-server hat keine Admin-Tools. Doku: Deploy.md §7c, agents.md §6.5, CHANGELOG. Anlass: Nutzer-Fragen.
MED-2026-07-07-stammdaten-ibans-lead-formular2026-07-0715:0016:001.0IBANs strukturiert in den Stammdaten (MED-D-71) + öffentliches Lead-Formular (MED-D-72/OP-LEAD-1), 0.55.0, Nutzer-Vorgabe: (1) IBANs strukturiert: mandant.iban_privat (R1-F13) + praxis.iban (R1-F29), Migration v30, Schema/Model/Repo memory+d1, Patches, API mit Normalisierung + ISO-7064-Mod-97-Validierung (domain/iban.ts, ungültig→400), Client (IBAN-privat im Aktendeckel, Entitäts-IBAN je Praxis). (2) Öffentliches Lead-Formular: api/lead-service.ts (Mandant als lead + Entität + Sichtungs-Wiedervorlage + Audit, Ingress-Scrubbing G-6), Routen GET/POST /oeffentlich/lead (ohne Token, Turnstile), Client lead-public.component.ts + Route /lead + öffentliche Shell. +13 Vitest (353/36: iban.test +4, lead.test +4, app.test +2, onboarding-vorlagen +3) + tsc + ng build grün; end-to-end via wrangler dev + D1 (v30, Mod-97, öffentlicher Lead-POST → lead-Mandant). Doku: Decision-Log MED-D-71/72, Lastenheft §4.2 (R1-F13/F29), MED-KB-6 (teil-entschieden), OP-LEAD-1 (realisiert), Deploy.md (Access-Bypass /lead*), Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts/CLAUDE. Zugang öffentlich (Nutzer-Entscheidung via Rückfrage). Anlass: Nutzer "IBANs explizit in Stammdaten; Lead-Formular separat, quasi gleich wie Onboarding".
MED-2026-07-07-onboarding-pflicht-items2026-07-0714:1514:550.67Onboarding-Pflicht-Nachweise + Prozess-Einstieg + IBAN-Trennung (MED-D-70, 0.54.0, Nutzer-Vorgabe): (1) Prozess-Klarstellung (Lastenheft §5.1): Prozess beginnt mit Onboarding; Dentmarking = Beratungsleistung/Lead-Einstieg; Lead ohne Onboarding → Mandant direkt als lead. (2) domain/onboarding-vorlagen.ts: SEPA-Mandat + Dienstleistungsauftrag optional→Pflicht (in BASIS für alle Objektarten), "Stammdaten erfasst"→"Kundenfragebogen"; die fünf Pflicht-Nachweise + IBAN privat. (3) IBAN getrennt: "IBAN privat + Praxis" aufgeteilt in IBAN privat (BASIS) + Entitäts-IBAN je Praxis/MVZ/Gesellschaft. Kein Schema-Change (Items bei "Onboarding starten" aus Vorlage materialisiert, G-2 → nur neue Onboardings). Neuer Test domain/onboarding-vorlagen.test.ts (+3, 343/34) + tsc + ng build grün. Bewusst offen: strukturierte Bank-/Ausweis-PII (MED-KB-6, G-5/G-6, Default nur Checkliste+Ablage) + Lead-Auto-Anlage beim Dentmarking-Start (OP-LEAD-1). Doku: Decision-Log MED-D-70, Lastenheft §4.5/§5.1, MED-KB-6, HANDOFF §2/§4, Feature-Liste, Test-Übersicht, CHANGELOG, version.ts/CLAUDE. Anlass: Nutzer-Vorgabe 07.07.
MED-2026-07-07-doku-entwicklungsansatz2026-07-0713:0013:300.5Entwicklungsansatz als Übersichtsseite (MED-D-69, Doku-only): Neue Seite docs/konventionen/Entwicklungsansatz.md — True North (3 Leitfragen), Leitprinzipien G-1…G-7 (Tabelle), Way-of-Working (Everything-as-Code/Audit-Trail-Artefakte, ID-System, Branch-first/Draft-PR MED-D-60, Doku-Konsistenz, SemVer), Standard-Prozess + Compliance-Haltung; zwei Mermaid-Diagramme (Warum→Wie→Prozess→Nachweis; Lifecycle). Verlinkt aus docs/README.md (prominenter Hinweis + konventionen-Tabelle) + CLAUDE.md-Tiefenquellen. G-2: CLAUDE.md bleibt verbindlich, Seite = lesbare Spiegelung. Verifikation: docs-site-Build grün (Mermaid + interne Links), check-doc-consistency grün. Doku: Decision-Log MED-D-69, CHANGELOG, docs/README.md, CLAUDE.md. Anlass: Nutzer-Wunsch "Entwicklungsansatz explizit & übersichtlich in der Doku".
MED-2026-07-07-stacked-branch-convention2026-07-0706:1506:350.33Stacked/Child-Branches + Squash-Rebase-Konvention (MED-D-65, Konvention, keine Versionsänderung): Auf Nutzer-Fragen "wie verändert auto-delete-head-branches das Branching / kann ich child-branches nutzen?" + "als Kandidat für alle Repos notieren" recherchiert & festgehalten: auto-delete löscht nur Head gemergter PRs (stört Stacking nicht); Stacking-Regeln = bottom-up mergen (GitHub retargetet Child-PRs auto), nach Parent-Merge rebase --onto main (wegen Squash-only), Child bis rebased als Draft (MED-D-60); Default "ein Branch/mehrere Commits". agents.md §7 ergänzt. Cross-Repo-Kandidat: neuer Sammel-OP MED-OP-CROSS-1 (HANDOFF §4) für TKT/GRM (Repo-Key-Registry MED-D-57). Zuvor: offizieller github/github-mcp-server verifiziert (kein delete_branch-Tool, PR #2790 offen; Contents: write sobald da) + auto-delete/Stacking/Upvote-Fragen beantwortet. Doku: Decision-Log MED-D-65, CHANGELOG, HANDOFF §4. Anlass: Nutzer-Fragen.
MED-2026-07-07-log-hygiene-med-d-54-dup2026-07-0706:4006:550.25Log-Hygiene: doppelt vergebenes MED-D-54 entzerrt (OP-PM-1, keine Versionsänderung): Zwei parallele Sessions hatten MED-D-54 gleichzeitig belegt (Geschlossene Ablage/Verzicht NextCloud und Angular-22-Aufschub). Ablage behält MED-D-54 (~27 Refs inkl. Server-Code + "setzt MED-D-54 um" von MED-D-58/61), Angular → MED-D-66 umnummeriert (4 Doku-Refs nachgezogen: Decision-Log-Zeile, MED-OP-NG22-1/HANDOFF §4, CHANGELOG, Timesheet). Referenzen per Kontext (Angular vs Ablage) disambiguiert, check-doc-consistency.sh grün. Historische Timesheet-Zeile 25 ("MED-D-54..57 belegt") bewusst als Zeitdokument belassen. Doku: Decision-Log (MED-D-66 + Vermerk), CHANGELOG, HANDOFF §4. Anlass: Nutzer "fix MED-D-54-Dublette".
MED-2026-07-06-design-specifications-zgcoli-opdm92026-07-0622:2022:450.42OP-DM-9 behoben: Fragebogen-Statistik-Endpoint admin-gated (Version 0.51.1, MED-D-64, Security/G-5): Beim Aufräumen offener Branches fand sich die OP-DM-9-Note nur auf dem alten Branch claude/design-specifications-zgcoli (nicht auf main) — statt sie zu verlieren, den Befund gefixt. GET /api/fragebogen/statistik gab Einladungs-token an jede authentifizierte Rolle (nur Anzeige seit 0.37.0 admin-gated, Endpoint nicht). Fix: neue admin-exklusive Fähigkeit fragebogen_statistik_sehen (domain/rechte.ts), Route via guard(c,…)→403 (RBAC-Matrix MED-D-48 statt inline-istAdmin, G-3). Branch zuvor auf main gebracht (25 Commits Rückstand gemergt). +2 Vitest (319/32, rbac.test.ts+rechte.test.ts) + tsc + npm test grün. Doku: Decision-Log MED-D-64, HANDOFF §4 (OP-DM-9 ✅), Test-Übersicht, CHANGELOG, version.ts. Anlass: Nutzer "Fix it on the old branch".
MED-2026-07-06-coderabbit-review-rate-limit-g0w5y1-22026-07-0613:4514:300.75Draft-PR-Workflow für alle Agenten + PR #86 + CodeRabbit-Findings (MED-D-60, Prozess, keine Versionsänderung; ergänzt MED-D-59): Reframing auf Nutzer-Rückfrage "controlling Claude and other agents better" — Rate-Limit = Volumen-Problem, wirksamster Hebel = Agenten-Verhalten. Verbindliche Konvention agents.md §7: Feature-PRs als Draft öffnen + frei pushen (CodeRabbit reviewt Drafts nicht → 0 Reviews im WIP), erst bei "ready for review" 1× Review + Auto-Merge → ~1 Review/PR statt je Push. Gate implizit (nur Draft-Status, kein Label — Nutzer-Wahl). PR #86 eröffnet; CodeRabbit-Findings adressiert: (a) ignore_usernames: [dependabot[bot]] entfernt — als Required Check würde ein ausgenommener Bot-PR nie den Status erzeugen und am Gate hängen (Bot-PRs mitreviewt); (b) CHANGELOG-PR-Link (#86) ergänzt. Merge-Konflikt/ID-Kollision gelöst: main belegte MED-D-54..57 bereits (Angular22/NextCloud/Repo-Key) → unsere Entscheidungen auf MED-D-58/MED-D-59 umnummeriert (alle Querverweise nachgezogen). agents.md §6.5 (Required Checks = CI Gate + CodeRabbit) präzisiert. Doku: Decision-Log MED-D-59/MED-D-60, CHANGELOG, HANDOFF §3. Anlass: Nutzer "think again" + "pr and merge".
MED-2026-07-06-coderabbit-review-rate-limit-g0w5y12026-07-0613:1013:450.58CodeRabbit auto-merge-tauglich & rate-limit-sicher (MED-D-59, Tooling, keine Versionsänderung): .coderabbit.yaml erweitert — commit_status: true (Status-Context CodeRabbit als Required-Check-Kandidat), fail_commit_status: false (Rate-Limit bleibt pending statt failure → kein Auto-Merge-Deadlock), auto_incremental_review: true (jeder Head-Commit bekommt eigenen Status — Voraussetzung des per-Commit-Required-Checks), collapse_walkthrough: true + path_filters erweitert (docs-site/build, *.min.js) für kompaktere Ausgabe (Doku bleibt), drafts: false + Klarstellung "nur bei offenem PR". Erklärt/dokumentiert: Required-Check via Branch-Protection ist Admin/gh api-Schritt (agents.md §6.5), Trade-off per-Commit-Pflichtcheck ↔ mehr Kommentare. Doku: Decision-Log MED-D-59, CHANGELOG, HANDOFF §3. Anlass: Nutzer-Anforderung (Required Check · Rate-Limit vermeiden · kompakter · nur bei PR).
MED-2026-07-06-nextcloud-integration-yku42k-22026-07-0618:5020:201.5NextCloud "besser per API": öffentlicher Upload-Link + Webhook (Version 0.49.0, MED-D-55/OP-DOC-1-Rest, R3/R9): Phase 2 nach der RBAC-Session (Nutzer: "NextCloud besser per API + Zugang liegt bereit", Scope "beides zusammen", Aktivierung via GitHub-Secrets). Gebaut: NextCloudClient.erstelleUploadLink() (OCS shareType=3/File Drop, + Fake), Ablage-Helfer uploadOrdner/dokumentIdAusUploadPfad (domain/ablage.ts), DokumentService.uploadLinkErzeugen/webhookDateiErstellt, R3-F10/F11 + Migration v25 (Schema/Model/Repo d1+memory), Routen POST /api/dokumente/:id/upload-link + öffentlicher POST /oeffentlich/nextcloud/webhook (Shared-Secret NEXTCLOUD_WEBHOOK_SECRET). Client: api.dokumentUploadLink + Button "Upload-Link/Link kopieren". Deploy: app-deploy.yml synct NEXTCLOUD_* aus GitHub-Secrets in den Worker. OAuth2 verworfen → App-Passwort/Service-User. +5 Vitest (288/30: dokument.test.ts+3, ablage.test.ts+2) + tsc + ng build + Doku-Konsistenz grün. Doku: Decision-Log MED-D-55, Dokumentenverwaltung-NextCloud.md, Lastenheft §4.2 (R3-F10/F11), Feature-Liste, Test-Übersicht, HANDOFF §2, Risikoregister RISK-6/16, CHANGELOG, version.ts/CLAUDE. Compliance-Flag: AVV/EU-Residenz vor Produktivbetrieb (RISK-4). Nachtrag MED-D-56 (Nutzer): Sandbox-fähige Ablage-Wurzel NEXTCLOUD_BASIS_ORDNER (Sandbox medidentas-digital-test, domain/ablage.ts setzeBasisOrdner/basisOrdner, wrangler.toml [vars]) + Invariante "nie löschen" (Client-Vertrag ohne DELETE, per Test abgesichert; nur Anlegen/Lesen/Umbenennen). +2 Vitest (290/30). Nutzer-Frage "eigener Test-Server?" → self-hosted NextCloud (Docker/AIO EU) empfohlen.
2026-07-06-sharp-goldberg-ndycex2026-07-0611:4012:501.17Datensparsamkeit G-6 + Zugriffs-(Lese-)Protokollierung gebaut (Version 0.48.0, D-50/RISK-27/KB-3): Nutzer-Frage "müssen wir den Zugriff auf PII protokollieren?" fachlich beantwortet, Richtung festgezurrt und umgesetzt. Neues Leitprinzip G-6 "Datensparsamkeit & Scrubbing-at-Source (ingress)" (CLAUDE.md). Code: neues domain/zugriff.ts (Whitelist mandant/beratungsdoku/dokument + zugriffAktion()), AuditLog.protokolliereZugriff() schreibt PII-armes aktion=eingesehen in die R8-Hash-Kette; verdrahtet an GET /api/mandanten/:id · …/beratungsdoku · …/dokumente/:id/datei (nur bei Erfolg); Listen/Cockpit bewusst nicht (per Test abgesichert). Mitarbeiterschutz §87 BetrVG → KB-3. +7 Vitest → 283/30 + tsc + ng build grün. Doku: G-6/CLAUDE, Decision-Log D-48, Risikoregister RISK-27 (→ in Arbeit), Audit-Log.md, Compliance #6, Kunden-Besprechungspunkte KB-3, Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts (0.48.0). Anlass: Nutzer-Frage + Vorgaben "Datensparsamkeit-Guidance" & "setze das um".
2026-07-06-nextcloud-integration-yku42k2026-07-0610:5013:102.3RBAC je Mandant + Rechte-Matrix (Version 0.46.0, D-48/OP-AUTH-1): Rückfrage-Klärung "User-Management + NextCloud besser per API": User-Management (R7) existiert bereits, echte Lücke = feingranulares RBAC; NextCloud-Anbindung bestätigt als ein technischer Service-User (nicht je Benutzer ein Account; NC-OAuth2 kann kein client_credentials, API-Recherche). Gebaut: reine Domänenfunktion server/src/domain/rechte.ts (darf(rolle, faehigkeit) + darfMandantSehen, ersetzt istAdmin); Mandant-Scope über verantwortlich (R1-F06) an zwei Chokepoints (service.sichtbareMandanten(akteur) für Aggregate + Middleware /api/mandanten/:id*, Fremd→404 statt 403); Zuweisung POST /api/mandanten/:id/zuweisen + lesende Liste GET /api/benutzer/zuweisbar (mandant_zuweisen, Audit mandant.zugewiesen); Feature-Flag rbac_mandant_scope_aktiv (Einstellung, Default aus, "erst zuweisen, dann scharfschalten"). Client: api.mandantZuweisen + Zuweisen-Select im Aktendeckel (backoffice/admin, mit Bestätigung). PR #78 · Merge mit main (Kollision mit #77 gelöst: D-47→D-48, 0.45.0→0.46.0) + CodeRabbit-Findings abgearbeitet (Normalisierung, next-Null-Check, Domänen-Label, R1-F06-ID-Fix, offene-punkte-Test, zuweisbar-Endpoint). +23 Vitest (273/29: rechte.test.ts, rbac.test.ts) + tsc + ng build + Doku-Konsistenz grün. Doku: Decision-Log D-48, Lastenheft §4.8a, Feature-Liste, Test-Übersicht, HANDOFF §2, RISK-10, CHANGELOG, version.ts/CLAUDE. NextCloud "besser per API" = Phase 2 (Plan liegt vor). Anlass: Nutzer-Fragen.
2026-07-06-akte-structure-improvement-db4ny7-82026-07-0610:5011:400.83Build-/Deploy-Status in der App (Version 0.45.0, D-47, Variante B): Deploy-Workflow (app-deploy.yml, if: always()) meldet den Job-Ausgang via wrangler d1 execute --remote in den einstellung-Store (deploy_status) — kein GitHub-Token im Worker. Read-only GET /api/deploy-status (defensiver Parser domain/deploy-status.ts, service.deployStatus()), Client-Header-Chip "✓/✗ Deploy vor Xm" mit Run-Link für alle. +7 Vitest (257/27), tsc + ng build + Doku-Konsistenz grün; end-to-end gegen miniflare verifiziert (exakter Workflow-INSERT → Endpoint liefert geparsten Status). Doku: Decision-Log D-47, Deploy.md, Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts/CLAUDE. Anlass: Nutzer-Wunsch.
2026-07-06-akte-structure-improvement-db4ny7-72026-07-0610:0510:500.75"Meaningful actions" — abgeleitete nächste Schritte (Version 0.44.0, D-46/OP-NEXTSTEP-1): neue reine Funktion domain/naechste-schritte.ts (naechsteSchritte(input)) leitet aus demselben AktenreifeInput wie die Aktenreife die nächstbeste Handlung je Zustand ab (Titel/Detail/Phase/Dringlichkeit/Sprungziel, blockierend zuerst, G-2). Im MandantDetail.naechsteSchritte mitgeliefert; Client-Aktendeckel zeigt eine "Nächste Schritte"-Leiste (klickbare Buttons, zuSchritt springt ins Register + scrollt zum Anker). +6 Vitest (250/26), tsc + ng build + Doku-Konsistenz grün; end-to-end gegen miniflare verifiziert (frisch → "Onboarding starten", nach Start → "nachfassen"). Doku: Decision-Log D-46, Feature-Liste, Test-Übersicht, HANDOFF §2/§4 (OP-NEXTSTEP-1 Erst-Slice ✅), CHANGELOG, version.ts/CLAUDE. Anlass: Nutzer-Screenshot Fokus-Karte.
2026-07-06-akte-structure-improvement-db4ny7-62026-07-0609:2010:050.75Neuer-Mandant-Flow: optionale E-Mail + "Öffnen"-Sprung + Backlog-OPs (Version 0.43.0): (1) Optionale Kontakt-E-Mail am Mandanten (R1-F12, Migration v24 ADD COLUMN email, tolerante Format-Prüfung istEmail, memory+d1, POST/PATCH, Akte-Stammdaten, Anlage-Formular; PII-arm G-5). (2) "Öffnen"-Aktions-Toast nach Anlage → Sprung in /mandant/:id (ToastService.mitAktion()/D-24, Router injiziert). (3) Backlog-OPs erfasst: OP-DUP-1 (Dubletten-Check), OP-NEXTSTEP-1 (meaningful actions aus Aktenreife+Playbook), OP-ASSIST-1 (LLM+RAG-Assistent, Compliance-kritisch). +2 Vitest (244), tsc + ng build + Doku-Konsistenz grün. Doku: CHANGELOG, HANDOFF §2/§4, Feature-Liste, Test-Übersicht, version.ts/CLAUDE. Anlass: Nutzer-Wünsche.
2026-07-06-akte-structure-improvement-db4ny7-52026-07-0608:1009:201.17Mandant = natürliche Person; "Praxis" → "Praxis/Gesellschaft" mit objektart (Version 0.42.0, D-45): Datenmodell-Umbau auf Nutzer-Klarstellung "ein Mandant (natürliche Person) hat 0-n Praxen/Gesellschaften". Mandant.typ (praxis/mvz/sonstige) entfernt (Migration v23 DROP COLUMN), neue Dimension Praxis.objektart (praxis · mvz · gesellschaft, R1-F28, v23 additiv Default 'praxis', MVZ-Standorte→'mvz'); Onboarding-Default-Vorlage aus der Objektart der (ersten) Praxis/Gesellschaft (vorlageFuerObjektart, ohne Praxis → gesellschaft). Server: enums/model/schema/migrate/repo (memory+d1)/service/app/praxis-service/dokumentvorlagen. Client: api.service (Objektart-Typ, Praxis.objektart, anlegen/praxis-Methoden), verwaltung (Typ-Wahl entfernt), mandant-detail (Objektart-Select je Praxis/Gesellschaft), cockpit/akte (Typ-Pille entfernt). 242 Vitest + tsc + ng build + Doku-Konsistenz grün; end-to-end via Playwright verifiziert. Doku: Lastenheft §4.1 (R1-F28, R1-F04 entfällt), Decision-Log D-45, Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts/CLAUDE.
2026-07-06-akte-structure-improvement-db4ny7-42026-07-0607:2008:100.83Arbeitssicht prozessgegliedert wie die Akte (Version 0.41.0, D-44): Hauptseite /mandant/:id (mandant-detail.component.ts) von Endlos-Scroll auf Aktendeckel (3 KPIs + Aktenreife-Ring + klickbarer Phasen-Zeitstrahl) + Register = Prozessphasen umgebaut; alle Editier-Controls bleiben (Sektionen je Register per [hidden] ein-/ausgeblendet), Startregister = aktuelle Phase. Rein Client, nutzt die Akte-CSS-Klassen. ng build + Doku-Check grün; end-to-end via Playwright verifiziert (Deckel/Register/Stepper, Register-Wechsel, keine Konsolenfehler). Doku: Decision-Log D-44, Feature-Liste, HANDOFF §2, CHANGELOG, version.ts/CLAUDE.
2026-07-06-akte-structure-improvement-db4ny7-32026-07-0606:1506:450.5Leitstand-Band auf autoritatives Aktenreife-Aggregat (Version 0.40.0, OP-AKTE-1/D-43): neuer Endpunkt GET /api/aktenreife (service.aktenreifeUebersicht(){reif,score,blockierend} je Mandant) über geteilten Helper baueAktenreifeInput (auch von detail() genutzt); Cockpit lädt es in reifeMap, leitReifeStufe nutzt die echte Reife statt des Offen-Zahl-Proxys (grau nur noch für unangefasste Leads). Schließt OP-AKTE-1. +1 Vitest (241/25), tsc + ng build grün. Doku: Decision-Log D-43, Akte-Struktur.md (OP-AKTE-1 erledigt), Feature-Liste, Test-Übersicht, HANDOFF §2/§4, CHANGELOG, version.ts/CLAUDE.
2026-07-05-akte-structure-improvement-db4ny7-22026-07-0516:1517:151.0Wiedervorlagen editierbar + Kommentar-Verlauf (Version 0.39.0, R5-F12/D-42): bestehende Wiedervorlagen nachträglich bearbeitbar (Betreff/Fälligkeit, Service bearbeiten, PATCH …/:id; geänderte Fälligkeit reaktiviert Erinnerung) + append-only Kommentare (neue Entität/Tabelle wiedervorlage_kommentar, Migration v22, Repo d1+memory, POST …/:id/kommentare, Autor=Identität R7). Anzeige umgekehrt chronologisch + dezent an der WV im Mandant-Detail; Audit wiedervorlage.kommentiert PII-arm. +4 Vitest (240/25), tsc + ng build grün. Doku: Decision-Log D-42, Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts/CLAUDE.
2026-07-05-akte-structure-improvement-db4ny72026-07-0515:0016:151.25Prozessgegliederte Mandantenakte + strukturierte Aktenreife (Version 0.38.0, D-41): Aktensicht (mandant-akte.component.ts) von Modul-Stapel auf Aktendeckel + Phasen-Register umgebaut (Deckel = 3 True-North-Kennzahlen + Aktenreife-Ring + Phasen-Zeitstrahl; Register = Prozessphasen + Audit quer; Druck klappt alle Register auf). Aktenreife strukturiert in neuem domain/aktenreife.ts (offenePunkte:string[]{reif,score,punkte,jePhase}, G-2); Kernentscheidung: nur blockierend verhindert Reife, offene Wiedervorlage = hinweis. Service/Client-Typen + Cockpit-Detailfärbung + Detail-Pille nachgezogen. Interaktives Mockup vorab, Nutzer-Freigabe. +8 Vitest (236/25), tsc + ng build grün. Doku: Akte-Struktur.md (neu), Decision-Log D-41, Feature-Liste, Test-Übersicht, HANDOFF §2/§4 (OP-AKTE-1), CHANGELOG, version.ts/CLAUDE.
2026-06-27-medidentas-repo-init2026-06-27~Repo-Init: Way-of-Working, Konventionen, Doku-Struktur, Doku-Rendering (Docusaurus), Governance-Docs, CI/CD-Gerüst. IDs: G-1, A-1..3, R1–R9, OP-PM-1. Danach: Erweiterbarkeit (A-6/R10) + Dexman-Detail-Lastenheft inkl. medipulse.de-Wettbewerbsanalyse (DEX-1..7, OP-DEX-1..5, OP-EXT-1; RISK-11..13).
2026-06-27-mvp-scope-onboarding2026-06-27~OP-STACK-1 entschieden (Cloudflare, A-4); MVP-Scope & Slice-Plan (MVP-Scope.md); Slice 1 Mandant+Onboarding feinspezifiziert; Datenmodell R1-F##/R2-F## im Lastenheft.
2026-06-27-lastenheft-development-89fr892026-06-27~Prozess-Workshop (20.01.2026) eingearbeitet: Anforderungsquelle (anonymisiert), Lastenheft-Revision — R11 (Meeting-Doku/Aufgaben) + R12 (Dok-Automatisierung), UC-7/8, R6 geschärft, A-7/A-8, OP-DOMAIN-1 bestätigt, OP-MEET-1/DOCGEN-1/AI-1, OP-CRM-1 geschärft (HubSpot/Build-vs-Buy), FR-4 (MyID). Meeting-Minutes-Konzeptdoc. Compliance/Risiko (RISK-14/15, RISK-3), Glossar +8, MVP-Scope, README/CLAUDE. PR #7 gemergt.
2026-06-27-architektur-system-charakter2026-06-27~Architektur-Übersicht System-Charakter.md (Anwendungs-Archetyp Case-Management+Orchestrierung, eigengebauter Kern, "System of Engagement, nicht of Data", Schichten-/eine-Wahrheit-Modell); verlinkt aus Lastenheft §1, docs/README, CLAUDE. PR #8 gemergt.
2026-06-27-slice1-mandant-onboarding2026-06-27~Slice 1 (Version 0.2.0): erster Anwendungscode. server/ (Worker · Hono · Drizzle/D1, idempotente Migration, Repo-Vertrag D1+In-Memory, abgeleiteter Fortschritt, Logger, version.ts/build-number.ts) + client/ (Angular 19: Cockpit + Mandant-Detail). 19 Vitest + Typecheck + ng build grün. CI: server-test + client-build im CI Gate; version.ts-Check reaktiviert. R1-F01..07/R2-F01..16. PR #9 gemergt.
2026-06-27-slice2-dokumente-nextcloud2026-06-27~Slice 2 (Version 0.3.0): Dokumente/NextCloud (R3+R9). NextCloudClient (WebDAV+Fake), Ablage-Pfadlogik, D1 dokument+Migration v2, Dokument-Dienst (provisionieren/Abgleich/Status+Item-Propagation/Hochladen), Client-Sektion. 33 Vitest + ng build grün. OP-DOC-1 MVP entschieden (WebDAV+App-Passwort); RISK-16. R3-F01..09. PR #10 gemergt.
2026-06-27-slice4-unterschriften2026-06-27~Slice 4 (Version 0.4.0): Unterschriften/E-Signatur (R4+A-2+R9). Provider-Abstraktion + FakeSignatur, eIDAS-Niveau-Matrix (Vollmacht→QES/Vertrag→AES/Mandat→SES), D1 signatur_vorgang+Migration v3, Signatur-Dienst (anfordern/Abgleich/Rückablage→NextCloud+Dok unterschrieben+Item geprüft), Client-Sektion. 43 Vitest + ng build grün. OP-SIGN-1 MVP; RISK-2 nachgezogen. R4-F01..08. PR #11 gemergt.
2026-06-27-slice6-audit-log2026-06-27~Slice 6 (Version 0.5.0): Audit-Log quer (R8/G-4). Append-only D1 audit_event+Migration v4, SHA-256-Hash-Verkettung (domain/audit.ts, pruefeKette), monotone Audit-IDs, AuditRecorder quer in alle Dienste (PII-arm), API audit/verify, Client-Verlauf. 53 Vitest (inkl. Tamper-Evidence) + ng build grün. OP-AUDIT-1 (Hash-Chain+Retention) entschieden; RISK-5 gemindert. R8-F01..11. PR #12 gemergt.
2026-06-27-slice3-wiedervorlagen2026-06-27~Slice 3 (Version 0.6.0): Wiedervorlagen (R5/A-5). D1 wiedervorlage+Migration v5, Benachrichtigungs-Abstraktion (Log-Default+Fake), Wiedervorlage-Dienst (anlegen/fällige/erledigen/synchronisieren aus Fristen/Erinnerungen), Cloudflare-Cron (scheduled, idempotent), API inkl. Fälligkeits-Cockpit, Client (Cockpit-Fällig-Sektion + Detail). 62 Vitest + ng build grün. A-5 gebaut; RISK-6 in Arbeit. R5-F01..11. PR #13 gemergt.
2026-06-27-slice5-beratungsdoku2026-06-27~Slice 5 (Version 0.7.0): Beratungsdoku (R6). Pflichtthemen+Default-Bausteine je Themenbereich (domain/beratung-themen.ts), KI-Prüfer-Abstraktion (ki/pruefer.ts + RegelPruefer), D1 beratungsdoku+Migration v6, Service (anlegen/bearbeiten/prüfen/freigeben→R3-Dokument), abgeleitete Vollständigkeit, Client-Sektion. 74 Vitest + ng build grün. OP-AI-1 (Abstraktion+Haftungsgrenze) + OP-DOMAIN-1-Restpunkt; RISK-14 in Arbeit. R6-F01..10. MVP-Kern (Slices 1–6) feature-complete.
2026-06-27-slice7-identitaet-rollen2026-06-27~Slice 7 (Version 0.8.0): Identität & Rollen (R7/OP-AUTH-1). Cloudflare-Access-Identität (auth/identitaet.ts: Header→E-Mail→Rolle), D1 benutzer+Migration v7, Authn-Middleware (AUTH_ENFORCED→401), RBAC (admin-only Verwaltung→403), Audit-Actor = echte Identität statt system. API ich/benutzer (GET/PUT/DELETE), health.authEnforced. Client: Nutzer im Header + Admin-Bereich "Benutzer & Rollen". 83 Vitest + ng build grün. OP-AUTH-1 MVP entschieden (Cloudflare Access, G-1); RISK-8/RISK-10 nachgezogen. R7-F01..04, ROLLE-Enum. MVP-Kern (Slices 1–7) feature-complete.
2026-06-28-lastenheft-development-89fr892026-06-28~Slice 8 (Version 0.9.0): Dokumenten-Automatisierung (R12/OP-DOCGEN-1, UC-8). Mapping-Engine (domain/dokumentvorlagen.ts: Vorlagen-Katalog je Dokumenttyp + Feld-Mapping aus Stammsatz + sprechende Benennung), D1 dokumentgenerierung+Migration v8, Dienst (vorbereiten/erzeugen→NextCloud+R3-Dokument/zur Unterschrift→R4, Niveau aus Matrix), abgeleiteter signiert-Status (G-2). API dokumentgenerierung (GET/POST + erzeugen/unterschrift). Client: Sektion im Mandant-Detail. 92 Vitest + ng build grün. OP-DOCGEN-1 MVP (Mapping+Ablage+R4-Übergabe, A-7); PDF-Erzeugung offen. R12-F01..08, DOKUMENTTYP/DOKUMENTGENERIERUNG_STATUS-Enums. MVP-Kern (Slices 1–8) feature-complete.
2026-06-28-slice9-self-service-onboarding2026-06-28~Slice 9 (Version 0.10.0, R2 §4.5/OP-ONBOARD-1): Self-Service-Onboarding per Einladungslink + Einwilligung als SES. Entity onboarding_einladung+Migration v9, domain/einwilligung.ts, onboarding-formular-service (einladung/kontext/einreichen→Stammdaten+R3-Doc+SES-Signatur+Audit G-4), öffentliche Routen /oeffentlich/* (außerhalb /api-Authn), Turnstile (optional), DEMO_MODE-Fakes. Client: öffentliche Seite /onboarding/:token (ohne Shell) + Einladungslink im Mandant-Detail. 98 Vitest + ng build grün. RISK-18/19; Access-Bypass + Turnstile + Text-Prüfung offen (OP-ONBOARD-1).
2026-06-28-deploy-live-und-design2026-06-28~Live-Deploy + Markenauftritt (Version 0.9.2, OP-DEPLOY-1): App live auf app.medidentas.com (1 Worker = UI+/api via Static Assets, hinter Cloudflare Access "HQ+MK", D1 EU weur). Deploy-Hotfixes: routes top-level (TOML-Parsing), npm run deploy für Build-Nummer. DNS-"can't find server" war lokaler Resolver-Negativ-Cache (global ok). Design an medidentas.de angeglichen: Markengrün #76b82a, Wortmarke medi/dentas + Herz-Puls-SVG + Claim, Footer; styles.css + app.component.ts. ng build grün.
2026-06-28-deploy-reife-domain2026-06-28~Deploy-Reife (Version 0.9.1, OP-DEPLOY-1): Repo deploy-fertig. Entscheidung: eine Subdomain app.medidentas.com — 1 Worker bedient UI+/api via Static Assets (wrangler [assets], SPA-Fallback in index.ts, Env.ASSETS optional). Domain medidentas.com gekauft → Transfer an HQ-Cloudflare-Account als OP-DEPLOY-1. Neu: Deploy-Runbook docs/architektur/Deploy.md + manueller app-deploy.yml (workflow_dispatch). Cloudflare-MCP in der Session nicht aufrufbar (Approval/Stream-Fehler); kein eigener Deploy von hier. 92 Vitest + ng build + Doku-Check grün.

| 2026-06-28-op-zeiterfassung-rechnungsstellung | 2026-06-28 | — | — | ~ | OP-Erfassung (keine Versionsänderung): zwei neue offene Punkte aufgenommen — OP-TIME-1 Zeiterfassung (abrechenbare Beratungs-/Arbeitszeit je Mandant; abzugrenzen vom internen Agenten-Timesheet) und OP-INVOICE-1 Rechnungsstellung & Mahnwesen (ggf. SevDesk inkl. Mahnwesen, DATEV/GoBD). Rahmen G-1 integrate-before-build (anbinden statt nachbauen). Eingetragen in Lastenheft §11 + HANDOFF §4 + CHANGELOG. | | 2026-06-28-op-docgen2-individualvertraege | 2026-06-28 | — | — | ~ | OP-Erfassung (keine Versionsänderung): OP-DOCGEN-2 aufgenommen — Dienstleistungsauftrag & Makler-Allein-Auftrag brauchen einen manuellen Ausformulierungs-/Freigabeschritt (Mensch im Prozess, RISK-14) vor R4; Feld-Mapping (OP-DOCGEN-1) liefert nur den Entwurf. Eingetragen in Lastenheft §11 (+ Querverweis OP-DOCGEN-1), HANDOFF §4, CHANGELOG. | | 2026-06-28-op-beratdok1-protokoll-pflichtangaben | 2026-06-28 | — | — | ~ | OP-Erfassung (keine Versionsänderung): OP-BERATDOK-1 aufgenommen — Beratungsprotokoll (R6) um Pflichtangaben je Termin erweitert (R6-F11..F19): wann/wo (Adresse bzw. Video)/Dauer/Analyse-Programm/Empfehlung gefolgt/Risikoaufklärung/Unterlagen-Übermittlung (F11–F17), Angaben & Gesundheitsbogen 1:1 vom Kunden (F18, §19 VVG), Verzicht auf Beratungsdoku (F19, §6 Abs. 3/§61 Abs. 2 VVG), Schlusserklärung Kunde (F20 — alles verstanden/aufgeklärt/Hinweise selbst/exakt empfohlenes Produkt/zufrieden; begrenzter Beweiswert RISK-20). Compliance-Flag (IDD/§34d·VVG §61–62/§19, §18 FinVermV; G-4) + neues RISK-20. Eingetragen in Lastenheft §4.6+§11, HANDOFF §4, Compliance.md, Risikoregister; OP-DOCGEN-2-Anführungszeichen korrigiert (CodeRabbit). |

| 2026-06-28-op-wv1-delegation | 2026-06-28 | — | — | ~ | OP-Erfassung (keine Versionsänderung): OP-WV-1 aufgenommen — Wiedervorlagen (R5) an Mitarbeiter delegieren/zuweisen. Heute nur freies verantwortlich (R5-F08). Offen: Zuweisen/Neu-Zuweisen an Benutzer (R7, validierte Ref), "meine Wiedervorlagen"-Sicht, Benachrichtigung bei (Neu-)Zuweisung, Audit der Delegation (G-4). Bindet R5↔R7. Eingetragen in Lastenheft §4.10+§11, HANDOFF §4, CHANGELOG. |

| 2026-06-28-op-dentmark1-spezialtool | 2026-06-28 | — | — | ~ | OP-Erfassung (keine Versionsänderung): OP-DENTMARK-1 aufgenommen — Dentmarking als Spezial-Tool (R10/A-6), Vorstufe zu Dexman: Daten sammeln + auswerten, speist später Dexman. Offen: Datenumfang, Abgrenzung↔Dexman, Import/Übernahme, DSGVO/EU, Lizenz (OP-EXT-1); Tool-Spec geplant. Eingetragen in Lastenheft §4.4+§11, HANDOFF §4, Erweiterbarkeit-Spezialtools.md, Dexman.md, CHANGELOG. |

| 2026-06-29-op-toolspec1-verfeinerung | 2026-06-29 | — | — | ~ | OP-Erfassung (keine Versionsänderung): OP-TOOLSPEC-1 aufgenommen — Verfeinerung/Detail-Lastenheft der Spezial-Tools: Dexman vertiefen (OP-DEX-1..5) + Dentmarking eigene Spec (spezialtools/Dentmarking.md); Manifest/Scopes/Isolation je Tool (OP-EXT-1). PR #23. Eingetragen in Lastenheft §11, HANDOFF §4, CHANGELOG. Außerdem: PR-Link am OP-DENTMARK-1-CHANGELOG-Eintrag ergänzt + MD028 (Blockquote) in Dexman.md behoben (CodeRabbit). |

| 2026-07-01-docs-broken-links-pages | 2026-07-01 | 15:30 | 16:00 | 0.5 | Doku/Infra (keine Versionsänderung): Docs-Deploy grün — Cloudflare-Pages-Projekt medidentas-docs angelegt (+ Custom Domain), Auto-Deploy bei docs/-Pushes. Docusaurus-Broken-Links beseitigt (Repo-Root-Verweise → absolute GitHub-URLs in docs/README.md+Lesepfade.md; Deploy-Link im Root-README → Docs-URL). npm run build grün, 0 Broken Links. PR #24. | | 2026-07-01-timesheet-zeitstempel-b | 2026-07-01 | 18:30 | 18:40 | 0.2 | Doku (keine Versionsänderung): Zeitstempel-Methode B eingeführt (Agent stempelt Start/Stop aus der System-Uhr, Europe/Berlin) — Methodik-Notiz ergänzt + heutige Docs-Session-Zeiten nachgetragen (15:30–16:00). Ältere —/~-Zeilen bleiben. |

| 2026-07-01-slice10-beratdok-pflichtangaben | 2026-07-01 | 18:45 | 19:10 | 0.4 | Slice 10 (Version 0.11.0, OP-BERATDOK-1): Beratungsprotokoll-Pflichtangaben R6-F11..F20 gebaut — Enums (Ort/Empfehlung/Übermittlung), Modell-Felder + Migration v10 (additiv, nullable/Default-0), Repo (D1+In-Memory), Service (Rahmendaten via aktualisieren, kein Prüfstand-Reset), API PATCH + Validierung, Client-Formular (aufklappbar, Checkboxen F16/F18/F19/F20). Compliance: RISK-20 (Pauschalbestätigung = Ergänzung, nicht Ersatz), jur. Endabnahme offen. 102 Vitest + tsc + ng build grün. Doku: Lastenheft §4.6/§11, Compliance 5a, Risikoregister, HANDOFF, version.ts. |

| 2026-07-01-slice11-beratdok-verzicht | 2026-07-01 | 20:10 | 20:45 | 0.6 | Slice 11 (Version 0.12.0, OP-BERATDOK-1): Dokumentationsverzicht-Workflow (F19) + Audit je Feldänderung. domain/beratung-verzicht.ts (Text+Render, §6 Abs. 3/§61 Abs. 2 VVG); Service verzichtErteilen → Verzichtserklärung als R3-Dokument + SES-Signatur (R4) + freigegeben + Audit (G-4, Inhalts-Hash); aktualisieren schreibt beratungsdoku.aktualisiert (PII-arm); bei Verzicht = vollständig (G-2). API POST /verzicht. Client: "Verzicht erklären"-Button + Ausblenden der Pflichtinhalte. Keine Migration. 105 Vitest + tsc + ng build grün. Jur. Endabnahme der Texte offen (RISK-18/20). |

| 2026-07-01-slice12-wv-delegation | 2026-07-01 | 20:45 | 21:00 | 0.6 | Slice 12 (Version 0.13.0, OP-WV-1): Wiedervorlagen delegieren/zuweisen (R5↔R7). Service zuweisen (validierte Benutzer-Ref R7 statt Freitext, null=entziehen) + Audit wiedervorlage.zugewiesen (wer→wem, G-4) + Benachrichtigung bei (Neu-)Zuweisung; meine(email). API POST …/:id/zuweisen + GET …/meine. Client: "Meine Wiedervorlagen" im Cockpit + Zuweisen-Steuerung im Mandant-Detail. Keine Migration. 110 Vitest + tsc + ng build grün. Doku: Lastenheft §4.10/§11, HANDOFF, CLAUDE, version.ts. |

| 2026-07-01-slice13-leistungszeit | 2026-07-01 | 21:30 | 23:55 | 1.5 | Slice 13 (Version 0.14.0, OP-TIME-1): Zeiterfassung als R13 Leistungszeit — Entscheidung Ansatz A (dünnes Ledger + Export). Modell + Migration v11, Repo (D1+Memory), LeistungszeitService (erfassen · Auto-Seed aus R6-F11/F13 · Abrechnungsvorschau · abrechnen), API + Mandant-Detail-Feld, Client-Sektion + "→ Zeit erfassen" je Beratung. Nebenfix: Detail-vollstaendigkeit honoriert R6-F19-Verzicht. Compliance: ArbZG getrennt als OP-TIME-2 + RISK-21. 117 Vitest + tsc + ng build grün. Doku: Lastenheft §4/§4.11/§11, HANDOFF, CLAUDE, Compliance, Risikoregister, version.ts. |

| 2026-07-02-leistungszeit-uebersicht | 2026-07-02 | 00:00 | 00:20 | 0.3 | Leistungszeit-Übersicht (Version 0.15.0, OP-TIME-1): Stunden-Aufteilung geleistet/abgerechnet/bezahlt auf der Kundenkarte. Server uebersicht() + GET …/leistungszeit/uebersicht (abgeleitet G-2; bezahlt = Andockpunkt SevDesk/OP-INVOICE-1, vorerst 0). Client: 3-Kachel-Übersicht im Mandant-Detail. 118 Vitest + tsc + ng build grün. Doku: Lastenheft §4.11, HANDOFF, CLAUDE, version.ts. |

| 2026-07-02-app-auto-deploy | 2026-07-02 | 00:50 | 01:10 | 0.3 | App-Auto-Deploy (keine Versionsänderung): Ursache "keine Stundenerfassung live" gefunden — App hing auf v0.10.0 (letzter manueller Deploy 28.06.), Slices 10–13 nie ausgerollt. App-Deploy #5 auf v0.15.0 ausgelöst (grün). Danach app-deploy.yml auf Auto-Deploy bei Push auf main (Pfade server/**/client/**/Workflow) umgestellt + workflow_dispatch behalten + concurrency: app-deploy (cancel-in-progress). Analog zum Doku-Auto-Deploy. Doku: Deploy.md §2/§5/§7, CLAUDE, HANDOFF, CHANGELOG. |

| 2026-07-02-mandanten-pipeline-board | 2026-07-02 | 01:15 | 01:45 | 0.5 | Mandanten-Pipeline/Board (Version 0.16.0, UC-6): Gesamtsicht aller Mandanten als Board (Spalten je Lifecycle-Status Lead/Onboarding/Aktiv/Ruhend/Archiviert) mit Fortschritts-Karten, oder als Liste — umschaltbar; Suche + Typ-Filter in beiden Ansichten; Statuswechsel per Karte (PATCH /api/mandanten/:id, auditiert mandant.geaendert, G-4). Rein client-seitig abgeleitet aus GET /api/mandanten (G-2), kein neuer Store/keine Migration. Integrationsfrei (bewusst gewählter Slice). ng build grün. Doku: Lastenheft §5.2/UC-6, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-aggregiertes-cockpit | 2026-07-02 | 01:50 | 02:20 | 0.5 | Aggregiertes Cockpit (Version 0.17.0, UC-6): "Alles Offene" über alle Mandantenservice.offenePunkte() + GET /api/offene-punkte bündelt offene Wiedervorlagen · fehlende Dokumente · ausstehende Unterschriften · unvollständige Beratungsdoku · offene Onboarding-Pflicht-Items, mit Zählern je Kategorie + überfällig-Flag (abgeleitet, G-2; kein Store/keine Migration). Client: Kachel-Filter + Liste im Cockpit (ersetzt die reine "Fällig&offen"-Sektion; "Meine Wiedervorlagen" bleibt). Integrationsfrei. 120 Vitest (+2) + tsc + ng build grün. Doku: Lastenheft UC-6/§6, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-mandantenakte-featureliste | 2026-07-02 | 02:25 | 03:05 | 0.7 | Mandantenakte + Feature-Liste (Version 0.18.0, UC-6): Druckbare Gesamtakte je Mandant (/mandant/:id/akte: Stammdaten·Onboarding·Dokumente·Unterschriften·Beratungsdoku·Leistungszeit·Wiedervorlagen·Audit) + Aktenreife-Ampel — server-seitig abgeleitet (detail().aktenreife, G-2), Client-Druckansicht (@media print). Neu: lebende docs/fachlich/Feature-Liste.md (was ist gebaut/teilweise/offen) + Pflege-Regel in CLAUDE §Repo + Verlinkung docs/README. Integrationsfrei. 121 Vitest (+1) + tsc + ng build grün. Doku: Lastenheft UC-6/§6, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-phasen-engine-playbooks | 2026-07-02 | 03:10 | 04:05 | 0.9 | Phasen-Engine + Playbooks (Version 0.19.0, §5.1, Orchestrierungs-Kern G-1): fachliche Prozessphase je Mandant (Mandant.prozessphase, enum PROZESS_PHASE, Migration v12 additiv) — domain/phasen.ts (Reihenfolge, Übergangs-Guards, Playbook-Katalog, reine Fns), service.phaseWechseln (Guards abgeleitet G-2, erzeugt idempotent Folge-Wiedervorlagen Quelle playbook, Audit mandant.phase_gewechselt G-4), POST /api/mandanten/:id/phase (400/404/409). Client: Phasen-Anzeige + Wechsel-Steuerung im Mandant-Detail (Guard-Fehler + Playbook-Hinweis). 133 Vitest (+12) + tsc + ng build grün. Doku: Lastenheft §5.2, Feature-Liste, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-playbooks-admin-editierbar | 2026-07-02 | 05:30 | 06:20 | 0.8 | Playbooks admin-editierbar (Version 0.20.0, §5.1/R7): Playbook-Katalog aus dem hartkodierten Konstrukt in einen persistierten Store überführt — playbook-Tabelle + Migration v13 (mit Default-Seed = STANDARD_PLAYBOOK, Verhalten unverändert), Repo-CRUD (D1 + Memory, Memory seedet im Konstruktor), service.phaseWechseln liest nur aktive Store-Einträge, Service-CRUD + Audit (playbook.angelegt/geaendert/entfernt), admin-geschützte Routen /api/playbooks (GET/POST/PATCH/DELETE, RBAC). Client: Playbook-Editor im Cockpit-Admin-Bereich (anlegen/editieren/(de)aktivieren/löschen). 137 Vitest (+4) + tsc + ng build grün. Doku: Lastenheft §5.2, Feature-Liste, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-test-uebersicht | 2026-07-02 | 14:30 | 14:55 | 0.4 | Doku (keine Versionsänderung): Neue lebende docs/betrieb/Test-Uebersicht.md — alle automatischen Tests (137 Vitest/16 Dateien nach Domäne·API·Auth, Client-Build, Doku-Checks) + CI-Pipeline (CI Gate), mit Pflege-Regel je PR. Feature-Liste auf aktuellen Stand (0.20.0) gegengeprüft + Querverweis. Verankert in docs/README, CLAUDE (Tiefenquellen + Repo-Regel + Tests&CI). Doku-Konsistenz grün. |

| 2026-07-02-board-phasen-spalte | 2026-07-02 | 15:20 | 15:45 | 0.4 | Board-Gruppierung nach Phase (Version 0.21.0, UC-6/§5.1): Das Pipeline-Board gruppiert wahlweise nach Lifecycle-Status oder fachlicher Prozessphase (Umschalter "Board nach: Lifecycle/Phase"). Server: MandantCockpit.prozessphase in cockpit() ergänzt. Client: generische spalten()-Berechnung + boardGruppe-Signal; in Phasen-Gruppierung führt der Phasenwechsel bewusst übers Detail (Guards). 138 Vitest (+1) + tsc + ng build grün. Doku: Lastenheft §5.2, Feature-Liste, Test-Übersicht, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-decision-log | 2026-07-02 | 15:50 | 16:10 | 0.3 | Doku/Governance (keine Versionsänderung): Neuer lebender docs/betrieb/Decision-Log.md (ADR-artig, D-n) — retrospektiv mit 19 Kern-Entscheidungen geseedet (Stack·G-1·G-2·Audit·Auth·eIDAS·Zeiterfassung·Auto-Deploy·Phasen-Engine·Playbooks-Store·Board u. a.). Verbindliche Pflege-Regel je PR verankert (CLAUDE §Repo Audit-Trail + Tiefenquellen, docs/README). Doku-Konsistenz grün. |

| 2026-07-02-ux-polish-p1 | 2026-07-02 | 16:15 | 17:05 | 0.8 | UX-Polish P1 (Version 0.22.0, Usability-Review → D-20/OP-UX-1): app-weiter ToastService (dezente Bestätigungen, Outlet aria-live in app.component) + <main>-Landmarke; Lade-Zustände (laedt) in Cockpit/Mandant-Detail/Mandantenakte; Bestätigung vor Löschen (Benutzer, Playbook) einheitlich zur bestehenden Verzicht-Rückfrage. Erfolgs-Toasts an den häufigsten Aktionen (anlegen/erledigen/erfassen/abrechnen/freigeben/zuweisen/Statuswechsel/Playbook-CRUD). Rest-Findings als OP-UX-1 erfasst. Client-only, ng build grün, 138 Vitest unverändert. Doku: Lastenheft §11 (OP-UX-1), Decision-Log D-20, Feature-Liste, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-ux-polish-p2 | 2026-07-02 | 17:10 | 17:50 | 0.7 | UX-Polish P2 (Version 0.23.0, OP-UX-1 → D-21): Access-Logout-Link im Header (/cdn-cgi/access/logout); Abschnitts-Navigation (sticky Sprungmarken md-sektionsnav + Section-ids + springeZu/abschnitte) im langen Mandant-Detail; Typ-Klartext (Praxis/MVZ/Sonstige) statt Rohwert in Cockpit + Detail (typLabel); Bestätigung vor Archivieren im Lifecycle-Wechsel; A11y-Grundgerüst (aria-label an Lifecycle-Select). Client-only, ng build grün, 138 Vitest unverändert. Doku: Lastenheft §11 (OP-UX-1 → P3), Decision-Log D-21, Feature-Liste, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-ux-polish-p3a | 2026-07-02 | 17:55 | 18:50 | 0.9 | UX-Polish P3a — A11y-Vertiefung (Version 0.24.0, OP-UX-1 → D-22): Skip-Link "Zum Inhalt springen" (.md-skip), durchgängiger Fokusring (:focus-visible), Fokus-Management bei Routenwechsel (Fokus → <main id="inhalt" tabindex="-1"> via Router-NavigationEnd), aria-pressed an Toggle-Buttons (opFilter/Ansicht/BoardGruppe), aria-label an Filter-Controls (Suche/Typ/Board-Select), role="progressbar" an Onboarding-Fortschrittsbalken. Client-only, ng build grün, 138 Vitest unverändert. Doku: Lastenheft §11 (OP-UX-1 P3a), Decision-Log D-22, Feature-Liste, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-ux-polish-p3b | 2026-07-02 | 18:40 | 19:25 | 0.8 | UX-Polish P3b — Bulk-Aktionen Wiedervorlagen (Version 0.25.0, OP-UX-1 → D-23): Mehrfachauswahl (Checkboxen + "Alle") in "Meine Wiedervorlagen"; Sammel-Erledigen (mit Rückfrage) + Sammel-Verschieben (+7 Tage) über neuen Endpunkt POST /api/wiedervorlagen/sammelaktion. Service-Methode sammelaktion() teilfehler-tolerant (Duplikate entfernt, je ID verbucht, kein Alles-oder-nichts), jede Einzeländerung über bestehende Methoden → einzeln auditiert (G-4); Verschieben setzt erinnertAm zurück. +4 Vitest (142 gesamt), ng build grün. Doku: Lastenheft §11 (OP-UX-1 P3b), Decision-Log D-23, Feature-Liste, Test-Übersicht (142), HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-02-ux-polish-p3c | 2026-07-02 | 19:30 | 20:10 | 0.7 | UX-Polish P3c — Undo bei Lifecycle-Wechseln (Version 0.26.0, OP-UX-1 → D-24, schließt OP-UX-1 ab): ToastService.mitAktion() — Aktions-Toast mit "Rückgängig"-Button (~6 s), gerendert in app.component (+ .md-toast-aktion CSS). Undo im Mandant-Detail (lifecycleSetzen) und im Board (verschieben): setzt den vorherigen Lifecycle-Status erneut → kompensierende Gegenbuchung als eigener mandant.geaendert-Audit-Eintrag (kein Rewrite, append-only/G-4). Client-only, ng build grün, 142 Vitest unverändert. Doku: Lastenheft §11 (OP-UX-1 abgeschlossen), Decision-Log D-24, Feature-Liste, HANDOFF, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-03-dentmarking-requirements-logic | 2026-07-03 | 17:50 | 19:50 | 2.0 | Dentmarking — Detail-Lastenheft + Excel-Logik-Extraktion + Umsetzungspfad (Doku, keine Versionsänderung; OP-DENTMARK-1/OP-TOOLSPEC-1 → D-26, Umsetzungsoptionen diskutiert → D-27: Modul im Kern-Worker, Kern-Entität praxis, GJ-Faktentabelle praxis_jahreswert, Slices T1–T5, OP-DM-7): Analyse der fünf Original-Artefakte (Fragebogen PDF/Online-Link, Dentmarking_v1.xlsm per openpyxl/olevba, Betriebskennzahlen-Rohling 2015, Auffälligkeiten-Vorlage). Neu: docs/spezialtools/Dentmarking.md (DM-1..DM-8, OP-DM-1..6) + docs/spezialtools/Dentmarking-Excel-Logik.md (Feldkatalog 111 Fragen A–DG, 18 Kennzahl-Formeln, Benchmark-Tabelle je Praxistyp, Potentialrechnung 25 %-Rendite, Diagramm-Projektionen, VBA-Abläufe, Befunde B-1..B-11). Compliance geflaggt: RISK-23 (PII in Alt-Excel/Fileshare, Klartext-Kennwort [geschwärzt]); keine PII ins Repo (G-5). Gepflegt: Lastenheft §4.4/§11, HANDOFF §2/§4, Dexman.md, Erweiterbarkeit-Spezialtools.md, docs/README, CLAUDE (Tiefenquellen), Feature-Liste, Decision-Log D-26, Risikoregister RISK-23, Glossar (+Dentmarking/+PZR), CHANGELOG. |

| 2026-07-03-dentmarking-t1-praxis | 2026-07-03 | 19:55 | 21:00 | 1.1 | Dentmarking T1 — Praxis/Objekt-Entität im Kern (Version 0.27.0, R1/D-27): Entität Praxis (R1-F20..F27: Name · Typ einbehandler/mehrbehandler/mvz_standort · Rechtsform · Standort · Geschäftsjahr-Beginn-Monat; 1:n unter dem Mandanten), D1-Tabelle praxis + Migration v14, Repository D1+InMemory, PraxisService mit Audit (praxis.angelegt/praxis.geaendert, G-4), API GET/POST /api/mandanten/:id/praxen + PATCH /api/praxen/:id, Client-Sektion "Praxen / Objekte" im Mandant-Detail + Abschnitts-Navigation. +7 Vitest (149 gesamt/17 Dateien; Test-Übersicht: Wiedervorlage-Zahl 16→18 korrigiert**)**, tsc + ng build grün. Doku: Lastenheft §4.1 (R1-F20..F27), Dentmarking.md §12 (T1 ✅), Feature-Liste, Test-Übersicht, HANDOFF §2, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-03-dentmarking-t2-erhebung | 2026-07-03 | 21:05 | 22:35 | 1.5 | Dentmarking T2 — Erhebung + Geschäftsjahr-Faktentabelle (Version 0.28.0, D-27): Fragenkatalog v1 als Code (domain/dentmarking-katalog.ts, 111 Felder A–DG, sprechende Schlüssel + Alt-Spalten-Mapping, Zahl-Parser für dt. Formate); Entitäten Erhebung (qualitative Antworten + DSGVO-Flag je Praxis × GJ) + PraxisJahreswert (Praxis × Periode × Feldschlüssel × Quelle, generisches Periodenmodell); Migration v15 mit Unique-Indizes (Import-Idempotenz + Upsert-Schlüssel); DentmarkingService.erhebungErfassen (Split zahl/text, idempotent via importSchluessel/B-5, Re-Import-Upsert, PII-armes Audit erhebung.erfasst); API GET/POST /api/praxen/:id/erhebungen + GET …/jahreswerte; Client "Betriebsdaten"-Aufklapper je Praxis (GJ-Zähler, Erhebungs-Liste, JSON-Import). +9 Vitest (158 gesamt/18 Dateien), tsc + ng build grün. Doku: Dentmarking.md §12 (T2 ✅), Lastenheft §11, Feature-Liste, Test-Übersicht, HANDOFF §2, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-04-dentmarking-t3-kennzahlen | 2026-07-04 | 07:45 | 08:45 | 1.0 | Dentmarking T3 — Kennzahlen-Engine + Benchmarks + Potential (Version 0.29.0, DM-2..DM-4): domain/dentmarking-kennzahlen.ts — 18 Kennzahlen rein abgeleitet (G-2), Formel-Varianten alt/korrigiert (B-1..B-3, umschaltbar bis OP-DM-1-Antwort; Rückfrage ans Fachteam ist raus), Benchmark v1-2020-excel (extrahierte Ø-/Richtwerte je Praxistyp, Quelle → OP-DM-2), Potentialrechnung wie Pot-Blatt + Mehrgewinn (25 %-Annahme parametrisierbar), Konventionen als Konstanten (B-6), Nenner-Guards (null statt stummer 0). API GET /api/praxen/:id/kennzahlen; Client: Kennzahlen-Tabelle mit Ampel + Alt-Formel-Umschalter an den GJ-Chips. +10 Vitest (168 gesamt/19 Dateien, inkl. Beispielrechnung Excel-Logik §11), tsc + ng build grün. Doku: Dentmarking.md §12 (T3 ✅), Lastenheft §11, Feature-Liste, Test-Übersicht, HANDOFF §2, CLAUDE, version.ts, CHANGELOG. |

| 2026-07-04-dentmarking-t4-gutachten | 2026-07-04 | 08:50 | 10:05 | 1.3 | Dentmarking T4 — Gutachten + Befunde (Version 0.30.0, DM-6/DM-7) + Verbesserungs-Bilanz: (1) Doku: Dentmarking.md §13 "Verbesserungen gegenüber dem Alt-Excel" (Ist→Neu-Tabelle mit Belegen T1–T3) + §13.1 "Vorleistungen für Dexman" (Praxis-Entität, Faktentabelle mit Quellen-/Periodenmodell, Katalog als Feld-Vokabular, Engine-Blaupause) + Verweis in Dexman.md. (2) T4: Gutachten als eingefrorener append-only Beleg (Text-Fassung deterministisch gerendert, referenziert Erhebung/Benchmark-Version/Formel-Variante/Rendite, R3-Dokument-Referenz; PDF = OP-DOCGEN-1-Rest) + Befund (Kennzahl-Bezug, Priorität) → idempotente Wiedervorlagen (neue R5-Quelle befund); Migration v16; Audit gutachten.erstellt/befund.erfasst; API + Client (Gutachten erstellen/ansehen, Befunde, WV-Knopf). +5 Vitest (173 gesamt/19 Dateien; inkl. CodeRabbit-Review-Fixes Runde 1–3: per-Zeile-Formularzustand, Passwort-Schwärzung, Feldzahl 111, Gutachten-POST-Härtung GJ-Range + keine-Daten-Guard/409), tsc + ng build grün. Doku: Dentmarking.md §12 (T4 ✅), Lastenheft §11, Feature-Liste, Test-Übersicht, HANDOFF §2, CLAUDE, version.ts, CHANGELOG. | | 2026-07-04-dentmarking-t5-fragebogen | 2026-07-04 | 11:15 | 12:05 | 0.8 | Dentmarking T5 — öffentlicher Fragebogen (Version 0.31.0, DM-1): tokenisierte fragebogen_einladung (Migration v17, 30 Tage, Einmal-Einreichung) + öffentliche Seite /fragebogen/<token> (Katalog v1 in 6 Themenblöcken, DSGVO-Einwilligung Pflicht, Turnstile-Option, R2-Mechanik wie Slice 9); Einreichung erzeugt idempotent Erhebung (Kanal formular) + GJ-Jahreswerte; intern Link-Erzeugung/-Kopie je Praxis × GJ; Audit PII-arm. +5 Vitest (178 gesamt/19 Dateien; inkl. CodeRabbit-Review-Fixes: Einladungs-Wiederverwendung je GJ, effektiver Listen-Status), tsc + ng build grün. Doku: Dentmarking.md §12/§13, Lastenheft §11, Feature-Liste, Test-Übersicht, Deploy.md §7a (/fragebogen*-Bypass), Risikoregister RISK-19, HANDOFF, CLAUDE, version.ts, CHANGELOG. | | 2026-07-04-op-docgen-1-pdf | 2026-07-04 | 15:05 | 15:50 | 0.75 | PDF-Erzeugung OP-DOCGEN-1 (Version 0.32.0, D-28): pdf-lib im Worker + Blockmodell-Layout-Schicht (server/src/pdf/, WinAnsi-Sanitizer, Seitenumbruch, deterministisch); Dentmarking-Gutachten-Renderer auf Blockmodell (Text-Fassung unverändert, PDF zusätzlich in NextCloud), R12-Dokumentgenerierung legt PDF statt .txt ab; NextCloudClient.get + Download-Route GET /api/dokumente/:id/datei; Client-Links "Öffnen"/"PDF". +4 Vitest (182 gesamt/20 Dateien), tsc + ng build grün. Doku: Lastenheft, Dentmarking.md, Feature-Liste, Test-Übersicht, Decision-Log D-28, HANDOFF, CLAUDE, version.ts, CHANGELOG. | | 2026-07-04-build-zeitstempel | 2026-07-04 | 16:10 | 16:25 | 0.25 | Build-Zeitstempel (Version 0.33.0): gen-build-number.mjs stempelt BUILD_ZEIT (epoch ms); /api/health liefert buildZeit; Kopfzeile zeigt "v… · build … · Datum/Uhrzeit" (de-DE). Fix: App-Shell erkennt /fragebogen/* als öffentliche Seite (T5). Health-Test erweitert (182 gesamt/20 Dateien), tsc + ng build grün. Doku: HANDOFF, CLAUDE, version.ts, CHANGELOG. | | 2026-07-04-oeffentliche-formulare-diagnose | 2026-07-04 | 16:40 | 16:55 | 0.25 | Oeffentliche Formularseiten Diagnose (Version 0.33.1): /fragebogen + /onboarding unterscheiden beim Laden HTTP 404 (Token unbekannt) von technischem Fehler (Netzwerk/Access-HTML/5xx -> sichtbarer Status) - vorher pauschal "Einladung nicht gefunden". Hintergrund: Support-Meldung, wahrscheinlichste Ursache = fehlender Access-Bypass fuer /oeffentlich* (Dashboard). Rein clientseitig, ng build gruen. Nachgang: CodeRabbit-Finding — Access-Wand (nicht-JSON/Status 200) als eigener Zugriffsschutz-Zustand; Ursache per eingeloggtem JSON-Abruf verifiziert; OP-ONBOARD-1 auf "bestätigt". | | 2026-07-04-oeffentliche-auslieferung-tests | 2026-07-04 | 17:20 | 17:50 | 0.5 | Automatische Tests für die öffentliche Auslieferungs-Weiche (Version 0.33.2): Worker-Routing-Logik "Static Assets vs. API/App" nach server/src/serving.ts ausgelagert (pure Prädikate zielIstAssets/istSpaNavigation), index.ts verhaltensgleich umgestellt; serving.test.ts (+6 Vitest, inkl. Pfad-Grenze gegen Präfix-Kollisionen /apiary) sichert ohne echtes D1, dass /oeffentlich* (Onboarding-/Fragebogen-Daten) + /api* an die App gehen und nicht in die SPA-Assets fallen — Regressionsschutz zum Public-Link-Vorfall. Hinweis dokumentiert: die öffentlichen Flow-Tests liefen bereits (onboarding-formular.test.ts, dentmarking.test.ts), der eigentliche Vorfall war Access-Konfiguration (nicht testbar). CodeRabbit-Findings adressiert (Pfad-Grenze + CHANGELOG-Konsistenz). 188 gesamt/21 Dateien, tsc grün. Doku: HANDOFF §2, CLAUDE, version.ts, Test-Übersicht, CHANGELOG. | | 2026-07-04-den-selfservice-onboarding | 2026-07-04 | 17:55 | 18:50 | 0.9 | Selfservice-Onboarding-Link repariert (Version 0.33.3): Live-Diagnose des Einladungslinks /onboarding/<token> — Access-Bypass (OP-ONBOARD-1) und /oeffentlich*-Daten-Route funktionieren, aber die Seite selbst antwortete 307 → /: der SPA-Fallback holte explizit /index.html, Cloudflares Asset-Layer (Default html_handling = "auto-trailing-slash") beantwortet das mit 307 → / ("pretty URL"), der Browser folgte auf / in die Access-Loginwand. Fix: spaFallback in serving.ts (erst /, dann /index.html, nie Redirect durchreichen), index.ts umgestellt; +4 Vitest mit Asset-Layer-Fakes beider html_handling-Modi inkl. Nur-Redirect-Fall (192 gesamt/21 Dateien; CodeRabbit-Review-Fixes: explizites redirect: 'manual', Redirect-Ablehnungs-Test); end-to-end verifiziert mit wrangler dev + echtem Client-Build (/onboarding/<token> → 200 SPA). tsc + ng build grün. Doku: HANDOFF §2, CLAUDE, version.ts, Test-Übersicht, CHANGELOG. | | 2026-07-04-selfhosted-runner | 2026-07-04 | 18:50 | 19:15 | 0.4 | CI/Deploys auf self-hosted Runner (D-29, keine Versionsänderung): GitHub-gehostete Runner starteten org-weit keine Jobs mehr (Billing/Limit) — CI + Auto-Deploy zu 0.33.3 hingen (PR #56 nach vollständiger lokaler Verifikation gemergt). Alle drei Workflows auf runs-on: ${{ vars.CI_RUNNER || 'self-hosted' }} umgestellt (Rückschalten ohne Commit via Repo-Variable CI_RUNNER); Runbook Deploy.md §7b (Runner-Anforderungen, Queued-Verhalten), Risikoregister RISK-24 (SPoF/Secrets), Decision-Log D-29, Test-Übersicht CI-Abschnitt, CHANGELOG, HANDOFF. | | 2026-07-04-signatur-ident-strategie | 2026-07-04 | 19:20 | 19:45 | 0.4 | Signatur-/Ident-Strategie Onboarding (D-30, Doku, keine Versionsänderung): Beratungsfrage "DocuSign im Onboarding? Oder PostIdent?" → Dreischichten-Abgrenzung Einwilligung (Checkbox+Audit, SES, bleibt) ≠ Unterschrift (Provider am Abschluss: Vertrag AES / Vollmacht QES; Anbieterwahl über Produktgeber-Akzeptanz, OP-SIGN-1) ≠ Identverifikation (nur bei GwG-Pflicht; Berater-Ident im Termin Standard, VideoIdent Fallback, QES enthält Ident). Neu: OP-GWG-1 (Lastenheft §11 + HANDOFF §4), RISK-25, Compliance-Tracker #9, Unterschriften.md-Abschnitt, Decision-Log D-30, CHANGELOG, HANDOFF §2. | | 2026-07-03-excel-parsing-y6pna5 | 2026-07-03 | 19:10 | 20:10 | 1.0 | Dexman Excel-Analyse & Fachmodell (Doku, keine Versionsänderung): Drei Kunden-Excel-Tools analysiert (DexMan_v41.xlsm entschlüsselt/geparst inkl. VBA, Personal_Manager_v2.xlsm, Darlehensuebersicht_v25.xlsm) → neues Lastenheft docs/spezialtools/Dexman-Fachmodell.md (DEX-8..13, Feldkataloge Personal/Darlehen/Planung/Inventar, Datenfluss DAM/PM→DexMan) + anonymisierte JSON-Beispieldaten (dexman-beispieldaten/, Scrubbing-Regeln §9). Neue OPs OP-DEX-6..9 (Umsatzbeteiligung · Ein-/Austritte dynamisch · Darlehen-Klassifikation/Praxis-Zuordnung · Parameter-Pflege), D-25, RISK-22 (PII in Kunden-Excels). Doku-Pflege: Dexman.md, docs/README, HANDOFF §2/§4, CLAUDE Tiefenquellen, Decision-Log, Risikoregister, CHANGELOG. | | 2026-07-04-ops-ruhen-abc | 2026-07-04 | 21:35 | 21:50 | 0.25 | Backlog-OPs erfasst (Doku, keine Versionsänderung): OP-RUHEND-1 (Ruhen-Workflow — Hinweis: Status ruhend existiert bereits in R1-F05, offen ist Grund/Reaktivierung/Wiedervorlage-Pause/Reporting) + OP-ABC-1 (ABC-Klassifizierung A/B/C als Priorität ≠ Lifecycle/Phase, admin-konfigurierbare diskrete Codenamen fürs Kundengespräch, PII-nah). Doku: Lastenheft §11, HANDOFF §2/§4, CHANGELOG. | | 2026-07-04-mandanten-struktur-ablage | 2026-07-04 | 19:50 | 20:20 | 0.5 | Mandanten-Struktur/Ablage & Backlog-OPs erfasst (D-31/D-32, Doku, keine Versionsänderung): strukturierte Namensfelder (nachname/titel/vorname, anzeigename abgeleitet, typ-abhängig) + Anfangsbuchstaben-Ebene in NextCloud (D-31); Gruppierung Ablage-Variante A flach+Querverweise+gemeinsamer Gruppenordner, vorläufig mit Kundenbestätigungs-Vorbehalt (D-32, Abweichung von Kunden-Vorgabe). Neue OPs OP-MANDGRP-1/OP-IMPORT-1/OP-SKILL-1, RISK-26 (Skill-Daten BetrVG/PII). Doku: Decision-Log, Lastenheft §11, Dokumentenverwaltung-NextCloud.md, Risikoregister, CHANGELOG, HANDOFF §2/§4. | | 2026-07-04-mandant-namensfelder-bucket | 2026-07-04 | 20:30 | 21:30 | 1.0 | Mandanten-Struktur & Ablage gebaut (Version 0.34.0, D-31): strukturierte Namensfelder nachname/titel/vorname (R1-F08..F10, Migration v18), Anzeigename abgeleitet (Schema "Nachname Titel Vorname", domain/mandant-name.ts, G-2), Anfangsbuchstaben-Ebene in der Ablage (anfangsbuchstabe(): Umlaut/Akzent→Grundbuchstabe, nicht-alphabetisch→#); Repo d1+memory, API POST/PATCH, Client-Anlegen-Formular. +11 Vitest (203/22 Dateien; inkl. CodeRabbit-Review-Fixes: ß-Bucket-Bug, DRY-Repo-Helfer, Doku-Tabellen), tsc + ng build + Doku-Konsistenz grün; end-to-end via wrangler dev verifiziert (Migration v18 auf D1). Folge-PRs: Alt-Ordner-Umzug (WebDAV MOVE) + Gruppierung (OP-MANDGRP-1). Doku: Lastenheft §4.1, Dokumentenverwaltung-NextCloud.md, Feature-Liste, Test-Übersicht, CHANGELOG, HANDOFF, version.ts. | | 2026-07-04-runner-env-variables-v5tc5h | 2026-07-04 | 19:20 | 19:40 | 0.33 | Runner-Tool-Cache je Lauf isoliert (Tooling, keine Versionsänderung, 0.34.0): RUNNER_TOOL_CACHE + AGENT_TOOLSDIRECTORY = ${{ runner.temp }}/_tool auf den setup-node-Steps in ci/app-deploy/docs-deploy → self-hosted-Runner (D-29) nutzt per-Lauf frischen, beschreibbaren Tool-Cache statt geteiltem Host-Cache. Wichtig: runner-Context nur auf Step-Ebene gültig (top-level-/job-env: → "Unrecognized named-value: 'runner'"); daher Step-env. YAML-Parse grün, kein top-level env:. CodeRabbit-Nitpick "composite action gegen 3-Zeilen-Dublette" abgelehnt (YAGNI/G-1-Einfachheit, 5 triviale Blöcke). PR #62. Doku: .github/workflows/.yml, CHANGELOG, Timesheet. | | 2026-07-04-runner-env-variables-v5tc5h-2 | 2026-07-04 | 21:30 | 21:45 | 0.25 | Angleichung an taktano #404 (Tooling, keine Versionsänderung, 0.34.0): Toolcache wird jetzt auf Runner-Ebene provisioniert → die Step-env-Blöcke (RUNNER_TOOL_CACHE/AGENT_TOOLSDIRECTORY) wieder aus allen 3 Workflows entfernt (ci/app-deploy/docs-deploy). medidentas hat keine Python-/setup-python-Jobs → kein /Users/runner-Problem, kein Fix 2 (System-python3) nötig wie bei taktano. YAML-Parse grün, kein runner.temp mehr. PR #62. Doku: .github/workflows/.yml, CHANGELOG, Timesheet. | | 2026-07-05-design-specifications-zgcoli-op | 2026-07-05 | 13:15 | 13:25 | 0.2 | Backlog OP-DM-9 erfasst (Doku, keine Versionsänderung): aus dem Review zu PR #65 festgehalten, dass GET /api/fragebogen/statistik aktiveEntwuerfe[] inkl. Einladungs-token/praxisName/geschaeftsjahr an jede authentifizierte Rolle ausgibt (Anzeige seit 0.37.0 admin-gated, Endpoint noch nicht → Defense-in-Depth). HANDOFF §4 (OP-DM-9) + CHANGELOG. | | 2026-07-05-design-specifications-zgcoli | 2026-07-05 | 10:30 | 13:00 | 2.5 | Cockpit-Neugestaltung "Fokus/Leitstand" + Betreuungsmodell (Version 0.37.0, D-35): Design-Handoff "AppFlowVerbesserung" im Angular-Client umgesetzt — neues cockpit.component.ts (Fokus = priorisierte Bahn, tastaturgetrieben; Leitstand = Portfolio-Band + 14/28-Tage-Zeitstrahl), Theming Hell/Dunkel/System (data-theme + CSS-Tokens), Command-Palette (⌘K); Verwaltung (Neuer Mandant/Benutzer/Playbooks) nach verwaltung.component.ts (/verwaltung) ausgelagert, Cockpit vollflächig. Neue Domänen-Dimension Betreuungsmodell (R1-F11: Enum, Migration v21, Repo d1+memory, Service/Cockpit-DTO, PATCH+Audit mandant.betreuungsmodell.geaendert, Client-API) — intern, neutral (nicht Ampel). +5 Vitest (228/24), tsc + ng build + Doku-Konsistenz grün; Fokus/Leitstand (hell/dunkel) + Command-Palette end-to-end via Chromium/Playwright gegen gemockte API verifiziert. Doku: Lastenheft §4.1, Feature-Liste, Test-Übersicht, Decision-Log (D-35), CHANGELOG, HANDOFF, version.ts/CLAUDE. | | 2026-07-05-dentmarking-questionnaire-model-eiuhl8-2 | 2026-07-05 | 08:45 | 10:30 | 1.75 | Dentmarking T7 / DM-9-Folge gebaut (Version 0.36.0, D-34): TTL für zwischengespeicherte Fragebögen (per Link ohne Auth) — Tenant-Einstellung fragebogen_entwurf_ttl_tage, Default/Cap 30 Tage (DSGVO-Datenminimierung, geklemmt 1..30), neue einstellung-Key/Value-Tabelle (Migration v20), GET/PUT /api/einstellungen (PUT admin), Invite-TTL aus Einstellung + Route-Cap 30. Cron-Ablauf-Hook entwuerfeAblaufBenachrichtigen (markiert abgelaufene Entwürfe, Benachrichtigungs-Seam, idempotent via entwurf_ablauf_benachrichtigt_am) — Zwischenstand-Mail = OP-DM-8 (tbd). Statistik GET /api/fragebogen/statistik (Trichter erstellt→begonnen→eingereicht + aktive Entwürfe mit Score/Rest-Laufzeit); Cockpit-Sektionen Statistik/Completion-Flow + admin Fragebogen-Einstellungen. +9 Vitest (223/24 Dateien), tsc + ng build + Doku-Konsistenz grün. Doku: Dentmarking.md (DM-9 f/g, T7, OP-DM-8), Decision-Log D-34, Feature-Liste, Test-Übersicht, HANDOFF §2/§4, CHANGELOG, version.ts. | | 2026-07-05-dentmarking-questionnaire-model-eiuhl8 | 2026-07-05 | 06:05 | 08:35 | 2.5 | Dentmarking T6 / DM-9 gebaut (Version 0.35.0, D-33): wiederaufnehmbarer Fragebogen (Entwurf am Einladungs-Token, Migration v19, PUT /oeffentlich/fragebogen/:token/entwurf, fragebogenKontext rehydriert + verwirft beim Einreichen) + Feld-Datenmodell: 3 Wichtigkeits-Klassen (essenziell/wichtig/nice-to-have, aus Kennzahlen-Analyse §5 abgeleitet), gewichteter Ausfüll-Score (domain/dentmarking-score.ts, 3/2/1, G-2), Feld-Markierungen "weiß ich nicht"/"wird nachgeliefert" (erhebung.markierungen, kein Jahreswert), Wertebereiche (weiche Plausibilisierung, z. B. Behandler 1–500) + Struktur-Typ Öffnungszeiten (Wochentag-Raster). Neue Enums FELD_KLASSE/FELD_MARKIERUNG. Client: Live-Score/Marker-Steuerung/Öffnungszeiten/Bereichs-Hinweise. +12 Vitest (214/23 Dateien), tsc + ng build + Doku-Konsistenz grün. Doku: Dentmarking.md (DM-9/T6), Decision-Log D-33, Feature-Liste, Test-Übersicht, HANDOFF §2/§4, CHANGELOG, version.ts. | | 2026-07-06-file-time-tracking-gkedy6 | 2026-07-06 | 14:00 | 15:30 | 1.5 | Prominente Live-Zeiterfassung auf der Mandantenakte (Version 0.46.0, D-49, R13/OP-TIME-1): rein clientseitiger Live-Timer in mandant-detail.component.ts (startet beim Öffnen der Akte, HH:MM:SS-Stoppuhr + Kommentar-Feld "Was wurde getan?", pausier-/fortsetz-/überschreibbar; "Zeit buchen" mit Pflicht-Kommentar bucht kaufmännisch gerundete Minuten über das bestehende Ledger api.leistungszeitErfassen, R13) + Verlassen-Guard zeiterfassung.guard.ts (CanDeactivate → Modal Buchen/Verwerfen/Zurück ab ≥ 1 Min, beforeunload-Warnung) + neues Register "Zeiten & Abrechnung" (verschoben aus Beratung, + Rechnungen/Mahnungen-Block via SevDesk/OP-INVOICE-1) neben "Verlauf". Kein neuer Server-Zustand (G-2), Fakturierung extern (G-1). ng build grün, Server unverändert (257 Vitest). Doku: Decision-Log D-49, Feature-Liste, Test-Übersicht, Akte-Struktur.md, CHANGELOG, HANDOFF §2, version.ts/CLAUDE. | | 2026-07-06-file-time-tracking-gkedy6-2 | 2026-07-06 | 15:40 | 16:15 | 0.6 | Zeiterfassung: Schwelle & Rundung admin-konfigurierbar (Version 0.47.0, D-49): die Verlassen-Nachfrage-Schwelle (zeiterfassung_schwelle_minuten, Default 1/0..240) und eine Buchungs-Rundung (zeiterfassung_rundung_minuten, Aufrunden auf Vielfache, Default 0/0..60) in den einstellung-Katalog aufgenommen (admin unter /verwaltung, generisch gerendert). Rundungsregel als reine, getestete Funktion domain/einstellungen.ts#buchungsminuten (+3 Vitest → 260), Client mandant-detail.component.ts spiegelt sie (lädt /api/einstellungen, zeigt buchbare Minuten am Button + Aufrund-Hinweis, Schwelle steuert Modal/beforeunload/Buch-Freigabe). ng build + tsc grün, Doku-Konsistenz grün. Doku: Decision-Log D-49 (Addendum), Feature-Liste, Test-Übersicht, CHANGELOG, HANDOFF §2, version.ts/CLAUDE. |

| MED-2026-07-06-med-id-prefix | 2026-07-06 | 16:20 | 16:35 | 0.25 | Projekt-Kürzel MED für neue IDs & Chat-/Session-Namen (MED-D-51, Governance, keine Versionsänderung): Präfix MED- für neu vergebene IDs + Session-Namen verankert (CLAUDE.md §ID-System, agents.md §4, Decision-Log MED-D-51, CHANGELOG); Bestand bleibt unverändert (kein retroaktiver Umbau). Erste MED-präfixierte Session-ID. | | MED-2026-07-06-coderabbit-config | 2026-07-06 | 16:40 | 16:55 | 0.25 | CodeRabbit-Review konfiguriert (.coderabbit.yaml, MED-D-52, Tooling, keine Versionsänderung): Extras aus, knowledge_base.issues.scope: local (stoppt externe Issue-Fetch-Fehler auf OP-*-IDs), path_filters ohne generierte Dateien; Doku bleibt im Review. Empfehlung "CodeRabbit als Required Check" dokumentiert (Admin-Schritt). Schema gegen coderabbit-Schema v2 verifiziert. | | MED-2026-07-06-angular-react-version-bump | 2026-07-06 | 18:45 | 19:05 | 0.33 | Dependency-Bump Angular 19 → 21 + React 18 → 19 (Version 0.48.1, MED-D-53, Wartung): client/ @angular/* ^19^21.0.0 (LTS 21.2.x) + typescript ~5.6.3~5.9.0; docs-site/ react/react-dom ^18^19.0.0, @docusaurus/* ^3.6^3.10.1, @easyops-cn/docusaurus-search-local ^0.45^0.55 (React-19-Peers). Bewusst Angular 21 statt 22: @angular/cli@22 verlangt Node ≥ 22.22.3, CI/Umgebung 22.22.2 → Build bricht hart ab; 21 (node ^22.12) ist der höchste lokal & in CI verifizierbare Stand. Beide Lockfiles neu erzeugt, ng build (Client) + docusaurus build (Doku-Site) lokal grün, Server unverändert. Doku: MED-D-53, HANDOFF §2, CHANGELOG, version.ts/CLAUDE. Anlass: Nutzer-Vorgabe "Angular und React auf aktuelle Version". | | MED-2026-07-06-file-handling-options | 2026-07-06 | 19:55 | 20:20 | 0.42 | Alternativen-Check Datei-Werkzeug + lokaler Mac-Sync (MED-OP-FILES-1/MED-KB-4, Doku, keine Versionsänderung): Nutzer-Frage "bessere Datei-Optionen? Nice-to-have Mac-Sync" recherchiert (NextCloud-Mac-Client/VFS-Status, kDrive/WebDAV, Hetzner Storage Share) und in Dokumentenverwaltung-NextCloud.md §Alternativen-Check dokumentiert: A-1 bleibt, Mac-Sync via offiziellem Desktop-Client (klassischer Sync, VFS-Client meiden); kDrive Plan B; M365/Dropbox Art.-9-Flag; Tresorit/E2EE bricht R12. Hosting + Sync-Rollout/Rechte → MED-KB-4. HANDOFF §2/§4, CHANGELOG. | | MED-2026-07-06-file-handling-options-2 | 2026-07-06 | 20:05 | 20:20 | 0.25 | Nachtrag "Geschlossene Ablage" (MED-OP-FILES-1/MED-KB-4 Punkt 0, Doku): Nutzer-Idee "Dateien selbst verwahren + Zugriff nur über die App-UI (keine Nutzer-Eingriffe)" als Variante analysiert (§Nachtrag in Dokumentenverwaltung-NextCloud.md): löst RBAC-Bypass (D-48) + Zugriffslog-Loch (D-50) by design; Preis = kein Finder-Sync (Grundsatz-Widerspruch zum Mac-Sync-Wunsch), Bearbeiten = Download→Re-Upload, Eigenbau Versionierung/Papierkorb/Upload. V1 "NextCloud unsichtbar" vs. V2 "R2 + App-UI" (EU-Jurisdiction, Bucket Locks/WORM verifiziert); G-1-Begründung dokumentiert. Grundsatzentscheid → MED-KB-4 Punkt 0. CHANGELOG erweitert. | | MED-2026-07-06-file-handling-options-3 | 2026-07-06 | 20:20 | 20:35 | 0.25 | Vorläufige Entscheidung MED-D-54 notiert (Kundenbestätigung ausstehend): Verzicht auf NextCloud — geschlossene Ablage V2 "R2 + App-UI"; NextCloud ggf. später als "read-only"-Sicht (Hinweis: umgeht Lese-Zugriffslog D-50). Decision-Log MED-D-54, MED-KB-4 Punkt 0 auf "Bestätigung ausstehend" umgestellt, A-1-Revisions-Hinweisbox im NextCloud-Doc, HANDOFF §2/§4, CHANGELOG. Umsetzung erst nach Bestätigung. | | MED-2026-07-06-file-handling-options-4 | 2026-07-06 | 20:40 | 21:20 | 0.67 | Geschlossene Ablage V2 "R2 + App-UI" gebaut (0.50.0, MED-D-58, setzt MED-D-54 um): Merge von main (0.49.0/MED-D-55..57, Doku-Konflikte beidseitig aufgelöst, Log-Hygiene 0.48.1-Duplikat); neuer Treiber ablage/r2.ts (R2Ablage erfüllt NextCloudClient-Vertrag, Vorfassungs-Sicherung _versionen/…, keine Lösch-Operation/MED-D-56) + App-eigene öffentliche Upload-Route GET/POST /oeffentlich/ablage/upload/:token (Formular, Token-Marker, Status-Hub + Audit); Umschaltung ABLAGE_BACKEND=r2 + Bucket-Binding (Runbook in wrangler.toml, EU-Jurisdiction/Bucket-Lock), Default NextCloud = keine Regression. +10 Vitest (300/31) + tsc grün; end-to-end via wrangler dev + lokalem R2 verifiziert. Doku: MED-D-58, NextCloud-Doc, Feature-Liste, Test-Übersicht, MED-KB-4, HANDOFF, CHANGELOG, version.ts/CLAUDE. Aktivierung erst nach Kundenbestätigung. Zzgl. neuer Backlog-OP MED-OP-OFFLINE-1 (offline-fähiger Upload, PWA/Background-Sync, Compliance-Flag Art.-9). PR + Merge. | | MED-2026-07-06-file-handling-options-5 | 2026-07-06 | 21:20 | 21:35 | 0.25 | Geschlossene Ablage R2 scharfgeschaltet (MED-D-61, Config/Aktivierung, keine Versionsänderung): Bucket medidentas-ablage (EU) vom Betreiber angelegt → ABLAGE_BACKEND=r2 + [[r2_buckets]]-Binding in wrangler.toml einkommentiert (TOML-validiert); Ablage läuft ab Deploy über R2 (kein NextCloud), ein Zugriffsweg (App). Flags: Sandbox-Wurzel bleibt vorerst, Kundenbestätigung MED-KB-4 P0 offen, Merge = Prod-Aktivierung. Doku: MED-D-61, Deploy.md §7a-2, Feature-Liste/HANDOFF/CHANGELOG/KB-4. PR angelegt. | | MED-2026-07-06-file-handling-options-6 | 2026-07-06 | 21:35 | 23:05 | 1.5 | Ausfüll-Formulare + rechtsverbindliche Einreichung (Phase 1, SES — MED-D-63, Version 0.51.0): Entscheidungsgrundlage inkl. Look-&-Feel-Mockups (Artifact) für "vorausgefülltes Formular → Kunde ergänzt → Vorschau → rechtsverbindlich abschicken", dann gebaut: domain/ausfuellformular.ts + api/ausfuellformular-service.ts + Entität/Migration v26 + Repo (d1+memory) + Routen intern/öffentlich + Client formular-public.component.ts (Route /formular/:token) + Akte-Sektion. Bewusste Trennung "rechtsverbindlich"≠"unterschrieben" (SES; formgebunden → Phase 2). +17 Vitest (317/32) + tsc + ng build grün; end-to-end via wrangler dev + D1. Doku: MED-D-63, MED-KB-5 (Phase 2/RISK-18), Deploy.md §7a Bypass, Feature-Liste, Test-Übersicht, HANDOFF, CHANGELOG, version.ts/CLAUDE. Draft-PR (MED-D-60). | | MED-2026-07-06-file-handling-options-7 | 2026-07-06 | 23:20 | 23:30 | 0.17 | Access-Bypass /formular* erledigt festgehalten (Doku, keine Versionsänderung): Betreiber hat die Cloudflare-Access-Bypass-Policy um /formular* ergänzt (MED-D-63 Phase-1-Follow-up) → öffentliche Formularseite ohne Login erreichbar. Deploy.md §7a ✅, HANDOFF §2, CHANGELOG. PR + Merge. | | MED-2026-07-06-angular22-backlog-note | 2026-07-06 | 19:10 | 19:25 | 0.25 | Angular-22-Evaluierung als Backlog-Punkt (MED-D-66/MED-OP-NG22-1, Governance, keine Versionsänderung): Auf Nutzer-Frage die echten v22-Release-Notes (05.06.2026) recherchiert und auf den Client gemappt. Ergebnis dokumentiert: 22 bewusst aufgeschoben, inhaltlicher Treiber = Signal Forms (stable) + @angular/aria (GA, A11y-Track D-22) + httpResource; Blocker = TypeScript 6 Pflicht + CLI-Node ≥ 22.22.3 (Node-Upgrade zwingend). Umstieg beim nächsten Formular-Feature als geplanter PR "Node-Bump + Angular 22 + Signal-Form". Doku: Decision-Log MED-D-66, HANDOFF §4 MED-OP-NG22-1, CHANGELOG. Anlass: Nutzer-Frage "welche Angular-22-Features interessant?". |

Start/Stop dieser Init-Session werden nachgetragen, sobald die genauen Zeiten feststehen (Gap-Regel beachten). | MED-2026-07-07-file-handling-options | 2026-07-07 | 06:30 | 07:45 | 1.25 | Fragebogen-/Formular-Vorgänge (MED-D-67, 0.52.0): gemeinsames Vorgangs-Modell über Onboarding-Einladung/Dentmarking-Fragebogen/Ausfüll-Formular (domain/formular-vorgaenge.ts + api/formular-vorgaenge-service.ts): Parallel-Limit je Typ (nur EIN offener Onboarding-Fragebogen je Mandant, idempotent), Öffnungs-Tracking geoeffnetAm + Audit + Status-Pillen, Ausfüllgrad 0–100 (Dentmarking-Score verallgemeinert), SLA-Cron weich (Benachrichtigungs-Seam, Marke slaErinnertAm; abgelaufene Links ohne weiche Erinnerung)/hart (idempotente Wiedervorlage formular_sla:<token>), Sichtungs-Wiedervorlage bei jeder Einreichung (formular_sichtung:<token>). Migration v27, Quelle formular, Repo memory+d1, Client-Pillen + ausfuellgrad in der Liste. +13 Vitest (332/33) + tsc + ng build grün; end-to-end via wrangler dev + D1. Doku: MED-D-67, Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts/CLAUDE. Draft-PR (MED-D-60). | | MED-2026-07-07-file-handling-options-2 | 2026-07-07 | 10:20 | 11:00 | 0.67 | MED-D-67-Nachtrag: Wichtigkeit dreistufig + Feld-Markierungen (Nutzer 07.07.): Ausfüllgrad unterscheidet nun Pflicht (3) · wichtig (2) · optional (1); jedes offene Feld bietet "weiß ich nicht"/"wird nachgeliefert" (DM-9-Muster verallgemeinert) — markiert = bewusst offen (kein Ausfüllgrad-Beitrag), erfüllt aber ein Pflichtfeld; "nachgeliefert" → idempotente Reminder-Wiedervorlage formular_nachlieferung:<token>. domain/formular-vorgaenge.ts (FeldWichtigkeit/WICHTIGKEIT_GEWICHT), domain/ausfuellformular.ts (Markierungen in Fassung/Vorschau/Validierung), Persistenz kundenMarkierungen Migration v28 (memory+d1), Service/Routen, Client formular-public.component.ts (Wichtigkeits-Badges + Markierungs-Chips) + api.service. +3 Vitest (335/33) + tsc + ng build grün; end-to-end via wrangler dev + D1 (v28). Doku: Decision-Log-Nachtrag MED-D-67, CLAUDE/HANDOFF/Feature-Liste/Test-Übersicht/CHANGELOG. Push in dieselbe Draft-PR #96. | | MED-2026-07-07-onboarding-draft-completion | 2026-07-07 | 12:00 | 12:35 | 0.58 | Onboarding-Fragebogen: Zwischenspeichern + Fertigstellungsgrad (MED-D-68, 0.53.0, Nutzer-Bug): Der öffentliche Onboarding-Fragebogen war die einzige der drei Token-Strecken ohne Entwurf-Zwischenspeichern und ohne angezeigten Ausfüllgrad. Nachgezogen (Muster DM-9/MED-D-67): Entwurf am onboarding_einladung (entwurf/entwurf_gespeichert_am, Migration v29, Schema/Model/Repo memory+d1), Route PUT /oeffentlich/onboarding/:token (kein Turnstile, Ingress-Scrubbing bereinigeStammdaten G-6, Audit onboarding.zwischengespeichert, Entwurf bei Einreichung verworfen); stammdatenFelderGewichtet → gemeinsamer ausfuellgrad() im kontext; Client onboarding-public.component.ts (Fortschrittsbalken live, Zwischenspeichern-Button, Rehydrieren) + api.service. +2 Vitest (340/33) + tsc + ng build grün; end-to-end via wrangler dev + D1 (v29 aktiv, Ausfüllgrad 19→75, unbekannte Schlüssel gescrubbt). Doku: Decision-Log MED-D-68, Feature-Liste, Test-Übersicht, HANDOFF §2, CHANGELOG, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer "kann nicht zwischengespeichert werden — kein Fertigstellungsgrad". | | MED-2026-07-07-op-address-validation-typing | 2026-07-07 | 12:45 | 12:55 | 0.17 | Backlog erfasst: MED-OP-VALID-1 — Feld-Typisierung + Adressvalidierung (Doku-only, keine Versionsänderung): Nutzer-OP "Adressen validieren; zulässige Werte pro Feld (Typisierung) ergänzen" als offener Punkt in HANDOFF §4 festgehalten (nicht ad hoc gebaut): (a) Typ+Constraints je Formularfeld, serverseitig am Ingress validiert (G-6) + Client-Live-Feedback (PLZ/E-Mail/Telefon/Enum/Zahl-Wertebereich), gemeinsames Validierungs-Vokabular über die drei Token-Strecken, weich/hart je Feld; (b) Adressvalidierung PLZ↔Ort, Standardwerkzeug bevorzugen (G-1), Compliance-Flag Online-Prüfung = PII-Datenfluss an Dritte (AVV/Residenz/Minimierung, G-5/G-6). Bezug MED-D-67/MED-OP-FORM-1. Doku: HANDOFF §4, CHANGELOG. Anlass: Nutzer-OP. | | MED-2026-07-07-browser-tabs-icon | 2026-07-07 | 16:25 | 16:40 | 0.25 | Browser-Tab-Icon (Favicon) = medidentas-Logo (MED-D-75, 0.55.1, PATCH; umnummeriert von MED-D-73 — Kollision #103, OP-PM-1): App lieferte kein Favicon → Tabs zeigten Platzhalter. Neu client/src/assets/favicon.svg (dieselben SVG-Pfade wie das Header-Logo app.component.ts — grünes Herz #76b82a + weiße Puls-Linie), in angular.json assets-Glob aufgenommen + in index.html per <link rel="icon" type="image/svg+xml"> referenziert; SVG statt .ico (G-2). ng build grün (favicon.svg im dist/browser/ + index.html-Referenz verifiziert). Doku: Decision-Log MED-D-75, CHANGELOG, HANDOFF §2, CLAUDE.md, version.ts. Anlass: Nutzer "Use the icon for the browser tabs". | | MED-2026-07-07-favicon-data-uri | 2026-07-07 | 20:30 | 20:55 | 0.42 | Favicon als inline data:-URI (MED-D-76, 0.55.2, PATCH; Fix zu MED-D-75): Tab-Icon erschien nicht (auch inkognito "M") — Ursache diagnostiziert: App hinter Cloudflare Access, /favicon.svg → 302 Loginseite, Icon-Fetch schlägt fehl. Fix: identisches Herz-mit-Puls-SVG als data:image/svg+xml;base64,… direkt im <link rel="icon"> von index.html (kein Access-Fetch, cache-unabhängig); Standalone-favicon.svg + Glob bleiben. Deploy auf 36375c3 verifiziert (App-Deploy success), Live-/favicon.svg → 302 Access bestätigt die Diagnose. ng build grün. Doku: Decision-Log MED-D-76, CHANGELOG, HANDOFF §2, CLAUDE.md, version.ts. Anlass: Nutzer-Bug. | | MED-2026-07-07-favicon-ios-png | 2026-07-07 | 21:15 | 21:35 | 0.33 | Zusätzliche PNG-Favicon-Variante für iOS/iPadOS (MED-D-77, 0.55.3, PATCH; Fix zu MED-D-76): Nutzer-Screenshot zeigt iPad (Safari + Chrome/WebKit) weiterhin ohne Icon (Globus statt Herz) trotz SVG-data:-URI-Fix — iOS-WebKit rendert inline-SVG-Favicons im Tab nicht zuverlässig. Fix: PNG-Variante (64×64, transparent) per cairosvg aus demselben SVG gerastert, als zweiter <link rel="icon" type="image/png"> vor dem SVG-Link. ng build grün. Doku: Decision-Log MED-D-77, CHANGELOG, HANDOFF §2, CLAUDE.md, version.ts. Anlass: Nutzer-Bug (iPad-Screenshot). | | MED-2026-07-07-favicon-oeffentlich-bypass | 2026-07-07 | 21:45 | 22:15 | 0.5 | Favicon über bestehenden /oeffentlich*-Access-Bypass statt data:-URI (MED-D-78, 0.55.4, PATCH; Fix zu MED-D-77, definitiv): Nutzer-Report "Favicon wird immer noch nicht angezeigt" nach PNG-data:-URI-Fix — Root-Cause revidiert: iOS/iPadOS-WebKit unterstützt inline-data:-URI-Favicons im Tab grundsätzlich nicht, unabhängig vom Format (nicht nur SVG). Fix: echte Datei-Auslieferung unter /oeffentlich/favicon.svg/.png (liegt bereits im bestehenden Access-Bypass, kein Betreiber-Schritt); neue reine Funktion serving.ts#echterFaviconPfad() + Proxy in index.ts#fetch() (vor Migration, kein DB-Zugriff); index.html auf echte Pfade umgestellt. +2 Vitest (356/36), tsc + ng build grün, end-to-end via wrangler dev verifiziert (/oeffentlich/favicon.svg → 200 image/svg+xml, /oeffentlich/favicon.png → 200 image/png). Doku: Decision-Log MED-D-78, CHANGELOG, HANDOFF §2, CLAUDE.md, version.ts, Test-Übersicht. Anlass: Nutzer-Bug (iPad, Chrome + Safari identisch betroffen). | | MED-2026-07-11-onboarding-rueckuebernahme | 2026-07-11 | 09:30 | 10:20 | 0.83 | Onboarding-Fragebogen → Stammdaten zurückschreiben (MED-D-88, 0.61.0, MINOR; schließt MED-OP-FORM-3): Der eingereichte Onboarding-Fragebogen fließt jetzt — wie das Ausfüll-Formular (MED-D-84) — per Review-and-apply (Mensch-im-Prozess, RISK-14/G-4) in die Stammdaten des Mandanten: uebernahme-vorschlaguebernehmen schreibt nur ausgewählte + gültige Felder (E-Mail-Format erneut geprüft), Audit stammdaten.uebernommen (quelle: 'onboarding') PII-arm, idempotent + mandant-scoped. Reuse der regelgetriebenen Rückschreib-Domäne domain/stammdaten-uebernahme.ts: neues Regelwerk ONBOARDING_STAMM_REGELN (email→email · telefon · strasse · plz · ort → Mandant), neue Validierungsart email; api/onboarding-formular-service.ts (2 Methoden, spiegelt AusfuellformularService) + Routen …/einladungen/:token/{uebernahme-vorschlag,uebernehmen} + Client-Review-Panel "In Stammdaten übernehmen" an der Einladungs-Liste. Kein Schema-/Migrations-Change (Zielfelder existieren seit v33). +6 Vitest (403/40), tsc + ng build grün, e2e via wrangler dev + D1 (Einreichung → Vorschlag 5 Felder → übernommen → Re-Vorschlag leer/idempotent). MED-KB-6 (Feld-Verschlüsselung/Retention) bleibt offen. Doku: Decision-Log MED-D-88, Feature-Liste, Test-Übersicht, HANDOFF §2/§4 (MED-OP-FORM-3 ✅), CHANGELOG, version.ts/CLAUDE. Draft-PR (MED-D-60). | | MED-2026-07-11-formular-feld-sichtung | 2026-07-11 | 10:40 | 12:40 | 2.0 | Feld-Sichtung "approve/deny" + Kunden-Feedback per Mail + Korrektur-Schleife — verbindliches Formular-Muster (MED-D-89, 0.62.0, MINOR; neues MED-OP-FORM-4): Nutzer-Vorgabe "Formulare immer so bauen: Kunde meldet zurück → Mitarbeiter sichtet jedes Feld approve/deny → Kunde erhält Feedback per Mail". Generisch/rein domain/feld-sichtung.ts (Entscheid je Feld, Ablehnung verlangt Grund, zuSichtendeFelder/vollstaendigGesichtet/feedbackNachricht) — zuerst Ausfüll-Formular (Onboarding/Dentmarking Fast-Follows). AusfuellformularService.feldSichten/sichtungAbschliessen (mandant-scoped, Audit PII-arm), Routen …/{feld-sichten,sichtung-abschliessen}, Feedback über den Benachrichtigungs-Seam (Log PII-arm — nur Betreff/Kategorie/Zeilen-Anzahl; realer Mail-Adapter OP-DM-8), Korrektur-Schleife (Status korrektur: nur abgelehnte Felder offen, akzeptierte server-gesperrt, Re-Einreichung setzt nur diese zurück + reaktiviert Sichtungs-WV). Migration v35 (ausfuellformular.sichtung), Status-Enum +korrektur, Seam +kategorie?/zeilen?. Client: Sichtungs-Panel (Arbeitssicht) + korrektur-fähiges öffentliches Formular. +14 Vitest (feld-sichtung.test.ts 8 + Service/Loop 6, 417/41) + tsc + ng build grün; e2e via wrangler dev + D1 (v35) (deny plzkorrektur → Kontext korrekturFelder=['plz'] + Grund → Korrektur ort gesperrt/plz korrigiert → eingereicht, plz zurückgesetzt/ort akzeptiert; Feedback PII-arm — Grund/Token nicht im Log). Nutzer-Weggabelungen: Deny→Korrektur-Schleife · Mail über Seam jetzt/realer Versand aufgeschoben · generisch+1 Strecke zuerst. Doku: Decision-Log MED-D-89, HANDOFF §2/§4 (MED-OP-FORM-4), Feature-Liste, Test-Übersicht, CHANGELOG, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer "Lass uns die Formulare immer so bauen …". |

| MED-2026-07-12-app-ux-process-review-15 | 2026-07-12 | 18:05 | 18:35 | 0.5 | Slice C1 — CodeRabbit-Review-Nacharbeit (MED-D-105, 0.71.00.71.1, PATCH): Follow-up auf das #138-Review nach dem Merge (frischer Branch von main). Major-Finding: BeratungsauftragService.anlegen umschließt die Playbook-Erzeugung mit einer Fehler-Grenze (Repo-Fehler beim Anlegen der Folgeaufgaben kippt die bereits persistierte+auditierte Auftrags-Anlage nicht mehr → kein Retry-Doppel, da die Anlage nicht idempotent ist); Fehler PII-arm als auftrag.playbook_fehler auditiert (nur Fehler-Klasse), Client-Label ergänzt. Doku-Konsistenz (Minor): vier untererfasste Test-Übersicht-Zeilen auf die realen Zählungen (app 40→42, ausfuellformular 33→35, onboarding-formular 8→13, stammdaten-uebernahme 9→10) → Detailsumme deckt sich mit Kopf; HANDOFF 434→437; Feature-Listen-Stand 0.70.00.71.1; #138-PR-Link. +1 Vitest (437/42), tsc + ng build grün. Draft-PR (MED-D-60). Anlass: CodeRabbit-Review #138. | | MED-2026-07-12-app-ux-process-review-16 | 2026-07-12 | 18:20 | 19:05 | 0.75 | Beratungsaufträge Slice C2a — Lead-Auto-Anlage (MED-D-106, 0.71.10.72.0, MINOR): Nutzer-Priorisierung "1". Schließt den Kreis Lead → Auftrag → Folgeaufgaben: das öffentliche Lead-Formular erfasst optionales Produkt-Interesse (Mehrfachauswahl, nur buchbare Produkte); bei Einreichung entsteht je gewähltem Produkt direkt ein Beratungsauftrag (anbahnung, an die Lead-Praxis gebunden) samt Produkt-Playbook (Slice C1). Server: LeadService bekommt BeratungsauftragService optional injiziert, kontext() liefert den buchbaren Katalog, einreichen nimmt interesse[] und delegiert (Ingress-Scrubbing verwirft Unbekanntes/Nicht-buchbares/Duplikate, G-6; Einzel-Fehler kippt den Lead nicht, MED-D-105); Audit lead.eingegangen zählt Aufträge PII-arm. Client: Interesse-Checkboxen im Lead-Formular. Keine Migration/keine neue PII. +5 Vitest (442/42), tsc + ng build grün; e2e via wrangler dev + D1 (2 Interessen → 2 Aufträge anbahnung + 4 Playbook-WVs + Audit auftraege:2). Doku: Decision-Log MED-D-106, HANDOFF §2/§4, Feature-Liste, Test-Übersicht, CHANGELOG, Beratungsauftraege.md §6, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer-Auswahl Slice C2 = Lead-Auto-Anlage. | | MED-2026-07-12-app-ux-process-review-17 | 2026-07-12 | 19:05 | 20:05 | 1.0 | App-UX-Prozess-Review aufgefrischt v0.62.0 → v0.72.0 (MED-D-107, MED-OP-REVIEW-1; Doku-Audit, keine Versionsänderung): Nutzer "go" nach Stale-Hinweis (v0.62.0-Audit = 10 Minor alt). Methode: vier parallele Code-Dimensions-Reviews (Feedback/Sprache/Kundenstrecken/Design-Mobile-A11y) via Subagenten, je mit Verdikt gegen die v0.62.0-Befunde K1–K7/§4, + Live-Begehung (wrangler dev + D1, Desktop 1440/Mobil 390, Playwright-Screenshots + scrollWidth-Overflow-Messung). Ergebnis: vier Kernrisiken adressiert (UX-Wellen 1–5), Dimensions-Noten gestiegen; neuer Backlog B1–B7 → Wellen 6/7/8 (MED-OP-UX-5/6/7), Kernfund live: Akte reflowt mobil nicht (390px→944px). Audit-Datei in place auf v0.72.0/Commit 7a13ce5; Frische-Check grün. Doku: Decision-Log MED-D-107, HANDOFF MED-OP-REVIEW-1 + 3× MED-OP-UX, CHANGELOG. Draft-PR (MED-D-60). Anlass: Meisterwerk-Audit-Kadenz. | | MED-2026-07-12-app-ux-process-review-18 | 2026-07-12 | 20:05 | 20:20 | 0.25 | App-UX-Review — CodeRabbit-Review-Nachlese (#141, Doku-only, keine Versionsänderung): drei valide #141-Findings umgesetzt — Decision-Log wieder append-only (Block 104,105,106,107 aufsteigend sortiert, Bestandstext unverändert; OP-PM-1), UX-Review §1 präzisiert (vier ursprüngliche Kernrisiken adressiert, B1–B7 bleiben), HANDOFF §5 auf MED-D-107/v0.72.0-Stand. Bewusst NICHT: Timesheet-ID-Form -app-ux-process-review-<N> beibehalten (Konsistenz mit 16 Bestandszeilen des Branches; -2pabmc-Umstellung fragmentiert die Serie). check-doc-consistency.sh grün. Draft-PR (MED-D-60). Anlass: CodeRabbit-Review #141. | | MED-2026-07-12-app-ux-process-review-19 | 2026-07-12 | 20:20 | 21:00 | 0.67 | UX-Welle 6 / B1 — Arbeits-Akte mobil responsiv (MED-D-111, MED-OP-UX-5, 0.72.00.72.1, PATCH): Nutzer "MED-OP-UX-5 / Welle 6, konkret B1". Diagnose statt Raten: per wrangler dev + Playwright die überlaufenden Elemente gegen den 390px-Viewport gemessen → Ursache ist die Shell-Kopfzeile .md-header (einzeilige Flex-Zeile ohne Umbruch, zwingt die Akte auf 944px), nicht die Inhalts-Layouts (reflowten bereits). Fix: @media (max-width:640px).md-header { flex-wrap: wrap } + Spacer bricht die rechte Gruppe + Nutzer-Pille Ellipsis. Regression beim Bau gefunden+behoben: geteilte Klasse .md-grow (Kopf-Spacer + Deckel-Titel-h2) → auf .md-header > .md-grow eingegrenzt. Verifiziert: Akte 390px (vorher 944px), Cockpit/Lead/Desktop unverändert; 442 Vitest + tsc + ng build grün. Nur Client-CSS. Doku: Decision-Log MED-D-111 (ID-Kollision zweimal behoben, First-merge-wins agents.md §3 — ursprünglich MED-D-108, dann MED-D-110), HANDOFF §2/§4 (MED-OP-UX-5 B1 ✅), UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer-Priorisierung Welle 6/B1. | | MED-2026-07-12-docs-review-process-automation-2 | 2026-07-12 | 22:05 | 22:20 | 0.25 | CI-Gate: "require branches up to date" abgeschaltet (MED-D-109, schärft MED-D-59; Doku + Repo-Setting, 0.72.0 unverändert): Nutzer-Entscheidung "3a" gegen die Rate-Limit-Treadmill (PR grün → main zieht → behind → Branch-Update → CodeRabbit-Free-Review → Rate-Limit; 12.07. dreimal). Required Checks CI Gate+CodeRabbit bleiben, nur die up-to-date-Pflicht entfällt. Doku: Decision-Log MED-D-109, agents.md §6.5/§7, HANDOFF §6 (offener Admin-Schritt), CHANGELOG. Manueller Rest: Branch-Protection-Häkchen deaktivieren (nicht via MCP). Konsistenz-Check grün. Anlass: Nutzer-Wahl "3a". | | MED-2026-07-12-docs-review-process-automation-3 | 2026-07-12 | 22:25 | 23:05 | 0.67 | Doku-Welle 2 "eine Definition, ein Ort" (MED-D-110, MED-OP-DOKU-2; Doku-only, 0.72.0 unverändert): Phantom-Phase "Ablage" aus Prozessmodell §3 entfernt → Diagramm auf die 6 echten prozessphase-Enum-Werte, Ablage als quer-liegende Achse (§6); System-Charakter §1 mitgezogen. Kanonische-Quellen-Tabelle neu in agents.md §5.4 (welche Regel wohnt wo) + Pflege-Pflichtsatz je PR einmal definiert (bedingt, mit Last-Kritik B18). ID-Vergabe-Regel bei parallelen Sessions (agents.md §3, First-merge-wins) gegen die heute zweimalige Kollision. README R1–R12R1–R13. Nebenbei: #146 (MED-D-109) CodeRabbit-Nachlese (7 Findings gefixt, 2 begründet) + Auto-Rerun heilte transiente Runner-Aussetzer → gemergt. Konsistenz-Check grün, Mermaid validiert. Anlass: Nutzer "Dann MED-OP-DOKU-2". | | MED-2026-07-12-docs-review-process-automation-4 | 2026-07-12 | 23:10 | 23:55 | 0.75 | Doku-Welle 3 "Check schärfen + Zielgruppen" (MED-D-113, MED-OP-DOKU-3; Doku+Tooling, 0.72.0 unverändert) — Doku-Meisterwerk-Auftrag abgeschlossen: check-doc-consistency.sh +4 semantische Checks (doppelte ##-Überschriften · aktive OP-Dubletten · veraltete G-/R-Spannen · Stand-Stempel↔APP_VERSION), high-signal iterativ auf 0 False-Positives gebracht (append-only/Audits ausgenommen, "Stand"-Wortgrenze); deckte reale Drift → Sanity/Management-Summary auf 0.72.0/442 gefixt. Lesepfade 7 Zielgruppen + Matrix; Glossar-Generator 4→7 Zielgruppen + R1–R13 + 3 Begriffe (41). B12: OP-DOMAIN-1 bestätigt, Feature-Waisenzeile weg, erstes-gebautes-Tool=Dentmarking, Meeting-§3=MED-D-82, Stack "bewertet". Rest-Politur → MED-OP-DOKU-4. Alle 3 Doku-Wellen ✅. +MED-OP-DOKU-4-Politur (Nutzerwunsch "noch dazu"): Produkt-Marketing-BLUF, 2 validierte Mermaid-Diagramme (Feld-Sichtungs-Loop, Dexman-Liquidität); Dexman/NextCloud bereits pyramidal. Doku-Meisterwerk-Auftrag komplett. Anlass: Nutzer "Ja + DOKU-4". | | MED-2026-07-12-app-ux-process-review-20 | 2026-07-12 | 21:55 | 22:10 | 0.25 | App-UX-Review — CodeRabbit-Review-Nachlese II (MED-D-112, Doku-only): die drei Findings aus dem allerersten #144-Review, liegen geblieben hinter zwei ID-Kollisions-Merges. CLAUDE.md-Statuszeile um App-Audit (MED-D-107) + gestartete Welle 6/B1 (MED-D-111) ergänzt; Feature-Liste.md neue Zeile "Arbeits-Akte mobil responsiv" analog Welle 1–5. HANDOFF-Quote-Finding geprüft und als Fehlalarm verworfen ("…"-Muster ist bereits das etablierte Dokument-weite Zitat-Format). Gegen aktuellen main verifiziert statt blind übernommen. Konsistenz-Check grün. Doku: Decision-Log MED-D-112, CHANGELOG. Draft-PR (MED-D-60). Anlass: liegen gebliebene Review-Findings nach #144-Merge. | | MED-2026-07-12-app-ux-process-review-21 | 2026-07-12 | 23:10 | 23:35 | 0.42 | UX-Welle 6 / B3 — Audit-Verlauf-Ladefehler sichtbar (MED-D-114, MED-OP-UX-5, 0.72.10.72.2, PATCH): Nutzer "B3". Der zentrale HTTP-Interceptor fängt nur 0/5xx/403 ab — ein Ladefehler des Audit-Trails sah bislang identisch aus wie "keine Historie" (True North #2/#3-Risiko, G-4). Neue Signale verlaufFehler (interaktive Akte, verlaufLaden()-Retry) + auditFehler (Druck-Akte, Kopfzeile "(?)" statt "(0)"). Die 2 Abrechnungs-Mutationen (lzAbrechenbarToggle/lzAbrechnen) hatten gar keinen Error-Handler — jetzt Fehler-Toast analog leistungszeitAusBeratung. Priorisiert nach Schweregrad: Audit-Trail + Geld-Mutationen zuerst; übrige Sub-Ressourcen-Listen (Meetings/Aufträge/Einladungen/Formulare) bewusst zurückgestellt (niedrigere Priorität). Verifiziert per wrangler dev + Playwright mit erzwungenem 500 (Route-Interception) auf GET …/audit: Fehler-Zustand + Retry rendern korrekt in beiden Akten-Ansichten, Golden Path unverändert (keine Konsolenfehler). 442 Vitest + tsc + ng build grün. Nur Client. Doku: Decision-Log MED-D-114 (ID-Kollision dritte in Folge, First-merge-wins agents.md §3 — ursprünglich MED-D-113, kollidierte mit paralleler Doku-Welle 3), HANDOFF §2/§4, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer-Priorisierung Welle 6/B3. | | MED-2026-07-13-app-ux-process-review-22 | 2026-07-13 | 05:50 | 06:10 | 0.33 | UX-Welle 6 / B4 — A11y-Basis (MED-D-115, MED-OP-UX-5, 0.72.20.72.3, PATCH): Nutzer "Ja" (auf Vorschlag B4 fortzusetzen). Zwei A11y-Lücken aus dem v0.72.0-App-Audit behoben: (1) --faint-Kontrast im hellen Theme lag bei ≈2,8:1 (unter AA 4,5:1) — betroffen v. a. Sub-0,7rem-Text (Cockpit-Sektionslabels/-Hinweise, keine "großer-Text"-Ausnahme) — auf #5c665f verdunkelt (≈5,3–6,0:1); dunkles Theme (≈5,4:1) unverändert. (2) "Verlassen"-Modal (mandant-detail.component.ts, D-49) ohne Fokus-Falle — jetzt echte Dialog-Semantik analog Command-Palette (MED-D-93): Fokus rein beim Öffnen, Tab/Shift+Tab bleiben gefangen, Escape = Abbrechen, Fokus-Rückgabe beim Schließen. Verifiziert per wrangler dev + Playwright: --faint-Token live geprüft (Kontrast-Rechnung vorab); Modal-Fokus-Falle über den echten CanDeactivate-Guard ausgelöst (Playwright-Clock fährt den Timer über die Schwelle statt künstlichem Hook), 8× Tab/Shift+Tab bleiben nachweislich im Dialog, Escape schließt + bleibt auf der Akte, Golden Path (keine Interaktion) navigiert weiterhin ohne Modal. 442 Vitest + tsc + ng build grün. Nur Client. Doku: Decision-Log MED-D-115, HANDOFF §2/§4 (MED-OP-UX-5 jetzt komplett ✅), UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer-Priorisierung Welle 6/B4 (letzter Punkt der Welle). | | MED-2026-07-13-app-ux-process-review-23 | 2026-07-13 | 06:12 | 06:25 | 0.22 | CodeRabbit-Review-Nachlese zu #151 (MED-D-116, 0.72.30.72.4, PATCH): #151 wurde gemergt, bevor CodeRabbits Review durchlief. Ein echter Bug (Major) nachgezogen: verlassenAbbrechen() (Escape und "Zurück zur Akte") prüfte timerBuchtGerade() nicht — Escape während einer laufenden Buchung setzte den CanDeactivate-Guard vorzeitig auf false, die spätere erfolgreiche Buchungs-Antwort löste verlassenAufloesen(true) ein zweites Mal aus (Doppel-Buchungs-/Timer-Renn-Risiko). Fix: früher Return, solange timerBuchtGerade() wahr ist. Dazu: Fokus-Selektor auf vollständigen Tabbable-Selektor erweitert (disabled input/textarea/select + Links), verlModal/verlFokusierbare auf das etablierte verlassen…-Präfix umbenannt. HANDOFF §2 (0.72.2-Rest) + Timesheet-Zähl-Tippfehler ("Drei"→"Zwei A11y-Lücken") nachgezogen. Anführungszeichen-Findings bewusst nicht geändert (Fehlalarm, MED-D-112). Verifiziert per wrangler dev + Playwright: Route-Interception verzögert die Buchungs-Antwort künstlich (2s), Escape währenddessen gedrückt — Modal bleibt nachweislich offen (Guard blockt), schließt erst nach der echten Antwort, danach saubere Navigation, kein Doppel-Zustand. 442 Vitest + tsc + ng build grün. Nur Client. Anlass: CodeRabbit-Review auf #151 (nach dessen Merge eingetroffen). | | MED-2026-07-13-app-ux-process-review-24 | 2026-07-13 | 06:26 | 06:35 | 0.15 | CodeRabbit-Review-Nachlese II zu #151/#152 (MED-D-117, 0.72.40.72.5, PATCH): #152 wurde gemergt, bevor CodeRabbits Review durchlief — drittes Mal in Folge dasselbe Merge-vor-Review-Timing auf diesem Branch. Drei kleine Findings, kein zweiter echter Bug: Fokus-Selektor weiter verschärft (a[href]:not([tabindex="-1"]), input:not([type="hidden"]), [tabindex]-Zweig jetzt auch :not(:disabled) — CodeRabbits Diff 1:1 übernommen, kein Verhaltensunterschied im heutigen Modal), CHANGELOG-PR-Link zu #152 nachgetragen (war vergessen), Feature-Liste-Zeile A11y-Basis um die 0.72.4-Härtung ergänzt. Verifiziert per wrangler dev + Playwright: Fokus-Falle + Buchungs-Guard beide erneut grün mit dem geänderten Selektor. 442 Vitest + tsc + ng build grün. Nur Client. Anlass: CodeRabbit-Review auf #152 (wieder nach dessen Merge eingetroffen). | | MED-2026-07-13-app-ux-process-review-25 | 2026-07-13 | 07:38 | 08:05 | 0.45 | UX-Welle 7 / B2 — Eine Sprache, zu Ende (MED-D-118, MED-OP-UX-6, 0.72.50.73.0, MINOR): Nutzer "MED-OP-UX-6". labels.ts deckt die Enums seit UX-Welle 2 ab, aber interne Kennungen standen weiter in der Prosa — gegen den Original-App-Audit (B2/B6-Abschnitt) geprüft und Punkt für Punkt abgearbeitet: fünf Register-Hinweise der Druck-Akte verloren ihre Requirement-IDs (R3/R4/R5/R6/R12/R13), Governance-Referenz (G-4) und Doc-ID (MED-D-56); neun Feld-IDs (F12)…(F20) an den Beratungsdoku-Rahmendaten in mandant-detail.component.ts weg (echte Gesetzeszitate §19 VVG/§6 Abs. 3/§61 Abs. 2 VVG bewusst behalten); OP-INVOICE-1/(G-1)/(G-4) aus den Rechnungs-/Audit-Hinweisen; zwei (R7)-Reste aus Zuweisen-Fehlermeldungen; R7/§5.1 aus verwaltung.component.ts. Zwei rohe-Enum-Stellen geschlossen: Rollen-Dropdown → ROLLE_LABEL, gebundener-Artefakt-Status (neue Auftrags-Fläche) → typ-abhängige artefaktStatusLabel() (Prüfstatus/Dokument-Status/WV-Status je nach Artefakt-Typ) statt rohem {{ r.status }} — der schärfste Einzelfund, da eine Beratungsdoku mit ki_geprüft sonst roh durchgereicht worden wäre. Rohe Prozessphase im Playbook-Löschen-confirm()PHASE_LABEL. Stale Consent-Text "Geldanlage" → "Kapitalanlage" (domain/einwilligung.ts, seit MED-D-99/Migration v37 überfällig). Verifiziert per wrangler dev + Playwright: automatisierter Leak-Scan über Druck-Akte + interaktive Akte bestätigt keine Restfunde mehr; Rollen-Dropdown/Artefakt-Status/Playbook-Confirm nur tsc-verifiziert (Admin-Rolle bzw. passende Seed-Daten in der Sandbox nicht verfügbar) — transparent so dokumentiert. Bewusst zurückgestellt: Rest von B6 (Lead-Picker-A11y, Fragebogen-Handschrift-Ausreißer, tote CSS) — niedrigere Priorität. 442 Vitest + tsc + ng build grün. Doku: Decision-Log MED-D-118, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer "MED-OP-UX-6". | | MED-2026-07-13-app-ux-process-review-26 | 2026-07-13 | 08:10 | 08:40 | 0.50 | UX-Welle 7 / Rest von B6 — Neue Flächen: Feinschliff (MED-D-119, MED-OP-UX-6, 0.73.00.73.1, PATCH): Nutzer "ok" (auf Vorschlag, erst Rest von B6 statt Welle 8). Schließt die im B2-PR bewusst zurückgestellten Punkte ab — UX-Welle 7 damit komplett. Lead-Interesse-Picker (lead-public.component.ts): Gruppenüberschrift war ein <label> ohne for/Control → <fieldset>/<legend>; Checkboxen von Default-Größe auf 24×24px; Ladefehler nicht differenziert (jede Ursache → "Formular nicht erreichbar") → jetzt dieselbe ladeStatus/zugriffsschutz-Logik wie die drei anderen öffentlichen Strecken (kein 404-Fall, da Lead tokenlos ist). Fragebogen-Handschrift-Ausreißer (fragebogen-public.component.ts): eigener Fortschrittsbalken ersetzt durch den geteilten md-pub-fortschritt-Baustein; neue sichtbare Legende für die ESSENZIELL/WICHTIG/OPTIONAL-Badges (bisher nur Hover-title, auf Touch nicht entdeckbar); tote CSS .md-fb-marker-actions/.md-linkbtn + die durch den Baustein-Wechsel unbenötigten .md-fb-score/.md-fb-bar*-Regeln entfernt. styles.css: totes @keyframes mwToast + --toastBg/--toastBd/--toastInk (Relikt eines älteren Toast-Prototyps) entfernt; .md-step-Regel selbst unangetastet (bleibt für die weiterhin klickbare Druck-Akte-Variante korrekt), stattdessen gezielte cursor: default-Überschreibung am rein anzeigenden Stepper der interaktiven Akte. Verifiziert per wrangler dev + Playwright: Fieldset/Legend + 24px-Checkbox-Maße programmatisch bestätigt; Zugriffsschutz-Fehlerpfad per Route-Interception erzwungen; Fragebogen mit live erzeugtem Einladungs-Token gerendert (Fortschrittsbalken + alle drei Badge-Typen + neue Legende sichtbar, Screenshot), keine Konsolenfehler. 442 Vitest + tsc + ng build grün. Nur Client. Doku: Decision-Log MED-D-119, HANDOFF §2/§4/§5 (MED-OP-UX-6 jetzt komplett ✅), UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Draft-PR (MED-D-60). Anlass: Nutzer "ok" (Rest von B6 vor Welle 8). | | MED-2026-07-13-app-ux-process-review-27 | 2026-07-13 | 08:45 | 09:40 | 0.92 | UX-Welle 8 / Teil 1 — Eine Handschrift (MED-D-120, MED-OP-UX-7, 0.73.10.74.0, MINOR): Nutzer "welle 8". App-Audit-Befund B5 gegen aktuellen Code neu geprüft — alle 7 confirm()-Stellen, alle 4 Datums-Rohformate, alle 4 Clipboard-Stellen und die zwei CSS-Token-Welten unverändert vorgefunden. Neuer ConfirmService (promise-basiert wie ToastService) + EIN gestalteter Dialog in app.component.ts mit echter Fokus-Falle (Muster vom Verlassen-Modal, MED-D-115) ersetzt alle 7 confirm()-Aufrufe (mandant-detail.component.ts ×5, verwaltung.component.ts ×2). Beim Live-Test mit Playwright fiel ein eigenständiger, bereits vor diesem PR bestehender Bug auf: der Cancel-Pfad der Mandats-Archivierung setzte this.daten.set(this.daten()) zurück — eine identische Objekt-Referenz ist unter Angular-Signal-Standardgleichheit ein No-Op, das <select> blieb optisch auf "Archiviert" stehen. Mitbehoben: Cancel-Pfad schreibt den vorherigen Wert jetzt direkt per viewChild-Referenz auf das DOM-Element zurück. datum()/datumZeit() (kanonisch seit MED-D-91) durchgesetzt: vier eigene Rohformate (app.component.ts, onboarding-public/fragebogen-public/formular-public) + eine tote zeitStempel()-Dopplung in mandant-detail.component.ts entfernt; cockpit.component.tss faelligDatum()/kurzZeit() geprüft und bewusst nicht angeglichen (zweckgebundene Varianten). Neuer kopiereText()-Helfer (labels.ts) ersetzt 4 divergierende Clipboard-Stellen, dabei einen echten ?.-Bug in akte-dentmarking.component.ts behoben (hätte ohne Clipboard-API/HTTPS ungefangen geworfen). Verlassen-Modal: "Verwerfen & verlassen" von flex-end auf space-between — jetzt sichtbar von "Zurück"/"Buchen" abgesetzt. Bewusst zurückgestellt (Rest von B5): ~570 Inline-Styles → Utility-Klassen (eigenes Epic); zwei CSS-Token-Welten (Architektur-Entscheidung); Cockpit-Fokus-Kontext mobil als Bottom-Sheet (neues Feature); 4 divergierende Absende-Button-Texte der Kundenstrecken (geprüft, bewusst belassen — je eine andere rechtliche Aussage). Verifiziert per wrangler dev + Playwright: kein natives confirm() feuert mehr, gestalteter Dialog rendert korrekt (Nachricht/Buttons/Fokus auf "Abbrechen"), Tab bleibt in der Falle, Escape bricht ab UND stellt den Status korrekt wieder her (Bug erst hier gefunden, dann gefixt und re-verifiziert). 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-120, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "welle 8". | | MED-2026-07-13-app-ux-process-review-28 | 2026-07-13 | 09:55 | 10:35 | 0.67 | UX-Welle 8 / Teil 2 — Cockpit-Fokus-Kontext mobil (MED-D-121, MED-OP-UX-7, 0.74.00.75.0, MINOR): Nutzer "Ja" (auf Vorschlag, mit dem Rest von B5 fortzufahren). Von den drei zurückgestellten B5-Punkten (Inline-Styles, Token-Welten, Cockpit-Bottom-Sheet) das bounded, konkrete Feature gewählt — Inline-Styles sind ein eigenes Epic, Token-Welten-Vereinheitlichung eine Architektur-Entscheidung, beide passen nicht in eine schnelle Runde. Die rechte Kontext-Spalte der Cockpit-Fokus-Ansicht (.mw-ctx: Aktenreife, Betreuungsmodell, Phasen-Strip, offene Punkte, Verlauf) war unter 820px display:none — anders als das strukturell analoge Leitstand-Detail (seit MED-OP-UX-3 ein Bottom-Sheet). Neuer Toggle-Button "Kontext ↑" (.mw-ctx-toggle, nur <820px sichtbar) öffnet dieselbe Spalte als Bottom-Sheet — identische CSS wie .mw-leit-aside.offen (position:fixed;bottom:0;max-height:62vh), "← Schließen" schließt sie. Bewusst NICHT das Leitstand-Muster 1:1 kopiert (offen aus !!selEvent() abgeleitet): im Cockpit ist cur() fast immer gesetzt (sobald die Bucket-Queue nicht leer ist), eine Ableitung hätte die Sheet auf fast jedem Mobile-Aufruf sofort übers Bild gelegt — stattdessen ein eigenes, entkoppeltes ctxOffen-Signal (reiner manueller Toggle). Verifiziert per wrangler dev + Playwright bei 1400px (Toggle bleibt unsichtbar, Kontext-Spalte immer sichtbar — Desktop unverändert) und 390px (Spalte per Default display:none, Toggle sichtbar, Klick öffnet die Sheet mit position:fixed/bottom:0/Klasse .offen, "Schließen" schließt sie zuverlässig) — beide Zustände screenshotbestätigt, keine Konsolenfehler. 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-121, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "Ja" (Fortsetzung Welle 8). | | MED-2026-07-13-app-ux-process-review-29 | 2026-07-13 | 10:45 | 11:15 | 0.50 | UX-Welle 8 / Teil 3 — Inline-Styles konsolidiert, Runde 1 (MED-D-122, MED-OP-UX-7, 0.75.00.75.1, PATCH): Nutzer "B5 NeXT" nach Rückfrage-Antwort "Inline-Styles zuerst" (echte Weggabelung: Inline-Styles vs. Token-Welten-Entscheidung — Nutzer wählte den risikoärmeren, mechanischen Weg). Statt blind alle 215 Inline-Styles in cockpit.component.ts (größter Einzelposten der App-Audit-Zählung ~570) anzufassen, zuerst eine Long-Tail-Analyse: nur 49 Stellen (19 Muster) sind exakte ≥2×-Duplikate, 166 sind Einzelwerte. Diese als 17 neue Utility-Klassen konsolidiert — 6 generische .md-* (Wiederverwendung von .md-grow für flex:1, neu .md-block/.md-mauto/.md-jc-center/.md-grow-mw0/.md-grow-center/.md-mb-05) + 11 Cockpit-eigene .mw-* (.mw-row-sm/.mw-cap/.mw-detail-lbl/.mw-note/.mw-sub/.mw-sub-faint/.mw-flag-red/.mw-loading-note/.mw-empty-note/.mw-dot-sq7/.mw-dot6) + ein .mw-sec-label.mut-Modifier (deckte dabei einen kleinen Redundanz-Fund auf: 3× wurde letter-spacing:0.14em inline re-deklariert, obwohl die Klasse das bereits setzt — entfernt). Ergebnis: 215→166 Inline-Styles (-23 %), byte-identisches CSS (reine 1:1-Ablöse, keine Werte neu interpretiert). Bewusst NICHT angefasst: die 166 verbleibenden Einzelwerte — eine weitere Verdichtung bräuchte eine Spacing-/Typografie-Skala-Entscheidung, dieselbe Kategorie wie die noch offene Token-Welten-Frage. Verifiziert per wrangler dev + Playwright: Fokus- und Leitstand-Ansicht bei 1400px (hell + dunkel, da mehrere neue Klassen Cockpit-Theme-Variablen referenzieren) und 390px (mobil) gescreenshottet, keine Konsolenfehler, keine sichtbare Abweichung. 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-122, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "B5 NeXT" → "Inline-Styles zuerst". | | MED-2026-07-13-app-ux-process-review-30 | 2026-07-13 | 17:50 | 18:35 | 0.75 | UX-Welle 8 / Teil 4 — Inline-Styles konsolidiert, Runde 2 atomar (MED-D-126, MED-OP-UX-7, 0.75.10.75.2, PATCH): Nutzer "Die verbleibenden ~166 one-off inline styles" nach vorherigem Angebot der drei offenen B5-Punkte. Analyse zeigte: mit Zahlenwerten normalisiert wiederholen sich viele der 166 "Einzelwerte" doch als FORM (z. B. display:flex;flex-direction:column;gap:X 7× mit 7 verschiedenen Gaps) — echte Weggabelung, daher Rückfrage mit drei Optionen (atomare Zerlegung ohne Wertänderung / nur weitere exakte Duplikate / Spacing-Skala mit Rundung). Nutzer wählte "Atomare Klassen, Werte unverändert". Umsetzung: Deklarations-Häufigkeitstabelle über alle 242 distinkten Deklarationen gebaut, Schwellenwert ≥4× gewählt (bewusst dokumentierter Mittelweg: ≥2×→91 Klassen, ≥3×→56, ≥4×→37, ≥5×→23) — 36 neue atomare Klassen (Layout-Primitive mw-flex/mw-col/mw-items-center/mw-flex-none/mw-abs/mw-rel etc., 5 Cockpit-Farbtoken-Atome mw-c-mut/mw-c-faint/mw-c-text/mw-c-text2/mw-c-accent-text, Font-Größen mw-fs-68mw-fs-92, Gaps mw-gap-35mw-gap-60). Automatisiert per Node-Skript: Tag-aware Regex, die Angular-Bindings ([style.color], [attr.stroke] etc.) unangetastet lässt und ein vorhandenes class="…" korrekt erweitert statt überschreibt; vor dem Schreiben ein vollständiger Dry-Run mit Vorher/Nachher-Diff aller 145 betroffenen Stellen manuell durchgesehen (u. a. gezielt auf [class]-Bindings und verschachtelte Anführungszeichen in Ternaries geprüft). Ergebnis: 145 von 166 Stellen atomisiert, 21 blieben unberührt (nur Deklarationen unter der Schwelle) — Cockpit jetzt bei 132 Inline-Styles (215 zu Sessionbeginn von B5 → -39 % kumuliert). Verifiziert per wrangler dev + Playwright: Fokus- und Leitstand-Ansicht (Timeline mit Sticky-Headern, Event-Detail-Panel, "Wartet auf andere"/"Erledigt heute"-Buckets) bei 1400px (hell + dunkel) und 390px (mobil) gescreenshottet — jede Ansicht pixelidentisch zum vorherigen Stand, keine Konsolenfehler. Während der Arbeit landeten zwei fremde CI-Commits auf main (MED-D-124/125, Infra-only) — sauber rebased, kein Konflikt. 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-126, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "Die verbleibenden ~166 one-off inline styles" → Rückfrage → "Atomare Klassen, Werte unverändert". | | MED-2026-07-13-app-ux-process-review-31 | 2026-07-13 | 18:40 | 19:40 | 1.00 | World-2-Pilot — Verwaltung + App-Shell auf Cockpit-Tokens (MED-D-128, MED-OP-UX-7, 0.75.20.76.0, MINOR): Nutzer "world 2" (Antwort auf eine vorherige Erklärung der zwei CSS-Token-Welten). Zwei echte Rückfragen vor Umsetzung: (1) Zielrichtung bestätigt — Cockpit-Palette (--bg/--panel/--accent/.../.mw-btn) wird der EINE Standard, nicht umgekehrt; Umfang "Pilot-Bereich zuerst" statt alles auf einmal. (2) Strukturfund während der Scoping-Analyse: Verwaltung hat keine eigene Header/Footer, sondern teilt sich die App-Shell mit Akte/Mandant-Detail (app.component.ts) — ein sauberer Pilot müsste die Shell mitfärben, sonst Bruch zwischen Header und Inhalt. Nutzer bestätigte "Shell + Verwaltung-Inhalt". Vor der Umsetzung ein vollständiges Klassen-Inventar gebaut: fast jede von Verwaltung genutzte Klasse (.md-btn, .md-card, .md-pill, .md-muted, .md-row, .md-items, .md-w100) sowie mehrere bare Element-Selektoren (button, input, select, label, h2/h3) sind app-weit mit Akte/Mandant-Detail/den 4 öffentlichen Kundenstrecken geteilt — eine direkte Änderung der Basisregeln hätte über den Piloten hinausgeleckt. Lösung: neue .mw-scope-Wrapper-Klasse um Verwaltungs gesamten Template-Inhalt, mit rein descendant-gescopeten CSS-Overrides (.mw-scope .md-card, .mw-scope button, .mw-scope input/select, .mw-scope .md-pill/.md-muted/.md-error/.md-items li/.md-status-*/.md-funnel-*, .mw-scope label) — reversibel/erweiterbar: dieselbe Klasse an einem anderen Wurzel-Template reicht für den nächsten Rollout-Schritt. Die App-Shell selbst (.md-shell/.md-header/.md-footer/.md-skip/.md-theme-seg/.md-version/.md-deploy) direkt umgefärbt, da exklusiv nur dort verwendet (verifiziert); .md-header .md-btn/.md-header .md-pill gescopet für Nav-Buttons/Rollen-Chip. .md-brand/.md-wordmark*/.md-logo bewusst NICHT angefasst — auch von den öffentlichen Kundenstrecken über pub-bausteine.ts genutzt, Kontrast gegen den neuen Header-Hintergrund geprüft und für beide Themes ausreichend befunden. Zwei inline var(--md-warn)-Referenzen in Verwaltung (nicht CSS-überschreibbar) direkt auf var(--amber) umgestellt. Bewusste, vorab angekündigte Konsequenz: Akte/Mandant-Detail erben die neue Header/Footer-Chrome (dieselbe Shell), behalten aber vorerst ihren --md-*-Inhalt — transitioneller zweifarbiger Look, am deutlichsten im Dunkel-Theme. Verifiziert per wrangler dev + Playwright: Verwaltung hell/dunkel/mobil sowie Mandant-Detail + Druck-Akte hell/dunkel gescreenshottet; dem Nutzer vor dem Commit zur Durchsicht per Datei-Versand vorgelegt (Akte/Detail-Inhalt bestätigt unverändert, nur Chrome ändert sich) — ein Stop-Hook (uncommitted changes) forderte danach zum Commit/Push auf, bevor eine explizite Nutzer-Antwort einging; da die visuelle Vorschau bereits geteilt war und der Hook eine feste Repo-Policy ist, wurde committed/gepusht, aber Auto-Merge bewusst NICHT aktiviert (Freigabe steht noch aus). Während der Arbeit landete ein fremder Commit auf main (MED-D-127, Doku-only) — per Cherry-Pick auf frischen main sauber neu aufgesetzt (ursprünglicher Rebase-Versuch hatte einen Konflikt in Decision-Log.md durch bereits gemergte Vorgänger-Commits, per Abort+Reset+Cherry-Pick vermieden statt manuell aufgelöst). 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-128, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "world 2" → zwei Rückfragen → "Ja, World 2 wird Standard" + "Ja, Shell + Verwaltung-Inhalt". | | MED-2026-07-18-app-ux-process-review-47 | 2026-07-18 | 20:06 | 20:22 | 0.27 | CodeRabbit-Nachlese zu MED-D-147 (MED-D-148, keine Versionsänderung): PR #189 mit 6 Befunden — jeder einzeln gegen den aktuellen Code verifiziert statt blind übernommen. Echt, behoben (5): app.tss weicheHinweise() rief kiFeldVorschlag.schlageVor() ohne Fehlerbehandlung auf — ein Provider-Fehler hätte die bereits erfolgreiche POST/PATCH-Mutation mit 500 scheitern lassen (Datenintegritäts-Risiko: doppelte Praxis-Anlage bei Retry) — auf try/catch umgestellt, Mutation bleibt bei Vorschlags-Fehler erfolgreich, nur vorschlaege bleibt für das Feld leer; mandant-detail.component.tss PLZ-Übernehmen-PATCH hatte keinen Error-Handler — error: () => this.toast.fehler(...) ergänzt; HANDOFF.md MED-OP-TEST-1-Zeile nannte noch "446" statt 466 Vitest; Management-Summary.md §5 listete die smarten Formular-Vorschläge noch komplett als Zukunftsschritt ("Fake-Seam zuerst... echtes LLM später"), obwohl Slice 1+2 bereits gebaut sind — Zeile auf die tatsächlich verbleibenden Folge-Slices umformuliert (Onboarding/Dentmarking-Angleichung, Client-UI, Adressvalidierung); Timesheet.mds eigene MED-D-147-Zeile (Session -46) zitierte den Toast-Text mit zwei typografischen -Anführungszeichen statt gerader " — verletzte die eigene, erst Stunden zuvor in MED-D-145 verankerte Konvention, korrigiert (verschachtelt: äußere '…', innere "…"). Zusätzlich mitgenommen (nicht explizit gefordert, derselbe Root-Cause): Test-Uebersicht.mds Intro-Absatz narrierte nur bis MED-D-143, um MED-D-146/147 ergänzt. Geprüft, bewusst NICHT übernommen (1): praxis.test.ts — CodeRabbits committable suggestion behauptete eine doppelte const body-Deklaration in Zeile 150; per Read bestätigt, dass die Deklaration nur einmal existiert (zusätzlich verifiziert: tsc --noEmit + voller Testlauf beide grün, 466 Tests unverändert, vor UND nach diesem Fix) — CodeRabbits Diff-Analyse hat hier fälschlich dupliziert, kein echter Befund, ein blind übernommener Fix hätte eine funktionierende Zeile gelöscht. Golden Path erneut gegen echten Browser verifiziert (wrangler dev + Playwright, derselbe Testablauf wie bei MED-D-147): bestätigt, dass die try/catch-Änderung das Erfolgsverhalten unverändert lässt. Kein neues Feature, APP_VERSION unverändert 0.80.0, 466 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-148, CHANGELOG. Anlass: automatisch eingehende CodeRabbit-Review-Events auf PR #189. | | MED-2026-07-18-app-ux-process-review-46 | 2026-07-18 | 19:46 | 20:05 | 0.32 | MED-OP-VALID-1 Slice 2 — KI-Formatvorschlag erstmals im App-internen Praxis-Formular (MED-D-147, 0.79.00.80.0, MINOR): Nutzer "Die smarte Eingabe-Unterstützung (LLM + RAG?) auch für die Eingabe-Felder in der App verwenden". Vor der Umsetzung die Parenthese "(LLM + RAG?)" direkt beantwortet: docs/architektur/In-App-Assistent.md (OP-ASSIST-1, weiterhin Design-only) scopet RAG strikt auf Doku-Retrieval, §5 verbietet PII/Bestandsdaten im Vektor-Store explizit — Feld-Formatvorschlag braucht keine Retrieval, sondern den in Slice 1 bereits gebauten deterministischen KiFeldVorschlag-Mechanismus. Ein Explore-Agent recherchierte, WO im internen App-Client überhaupt strukturierte Felder mit einem echten Typ existieren, bevor irgendetwas gebaut wurde: Mandant-Stammdaten (telefon/geburtsdatum/strasse/plz/ort) sind heute gar nicht Berater-editierbar — nur über den auditierten Formular-Rückübernahme-Pfad gesetzt; einzig Praxis strasse/plz/ort sind bereits editierbar (Anlegen + PATCH in app.ts) und dort komplett ungeprüft; Mandant email/ibanPrivat + Praxis iban/geschaeftsjahrBeginnMonat sind bereits hart validiert (400 bei ungültigem Wert). Daraus zwei echte Forks proaktiv als Text vorgelegt statt selbst entschieden: (1) sollen die bereits harten Felder auf "immer weich" umgestellt werden (Verhaltensänderung einer produktiven API) oder bleibt ein Vorschlag nur additiver Helfer? (2) soll Mandant-Stammdaten neu Berater-editierbar werden (umgeht die auditierte Formular-Rückübernahme, G-4)? Nutzer antwortete knapp "yes" — beide bewusst konservativ interpretiert: harte Felder bleiben hart, Mandant-Stammdaten-Editierbarkeit wird nicht neu eingeführt. Vor der Umsetzung zusätzlich erkannt: ein Vorschlags-Layer auf den bereits harten, normalisierten Feldern (Mandant-IBAN/E-Mail, Praxis-IBAN) würde praktisch nie einen echten Hinweis erzeugen (der gespeicherte Wert ist per Konstruktion schon gueltig) — bewusst NICHT implementiert, um keinen toten Code zu schreiben; Scope damit auf die einzige risikofreie additive Erweiterung reduziert: Praxis-plz. Umsetzung: neuer weicheHinweise()-Helfer in app.ts (nutzt den bereits verdrahteten kiFeldVorschlag) an POST /api/mandanten/:id/praxen + PATCH /api/praxen/:id — Antwort additiv um hinweise/vorschlaege erweitert ({...p, hinweise, vorschlaege}, kein Bruch der bestehenden Praxis-Antwortform; PATCH berechnet nur, wenn plz tatsächlich im Patch enthalten war, verifiziert per Test). Client: PraxisMitHinweisen-Typ in api.service.ts; mandant-detail.component.ts#praxisAnlegen() zeigt bei einem PLZ-Vorschlag einen Undo-Toast (ToastService.mitAktion, bestehendes Nielsen-#3-Muster wiederverwendet statt einer neuen Inline-Hinweis-Komponente — die Praxis-Anlegen-Felder leeren sich sofort nach Erfolg, ein Inline-Hinweis am Feld wäre sofort wieder verschwunden); Klick löst ein echtes praxisAendern-PATCH mit dem Vorschlag aus, ohne Klick bleibt der Originalwert unverändert. Gegen echten Browser verifiziert, nicht nur Vitest (Konvention bei UI-Änderungen, agents.md): wrangler dev --local lokal mit .dev.vars (AUTH_ENFORCED=false, nach der Verifikation wieder entfernt — war bereits gitignored, nie riskiert) + Playwright (Chromium unter /opt/pw-browsers, kein Neu-Download): Mandant angelegt → Praxis "Filiale Nord" mit PLZ "40 210" (bewusst fehlerhaftes Format) angelegt → Toast 'PLZ "40 210" wirkt unüblich — meintest du "40210"?' erscheint (Screenshot 02-after-anlegen-toast.png) → Klick auf "PLZ übernehmen" → zweiter Toast "PLZ aktualisiert." + Praxis-Liste zeigt "Filiale Nord · 40210" (Screenshot 03-after-uebernehmen.png) → Server-API bestätigt plz: "40210" unabhängig vom Screenshot. +2 Vitest (praxis.test.ts: additiver Hinweis bei Anlegen — 201 trotz unüblichem Format, nie 400; PATCH nur bei enthaltenem plz-Feld). 464→466 Vitest, tsc --noEmit + ng build grün (nur der vorbestehende, unbezogene NG8102-Hinweis), Doku-Konsistenz-Check grün. Version-Stamps einzeln auf 0.80.0/466 geprüft. Doku: Decision-Log MED-D-147, HANDOFF §2/§4, CHANGELOG, Feature-Liste, Test-Übersicht, version.ts/CLAUDE/README/Lastenheft/MVP-Scope/Sanity-Checkliste/Management-Summary. Anlass: Nutzer "Die smarte Eingabe-Unterstützung (LLM + RAG?) auch für die Eingabe-Felder in der App verwenden" → RAG-Klärung + Scope-Analyse mit zwei Forks vorgelegt → "yes". | | MED-2026-07-18-app-ux-process-review-45 | 2026-07-18 | 19:00 | 19:45 | 0.75 | MED-OP-VALID-1 Slice 1 — kanonischer Feld-Typ + immer-weiche Prüfung + KI-Formatvorschlag als USP (MED-D-146, 0.78.50.79.0, MINOR): Nutzer „Was können wir als Nächstes bauen (ohne docusign Integration)" → drei Kandidaten vorgelegt (OP-DOCGEN-2/MED-OP-AUFTRAG-1/MED-OP-VALID-1) mit Empfehlung OP-DOCGEN-2, Nutzer wählte stattdessen MED-OP-VALID-1 und schärfte den Scope in derselben Nachricht: „soll weich sein - Fallback ist, dass auch Freitext akzeptiert wird; optional per LLM validieren und passend zum Datentyp einen Vorschlag machen" — danach „Dieses smarte Vorschlagen als USP festhalten". Vor dem Bauen ein Explore-Agent recherchieren lassen statt sofort neuen Code zu schreiben: deckte auf, dass die Bausteine bereits verstreut im Repo existierten — stammdaten-uebernahme.ts trug ValidierungsArt/pruefeWert/normalisiereWert (dort schon "weich", gueltig explizit nur ein Flag); iban.tss eigene Kopfzeile nannte sich "erster konkreter Baustein von MED-OP-VALID-1"; dentmarking-katalog.ts hatte mit Wertebereich/bereichsHinweis() dasselbe Nie-blockierend-Prinzip für Dentmarking; ausfuellformular.tss FeldArt-Kommentar sagte selbst "Validierung bleibt tolerant (G-3)". Statt eines neuen, konkurrierenden Validierungs-Mechanismus (hätte G-8/G-2 verletzt) wurden diese drei Bausteine zusammengeführt: ValidierungsArt/pruefeWert/normalisiereWert in einen neuen kanonischen domain/feld-typ.ts extrahiert (in stammdaten-uebernahme.ts re-exportiert — bestehende Importe/Tests unverändert lauffähig, verifiziert per vollem Testlauf vor und nach der Extraktion) + um plz/tel/zahl/betrag erweitert (bisher nur iban/datum/text/email); neue Funktion formatVorschlag() liefert deterministische Formatkorrekturen (DE-Datum→ISO, IBAN-Normalform, PLZ/Tel-Ziffernbereinigung) oder null, wenn nichts sicher ableitbar ist. ausfuellformular.tss FeldArt wurde ein Alias von ValidierungsArt (unschädliche Erweiterung, die bisherigen 4 Werte sind eine Teilmenge) + neue reine pruefeAlleWerte(). Neuer Fake-first KI-Vorschlag-Seam ki/vorschlag.ts (Interface KiFeldVorschlag + DTOs VorschlagAnfrage/VorschlagErgebnis) + ki/regel-vorschlag.ts (RegelVorschlag) — exakt dieselbe Struktur wie ki/pruefer.ts/ki/regel.ts und ki/gespraechs-auswerter.ts (RISK-14-Haftungshinweis Pflichtfeld im hinweis, dormant-tauglich für ein echtes LLM später, OP-AI-1); in AppDeps/createApp verdrahtet (kiFeldVorschlag, Default RegelVorschlag, analog kiPruefer/kiAuswerter) und in AusfuellformularService.kontext() verbraucht → liefert neu hinweise/vorschlaege je Feld, nie automatisch übernommen. Ein eigener Test deckte während der Umsetzung einen echten Design-Fehler auf: der erste Entwurf berechnete den Formatvorschlag nur für Felder MIT Hinweis — ein Test mit einem DE-formatierten Datum (laut pruefeWert bereits gültig, aber nicht kanonisch) schlug fehl, weil kein Hinweis vorlag und der Vorschlag deshalb nie berechnet wurde; korrigiert auf "Vorschlag für jedes ausgefüllte Feld berechnen", formatVorschlag/schlageVor entscheiden selbst per null-Rückgabe, wann sich das lohnt — derselbe Vorher/Nachher-Testreflex wie bei den D1-Atomizitäts-Fixes in MED-D-143. Bewusst nicht in diesem Slice: Angular-Client-UI für hinweise/vorschlaege (Fähigkeit ist API-seitig fertig, Anzeige folgt als Slice 2), Onboarding-Stammdaten/Dentmarking-Fragebogen an denselben kanonischen Typ angleichen (Slice 2), Adressvalidierung Teil (b) bleibt unverändert offen (Provider-Entscheidung + Compliance-Klärung). Als Produkt-USP festgehalten (Nutzeranweisung): neue Zeile in docs/produkt/Produkt-und-Marketing.md (Nutzenversprechen-Tabelle) + docs/produkt/Management-Summary.md §5 (Roadmap-Tabelle). +18 Vitest (feld-typ.test.ts 13 neue, regel-vorschlag.test.ts 3 neue, ausfuellformular.test.ts +2: pruefeAlleWerte-Weichheit + kontext()-Hinweise/Vorschläge inkl. des Gültig-aber-nicht-kanonisch-Falls), 446→464 Vitest, tsc --noEmit + ng build grün (nur der vorbestehende, unbezogene NG8102-Hinweis), Doku-Konsistenz-Check grün. Version-Stamps einzeln auf 0.79.0/464 geprüft (historische 0.78.x-Referenzen in Decision-Log/CHANGELOG/Timesheet-Log-Einträgen bewusst NICHT mitgezogen). Doku: Decision-Log MED-D-146, HANDOFF §2/§4, CHANGELOG, Feature-Liste, Test-Übersicht, version.ts/CLAUDE/README/Lastenheft/MVP-Scope/Sanity-Checkliste/Management-Summary. Anlass: Nutzer „Was können wir als Nächstes bauen (ohne docusign Integration)" → Empfehlung → Nutzer wählte MED-OP-VALID-1 + schärfte Scope → „Dieses smarte Vorschlagen als USP festhalten". | | MED-2026-07-18-app-ux-process-review-44 | 2026-07-18 | 12:10 | 12:50 | 0.67 | Anführungszeichen repo-weit vereinheitlicht + CodeRabbit angewiesen (MED-D-145, keine Versionsänderung): Nutzer „can we just use straight quotation marks always and instruct coderabbit to be happy about it?" — Root-Cause-Analyse statt sofortigem Umbau: Zählung über alle 44 .md-Dateien zeigte einen echten Stilbruch (1686× „…" öffnend-typografisch/schließend-gerade gemischt mit 135× korrektem „…" + vereinzelten ‚‘’”«») — plausible Ursache für CodeRabbits wiederkehrende Typografie-Nitpicks (u. a. der zuvor beobachtete UNPAIRED_BRACKETS-Hinweis). Vor der Umsetzung Scope-Rückfrage per AskUserQuestion (Doku vs. auch App-Code): Grep zeigte 93 zusätzliche Client-/Server-Dateien mit denselben Zeichen (UI-Labels, Fehlermeldungen, PDF-Vorlagen, ~30 Tests mit exakten String-Assertions) — andere Risikoklasse (Produkttext/UX statt reine Formatierung), Nutzer bestätigte „docs only". Umsetzung: Python-Zeichen-Mapping (/"/"", /'/'') über 43 betroffene .md-Dateien, verifiziert per Vorher/Nachher-Zeichen-Zählung (Zielzeichen auf 0) + git diff --stat (850/850 Zeilen reine Ersetzung, keine Zeilenänderung); die ‹Variable›/»…«-Platzhalter-Notation in Dentmarking-Excel-Logik.md (Excel-Formel-Konvention) bewusst nicht angefasst — vorab per Kontext-Grep als eigene Kategorie erkannt. Mermaid-Diagramme nicht nur gelesen, sondern gegen den echten Validator geprüft (analog node:sqlite-Präzedenzfall MED-D-143): dabei einen vorbestehenden, von der Anführungszeichen-Änderung unabhängigen Syntaxfehler in Dentmarking.md gefunden — Flowchart-Knoten F[Word "Auffälligkeiten"<br/>manuell] enthielt ein unescapetes Anführungszeichen in einem ungeklammerten Label; per Validator bestätigt, dass auch die ursprüngliche „…"-Schreibweise bereits ungültig war (kein durch diesen PR eingeführter Regressionsfehler) — auf ["Word #quot;Auffälligkeiten#quot;<br/>manuell"] korrigiert, jetzt grün; die beiden Sequenzdiagramme (Dokumentenverwaltung-NextCloud.md/Unterschriften.md) einzeln geprüft, dort unproblematisch (Anführungszeichen in Nachrichtentext, keine Klammer-Delimiter). Konvention einmalig verankert: neuer Absatz agents.md §2 „Anführungszeichen: immer gerade" (Regel + Begründung + Ausnahme). .coderabbit.yaml bekommt neuen reviews.path_instructions-Eintrag für **/*.md, der CodeRabbit explizit anweist, gerade Anführungszeichen nicht als typografisch inkonsistent/unpaired zu markieren — YAML-Syntax vorab per python3 -c "import yaml" validiert. Kein Code-/Schema-Change; APP_VERSION unverändert 0.78.5, 446 Vitest + tsc + ng build unverändert grün, Doku-Konsistenz-Check grün. Doku: Decision-Log MED-D-145, HANDOFF §2, CHANGELOG. Anlass: Nutzer „can we just use straight quotation marks always and instruct coderabbit to be happy about it?" → Scope-Rückfrage → „Straight-quotes change — docs only". | | MED-2026-07-16-app-ux-process-review-43 | 2026-07-16 | 08:40 | 09:00 | 0.33 | CodeRabbit-Nachlese zu MED-D-143 (MED-D-144, keine Versionsänderung): PR #185 mergte per Auto-Merge, bevor die zweite Review-Runde (3 Kommentare + 1 Nitpick) vollständig geprüft war — alle 4 einzeln verifiziert statt pauschal übernommen/verworfen. Echt, behoben (2): docs/fachlich/Feature-Liste.md fehlte, anders als docs/betrieb/Test-Uebersicht.md (bereits über Lesepfade.md Zeile 44 im DevOps-Pfad geroutet), in jedem der 7 Lesepfade — per grep bestätigt, kein Treffer irgendwo. Fix passend zur "eine Definition, ein Ort"-Governance (agents.md §5.4/MED-D-110): nicht eine Zielgruppen-Zeile direkt in Feature-Liste.md einbauen (zweite, redundante Definition derselben Zuordnung), sondern die Datei als Schritt 2 im bestehenden "Business/Management"-Lesepfad ergänzt (Kernfrage "was ist tatsächlich gebaut" passt exakt). CodeRabbits Decision-Log-Nitpick verlangte einen benannten MED-OP-/RISK-n-Folgepunkt für die in MED-D-143 nur im Fließtext erwähnte D1-/SQLite-Testharness-Lücke — neue Zeile MED-OP-TEST-1 in HANDOFF.md §4 angelegt (Beschreibung + naheliegende Lösung: node:sqlite, Node-Built-in, als zweiter Vitest-Testkreis für d1-repo.ts), MED-D-143s Fließtext-Verweis nachträglich auf die neue ID umgestellt. Geprüft, bewusst NICHT übernommen (2): CHANGELOG-Zeile auf [PR #185](link)-Format statt Branch-Name umstellen — das Branch-Name-Format ist die über das gesamte File etablierte Konvention für Einträge, die im selben Commit wie die PR-Erstellung entstehen (PR-Nummer zum Commit-Zeitpunkt unbekannt); ein Einzelfall-Fix hätte nur diese eine Zeile inkonsistent zum Rest der Datei gemacht. Test-Uebersicht.md-Intro um einen benannten Zielgruppen-Satz erweitern — bereits über Lesepfade.md kanonisch geroutet, eine Inline-Zweitnennung verletzt dieselbe "eine Definition, ein Ort"-Regel, die der Feature-Liste-Fix gerade umsetzt. Kein Code-/Schema-Change; nur docs/zielgruppen/Lesepfade.md + HANDOFF.md §2/§4 + docs/betrieb/Decision-Log.md + CHANGELOG.md; APP_VERSION unverändert 0.78.5, 446 Vitest + tsc + ng build unverändert grün, Doku-Konsistenz-Check grün. Anlass: automatisch eingehende CodeRabbit-Review-Events nach Merge von PR #185. | | MED-2026-07-16-app-ux-process-review-42 | 2026-07-16 | 07:56 | 08:35 | 0.65 | CodeRabbit-Nachlese zu MED-D-142 (MED-D-143, 0.78.40.78.5, PATCH): PR #181 mergte (Auto-Merge scharf), bevor CodeRabbits Review fertig war (Draft-Skip-Timing, analog MED-D-131) — 9 Kommentare eingetroffen, jeden einzeln gegen den bereits gemergten Code verifiziert statt pauschal übernommen oder ignoriert. Echt, behoben (5): app.ts-Guard fiel bei aufgelöster mandantId aber fehlendem Mandanten-Datensatz fail-open statt fail-closed durch (inkonsistent zu Chokepoint B) — korrigiert; d1-repo.ts/memory-repo.ts prüften quelleRef auf Truthy statt Nullish (leerer String hätte die Dublettenprüfung umgangen) — auf !== null/!== undefined umgestellt; memory-repo.tss Check-dann-Insert lief über ein await (Microtask-Yield) und war unter echter Nebenläufigkeit racy — auf synchronen Inline-Lookup umgestellt, damit die ganze Methode ohne Zwischen-await läuft (echte Atomizität im Single-Thread-Sinn); der zugehörige Test lief bislang sequenziell und hätte diesen Race nie aufgedeckt — auf Promise.all umgestellt, ohne anzunehmen wer "gewinnt"; Migration v39 (CREATE UNIQUE INDEX) hätte bei bereits vorhandenen Alt-Dubletten (durchaus plausibel aus der Zeit vor dem Fix) mit Fehler abgebrochen — auf einer live produktiven D1-DB ein echtes Deployment-Risiko (Worker bliebe bei jedem Start auf Schema-Version 38 hängen); Reconciliation-UPDATE davor ergänzt (behält je Dublette die älteste Zeile per kleinster ULID, kein DELETE, G-4-sicher, idempotent) — gegen echtes node:sqlite verifiziert (nicht nur gelesen): synthetische Alt-Dubletten geseedet, Migration ausgeführt, Dedup+Index-Aufbau+Idempotenz+künftige Ablehnung neuer Duplikate alle bestätigt; Management-Summary hatte einen übersehenen 442-Rest in der Qualitätssicherungs-Zeile, nachgezogen. Geprüft, bewusst NICHT übernommen (4): CLAUDE.md-§Versionierung weiter kürzen (widerspräche der gerade erst in MED-D-140 getroffenen Nutzerentscheidung); Decision-Log-Zeile ans strikte Dateiende verschieben (die Kopfzeile des Logs sagt selbst "analog CHANGELOG.md", und CHANGELOG ist explizit "neueste zuerst" — MED-D-143 folgt bewusst demselben Muster wie 139–142); Feature-Liste um granulare Detail-Zeilen erweitern (stattdessen die bestehende RBAC-Zeile minimal ergänzt, passend zur Datei-Konvention); eine D1-/SQLite-Migrationstest-Infrastruktur neu aufbauen (Repo hat aktuell keinerlei D1-Testharness, alle 446 Tests laufen gegen MemoryRepo — eigene, größere Design-Entscheidung, nicht Teil dieses Fixes; die manuelle node:sqlite-Verifikation deckt den konkreten Fall stattdessen einmalig ab). 446 Vitest (gleiche Zahl, ein Test verschärft), tsc --noEmit + ng build unverändert grün, Doku-Konsistenz-Check grün. Version-Stamps einzeln auf 0.78.5/446 geprüft (Feature-Liste.md-Zeile-100-Historienspanne 0.46.0 → 0.78.4 bewusst nicht mitgezogen — beschreibt, wann dieses Feature zuletzt erweitert wurde, nicht den globalen Ist-Stand). Doku: Decision-Log MED-D-143, HANDOFF §2, CHANGELOG, Test-Übersicht, Feature-Liste, Management-Summary, version.ts/CLAUDE. Anlass: automatisch eingehende CodeRabbit-Review-Events nach Merge. | | MED-2026-07-15-app-ux-process-review-41 | 2026-07-15 | 09:00 | 10:35 | 1.58 | MED-OP-AUTH-2 + MED-OP-WV-2 gehärtet (MED-D-142, 0.78.30.78.4, PATCH): Nutzerfrage "Wie können wir Mandant-Scope-Sicherheitslücke, fehlender DB-Unique-Constraint angehen" — Code-Recherche (nicht raten): mandantScopeGuard/darfSehen/darfMandantSehen in service.ts/app.ts/rechte.ts gelesen, dann die drei Lücken-Routen (meetings/:id*, beratungsdoku/:id*, individualdokumente/:id*) und den Wiedervorlagen-Dedup-Pfad (getWiedervorlageByQuelle/createWiedervorlage über alle Erzeuger: playbook/formular/aufgabe/dentmarking) durchsucht. Plan vorgelegt inkl. einer bewussten Abweichung von der HANDOFF-Notiz (Single-Column-Unique-Index auf quelle_ref statt Composite (quelle, quelle_ref), da der App-Level-Lookup quelle ohnehin ignoriert) — Nutzer fragte "erkläre Duplicate-Key-Handling" nach, ausführliche Erklärung (Race-Szenario, ohne/mit Handling, D1-Fehlertext-Erkennung ohne typisierten Fehler, Aufwands-/Risiko-Abwägung) gegeben, dann Nutzer "trotzdem mit handling; beide OPs in einem PR umsetzen". Umsetzung: byIdMandantScopeGuard-Factory in app.ts (Entität→mandantIdservice.darfSehen, 404 bei nicht sichtbar/kein Existenz-Leak, 403 bei Mutation ohne mandant_bearbeiten, next() bei nicht auflösbarer Entität — Handler behält seine eigene Nicht-gefunden-Meldung) auf Meetings/Beratungsdoku/Individualdokumente angewandt (6 neue app.use-Mounts). Migration v39 (CREATE UNIQUE INDEX … ON wiedervorlage (quelle_ref)) + istUniqueConstraintFehler-Helfer + Catch-Block in d1-repo.tss createWiedervorlage (liefert bei Constraint-Verletzung die vorhandene Zeile statt zu werfen) + spiegelndes Check-vor-Insert in memory-repo.ts (keine echte DB-Exception dort, aber gleiches Ergebnis für Tests). 4 neue Tests (3× rbac.test.ts für die drei Entitäten, 1× wiedervorlage.test.ts für die Race-Simulation) — jeder einzeln vor dem finalen Commit gegen den ungefixten Stand verifiziert: Guard-Mounts per Python-Skript temporär aus app.ts entfernt → alle 3 RBAC-Tests schlagen exakt mit "200 statt 404" fehl (der reale IDOR); Memory-Repo-Fix temporär zurückgesetzt → der Idempotenz-Test schlägt mit unterschiedlichen IDs fehl (die reale Dublette) — dann beide Fixes wiederhergestellt, alle 446 Tests grün. tsc --noEmit + ng build grün (nur ein vorbestehender, unbezogener NG8102-Hinweis). Version-Stamps (README/CLAUDE/HANDOFF/Lastenheft/Feature-Liste/MVP-Scope/Management-Summary ×4/Sanity-Checkliste/Test-Übersicht) einzeln auf 0.78.4/446 geprüft — die beiden historischen 0.78.3-Referenzen in HANDOFF §4 (MED-OP-REVIEW-1-Zeile, Doku-Welle-4-Punkt) bewusst NICHT mitgezogen (beschreiben vergangene Versionssprünge). Doku: Decision-Log MED-D-142, HANDOFF §2/§4, CHANGELOG, Test-Übersicht (+4 Zeilen-Updates), version.ts/CLAUDE. Anlass: Nutzer "Wie können wir ... angehen" → Plan → "erkläre Duplicate-Key-Handling" → "trotzdem mit handling; beide OPs in einem PR umsetzen". | | MED-2026-07-15-app-ux-process-review-40 | 2026-07-15 | 00:50 | 01:10 | 0.33 | HANDOFF-Restzeile bereinigt + Check-Blind-Spot geschlossen (MED-D-141, keine Versionsänderung): Nutzerfrage "In welchen Kategorien liegen die offenen OP?" — beim Kategorisieren aller offenen OP-/MED-OP--Punkte (Lastenheft §11 + HANDOFF §4) über 10 thematische Buckets (Integrationen/Recht+Compliance/Formulare/Mandanten-Verwaltung/Spezial-Tools/KI/HR/Deploy/UX-Politur/Way-of-Working) gefunden: MED-OP-DOKU-3 stand zweimal in HANDOFF §4 — eine noch offene Zeile (Merge-Rückstand) neben der längst archivierten (, MED-D-113) Zeile mit vollem Umsetzungs-Detail. Proaktiv gemeldet, Nutzer bestätigte "Ja". Offene Zeile entfernt. Root-Cause statt nur Symptom: check-doc-consistency.sh §6 vergleicht nur aktive Zeilen gegeneinander (uniq -d) und übersieht den Fall "aktiv UND bereits archiviert" — neuer Check 6b schließt diese Lücke (Schnittmenge aktiv×archiviert-IDs). Beim ersten Entwurf sofort einen echten False Positive selbst entdeckt: OP-LEAD-1 ist ebenfalls aktiv + archiviert gelistet, aber die archivierte Zeile ist bewusst erhaltener (Original)-Kontext (kein Bold, expliziter Zusatz), kein echtes Duplikat — Regex daraufhin verschärft auf das kanonische ~~**ID**~~-Bold-Muster, schließt solche Kontext-Zeilen korrekt aus. Verifiziert per synthetischem Vorher/Nachher-Test (künstliche Dublette eingefügt → erkannt; entfernt → grün) + Bestätigung, dass OP-LEAD-1 danach keinen Fehlalarm mehr auslöst — derselbe Vorsichts-Reflex wie beim sed-Kollateralschaden in MED-D-133/134 (ungetesteten Regex-Fix nicht blind vertrauen). Nur HANDOFF.md (1 Zeile) + check-doc-consistency.sh (neuer Check), kein Code-/Schema-Change; APP_VERSION unverändert 0.78.3, Doku-Konsistenz-Check grün (0 Hinweise). Anlass: Nutzer "In welchen Kategorien..." → Hinweis auf die Dublette → "Ja". | | MED-2026-07-14-app-ux-process-review-39 | 2026-07-14 | 22:52 | 23:20 | 0.47 | CLAUDE.md §Versionierung restrukturiert (MED-D-140, keine Versionsänderung): Nutzer "Claude §versionierung" — die seit MED-D-131 offene, damals dem Nutzer vorgelegte CodeRabbit-Frage erneut per AskUserQuestion zur Entscheidung gestellt: laufend wachsenden Absatz behalten oder auf Ist-Stand kürzen. Nutzer wählte die empfohlene Option "Trim to current-state only". Der ~28-zeilige §Versionierung-Absatz (Slice-für-Slice-/MED-D-für-MED-D-Aufzählung seit 0.72.0, trotz eigenem "keine Log-Kopie"-Disclaimer faktisch eine wachsende dritte Kopie derselben Fakten) auf 6 Zeilen gekürzt: Version + 1–2 Sätze Ist-Stand (Module R1–R13, Beratungsaufträge, Dentmarking, live in Produktion) + 1.0.0-Bedingung + expliziter Verweis "Historie → CHANGELOG.md · Feature-Stand → Feature-Liste.md · Detail → HANDOFF.md §2/§4/§5". Kein Informationsverlust geprüft — jede ausgelagerte Aussage stand bereits redundant in den Zieldateien. HANDOFF.md §2 (Aktueller-Stand-Absatz), §4 (MED-OP-DOKU-6-/MED-OP-REVIEW-1-Zeilen), §5 (Punkt 1 + neuer Punkt 3, Folgepunkte umnummeriert) entsprechend nachgezogen — die dort verbliebenen "offene Nutzer-Entscheidung"-Verweise als erledigt markiert statt gelöscht. check-doc-consistency.sh erneut grün (Stand-Stempel 0.78.3 unverändert). Kein Code-/Schema-Change; 442 Vitest + tsc + ng build unverändert grün. Anlass: Nutzer "Claude §versionierung". | | MED-2026-07-14-app-ux-process-review-38 | 2026-07-14 | 18:15 | 18:40 | 0.42 | Decision-Log-ID-Kollisionen bereinigt (MED-D-139, keine Versionsänderung): Nutzer fragte "What is MED-D-131?" — Antwort ergab, dass MED-D-131 im Log doppelt vergeben war (CodeRabbit-Nachlese 07-14 vs. Runner-Label-Umbenennung 07-13); proaktiv gemeldet, Nutzer bestätigte "Yes" (Fix jetzt statt im nächsten Doku-PR). Systematische Prüfung per grep auf alle Zeilen-Start-Muster ^| **MED-D-13[0-9]** | fand drei weitere identische Kollisionen: MED-D-130 (Architektur-Uebersicht/SBOM vs. World-2-Rollout Schritt 3), MED-D-132 (Runner-Revert vs. Doku-Review-Re-Audit), MED-D-133 (checkout clean:false vs. Doku-Welle 4a+4b) — alle vier Kollisionen entstanden zwischen demselben CI/Infra-Vereinheitlichungs-Batch (07-13, repo-übergreifend mit sera/taktano/Template geteilt) und der UX-Welle-8/Doku-Welle-4-Serie (07-14), die unabhängig voneinander fortlaufend nummeriert wurden. Vor der Korrektur grep-Referenz-Zählung außerhalb des Decision-Log für alle 4 IDs: die vier CI-Infra-Einträge hatten je nur eine Fundstelle (CHANGELOG.md), die vier Doku-/UX-Welle-Einträge Dutzende (HANDOFF.md mehrfach inkl. §2/§4/§5, Timesheet.md, CLAUDE.md-Versionierungs-Absatz, agents.md, UX-Prozess-Review-2026-07.md) — Entscheidung: CI-Infra-Paar umnummeriert (130135, 131136, 132137, 133138), Doku-/UX-Welle-Nummern unverändert gelassen, um die breiter zitierte Serie nicht anzufassen. Decision-Log.md: 4 Zeilen-Relabel + Cross-Referenzen (revertiert MED-D-131136, Umnummeriert von …-Notizen) korrigiert + neuer MED-D-139-Eintrag mit vollem Vorher/Nachher. CHANGELOG.md: 4 betroffene Zeilen nachgezogen + neuer Eintrag für diesen Fix selbst. HANDOFF.md §5: neuer Punkt 2, nachfolgende Punkte umnummeriert. Keine Versionsänderung (reine Buchführungs-Korrektur ohne Code-/Schema-/Feature-Bezug, analog MED-D-107/132); APP_VERSION unverändert 0.78.3. Kein Code-/Schema-Change; 442 Vitest + tsc + ng build unverändert grün. Anlass: Nutzer "What is MED-D-131?" → "Yes". | | MED-2026-07-14-app-ux-process-review-37 | 2026-07-14 | 17:05 | 18:10 | 1.08 | Doku-Welle 4c+4d — Governance-Aktualität + Handwerk-Restschulden (MED-D-134, MED-OP-DOKU-6, 0.78.20.78.3, PATCH): Nutzer "Next" nach MED-D-133 — Fortsetzung mit dem verbliebenen Maßnahmenplan aus MED-D-132, unter bewusstem Ausschluss der CLAUDE.md-§Versionierung-Restrukturierung (offene Nutzer-Entscheidung, nicht eigenmächtig entschieden). Governance-Docs echt neu geprüft statt nur gestempelt: Risikoregister.md — alle 28 Zeilen einzeln gegen den aktuellen Code-/Doku-Stand gelesen, "Letzte Prüfung" auf heute gebracht; Compliance.md-Tracker (9 Zeilen) gegengelesen, Kopf-Stempel korrigiert (widersprach dem bereits aktuellen Inhalt). Weltmodell-Data-Dictionary um Beratungsauftrag als G-8-Entität ergänzt. agents.md §3 (die laut §5.4-Governance-Tabelle kanonische ID-System-Quelle) um D-n/RISK-n/KB-n ergänzt — bemerkenswerter Fund: die als maßgeblich deklarierte Quelle war unvollständiger als eine bloße "Kurzform"-Ableitung (Entwicklungsansatz.md), die diese drei Präfixe schon führte; zusätzlich agents.md toten "Letztes Update"-Stempel repariert. docs/README.md-Index um Architektur-Uebersicht.md ergänzt (fehlte trotz CLAUDE.md-"verbindlich"-Markierung) + "Geldanlage"→"Kapitalanlage" korrigiert; Lesepfade.md routet jetzt Beratungsaufträge.md in IT-Architektur UND Customer Service (True-North-Frage 1 wird inzwischen je Auftrag beantwortet, nicht nur je Person) sowie Architektur-Uebersicht.md in IT-Architektur. Dexman.md pyramidal umsortiert (Zweck/Leitfragen vor Wettbewerbsanalyse, keine internen Querverweise betroffen). Zwei Sequenzdiagramme (Unterschriften.md, Dokumentenverwaltung-NextCloud.md) von "NextCloud" auf "Ablage (R2/NextCloud)" korrigiert — bewusst NICHT das ER-Diagramm-Feld nextcloud_ref angefasst, da der Feldname im aktuellen Server-Schema nicht verifiziert werden konnte (kein unbelegter Code-Claim in der Doku). HANDOFF OP-DEX-Nummerierung vereinheitlicht (1..5 war veraltetes Shorthand). Entwicklungsansatz.md bekommt einen expliziten "Detail: agents.md §7"-Verweis für den Draft-PR-Workflow, Kurzfassung selbst bewusst nicht gekürzt (dient als eigenständige lesbare Übersicht). Beim Stand-Stempel-Sync erneut zwei historische Referenzen (MED-D-133s echte 0.78.1→0.78.2-Angabe, an drei Stellen in HANDOFF) vor dem Commit korrigiert, die ein zu breiter sed-Lauf sonst fälschlich auf 0.78.3 mitgezogen hätte — derselbe Fehlertyp wie beim letzten Mal, diesmal proaktiv sofort nachgeprüft statt erst im Review gefunden. Mit diesem PR sind alle 32 Befunde (B1–B32) aus dem MED-D-132-Re-Audit bearbeitet, bis auf die eine bewusst offene CLAUDE.md-Frage. Kein Code-/Schema-Change; 442 Vitest + tsc + ng build unverändert grün, Doku-Konsistenz-Check grün. Anlass: Nutzer "Next". | | MED-2026-07-14-app-ux-process-review-36 | 2026-07-14 | 12:05 | 13:00 | 0.92 | Doku-Welle 4a+4b — Wahrheit wiederhergestellt + Check-Lücke geschlossen (MED-D-133, MED-OP-DOKU-5 Kern, 0.78.10.78.2, PATCH): Nutzer antwortete "4a + 4b" auf den in MED-D-132 vorgelegten Maßnahmenplan. README/MVP-Scope von 0.67.0/419-Tests auf 0.78.2/442-Tests + Beratungsaufträge/World-2/UX-Wellen 6-8 nachgetragen. Wichtigster Einzelfix: Lastenheft.md (fachliche Master-Spezifikation) bekam einen neuen §5.1a-Abschnitt "Beratungsaufträge — 3-Ebenen-Modell" (vorher komplett unerwähnt) — dabei den Phantom-"Ablage"-Fehler direkt an der Quelle behoben, indem das dortige 7-Zustands-stateDiagram-v2 durch die in Prozessmodell.md/System-Charakter.md bereits etablierte, korrekte 6-Zustands-Version ersetzt wurde (Ablage = quer-liegende Achse, kein eigener Zustand); denselben Fehler auch in CLAUDE.md eigener "Standard-Prozess"-Zeile behoben. Deploy.md korrigiert ("der erste echte Deploy steht aus" → "live in Produktion", widersprach seit Wochen der Realität). Management-Summary: Ablage-Zeile Platzhalter→R2-produktiv, 4 Standard-Bausteine in die Leitprinzipien-Tabelle ergänzt (fehlten komplett, obwohl Entwicklungsansatz.md sie schon führte). Für 4b: check-doc-consistency.sh §8-Regex von reinem "Stand"-Match auf "Stand|Status" erweitert (README/MVP-Scope nutzten "Status", der alte Regex sah es nie) + Lastenheft.md zur geprüften Dateiliste hinzugefügt; Fix mit einem synthetischen Vorher/Nachher-Test verifiziert statt blind vertraut. Beim breiten sed-Stand-Stempel-Sync selbst zwei Kollateralschäden gefunden und vor dem Commit korrigiert: eine historische MED-D-131-Versionsangabe und der MED-D-132-Audit-Bezugspunkt wären fälschlich auf 0.78.2 mitgezogen worden — genau die Art unbeaufsichtigter Automatisierung, die B18 als Wurzelursache der wiederkehrenden Doku-Drift benennt, hier in Miniatur selbst beobachtet und sofort gegengeprüft statt dem sed-Ergebnis blind zu vertrauen. Bewusst offen (4c/4d → neu MED-OP-DOKU-6): Governance-Aktualität (Compliance/Risikoregister-Stempel), Weltmodell-Data-Dictionary/agents.md-ID-System/docs-README-Index/Lesepfade, Handwerk-Restschulden (Dexman-Pyramidal, zwei Vor-R2-Diagramme, agents.md-Stempel, CLAUDE.md-§Versionierung — letzteres hängt an der noch offenen MED-D-131-Nutzerfrage). Kein Code-/Schema-Change; 442 Vitest + tsc + ng build unverändert grün, Doku-Konsistenz-Check grün (getestet: erkennt jetzt "Stand" und "Status"). Anlass: Nutzer "4a + 4b". | | MED-2026-07-14-app-ux-process-review-35 | 2026-07-14 | 10:40 | 12:00 | 1.33 | Doku-Review aufgefrischt v0.65.0 → v0.78.1 (MED-D-132, MED-OP-REVIEW-1/MED-OP-DOKU-5, keine Versionsänderung): Nutzer wählte "1" aus einem vorgeschlagenen Optionen-Set (Doku-Review-Audit auffrischen · CLAUDE.md-Restrukturierungsfrage · Weg zu 1.0.0 · Cockpit-Inline-Styles/Dexman). Der letzte Doku-Audit-Bezugspunkt (v0.65.0) war 13 Minor-Versionen alt, per agents.md §6.7 formal veraltet. Statt die HANDOFF-Behauptung "alle Doku-Wellen umgesetzt" ungeprüft zu übernehmen, 5 parallele Recherche-Agenten gestartet: (1) Verifikation aller 19 Alt-Befunde B1-B19 gegen den aktuellen Stand (Datei:Zeile-Belege), (2) Stand-Stempel-Sweep über alle ~40 docs/-Dateien + Root-Docs, (3) Cross-Doc-Konsistenz der Leitprinzipien G-1..G-8/ID-System/Session-Start-Reihenfolge, (4) Doku-Abdeckung der größten neuen Features seit v0.65.0 (Beratungsaufträge-3-Ebenen-Modell MED-D-95, World-2-Rollout), (5) Zielgruppen-/Pyramidal-/Diagramm-Stichprobe. Ergebnis: 10 von 19 Alt-Befunden echt gelöst — aber die Wurzelursache des letzten Audits (B18: schnelle Logs bleiben aktuell, langsame Rahmen-Docs veralten) ist bereits zurückgekehrt, diesmal schwerer: README/MVP-Scope erneut 11 Minor-Versionen veraltet (Rückfall von B2/B3); Lastenheft.md — die fachliche Master-Spezifikation — wurde nie für Beratungsaufträge nachgezogen und trägt am eigenen Quell-Dokument noch den exakten Phantom-"Ablage"-Fehler, der in den zwei abgeleiteten Docs (Prozessmodell/System-Charakter) bereits behoben wurde (schwerster Einzelfund — die Reparatur erreichte nie die zitierte Quelle, derselbe Fehler auch in CLAUDE.md selbst); Deploy.md widerspricht der Produktionsrealität. Wichtigster struktureller Fund: der mechanische Check selbst hat einen blinden Fleck, der die README/MVP-Scope-Staleness verdeckt (§8-Regex matcht nur "Stand" nicht "Status", Lastenheft.md fehlt in der Dateiliste) — erklärt, warum der Rückfall unbemerkt blieb. 9 weitere neue Befunde (B24-B32): Management-Summary/Weltmodell-Data-Dictionary/agents.md-ID-System/docs-README-Index/Lesepfade/Compliance-Risikoregister-Aktualität. docs/betrieb/Doku-Review-2026-07.md komplett neu geschrieben (Kernaussage, Bewertungstabelle, Befunde P1-P4, Maßnahmenplan "Doku-Welle 4"/MED-OP-DOKU-5 in 4 Teilwellen). Bewusst als reiner Audit ohne Versionsbump behandelt, analog MED-D-107 (App-Audit-Auffrischung) — die eigentlichen Fixes sind separate künftige PRs. HANDOFF §2/§4 (neue MED-OP-DOKU-5-Zeile)/§5 gepflegt. Kein Code-/Schema-Change; 442 Vitest + tsc + ng build unverändert grün, Doku-Konsistenz-Check grün. Anlass: Nutzer "1" nach Vorschlag mehrerer nächster Schritte. | | MED-2026-07-14-app-ux-process-review-34 | 2026-07-14 | 10:20 | 10:35 | 0.25 | CodeRabbit-Nachlese zu MED-D-130 (MED-D-131, 0.78.00.78.1, PATCH): PR #171 wurde auto-merged, bevor CodeRabbits Review fertig war (Draft→Ready-Timing: CodeRabbit überspringt Drafts, das Review startete erst mit dem Umschalten auf "ready for review" und lief parallel zum bereits aktivierten Auto-Merge — beide Ereignisse trafen praktisch gleichzeitig ein). CodeRabbit meldete danach 3 Befunde auf dem bereits gemergten Code: (1) UX-Prozess-Review-2026-07.md Punkt 17 beschrieb ungenau "bekommen denselben .mw-scope-Wrapper wie Verwaltung/Akte" — korrigiert auf ".mw-scope direkt am bestehenden .md-pub-Root, kein neuer Wrapper wie bei Akte"; (2) Management-Summary.md behauptete pauschal "EU-konform betrieben" — als Compliance-Überclaim erkannt (EU-Residenz ≠ DSGVO/eIDAS-Konformität, solange E-Signatur/E-Mail-Versand Platzhalter bleiben) und auf "live in der EU mit Compliance-by-Design-Kontrollen" + Verweis auf Compliance.md/Risikoregister.md präzisiert — genau der Fall, den CLAUDE.md "Proaktives Flagging" verlangt; (3) CodeRabbit wollte zusätzlich die Release-Historie aus CLAUDE.mds §Versionierung-Absatz in CHANGELOG/HANDOFF/Feature-Liste auslagern — dieser Absatz folgt aber einer über ~10 PRs (MED-D-120…130) etablierten, bewusst gewählten Konvention; eine Restrukturierung ist eine Way-of-Working-Entscheidung mit projektweiter Tragweite, keine lokale Korrektur — dem Nutzer im Chat als offene Frage vorgelegt statt einseitig umgesetzt. Da PR #171 bereits gemergt war, Branch gemäß Merge-Konvention frisch von origin/main neu aufgesetzt (git checkout -B ... origin/main) statt auf den alten Stand aufzusetzen. Reiner Doku-Fix, kein Code-/Schema-Change; ng build + tsc unverändert grün, Doku-Konsistenz-Check grün. Anlass: automatisch eingehende CodeRabbit-Review-Events nach Merge. | | MED-2026-07-14-app-ux-process-review-33 | 2026-07-14 | 06:10 | 07:15 | 1.08 | World-2-Rollout Schritt 3 — die 4 öffentlichen Kundenstrecken auf Cockpit-Tokens (MED-D-130, MED-OP-UX-7, 0.77.00.78.0, MINOR): Direkt im Anschluss an den Merge von PR #169 (Schritt 2) bat der Nutzer um "World-2 token rollout onto the 4 public customer streams" — der zuvor bewusst zurückgestellte letzte Rest des Token-Welten-Teilstrangs von B5. Zuerst Umfangs-Analyse per Explore-Agent: die 4 Strecken (Onboarding/Ausfüll-Formular/Dentmarking-Fragebogen/Lead, alle flach in client/src/app/, keine .html/.css-Splits) plus die gemeinsamen Bausteine pub-bausteine.ts (Marken-Kopf/Fortschritt/Legende/Marker-Chips/Fußzeile) — insgesamt 31 var(--md-*)-Bezüge über 5 Dateien. Wichtiger Fund: diese Seiten haben keine App-Shell (app.component.ts überspringt .md-shell für ihre Routen bewusst, eigene Chrome) — anders als Verwaltung/Akte, die die Shell teilen. Das bedeutete: .md-pub selbst musste direkt background: var(--bg) bekommen, sonst bliebe die alte World-1-Fläche hinter der neu eingefärbten .md-pub-card sichtbar — ein Detail, das in Schritt 1/2 nicht anfiel, weil dort die Shell den Seitenhintergrund schon lieferte. Zweiter Fund: von den 31 Bezügen lagen 21 nicht in Template-Inline-Styles, sondern in component-lokalen styles:-Blöcken (PubFortschrittComponent/PubMarkerChipsComponent in pub-bausteine.ts, plus fragebogen-public.component.tss eigener .md-fb-*-Satz für die Essenziell/Wichtig/Nice-to-have-Badges) — da Angulars ViewEncapsulation.Emulated diese Regeln bereits auf ihre eigene Komponente beschränkt (keine Nutzung anderswo bestätigt per Grep), konnten sie direkt editiert werden statt über .mw-scope-Scoping, kein Leck-Risiko. Umsetzung: mw-scope-Klasse direkt auf das jeweils schon vorhandene .md-pub-Root-Div gesetzt (kein zusätzlicher Wrapper-Div nötig, anders als bei Akte); 3 neue .mw-scope-Regeln in styles.css (.md-pub-card, .md-pub-consent, .md-pub.mw-scope) — die übrigen genutzten geteilten Klassen (button/.primary, input/select, .md-muted/.md-error, h2/h3, label) waren durch Schritt 1/2 bereits vorhanden, keine Dopplung; 10 Template-Inline-Fixes über die 4 Stream-Dateien + 11 component-lokale Direkt-Edits in pub-bausteine.ts/fragebogen-public.component.ts. Marken-Kopf (.md-brand/.md-wordmark*) bewusst unverändert, wie schon in Schritt 1 begründet. ng build grün (ein vorbestehender, unbezogener NG8102-Warnhinweis in akte-auftraege.component.ts ignoriert). Live-Verifikation per Hintergrund-Agent: wrangler dev + echte Test-Datensätze über die Server-API (Mandant+Onboarding-Einladung, Mandant+Ausfüllformular-Vorgang, Mandant+Praxis+Fragebogen-Einladung, Lead ohne Token) statt nur Leerzustände — alle 4 Strecken hell und dunkel gescreenshottet (14 Dateien inkl. 3 Fehlerzustände), keine Konsolenfehler; visuell selbst zwei Screenshots (Onboarding, Fragebogen) gegengeprüft — durchgängig kohärentes World-2-Bild in beiden Themes, Badges/Akzentfarben konsistent, Marken-Kopf unverändert. Ein unabhängiger, nicht migrationsbezogener Kosmetik-Fund notiert, nicht behoben: native ungestylte Checkboxen in lead-public.component.ts (prä-existent). Ergebnis: kein zweifarbiger Übergangszustand mehr irgendwo in der App — Token-Welten-Teilstrang von B5 damit vollständig abgeschlossen; verbleibend nur noch die 132 Einzelwert-Inline-Styles in Cockpit (Spacing-/Typografie-Skala-Entscheidung nötig) und die bewusst divergenten Absende-Button-Texte. 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-130, HANDOFF §2/§4/§5, UX-Review Item 17/18, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "World-2 token rollout onto the 4 public customer streams". | | MED-2026-07-13-app-ux-process-review-32 | 2026-07-13 | 19:45 | 21:20 | 1.58 | World-2-Rollout Schritt 2 — Akte/Mandant-Detail auf Cockpit-Tokens (MED-D-129, MED-OP-UX-7, 0.76.00.77.0, MINOR): Nutzer "Akte/Detail next" nach Vorschlag der offenen B5-Punkte. Zuerst Umfangs-Analyse: 8 Dateien (mandant-detail.component.ts 2228 Zeilen, mandant-akte.component.ts, 6 Register-Unterkomponenten), 73 distinkte --md-*/.md-*-Bezüge — deutlich größer als der Verwaltungs-Pilot (~15). Wichtiger Fund: die 6 Register-Unterkomponenten (akte-auftraege/-dentmarking/-einladungen/-formulare/-meetings/-stammuebernahme) rendern als Kind-Elemente direkt im Template der beiden Wurzel-Komponenten — kein eigener .mw-scope-Wrapper nötig, die CSS-Cascade des globalen Stylesheets greift automatisch über die Komponentengrenze (keine Shadow-DOM-Kapselung bei Angulars ViewEncapsulation.Emulated für externe globale Styles). Reduziert den Datei-Edit-Umfang von 8 auf 2 Dateien (Wrapper) + styles.css. Umsetzung: .mw-scope-Wrapper um beide Wurzel-Templates; 20 neue .mw-scope-gescopete CSS-Regeln für bislang unberührte Muster (KPI-Kacheln, Prozess-Stepper inkl. .done/.active/.warn, Timer-Widget inkl. .pausiert, Verlassen-Modal, Register-Navigation, Schweregrad-Badges, "…"-Menü, Nächste-Schritte-Chips); zusätzlich ~35 direkte Inline-Style-Fixes über alle 8 Dateien (var(--md-border)var(--bd), var(--md-warn)var(--amber), var(--md-ok)var(--green), var(--md-green)var(--accent), var(--md-muted)var(--mut), var(--md-error)var(--red)) — Inline-Styles sind per CSS-Scoping nicht erreichbar (höchste Spezifität), betrifft u. a. KPI-Ring-Farben und den "Verwerfen & verlassen"-Button. Verifiziert per wrangler dev + Playwright: Mandant-Detail + Druck-Akte hell/dunkel gescreenshottet, alle 10 Register-Tabs einzeln durchgeklickt und gescreenshottet (bestätigt: Kind-Komponenten erben die Palette korrekt über die Cascade, inkl. --amber-Warnfarbe in akte-auftraege) — keine Konsolenfehler. Screenshots dem Nutzer vor dem Push vorgelegt (wie bei MED-D-128); ein Stop-Hook (uncommitted changes) forderte danach zum Commit/Push auf, bevor eine explizite Freigabe-Antwort einging — analog zum Vorgehen bei MED-D-128 wurde committed/gepusht, aber Auto-Merge bewusst NICHT aktiviert. Ergebnis: kein zweifarbiger Übergangszustand mehr in der internen App — Shell/Verwaltung/Akte/Mandant-Detail durchgängig World-2. 442 Vitest + tsc + ng build grün, Doku-Konsistenz-Check grün. Nur Client. Doku: Decision-Log MED-D-129, HANDOFF §2/§4/§5, UX-Review §4, CHANGELOG, Feature-Liste/Test-Übersicht-Stand, version.ts/CLAUDE. Anlass: Nutzer "Akte/Detail next". |

Aggregat (KW)

KWSumme (h)Anmerkung
2026-KW26Repo-Init.
2026-KW2736.5Slices 3–13 (UX-Polish, Leistungszeit u. a.) + Dexman-Doku + Dentmarking T1–T5. Reconciled 2026-07-25 (OP-PM-1) aus allen KW27-Session-Zeilen (vorher 22.3, „Stand 04.07"-Teilstand); Sessions ohne Zeitangabe (z. B. 29.06.) nicht mitgezählt.
2026-KW2857.3Viele parallele 06.07-Sessions (Zeiterfassung D-49, MED-Konvention, CodeRabbit-Config, RBAC, NextCloud, Datensparsamkeit) + Beratungsaufträge/UX-Wellen. Reconciled 2026-07-25 (OP-PM-1) aus den Session-Zeilen (löst den „— vorläufig"-Merge-Stau-Platzhalter ab).
2026-KW2929.7Akten-Cockpit-Redesign-Programm (S1–S6), Mandat-Overlay, Audit-Auffrischungen, UX-Welle 10/11. Reconciled 2026-07-25 (OP-PM-1).
2026-KW3082.56Akten-Cockpit-Fidelity + DocuSign-Adapter/Secrets/Webhook, CI-Cache, Akten-Cockpit-Delta A+B+C+D (Vor-Ort→Erhalten/In-Person/Write-back/Prüfen-Schritt/Fremdformular) + App-UX-Welle-9-Rest (Auftrag-Playbook-Fehler sichtbar) + S6-Feinschliff (Motion-Token/Reduced-Motion + Wording-Zentralisierung) + DocuSign-Live-Verifikation-Runbook + Fremdformular-Feldmapping (AD-010 Weg A, Slice 1: AcroForm→Weltmodell-Mapping + Prefill, MED-D-235) + echte Vor-Ort-/In-Person-Signatur (DocuSign embedded, MED-D-236) + DocuSign-E2E/Parser-Härtung + Webhook-Write-back-in-Prod verifiziert (MED-D-238/239) + Akten-Cockpit-Design-System exakt übernommen (MED-D-241) + AD-014 "Über den Link hochgeladen"-Statusliste (MED-D-242) + AD-006 editierbarer Empfänger im Unterschriften-Assistenten (MED-D-243) + Build-Version dauerhaft in der UI (MED-D-245) + Abgelaufene Dokumente abgeleitet (AD-005, MED-D-246) + Formular-Rücklauf-Prüfung live verifiziert (AD-009, MED-D-247) + Weg B Fremd-Formular-Templates live verifiziert (MED-D-250) + CodeRabbit-Nachlese Weg B (MED-D-251) + Cockpit-Fokus entschlackt/Filter/Fakturierung (MED-D-252) + CodeRabbit-Nachlese dazu (MED-D-253) + DocuSign-Live-Fehler sprechend (MED-D-254) + Härtung/Push-Guardrail (MED-D-255) + Eigenformular-Generierung beim Versenden (MED-D-256) + Hausformular-Auto-Routing (MED-D-257) + CodeRabbit-Nachlese eIDAS-Guard (MED-D-258) + Meisterwerk-Audit-Refresh v0.116.1 (MED-D-259) + Selbst-Rollenwahl (MED-D-260) + B41 Feld-Editor-Token-Fix (MED-D-261) + DocuSign-Template-Auswahl+Feld-Anzeige (MED-D-262) + Nachlesen. Reconciled 2026-08-16 (OP-PM-1): die vier 2026-08-02-Sessions (MED-D-263…266, ISO-KW31) sind hier herausgerechnet und in die KW31-Zeile verschoben (2026-07-26 = letzte KW30-Session).
2026-KW312.382026-08-02-Sessions: CodeRabbit-Nachlese #299 stale-Attribut-Fix+Paginierung (MED-D-263) + Runbook Fremdformular-Template + Doku-Welle-7-Teil (MED-D-264) + Runbook-Korrektur Datumsfelder→Text-Tabs (MED-D-265) + Runbook-Präzisierung Rücklauf/„vorbefüllt" (MED-D-266). Abgeschlossen.
2026-KW332.352026-08-16-Sessions (Summe 1.30+0.20+0.85): Mandanten-Liste als aufgeräumter Einstieg (MED-D-267) + A11y-Fix native Buttons (MED-D-268) + Statistiken als eigener Cockpit-Bereich (MED-D-269). Abgeschlossen.
2026-KW347.752026-08-23-Sessions (Summe 0.25+1.00+2.50+0.75+2.50+0.75): CodeRabbit-Nachlese #310 (MED-D-270) + Akte-UX-Aufräumen (MED-D-271/272/273) + Durchlaufender Timer + Segmente + Buchungs-Overlay + Live-Push (MED-D-275) + CodeRabbit-#313-Härtung (MED-D-276) + Merge #313 + Umbenennung Akte→Mandant (MED-D-277, 0.123.0) + CodeRabbit-#314-Forward-Fix + Doku-Prosa-Sweep (MED-D-278, MED-OP-DOCS-2). Laufende Woche — je Session mitgezogen.
2026-KW358.742026-08-27-Sessions (Summe 1.00+0.75+0.33+1.25+1.50+0.58+1.50+1.33+0.50): Portal-Design S0 (MED-D-279) + CodeRabbit-Nachlese #315+#316 (MED-D-280) + Gesprächsprotokoll-Reiter (MED-D-281) + Portal-S1 Fundament (MED-D-282) + Portal-S2 Auth-Routen (MED-D-283) + CodeRabbit-Nachlese #320 (MED-D-283) + Onboarding-Grunddaten-Katalog (MED-D-284) + Onboarding-3-Schritte-Flow (MED-D-285) + Cockpit-Aufräumen (MED-D-286) + Gutachten-hide-when-empty (MED-D-287) + Ablage=NextCloud-Spiegel (MED-D-288). Laufende Woche — je Session mitgezogen.
Gesamt≈ 227.28Summe KW27–KW35 (36.5+57.3+29.7+82.56+2.38+2.35+7.75+8.74; KW26 Repo-Init ohne Zeit; KW32 ohne Session; KW35 laufend). Abgeleitet aus den Session-Zeilen — je Session mit fortgeschrieben.