- Add scan_manager: background asyncio task + Redis event store so scans
survive UI navigation; SSE stream reads from Redis and is reconnectable
- Replace SSE-tied scan endpoint with POST /nc-scan/start + GET /nc-scan/stream
- Fix frontend: AbortController + useEffect cleanup cancels stream on unmount
without stopping the server-side scan
- Add unique constraint on audio_versions.nc_file_path (migration 0009) to
prevent duplicate imports from concurrent scans; handle IntegrityError
gracefully in nc_scan with rollback + skip
- Fix API health check: use plain python instead of uv (not in dev image)
- Optimize Taskfile: fix duplicate dev:restart, add dev:fresh/dev:rebuild/
dev:status, migrate uses run --rm, check includes typecheck
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>