New[fix] NHS number check-digit validation now blocks Format button — prevents invalid patient identifiers reaching AI or being saved to database
New[fix] Double-Escape required to clear a long transcript — prevents accidental data loss from stray keypress
New[fix] Unsaved letter edits (inline editing mode) now tracked for beforeunload warning — prevents silent loss of post-formatting edits
New[fix] Letters page: calendar-accurate date filtering, deduplicated search results, preview resets correctly on filter change
New[ux] Clinical Review accordion (ActionItems/VoiceActions/ClinicalFlagsPanel) auto-collapses when all flags acknowledged
New[ux] Export/copy dropdown buttons disabled while AI is formatting — prevents mid-format file corruption
New[ux] Delete letter dialog auto-focuses Cancel button (safer default for destructive actions)
New[ux] Pre-appointment notes: character limit warning at 1500/2700 chars, hard cap at 3000
New[ux] Transcripts page: skeleton loader while lazy-loading letter content; error toast replaces silent failure
New[ux] ClinicSession: Next/Finish buttons now explain why they're disabled via tooltip
New[ux] Export dropdown: left-aligned on mobile to prevent viewport clipping on narrow screens
New[a11y] Copy button aria-label updates dynamically between 'Copy' and 'Copied to clipboard!'
New[a11y] Upload progress bar: role=progressbar, aria-valuenow/valuemin/valuemax for screen readers
New[a11y] Patient info badge title attributes for truncated GP surgery and diagnosis text
New[a11y] Sessions page: keyboard focus ring on session header buttons
New[fix] Token consistency: remaining hardcoded bg-purple-500/bg-indigo-600/bg-sky-600 buttons replaced with bg-primary