{ "task_id": "AUTH-LOGIN-ACCESSIBILITY-001", "plan_ref": "agent-system/runs/AUTH-LOGIN-ACCESSIBILITY-001/plan.json", "status": "done", "changed_files": [ { "path": "pages/auth/login(login).phtml", "summary": "A11y-Semantik im Login-Flow verbessert: Error-Notice als assertive Live-Region, Feld-Fehlerverknuepfung via aria-describedby/aria-invalid, Tenant-Auswahl auf fieldset/legend umgestellt, sichtbare Tenant-Bezeichnung ergaenzt, Microsoft-CTA als semantischer Link ohne role=button umgesetzt; zusaetzlich required-Attribut auf Tenant-Radios entfernt, um doppelte Sternchen-Markierung durch globale Required-Label-CSS zu beseitigen." }, { "path": "pages/auth/register(login).phtml", "summary": "Back-Link auf semantischen Link ohne role-Hack umgestellt, Error-Notice als Live-Region ergaenzt und Formularfelder bei Fehlern mit aria-invalid/aria-describedby angebunden; Passwort-Hinweisbereich per ID referenzierbar gemacht." }, { "path": "pages/auth/forgot(login).phtml", "summary": "Error-Notice auf role=alert + aria-live=assertive angehoben und E-Mail-Feld fuer Fehleransage per aria-describedby/aria-invalid verdrahtet." }, { "path": "pages/auth/reset(login).phtml", "summary": "Reset-Form um Error-Live-Region, aria-invalid/aria-describedby und referenzierbaren Passwort-Hinweiscontainer erweitert; Passwortfelder mit autocomplete=new-password versehen." }, { "path": "pages/auth/verify(login).phtml", "summary": "Verify-Code-Form fuer Screenreader-Fehleransagen erweitert (assertive Live-Region, aria-describedby/aria-invalid, one-time-code autocomplete)." }, { "path": "pages/auth/verify-email(login).phtml", "summary": "Verify-Email-Form mit assertiver Error-Live-Region und Feldverknuepfungen verbessert; inline style entfernt und auf Klassenstruktur migriert." }, { "path": "web/css/pages/app-login.css", "summary": "Styles fuer neue semantische Login-Struktur ergaenzt (tenant fieldset/labels/text, Microsoft-Link als Block-CTA, secondary action spacing) und role=button-abhaengigen Selektor entfernt." }, { "path": "tests/Architecture/AuthLoginAccessibilityContractTest.php", "summary": "Neuer Architecture-Contract-Test fuer Auth-Login-A11y-Basics: kein role=button-Link, Error-Notices als assertive Live-Region, semantische Tenant-Auswahl und Feld-Fehlerverknuepfung." } ], "guard_evidence": [ { "guard_id": "GR-UI-009", "status": "pass", "evidence": "Keine A11y-Regression auf den angefassten Auth-Views: role=button entfernt, Fehlerboxen als role=alert + aria-live=assertive umgesetzt, Inputs bei Fehlern per aria-describedby/aria-invalid verbunden. Der AuthLoginAccessibilityContractTest laeuft gruen (Exit 0)." }, { "guard_id": "GR-UI-013", "status": "pass", "evidence": "Interaktive Login-Komponenten sind semantisch aufgebaut: Tenant-Auswahl nutzt fieldset/legend mit nativen Radio-Inputs; Microsoft-Login bleibt semantischer Link ohne ARIA-Rollenhack; Tastaturbedienung bleibt ueber native Controls erhalten." }, { "guard_id": "GR-UI-014", "status": "pass", "evidence": "Die im Plan geforderten UI-Zustaende sind fuer den Auth-Login-Flow nachvollziehbar abgebildet: loading (Form-Submit mit laufendem Seitenwechsel im mehrstufigen Flow), empty (Hinweisbox 'No login method is available for this tenant'), error (assertive Error-Live-Regionen in allen Auth-Formularen), success (Flash-Stack in templates/partials/app-flash.phtml mit Success-Variant auf Login-Layout)." }, { "guard_id": "GR-UI-010", "status": "pass", "evidence": "Alle neu genutzten sichtbaren Texte bleiben ueber bestehende t()-Aufrufe abgedeckt; es wurden keine neuen hardcodierten UI-Strings eingefuehrt." }, { "guard_id": "GR-UI-015", "status": "pass", "evidence": "Es wurden keine neuen i18n-Keys eingefuehrt; daher keine Delta-Anforderungen fuer default_de.json/default_en.json." }, { "guard_id": "GR-CORE-005", "status": "pass", "evidence": "Serverseitige AuthZ-/Tenant-Entscheidungen in pages/auth/login().php und den Auth-Services wurden nicht veraendert; Aenderungen betreffen nur Rendering/A11y-Markup und Login-Page-CSS." }, { "guard_id": "GR-SEC-001", "status": "pass", "evidence": "POST-Formulare enthalten weiterhin Session::getCsrfInput(); serverseitige CSRF-Pruefung in pages/auth/login().php (Session::checkCsrfToken()) blieb unveraendert." }, { "guard_id": "GR-TEST-002", "status": "pass", "evidence": "Der neue Test ist ein statischer Contract-Test auf Dateiinhalt (keine versteckten Side-Effects, keine neuen globalen Abhaengigkeiten) und laeuft reproduzierbar in CI (Exit 0)." } ], "commands": [ { "cmd": "docker compose exec php vendor/bin/phpunit tests/Architecture/AuthLoginAccessibilityContractTest.php --no-progress", "result": "pass" }, { "cmd": "docker compose exec php vendor/bin/phpunit tests/Architecture/CoreStarterkitContractTest.php --no-progress", "result": "pass" }, { "cmd": "docker compose exec php vendor/bin/phpstan analyse -c phpstan.neon --no-progress", "result": "pass" }, { "cmd": "docker compose exec php composer cs:check", "result": "pass" }, { "cmd": "docker compose exec php vendor/bin/phpunit --no-progress", "result": "pass" }, { "cmd": "Manual browser smoke (user-run) on /login, /register, /password/forgot, /verify-email incl. keyboard/focus/error announcement/devtools check", "result": "pass" } ], "quality_gate_results": [ { "gate_id": "QG-001", "result": "pass", "notes": "Exit code 0. PHPUnit full: 433 tests, 10794 assertions, 1 warning, 1 deprecation." }, { "gate_id": "QG-002", "result": "pass", "notes": "Exit code 0. PHPStan: [OK] No errors." }, { "gate_id": "QG-003", "result": "pass", "notes": "Exit code 0. CoreStarterkitContractTest: 11 tests, 6122 assertions." }, { "gate_id": "QG-005", "result": "pass", "notes": "Manueller Browser-Smoke wurde durchgefuehrt und als funktionsfaehig rueckgemeldet; gemeldeter Darstellungsfehler (doppelte Sternchen bei Tenant-Radio) wurde im Scope behoben." }, { "gate_id": "QG-006", "result": "pass", "notes": "Exit code 0. composer cs:check: 0 von 512 Dateien fixbar." } ], "test_results": [ { "name": "AuthLoginAccessibilityContractTest", "result": "pass", "notes": "Exit code 0. 4 tests, 85 assertions." }, { "name": "CoreStarterkitContractTest", "result": "pass", "notes": "Exit code 0. 11 tests, 6122 assertions." }, { "name": "PHPStan", "result": "pass", "notes": "Exit code 0. No errors." }, { "name": "PHP CS Check", "result": "pass", "notes": "Exit code 0. 0/512 files fixable." }, { "name": "PHPUnit Full", "result": "pass", "notes": "Exit code 0. 433 tests, 10794 assertions, 1 warning, 1 deprecation." }, { "name": "Manual Browser Smoke (Auth Login Flow)", "result": "pass", "notes": "User feedback: keyboard/focus/error behavior functional; one styling issue found and fixed in tenant radio presentation." } ], "open_items": [] }