{ "task_id": "LOGIN-AUTH-QUALITY-CHECK-001", "summary": "Ganzheitlicher Quality-Check fuer Auth/Login/Password (lokal + Microsoft SSO) mit Guard- und Best-Practice-Review ueber PHP und Frontend, gezielten Korrekturen bei Verstoessen (inkl. unnoetigem CSS/JS), sowie Ergaenzung und Absicherung durch reproduzierbare Tests und Quality Gates.", "assumptions": [ "Scope umfasst lokalen Login/Password-Flow und Microsoft-SSO-Start/Callback inklusive tenantabhaengiger Login-Methoden.", "Umsetzungstiefe ist 'gezielte Fixes', kein breiter Architektur-Refactor.", "Wenn API-Verhalten nicht geaendert wird, ist keine OpenAPI-Aenderung noetig.", "Alle neu eingefuehrten sichtbaren Texte werden im selben Merge in de+en gepflegt." ], "scope": { "in": [ "pages/auth/login().php, register().php, forgot().php, verify().php, reset().php, verify-email().php", "pages/auth/login(login).phtml, register(login).phtml, forgot(login).phtml, verify(login).phtml, reset(login).phtml, verify-email(login).phtml", "pages/auth/microsoft/start().php und pages/auth/microsoft/callback().php", "pages/api/v1/auth/login().php und pages/api/v1/me/password().php", "lib/Service/Auth/AuthService.php, RememberMeService.php, PasswordResetService.php, EmailVerificationService.php, MicrosoftOidcService.php, TenantSsoService.php, SsoUserLinkService.php", "templates/login.phtml und templates/partials/auth-help-links.phtml (plus ggf. auth-bezogene Partials)", "web/js/app-login-init.js, web/js/components/app-password-toggle.js, web/js/components/app-password-hints.js", "web/css/pages/app-login.css", "tests/Service/Auth/*, tests/Http/ApiAuthTest.php, tests/Architecture/AuthLoginAccessibilityContractTest.php, tests/Architecture/AuthHelpLinksContractTest.php", "i18n/default_de.json und i18n/default_en.json fuer neue Keys" ], "out": [ "Neues Auth-Feature-Design oder Produktneuentwicklung", "Breite Refactors ausserhalb Auth/Login/Password/SSO", "DB-Schema-Migrationen", "Nicht-authentifizierungsbezogene Admin-Module" ] }, "guardrails": { "required_guard_ids": [ "GR-CORE-001", "GR-CORE-002", "GR-CORE-003", "GR-CORE-004", "GR-CORE-005", "GR-CORE-006", "GR-CORE-008", "GR-CORE-012", "GR-SEC-001", "GR-SEC-002", "GR-SEC-003", "GR-SEC-004", "GR-SEC-005", "GR-UI-009", "GR-UI-010", "GR-UI-011", "GR-UI-012", "GR-UI-013", "GR-UI-015", "GR-TEST-001", "GR-TEST-002", "GR-LANG-002" ], "required_quality_gate_ids": [ "QG-001", "QG-002", "QG-003", "QG-004", "QG-005", "QG-006" ] }, "success_criteria": [ { "id": "SC-001", "criterion": "Eine vollstaendige Guard-Matrix fuer den Auth/Login/Password-Scope liegt vor, mit Datei-/Flow-Bezug und priorisierten Findings (kritisch/hoch/mittel)." }, { "id": "SC-002", "criterion": "Alle kritischen und hohen Guard-Verstoesse im Scope sind durch gezielte Code-Anpassungen behoben oder mit begruendeter, nachvollziehbarer Ausnahme dokumentiert." }, { "id": "SC-003", "criterion": "Frontend-Review entfernt oder konsolidiert unnoetige/duplizierte Login-CSS- und Login-JS-Logik, ohne A11y- oder UX-Regression." }, { "id": "SC-004", "criterion": "Serverseitige Sicherheitsinvarianten bleiben fuer alle betroffenen Auth-Endpunkte intakt (AuthZ, Tenant-Scope, CSRF auf POST, keine sensiblen Leaks)." }, { "id": "SC-005", "criterion": "Automatisierte Tests sind erweitert, sodass Login/Password-Edge-Cases und Regressionen (inkl. Reset/Verify sowie SSO-Pfade) reproduzierbar abgedeckt sind." }, { "id": "SC-006", "criterion": "Alle Pflicht-Gates QG-001 bis QG-006 laufen mit PASS und nachvollziehbarer Evidenz." }, { "id": "SC-007", "criterion": "Manuelle End-to-End-Smokes fuer lokale Login- und SSO-Kernfluesse sind erfolgreich, inklusive Browser-Console ohne neue JS-Fehler." } ], "implementation_steps": [ { "id": "S1", "title": "Guard-Matrix und Baseline erstellen", "description": "Dokumentiere pro Auth/Login/Password-Flow die relevanten Guards aus Katalog und ordne sie konkreten Dateien/Codepfaden zu; erfasse bestehende Testabdeckung und initiale Gap-Liste.", "guard_refs": [ "GR-CORE-001", "GR-TEST-001" ] }, { "id": "S2", "title": "PHP Page/API Boundary-Review durchfuehren", "description": "Pruefe pages/auth/* und pages/api/v1/auth|me auf requestInput-Vertrag, Superglobal-Vermeidung, CSRF-Reihenfolge, API-Fehlerkonsistenz, PRG-Verhalten und serverseitige Sicherheitspruefungen.", "guard_refs": [ "GR-CORE-003", "GR-CORE-004", "GR-CORE-008", "GR-CORE-012", "GR-SEC-001", "GR-CORE-005", "GR-CORE-006" ] }, { "id": "S3", "title": "Service-Layer Security- und Testability-Review", "description": "Pruefe AuthService/RememberMe/PasswordReset/EmailVerification/MicrosoftOIDC/TenantSSO auf Auth- und Tenant-Invarianten, PII-Redaktion, SQL-/Crypto-Nutzung sowie unit-testbare Konstruktion via Dependency Injection.", "guard_refs": [ "GR-CORE-001", "GR-SEC-002", "GR-SEC-003", "GR-SEC-005", "GR-TEST-002" ] }, { "id": "S4", "title": "Frontend/UI-UX Quality-Review mit CSS/JS-Cleanup", "description": "Pruefe Login-Templates, Login-CSS und Login-JS auf A11y-Basics, i18n-Konformitaet, Semantik, UI-State-Vollstaendigkeit sowie JS/CSS-Reuse-first; entferne unnoetige/duplizierte Regeln oder Logik gezielt.", "guard_refs": [ "GR-UI-009", "GR-UI-010", "GR-UI-011", "GR-UI-012", "GR-UI-013", "GR-UI-015", "GR-SEC-004" ] }, { "id": "S5", "title": "Gezielte Korrekturen umsetzen", "description": "Setze nur die priorisierten High-Impact-Fixes um (PHP + Frontend), ohne Scope-Ausweitung; bei UI-Textaenderungen i18n-Keys in de/en im selben Schritt nachziehen.", "guard_refs": [ "GR-TEST-002", "GR-UI-010", "GR-UI-015", "GR-LANG-002" ] }, { "id": "S6", "title": "Testabdeckung gezielt erweitern", "description": "Ergaenze/erweitere PHPUnit-Tests fuer unterabgedeckte Auth/Login/Password-Pfade (v. a. PasswordResetService, EmailVerificationService, Login/SSO-Edge-Cases) sowie passende Architektur-Contracts fuer Markup-/A11y-Invarianten.", "guard_refs": [ "GR-TEST-001", "GR-TEST-002", "GR-UI-009", "GR-SEC-001" ] }, { "id": "S7", "title": "Quality Gates und Smokes ausfuehren", "description": "Fuehre QG-001 bis QG-006 aus, inklusive struktureller rg-Checks und JS-Smoke; dokumentiere pro Gate PASS/FAIL/Blocker mit kurzer Evidenz.", "guard_refs": [ "GR-LANG-002", "GR-TEST-001", "GR-UI-011", "GR-UI-012" ] }, { "id": "S8", "title": "Acceptance gegen SC-IDs abschliessen", "description": "Mappe jede Success-Criterion-ID auf konkrete Evidenz (Dateien, Tests, Gate-Resultate, Smoke-Ergebnisse) und markiere verbleibende Restrisiken transparent.", "guard_refs": [ "GR-TEST-001", "GR-CORE-005" ] } ], "tests": [ "Bestehende Tests: tests/Service/Auth/AuthServiceTest.php und tests/Service/Auth/RememberMeServiceTest.php gezielt erweitern (fehlende Login-/Tenant-/SSO-Edge-Cases).", "Neue Tests: tests/Service/Auth/PasswordResetServiceTest.php (requestReset, verifyCode, resetPassword inkl. expiry/attempts/used).", "Neue Tests: tests/Service/Auth/EmailVerificationServiceTest.php (sendVerification, verifyCode, resendVerification inkl. already_verified/attempt limits).", "Bestehende Architekturtests: tests/Architecture/AuthLoginAccessibilityContractTest.php und tests/Architecture/AuthHelpLinksContractTest.php bei Bedarf erweitern.", "API-bezogene Regressionen: gezielte Ergaenzung in tests/Http/ApiAuthTest.php oder neuer fokussierter Auth-API-Test fuer Login-/Password-Randfaelle.", "QG-001: docker compose exec php vendor/bin/phpunit", "QG-002: docker compose exec php vendor/bin/phpstan analyse -c phpstan.neon --no-progress", "QG-003: docker compose exec php vendor/bin/phpunit tests/Architecture/CoreStarterkitContractTest.php", "QG-004: strukturelle rg-Checks gemaess agent-system/checks/quality-gates.json (Erwartung: 0 Verstosse)", "QG-005: Browser-Smoke fuer Login, Forgot/Verify/Reset, Microsoft Start/Callback; DevTools Console ohne neue Errors", "QG-006: docker compose exec php composer cs:check" ], "acceptance_checks": [ "SC-001: Guard-Matrix enthaelt jeden In-Scope-Flow und referenziert konkrete Dateien plus Priorisierung der Findings.", "SC-002: Kein offener kritischer/hoher Guard-Verstoss im Scope ohne dokumentierte und akzeptierte Ausnahme.", "SC-003: Login-Frontend hat keine neu eingefuehrte A11y-Regressionsspur und keine unnoetige duplizierte CSS/JS-Logik in den geprueften Bereichen.", "SC-004: AuthZ-, Tenant- und CSRF-Invarianten sind fuer alle betroffenen POST- und Login-Endpunkte nachweisbar intakt.", "SC-005: Neue/erweiterte Tests schlagen bei kontrollierter Regelverletzung fehl und laufen im Zielzustand stabil gruen.", "SC-006: QG-001 bis QG-006 sind mit PASS protokolliert.", "SC-007: Manueller Smoke bestaetigt erfolgreiche Kernfluesse (lokal + SSO + Logout) ohne neue Browser-Console-Fehler." ], "ux_notes": { "affected_patterns": [ "Auth login card/layout (templates/login.phtml + pages/auth/*(login).phtml)", "Tenant selection pattern (login-tenant-fieldset, login-tenant-choice-grid)", "Auth help links partial (templates/partials/auth-help-links.phtml)", "Password hint/toggle behavior (web/js/components/app-password-hints.js, app-password-toggle.js)", "Login page styling (web/css/pages/app-login.css)" ], "ui_states_required": [ "loading", "empty", "error", "success" ], "a11y_touchpoints": [ "Email/password/code inputs inklusive aria-invalid und aria-describedby Verknuepfungen", "Fehler-Notices als assertive live regions mit fokussierbarer Rueckmeldung", "Tenant-Radioauswahl und Tastatur-Fokuspfad", "Microsoft Login CTA und lokale Login-Buttons mit semantischer Bedienbarkeit", "Password toggle control (button semantics, focus-visible, aria-label updates)" ] }, "risks": [ { "risk": "Gezielte CSS-Bereinigung kann visuelle Login-Regressionen erzeugen, obwohl funktional korrekt.", "mitigation": "Nur additive/minimale CSS-Deltas, visuelle Smokes pro Auth-Stage und QG-005 verpflichtend." }, { "risk": "Aenderungen an tenantabhaengiger Login-Methodik koennen lokale oder Microsoft-Login-Pfade unbeabsichtigt blockieren.", "mitigation": "SSO- und Local-Branches jeweils mit positiven und negativen Tests absichern; End-to-End-Smoke fuer Start/Callback/Login ausfuehren." }, { "risk": "Security-Fixes koennen durch Nebenwirkungen API- oder Session-Verhalten brechen.", "mitigation": "Invarianten zuerst testen (CSRF/AuthZ/Tenant), danach nur kleine isolierte Codeaenderungen mit Ruecktests." }, { "risk": "Neue Tests werden flakey wegen Session/Global-State-Kopplung.", "mitigation": "Konsequent Mocking/DI nutzen, globale Abhaengigkeiten kapseln und deterministische Assertions ohne Zeitrennen definieren." } ] }