Patch release rolling up five dogfood-driven fixes from the live IR migration.
UI fixes
Poll task list during scan (6acf273): the Recent Import Tasks list sat stale during an active batch — the polling loop refreshed the active-batch counter but never refetched the table. Now it refreshes loadTasks(true) every 5 s when a batch is in flight.
TopNav grid layout (95bc761): switching to Gallery or Showcase made the centered links shift left because the right-side action slot (Select / Shuffle teleport target) grew while the flex layout rebalanced. TopNav now uses a 1fr / auto / 1fr grid so the link block stays geometrically centered regardless of side-cell width.
Viewer modal haze + fit-to-view (c9ddcd0): the modal sat on a near-opaque background and large images overflowed the viewport. Background is now mid-opacity obsidian + backdrop-filter: blur(8px) (matches the TopNav haze); the media wrapper drops its align-items: center and adds min-height: 0 so the canvas finally has a parent height to clamp <img>'s max-height: 100% against.
Viewer modal close-on-click-outside (38a45ba): IR-parity. Clicking inside the image still toggles zoom; clicking the surrounding haze closes the modal. Implemented via the image's getBoundingClientRect() rather than @click.self because the <img> has pointer-events: none for the pan-drag pathway.
Backend fix
Auto-finalize empty scans + accurate active-batch stats (7a5a714): a re-triggered scan that finds every file already on a non-failed ImportTask enqueues zero work and previously left the batch row stuck in running forever. /api/system/stats then picked it as the active batch (most-recently-started running) and reported all-zero counters, hiding the older batch doing the actual work. Now scan_directory flips the batch to complete immediately when files_seen == 0, and system_stats filters its active-batch query to running batches with outstanding ImportTask work.
Commits
7a5a714 fix(scan): auto-finalize empty scans + system_stats picks running batch with actual work
38a45ba feat(ui): click outside the image in the viewer modal closes it (parity with IR)
c9ddcd0 fix(ui): viewer modal — haze background through to the image, fit-to-view at zoom 1
95bc761 fix(ui): TopNav uses 1fr/auto/1fr grid so Gallery/Showcase action buttons don't shift the centered links
6acf273 fix(ui): poll import task list during active batch so Recent Import Tasks doesn't sit stale
Patch release rolling up five dogfood-driven fixes from the live IR migration.
## UI fixes
- **Poll task list during scan** (`6acf273`): the Recent Import Tasks list sat stale during an active batch — the polling loop refreshed the active-batch counter but never refetched the table. Now it refreshes `loadTasks(true)` every 5 s when a batch is in flight.
- **TopNav grid layout** (`95bc761`): switching to Gallery or Showcase made the centered links shift left because the right-side action slot (Select / Shuffle teleport target) grew while the flex layout rebalanced. TopNav now uses a `1fr / auto / 1fr` grid so the link block stays geometrically centered regardless of side-cell width.
- **Viewer modal haze + fit-to-view** (`c9ddcd0`): the modal sat on a near-opaque background and large images overflowed the viewport. Background is now mid-opacity obsidian + `backdrop-filter: blur(8px)` (matches the TopNav haze); the media wrapper drops its `align-items: center` and adds `min-height: 0` so the canvas finally has a parent height to clamp `<img>`'s `max-height: 100%` against.
- **Viewer modal close-on-click-outside** (`38a45ba`): IR-parity. Clicking inside the image still toggles zoom; clicking the surrounding haze closes the modal. Implemented via the image's `getBoundingClientRect()` rather than `@click.self` because the `<img>` has `pointer-events: none` for the pan-drag pathway.
## Backend fix
- **Auto-finalize empty scans + accurate active-batch stats** (`7a5a714`): a re-triggered scan that finds every file already on a non-failed `ImportTask` enqueues zero work and previously left the batch row stuck in `running` forever. `/api/system/stats` then picked it as the active batch (most-recently-started running) and reported all-zero counters, hiding the older batch doing the actual work. Now `scan_directory` flips the batch to `complete` immediately when `files_seen == 0`, and `system_stats` filters its active-batch query to running batches with outstanding `ImportTask` work.
## Commits
```
7a5a714 fix(scan): auto-finalize empty scans + system_stats picks running batch with actual work
38a45ba feat(ui): click outside the image in the viewer modal closes it (parity with IR)
c9ddcd0 fix(ui): viewer modal — haze background through to the image, fit-to-view at zoom 1
95bc761 fix(ui): TopNav uses 1fr/auto/1fr grid so Gallery/Showcase action buttons don't shift the centered links
6acf273 fix(ui): poll import task list during active batch so Recent Import Tasks doesn't sit stale
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Patch release rolling up five dogfood-driven fixes from the live IR migration.
UI fixes
6acf273): the Recent Import Tasks list sat stale during an active batch — the polling loop refreshed the active-batch counter but never refetched the table. Now it refreshesloadTasks(true)every 5 s when a batch is in flight.95bc761): switching to Gallery or Showcase made the centered links shift left because the right-side action slot (Select / Shuffle teleport target) grew while the flex layout rebalanced. TopNav now uses a1fr / auto / 1frgrid so the link block stays geometrically centered regardless of side-cell width.c9ddcd0): the modal sat on a near-opaque background and large images overflowed the viewport. Background is now mid-opacity obsidian +backdrop-filter: blur(8px)(matches the TopNav haze); the media wrapper drops itsalign-items: centerand addsmin-height: 0so the canvas finally has a parent height to clamp<img>'smax-height: 100%against.38a45ba): IR-parity. Clicking inside the image still toggles zoom; clicking the surrounding haze closes the modal. Implemented via the image'sgetBoundingClientRect()rather than@click.selfbecause the<img>haspointer-events: nonefor the pan-drag pathway.Backend fix
7a5a714): a re-triggered scan that finds every file already on a non-failedImportTaskenqueues zero work and previously left the batch row stuck inrunningforever./api/system/statsthen picked it as the active batch (most-recently-started running) and reported all-zero counters, hiding the older batch doing the actual work. Nowscan_directoryflips the batch tocompleteimmediately whenfiles_seen == 0, andsystem_statsfilters its active-batch query to running batches with outstandingImportTaskwork.Commits