- Normalize scan-status percent at the API boundary: the wire value is a 0-1 fraction despite the field name; the bar previously showed ~0% for the whole scan (fixtures now use fractional wire values incl. 0/1) - Fix the poll-start race: a triggered library enters a pending set that survives status pruning until seen active or a 3-tick grace window expires; the poll runs while pending ∪ active is nonempty (previously the queue-to-start lag could mean polling never started and the button re-enabled mid-scan); grace ticks also drain on persistent status-fetch errors so the UI can't stick - Keep setState updaters pure: pending/grace bookkeeping hoisted into pruneGraceExpiredPending() outside the updater (StrictMode-safe) - Wire the prototype's per-source Scan button (one POST per library, disabled while any of its libraries is pending/active) - Honest bare-500 media-sources failure test (backend has no exception middleware); loadScanStatuses returns its promise; poll effect depends on derived hasActiveScans; synchronous ref double-submit guard; --radius-xs fallback 3px; StatusDot label on source cards (75 tests) Review: PR #128 findings Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>