CI / Build & Quality Checks (push) Canceled after 1m33s
CI / Trigger Desktop Build (push) Canceled after 0s
CI / Secret scan (gitleaks) (push) Canceled after 0s
CI / Docker image build & smoke test (push) Canceled after 0s
CI / Playwright smoke (e2e) (push) Canceled after 0s
- Skip link: following #main-content left focus on <body> (the <main> target wasn't focusable), so nothing was announced and the URL got a stray fragment. <main> is now tabIndex=-1 and the link focuses it. - Keyboard-shortcuts dialog (?): no role, and focus stayed in the timeline, so it opened silently. Now role="dialog" aria-modal, and focus moves into it (Escape still returns focus to where you were). - Reaction viewer (both the reaction context-menu path and "View Reactions"): same — role="dialog" aria-modal aria-label="Reactions", focus moves in. Keyboard-only checks (Playwright): Tab → skip link → Enter focuses <main>; Tab reaches the room list, Enter opens a room, typing lands in the composer, Enter sends (verified on the server); focus ring visible. "?" opens the dialog with focus inside, Escape returns to the same element, "?" in the composer stays text. Topic viewer, Search dialog and reaction viewer all return focus to their opener. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA