UX- & Prozess-Review der App (Stand v0.144.1, 2026-09-25)
Zielgruppen: Business/Management (Kernaussage + Maßnahmenplan) · IT-Dev (Befunde mit Datei:Zeile). True North: Prüft, ob die App die drei Leitfragen verständlich, konsistent und intuitiv beantwortet — diese Runde als Wirksamkeits-Kontrolle über 12 Minor-Versionen (v0.116.1 → v0.128.0): halten die geprüften Kern-Muster (Overlay-Shell, Reiter-A11y, Token-Disziplin) nach dem großen „Akte" → „Mandant"- Rename (MED-D-277) und dem durchlaufenden Timer/Push-Umbau, und tragen die seither gebauten neuen Flächen (Onboarding-3-Schritte-Stepper · Ablage-Spiegel + „erwartete Dokumente"-Disclosure · Dentmarking- Gate · Kunden-Self-Service-Portal S1/S2 dormant) denselben Meisterwerk-Anspruch? Methode: Code-Re-Audit gegen die v0.116.1-Befunde (B36–B43) + Neu-Flächen-Sweep (silent-error- Swallowing,
role="alert"-Abdeckung, Touch-Ziele, G-8-Labels vs. rohe Enums, Token-Disziplin, Overflow- Risiko, Theme-Konsistenz), jeweils mit Verdikt + Datei:Zeile. Bezugspunkt & Gültigkeit (MED-D-97): v0.128.0 · Commit(Commit wird beim Merge gestempelt)· 2026-09-12. Löst das v0.116.1-Audit (MED-D-259) ab. Dessen BacklogMED-OP-UX-11(B36–B40) ist überwiegend offen (nur B39 im Zuge des MED-D-277-Renames geschlossen) und wird unverändert weitergetragen;MED-OP-UX-12(B41–B43): B41 erledigt (MED-D-261 Token-Fix), B42/B43 offen → weitergetragen. Neu abgeleitet: B44–B45 →MED-OP-UX-13. Nächster App-Audit gemäß Stale-Regel (agents.md§6.7: ≥10 Minor-Versionen oder >90 Tage).
E. Einfachheits-Audit v0.144.1 (2026-09-25, MED-D-326) — Linse „ältere / wenig IT-affine Nutzer"
Zielgruppen: Business/Management (Kernaussage + Maßnahmen) · IT-Dev (Belege Datei:Zeile) · Customer Service. Bezugspunkt: v0.144.1 · Commit
2e57381· 2026-09-25. Frage (Nutzer): „Die Benutzerführung intern als auch für Kunden soll absolut trivial sein, sodass sich auch ältere oder weniger IT-affine Menschen darin zurechtfinden." Methode: App lokal gestartet (Full-Stack-Worker, Testdaten), Screenshots Desktop 1366 px
- Mobil 390 px, dazu Code-Sichtung aller Staff- und Kundenflächen. IDs sind audit-lokal (U-/K-/I-/M-).
E.1 Kernaussage
Nicht trivial — weder intern noch für Kunden. Die Oberfläche ist technisch sauber, aber entlang des Datenmodells statt entlang der Aufgabe gebaut: zu viele gleichzeitige Bedienelemente/Status, zu viele Wege für dieselbe Aufgabe, Fachjargon/interne IDs sichtbar, zu kleine/blasse Schrift. Kunden erhalten viele verschiedene Links, aber keinen Ansprechpartner mit Namen/Telefon. Die bisherigen Audits (A11y/Tokens) maßen Konsistenz — diese Linse misst kognitive Last, und dort liegt der größere Hebel.
E.2 Harte Fehler (in derselben Runde behoben → MED-D-329)
| ID | Befund | Beleg | Status |
|---|---|---|---|
| U-01 | /portal zeigte Kunden die interne Staff-Kopfzeile (Cockpit/Verwaltung/Build/Theme) und rief Staff-Endpunkte | app.component.ts istOeffentlich ohne /portal | ✅ MED-D-329 |
| U-02 | Korrektur-Mail kam nie an: empfaenger: null → Mail-Adapter überspringt still; Link relativ | formular-vorgang-service.ts (Sichtung abschließen), cloudflare-email.ts | ✅ MED-D-329 |
| U-03 | Primary-Button-Kontrast 2,4:1 (Weiß auf #76b82a, WCAG AA verlangt 4,5:1) | styles.css button.primary/.mw-btn.primary | ✅ MED-D-329 |
| U-04 | Kundenstrecken unbedingt dunkel, Portal hell (B44) | app.component.ts, styles.css :root | ✅ MED-D-329 |
E.3 Kundenseite (→ MED-OP-UX-15)
| ID | Befund |
|---|---|
| K-01 | ✅ MED-D-332 — Kein Ansprechpartner (Name/Telefon), kein Impressum-/Datenschutz-Link auf den Kundenseiten; einzige System-Mail an Kunden ist der Portal-Anmelde-Link (nackter Link, 15 min, no-reply@). |
| K-02 | ✅ MED-D-333 (Portal = eine To-do-Liste; Formular-Einladungen versenden weiter die Mitarbeitenden) — Bis zu 5+ verschiedene Links je Kunde (Onboarding, je Formular, Fragebogen, je Upload, Portal) + DocuSign; Portal ist nicht die eine To-do-Liste (Formulare nicht öffenbar, interne Items sichtbar, Dokumente doppelt). |
| K-03 | ✅ MED-D-332 — Jargon: „Die Dexpansionsberater", „Nice-to-have", „Bot-Schutz-Prüfung", „Prüfsumme", „Fertigstellungsgrad", „technischer Status 0", „Mandantennummer", DSGVO-Artikelzitate, rohe Kategorien „(stammdatum)". |
| K-04 | ✅ MED-D-332 — Deaktivierte Absende-Buttons ohne Begründung; Fehler nur unten, nicht am Feld. |
| K-05 | ✅ MED-D-332 — Datum als nativer Browser-Picker (Format folgt der Browser-Sprache); IBAN/PLZ/Telefon ohne Formatbeispiel/Zifferntastatur; „weiß ich nicht"/„wird nachgeliefert" unter jedem Feld. |
| K-06 | ✅ MED-D-333 — Fragebogen: 111 Fragen auf einer Seite. |
| K-07 | ✅ MED-D-332 — Upload: keine Kamera-Option, ungestylter Datei-Button, Limits erst nach der Liste; separate Upload-Seite off-brand. |
| K-08 | ✅ MED-D-333 (Keep-alive bei Aktivität) — Portal-Sitzung endet nach 30 min Leerlauf → Eingetipptes geht verloren. |
| K-09 | ✅ MED-D-332 — Schrift vielfach 10–13 px (Labels/Hinweise). |
| K-10 | ✅ MED-D-331 — Die weiche SLA-Erinnerung an Kunden (formular-vorgaenge-service.ts) hat ebenfalls empfaenger: null → erreicht den Kunden nicht (analog U-02, nicht in dieser Runde behoben). |
E.4 Interne Seite (→ MED-OP-UX-16)
| ID | Befund |
|---|---|
| I-01 | Startseite zeigt nicht, was heute fällig/überfällig ist (nur Mandantenliste); „Jetzt dran" liegt versteckt unter „Fokus". → M-03 (MED-D-328) |
| I-02 | ✅ MED-D-335 — Mandantenseite überladen: ~30 feste Bedienelemente, >12 Status-Anzeigearten, Lifecycle 3× sichtbar, „Schritt 2 von 5" + „Phase stammdaten", 6 Reiter (letzter abgeschnitten). |
| I-03 | Zeiterfassung startet beim bloßen Öffnen eines Mandanten; Verlassen erzwingt ein Entscheidungs-Modal. → M-07 (MED-D-328) |
| I-04 | ✅ MED-D-335 + MED-D-337 — ≥4 Wege "Dokument anfordern" (keiner versendet in-App), ≥6 Einstiege "Unterschrift" (einer umgeht den Assistenten). |
| I-05 | ✅ MED-D-334 — Interne IDs/Technik sichtbar: „MED-D-195", „MED-KB-5", „G-4", „OP-SIGN-1", „Ablage (R2) provisionieren", „AcroForm", „Weltmodell-Attribut", „eIDAS-Niveau/Rechtsmatrix", „Tagestakt/Bahnen/Brennt/aktenreif". |
| I-06 | Begriffe uneinheitlich: Mandant/Mandat (1 Buchstabe Unterschied; Leitstand zählt Mandanten als „Mandate"), Wiedervorlage/Aufgabe/Frist, signiert/Unterschrift. → Begriffsentscheidung MED-D-326 |
| I-07 | ✅ MED-D-335 — Schrift meist ≤12,8 px (bis ~9 px), graue Versal-Überschriften, Klickflächen 16–24 px. |
| I-08 | Einzeltasten-Kürzel im Fokus (E/S/A) handeln bei versehentlichem Tastendruck; Swipe; Tooltip-only-Erklärungen; Icon-only-Buttons. → Kürzel: M-07 (MED-D-328) |
| I-09 | ✅ MED-D-334 — Cockpit-Kopfzeile bei 1366 px zu breit (horizontales Scrollen); Build/Version für Büro sichtbar; toter Knopf „Suchen / Springen (bald verfügbar)". |
| I-10 | ✅ MED-D-334 — Fehlermeldungen „… fehlgeschlagen." ohne Ursache/nächsten Schritt. |
| I-11 | ✅ MED-D-334 — Zuweisen einer Wiedervorlage per freier E-Mail-Eingabe statt Personenauswahl. |
E.5 Maßnahmen (nach Wirkung)
| ID | Maßnahme | Aufwand | Status |
|---|---|---|---|
| M-01 | U-01…U-04 beheben | klein | ✅ MED-D-329 |
| M-02 | Ein Einstieg für Kunden: Portal = einzige To-do-Liste mit „Jetzt erledigen"; App versendet Einladungen selbst, mit Name + Telefon des Beraters | mittel | offen (MED-OP-UX-15) |
| M-03 | Startseite = „Heute": überfällig + heute fällig zuerst, darunter Mandantenliste | klein–mittel | ✅ MED-D-328 |
| M-04 | Mandantenseite verschlanken: ein „Nächster Schritt"-Button, ein Status, Rest per „Mehr"; je Aufgabe ein Weg | groß | offen (MED-OP-UX-16) |
| M-05 | Sprach-Durchgang: interne IDs/Technik raus; Begriffe „Kunde" + „Mandat" (MED-D-326) | mittel | Begriffe ✅ MED-D-330; interne IDs/Technik offen (MED-OP-UX-16) |
| M-06 | Senioren-Typografie: Grundschrift ≥16 px, nichts <14 px, Klickflächen ≥44 px, Kundenseiten hell | mittel | offen (MED-OP-UX-15/16) |
| M-07 | Timer nicht automatisch starten; Einzeltasten-Kürzel standardmäßig aus | klein | ✅ MED-D-328 |
| M-08 | Nutzertest mit 3–5 älteren Nutzern je Rolle (Aufgaben laut denken, Zeit/Fehler messen) | klein | offen (MED-OP-UX-15/16) |
0. Refresh v0.138.0 (2026-09-23, MED-OP-REVIEW-1) — Delta-Audit v0.128.0 → v0.138.0
Kernaussage des Refreshs: kein UX-Regress; die seit v0.128.0 gebauten Flächen tragen den Meisterwerk-Anspruch,
ein einziger neuer Kleinbefund (B46). Geprüft wurden die neuen/geänderten sichtbaren Flächen der Slices
MED-D-304…311: Kunden-Portal-Client (/portal, portal-public.component.ts), Staff-Magic-Link-Login
(/anmelden, staff-login.component.ts), der neue „Kundenportal"-Abschnitt in der Akte
(mandant-einladungen.component.ts) und das Turnstile-Widget am Portal-Login (MED-D-311).
| Prüfpunkt | Verdikt |
|---|---|
Chrome-lose Kundenflächen (/portal, /anmelden) nutzen dieselbe .md-pub-Handschrift wie die 4 Public-Strecken (reuse md-pub-kopf/-fuss, ladeFehlerAuswerten) | ✅ konsistent, kein Sonderweg |
Ehrliche Zustände statt stiller Fehler: Portal dormant/link_gesendet/link_ungueltig; Staff dormant/eingeloggt; 429/bot_check verständlich gemeldet; role="alert"/role="status" gesetzt | ✅ (True North #1 „ehrlich, wo steht der Kunde") |
Akte „Kundenportal"-Abschnitt: E-Mail vorbelegt aus Kontakt, role="status"-Bestätigung, 409 „besteht bereits" wird als Erfolg erklärt (kein roher Fehler) | ✅ |
| Bot-Schutz-Widget deaktiviert den Absende-Button bis Token vorliegt (gleiches Muster wie Lead-Strecke) | ✅ |
G-8/G-3-Labels statt roher Enums (Dokument-/Vorgang-Status über DOKUMENT_STATUS_LABEL/vorgangPill*) | ✅ |
B46 (neu, niedrig): portal-public.component schluckt den Fehler von GET /portal/config still (error: () => {}) → bei Config-Ausfall erscheint das Turnstile-Widget kommentarlos nicht; der Rate-Limiter schützt weiter, aber ein Hinweis fehlt | 🟡 → MED-OP-UX-13 |
Altbacklog weitergetragen (unverändert): MED-OP-UX-11 (B36–B40, B42/B43), MED-OP-UX-13 (B44–B45) + neu B46.
Der detaillierte Vollaudit unten bleibt als Bezugsrunde v0.128.0 stehen (Historie in-file; git trägt den Vorstand).
1. Kernaussage
Der Design-System-Kern und die drei neuen Flächen (Onboarding-Stepper, Ablage-Spiegel, Dentmarking-Gate)
tragen den Meisterwerk-Anspruch ohne Regress; neu sind nur zwei kleine Befunde — die öffentlichen
Kundenstrecken rendern unbedingt dunkel obwohl der Code sie „faktisch hell" nennt (B44), und ein Undo-Fehler
wird still geschluckt (B45) — während der A11y-/Ehrlichkeits-Altbacklog (B36–B40, B42/B43) offen bleibt.
Der geprüfte Design-System-Kern hält ohne Regress, auch durch den umfangreichen „Akte" → „Mandant"-Rename
(MED-D-277): die geteilte overlay-shell (vormals akte-overlay) mit Scrim/ESC/Fokus-Falle/role="dialog"/
aria-modal und die Reiter-Roving-tabindex-Navigation sind intakt. Die drei neuen sichtbaren Flächen sind
sauber gebaut:
- Onboarding-3-Schritte-Stepper (MED-D-285) — ehrliche Schritt-Semantik (
<ol>+aria-current="step"), jeder Fehler-Kanalrole="alert"(onboarding-public.component.ts:94/:170), der „wo fehlt was?"-Report ist rein abgeleitet (G-2, keine neue Wahrheit): fehlende Pflicht getrennt von offenen optionalen Angaben, Fehlschläge landen im roten Kanal statt im neutralen „gespeichert"-Hinweis (:360-369). Beantwortet True North #1 direkter. - Ablage-Spiegel + „erwartete Dokumente"-Disclosure (MED-D-288) — abgelegt/erwartet sauber über
nextcloudPfadgetrennt (mandant-detail.component.ts:615/:685), Ladefehlerrole="alert"(:609), ehrlicher Empty-State — kein Onboarding-Platzhalter maskiert sich mehr als abgelegtes Dokument. - Dentmarking-Gate (MED-D-287) — vorbildlich fail-open: der Block bleibt bei Ladefehler sichtbar
(
mandant-detail.component.ts:588,praxen().length === 0 && !nebendatenFehler()), damit das Werkzeug bei gescheitertem Praxen-Load erreichbar bleibt — genau das Gegenmuster zur Falsch-Leere.
Was von der glatten Note trennt, sitzt in zwei neuen Kleinbefunden — plus dem überwiegend unveränderten Vor-Backlog:
- Theme-Intent-Drift auf den Kundenstrecken (B44, niedrig-mittel; NEU):
app.component.ts:160überspringt auf öffentlichen Routen bewusst das Setzen vondata-theme; das World-2-Token-Set hat aber im blanken:rootDunkel-Werte (styles.css:472), und.md-pub.mw-scopezieht--bg/--text/--paneldaraus (:244-246). Ergebnis: alle vier öffentlichen Strecken rendern unbedingt dunkel — auch für einen Kunden mit Hell-Betriebssystem —, denn ohnedata-themegreift weder die[data-theme='light']- noch dieprefers-color-scheme-Regel. Das ist in sich konsistent (Dunkel-Text auf Dunkel-Grund, kein Kontrastbruch), widerspricht aber dem ausdrücklichen Code-Intent „Kundenseiten bleiben faktisch hell" (styles.css:45,app.component.ts:162) und macht B36 (Badge-Kontrast „v. a. Dark") zum Default statt zum Randfall. - Still geschluckter Undo-Fehler (B45, niedrig; NEU): die „Rückgängig"-Aktion der Bankkonto-Archivierung
verwirft ihren Fehler still (
mandant-detail.component.ts:1904,error: () => {}) — schlägt das Zurücksetzen fehl, ist der Toast weg und der Nutzer erfährt nicht, dass das Konto archiviert bleibt (B40-Klasse auf einer Sekundäraktion). - Der A11y-/Ehrlichkeits-Vor-Backlog ist überwiegend offen: B36 (Badge-Kontrast), B37 (Touch-Ziel
„übernehmen"), B38 (Tabs ohne
aria-controls/role=tabpanel), B40 (Cockpit-Wiedervorlagen still) sowie B42 (Rücklauf-Falsch-Leere) und B43 (<24-px-Ziel) unverändert. Positiv: B39 (zweirole=alert-Lücken) ist im Zuge des MED-D-277-Renames geschlossen; B41 (undefinierte Feld-Editor-Tokens) ist per MED-D-261 gefixt.
Bewertung je Dimension (10 = Meisterwerk; ↑/↓ ggü. v0.116.1):
| Dimension | v0.116.1 | v0.128.0 | Begründung (Kurzform) |
|---|---|---|---|
| Informationsarchitektur & Prozessführung (intern) | 9 | 9 | Neue Flächen (Onboarding-Stepper, Ablage-Spiegel, Dentmarking-Gate) sauber strukturiert; die 5-Reiter-IA + Overlay-Shell überleben den Rename ohne IA-Verlust |
| Verlässlichkeit des Feedbacks | 8 | 8 | Onboarding-Stepper + Ablage melden ehrlich (role=alert, ehrliche Empty-States), Dentmarking-Gate fail-open; aber: neu erkannter still-geschluckter Undo (B45) + Alt-Rest B40 (Cockpit-Wiedervorlagen) + B42 (Rücklauf-Falsch-Leere) |
| Selbsterklärbarkeit / eine Sprache (G-3/G-8) | 9 | 9,5 | zentrale Label-Maps halten; der „Akte" → „Mandant"-Rename (MED-D-277/278) vereinheitlicht die sichtbare Sprache über UI und Doku — ein Begriff statt zwei |
| Kundenstrecken (öffentlich) | 8,5 | 8 | Onboarding-Stepper ist ein echter UX-Gewinn; aber: die Theme-Intent-Drift (B44 — unbedingt Dunkel trotz „faktisch hell") + B36 (Badge-Kontrast) + B37 (16-px-Ziel) drücken |
| Konsistenz Design/Interaktion | 7,5 | 8 | Erholung: B41-Token-Regress gefixt (MED-D-261); neue Flächen nutzen ausschließlich World-2-Tokens, kein eingeschleuster Hex — Token-Disziplin wieder makellos |
| Mobile & Erreichbarkeit | 8 | 8 | Onboarding-Stepper kollabiert sauber (Schritt-Labels ellipsis, min-width:0); Rest-Risiko: B37/B43 (<24-px-Ziele) unverändert |
| Barrierefreiheit | 8 | 8 | Overlay-Dialog-Semantik + Roving-tabindex intakt; B39 geschlossen; aber: B38 (aria-controls) + B36 (jetzt Default-Dark, B44) + B40 unverändert offen |
2. Was gehalten wurde (bewahren)
Belegt im Code-Re-Audit + Neu-Flächen-Sweep (Datei:Zeile):
- Design-System-Kern ohne Regress (durch den MED-D-277-Rename hindurch):
- Geteilte Overlay-Shell
overlay-shell.component.ts(vormalsakte-overlay) —role="dialog",aria-modal, Scrim-Close, Initial-Fokus, Fokus-Falle (Tab-Wrap), Fokus-Rückgabe, ESC nur bei Fokus im Panel; von allen Overlay-Konsumenten korrekt genutzt (Rücklauf-Overlaymandant-detail.component.ts:1063, Mandat-Overlay, Neuer-Mandant, Zeitbuchung). - Reiter-A11y (
mandant-detail.component.ts:276-278) —role="tablist"+role="tab"+aria-selected- Roving-
tabindex+registerTaste()(Pfeil/Pos1/Ende) intakt.
- Roving-
- Geteilte Overlay-Shell
- B39 geschlossen (Alt-
MED-OP-UX-11): die zwei vormaligenrole=alert-Lücken tragen jetzt die Rolle —mandant-druckansicht.component.ts:86/:309(primärer Ladefehler + Audit-Verlauf) undmandant-meetings.component.ts:53(Gesprächsnotizen-Ladefehler mit Retry). - B41 geschlossen (Alt-
MED-OP-UX-12): der Feld-Editor nutzt keine undefinierten--fg/--gruenmehr (MED-D-261, reine CSS-Token-Korrektur) — die World-2-Tokens--text/--mut/--greensind kanonisch instyles.css:472-520definiert und werden durchgängig genutzt. - Neue Flächen überwiegend sauber:
- Onboarding-Stepper (
onboarding-public.component.ts):aria-current="step"(:59), Fehler-Kanalrole="alert"(:94/:170), abgeleiteter Lücken-Report (:260-264), Fehlschlag-Ehrlichkeit im roten Kanal statt im „gespeichert"-Hinweis (:360-369), Turnstile-Container per[hidden]schon im DOM (:146, CodeRabbit #322). - Ablage-Spiegel (
mandant-detail.component.ts): abgelegt/erwartet übernextcloudPfadgetrennt (:615/:685), erwartete in<details class="md-erwartet">mit erhaltenen Intake-Aktionen (:686-689), Ladefehlerrole="alert"(:609). - Dentmarking-Gate (
mandant-detail.component.ts:588): fail-open bei Praxen-Ladefehler — der Kommentar (:585-587) dokumentiert die Absicht explizit. - Kunden-Self-Service-Portal S1/S2 (MED-D-282/283): dormant/flag-gated (
PORTAL_AKTIV), keine öffentliche Fläche in Prod — Golden Rule gewahrt, kein UX-Belang bis S3.
- Onboarding-Stepper (
3. Verbliebene & neue Befunde
3.1 Unverändert offen aus v0.116.1 (MED-OP-UX-11, B36–B40) — überwiegend kein Fix
| # | Befund | Beleg (v0.128.0 verifiziert) | Status |
|---|---|---|---|
| B36 | Fragebogen-Badge weiß-auf-Farbe unter WCAG-AA (durch B44 jetzt Default-Dark) | fragebogen-public.component.ts:190-193 (color:#fff auf --amber/--mut) | offen |
| B37 | <16-px-Touch-Ziel „übernehmen"/„→ zu den Angaben" auf der Onboarding-Strecke | onboarding-public.component.ts:188 (.md-ob-uebernehmen, padding:0.05rem 0.5rem ≈ 13 px), genutzt :88/:151 | offen |
| B38 | Reiter role="tab" ohne aria-controls; Ziel-Sektionen ohne role="tabpanel" | mandant-detail.component.ts:278 (kein aria-controls), Panels z. B. :588 ([hidden] ohne role=tabpanel) | offen |
| B39 | 2 role="alert"-Restlücken | mandant-druckansicht.component.ts:86 · mandant-meetings.component.ts:53 — beide tragen jetzt role=alert | geschlossen |
| B40 | cockpit#meineWiedervorlagen() scheitert still → Falsch-Leere/Aktionsverlust | cockpit.component.ts:987 (error: () => {}) | offen |
3.2 Status MED-OP-UX-12 (B41–B43)
| # | Befund | Beleg (v0.128.0 verifiziert) | Status |
|---|---|---|---|
| B41 | Feld-Editor undefinierte Tokens → unsichtbarer Text im Light-Theme | MED-D-261 (Token-Fix); World-2-Tokens styles.css:472-520 kanonisch | geschlossen |
| B42 | Rücklauf-Prüfung zeigt bei Load-Fehler eine Falsch-Leere „nichts zu prüfen" | mandant-detail.component.ts:1069-1070 (beruhigende Leer-Meldung) vs. :1090 (dokFehler-role=alert sitzt nur im gefüllten @else-Zweig; oeffneRuecklauf-Fehler → leer → Alert rendert nicht) | offen |
| B43 | „Rücklauf prüfen"-Button unter 24-px-Touch-Ziel | mandant-detail.component.ts (interner Prüfen-Button, padding:4px 10px; font-size:0.8rem) | offen |
3.3 Neue Befunde (der nächste Backlog → MED-OP-UX-13)
B44 — Öffentliche Kundenstrecken rendern unbedingt Dark trotz „faktisch hell"-Intent (niedrig-mittel; Theme-Konsistenz + Kommentar-Drift; NEU)
app.component.ts:160 gibt auf öffentlichen Routen (istOeffentlich, :120-125) vor dem Theme-Effekt
zurück → document.documentElement bekommt kein data-theme. Das World-2-Token-Set definiert seine Werte
aber auf dem blanken :root dunkel (styles.css:472 :root, :root[data-theme='dark'] → --bg:#0d1210,
--text:#e7ece8); Hell greift nur über :root[data-theme='light'] (:489) oder @media (prefers-color-scheme: light) { :root[data-theme='system'] } (:506) — beides braucht das nie gesetzte Attribut.
.md-pub.mw-scope { background: var(--bg) } (:244) + .mw-scope { color: var(--text) } ziehen daraus →
alle vier öffentlichen Strecken (Onboarding/Formular/Fragebogen/Lead) rendern unbedingt dunkel, auch für
Hell-OS-Kunden, und honorieren prefers-color-scheme nicht. In sich konsistent (kein Kontrastbruch), aber der
ausdrückliche Code-Intent „Kundenseiten bleiben faktisch hell / unangetastet" (styles.css:45,
app.component.ts:162) ist damit irreführend, und B36 (Badge-Kontrast „v. a. Dark") wird zum Default.
Fix (Entscheidung nötig): entweder öffentliche Routen bewusst auf hell festlegen (data-theme='light' beim
Betreten setzen) oder prefers-color-scheme ehrlich honorieren + die beiden Kommentare korrigieren.
B45 — Undo der Bankkonto-Archivierung schluckt Fehler still (niedrig; True North #2, B40-Klasse auf Sekundäraktion; NEU)
mandant-detail.component.ts:1904 — die „Rückgängig"-Aktion des Archivierungs-Toasts
(bankkontoAendern(..., { pruefstatus: k.pruefstatus })) hat error: () => {}. Schlägt das Zurücksetzen fehl,
verschwindet der Toast und der Nutzer erfährt nicht, dass das Konto archiviert bleibt — der optische
Aktionsvollzug täuscht Erfolg vor. Fix: Fehler-Toast bei fehlgeschlagenem Undo (this.toast.fehler(...)),
wie es die Primäraktion bankArchivieren bereits tut (:1907).
Weitere Kleinbeobachtungen (nicht als Befund gezählt): die Cockpit-Timer-Leseloops (cockpit.component.ts:946/:947)
schlucken Fehler still — dort akzeptabel (reine UI-Uhr, Quelle bleibt aktiverTimer()); die Onboarding-Schritt-
Labels kürzen bei ≤360 px via ellipsis (onboarding-public.component.ts:196) — bewusst, kein Overflow.
B35 — Carry-over, bewusst zurückgestellt (bekannt/akzeptiert, kein Regress)
Unverändert: einige Modal-Dialoge mit eigener Fokus-Falle außerhalb der Overlay-Shell; Pill-Render- Vereinheitlichung; Einzelwert-Inline-Styles.
4. Maßnahmenplan
Drei Wellen, klar priorisiert:
MED-OP-UX-13(neu) — die zwei neuen Kleinbefunde. Reihenfolge: B44 (Theme-Entscheidung Kundenstrecken — der Fix schärft zugleich B36, weil er entscheidet, ob Hell der Default wird → dann entschärft sich der Badge-Kontrast) → B45 (Undo-Fehler-Toast, 1-Zeilen-Fix). Beide niedrig, keine Blocker.MED-OP-UX-12(Rest offen) — B42 (Rücklauf-Falsch-Leere, True North #2: eigenesruecklaufFehler-Signal, in allen Zweigen mitrole=alertrendern) → B43 (min-height:24px).MED-OP-UX-11(überwiegend offen) — die A11y-/Ehrlichkeits-Restmeile (B36 → B37 → B38 → B40): Badge- Kontrast (mit B44 verzahnt) → 16-px-Ziel → Tabs-aria-controls/role=tabpanel→ Cockpit-Falsch-Leere. Über 12 Minor unberührt geblieben — bewusst nachziehen.
B35/Carry-over bleibt bewusst offen (kein Regress).
*Dieses Audit ist ein Zeitdokument (MED-OP-REVIEW-1 / agents.md §6.7): Bezugspunkt v0.128.0 · Commit
(Commit wird beim Merge gestempelt) · 2026-09-12. Befunde werden als MED-OP-UX-11 (Carry-over B36–B38/B40)
MED-OP-UX-12(Rest B42/B43) +MED-OP-UX-13(neu B44/B45) in den Backlog überführt, nicht im Audit abgearbeitet. Keine Versionsänderung durch diesen Refresh.*