fix(a11y): migrate ConversationTraceModal to Radix Dialog (Issue M)
Custom <div> modal lacked focus trap, Escape handling, aria-modal, and
aria-labelledby. Migrated to the codebase-standard Radix Dialog pattern
(same as CreateWorkspaceDialog and SettingsPanel) which provides all
required WCAG 2.1 modal semantics automatically:
• Dialog.Root + Dialog.Portal + Dialog.Overlay + Dialog.Content
→ role="dialog", aria-labelledby, focus trap, Escape key
• Dialog.Title wraps "Conversation Trace" heading
→ aria-labelledby points to the title element
• Dialog.Close asChild on ✕ button with aria-label="Close conversation trace"
→ accessible name for the dismiss button (WCAG 4.1.2)
• Dialog.Close asChild on footer Close button
• Backdrop → Dialog.Overlay (z-[59]) + Content wrapper (z-[60])
• All timeline/body content unchanged; only modal scaffolding replaced
Added 10 WCAG tests in ConversationTraceModal.a11y.test.tsx covering:
dialog presence, accessible name, aria-labelledby, data-state, ✕ button
aria-label, close button click, Escape key, and loading indicator. All
732 tests pass, build clean.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>