- Heartbeat queued jobs (before the semaphore), not just running ones, so
the stale-job reaper can't fail a job that is alive but waiting for a slot
(which would otherwise let it resurrect itself on acquire, or admit a
duplicate once the partial unique index no longer sees it as active).
- Filter the translate modal's source list to the formats the server accepts
(text external/downloaded, non-bitmap embedded), so an unsupported source
is prevented up front instead of failing the job asynchronously.
- Tell a duplicate requester (e.g. a second viewer, or after a reload) that a
translation is already in progress instead of silently closing; the
finished track still arrives via the subtitle_ready refresh.
- Note in the admin card that AI subtitle settings take effect after a
restart (the running service snapshots them at construction).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>