Summary
The AI chat message stream in web/src/components/ai-chat-panel.tsx dynamically appends messages and updates task statuses, but neither region is wrapped in an aria-live container. Screen reader users receive no announcement of new AI responses or task state changes (pending → in_progress → done).
Location
web/src/components/ai-chat-panel.tsx
- Chat message list: the container that renders AI and user messages
TaskListPanel: task status items update dynamically
WCAG Criteria
- 4.1.3 Status Messages (Level AA): programmatically determinable status messages must be announced without receiving focus
- 4.1.2 Name, Role, Value (Level AA): dynamic regions must surface role/state to AT
Expected Fix
Wrap the chat messages container with aria-live="polite" and aria-atomic="false":
<div
aria-live="polite"
aria-atomic="false"
aria-relevant="additions text"
aria-label={t("chatMessagesAriaLabel")}
>
{messages.map(...)}
</div>
For task status, either add an aria-live="polite" region that announces completions, or add role="status" to the task list area.
Severity
B — Accessibility defect / WCAG violation
🤖 Filed by automated a11y audit (round 1)
Summary
The AI chat message stream in
web/src/components/ai-chat-panel.tsxdynamically appends messages and updates task statuses, but neither region is wrapped in anaria-livecontainer. Screen reader users receive no announcement of new AI responses or task state changes (pending → in_progress → done).Location
web/src/components/ai-chat-panel.tsxTaskListPanel: task status items update dynamicallyWCAG Criteria
Expected Fix
Wrap the chat messages container with
aria-live="polite"andaria-atomic="false":For task status, either add an
aria-live="polite"region that announces completions, or addrole="status"to the task list area.Severity
B — Accessibility defect / WCAG violation
🤖 Filed by automated a11y audit (round 1)