- _stop_background_work pre-fills the started parts with False and stores
the result and removes its atexit entry in a finally:, so a Ctrl+C between
steps no longer leaves the result unset and the callback registered.
- The "watchdog observer still running" warning moves into _stop_observer:
only for an observer still alive after its join, naming the join's own
timeout (not after observer.stop() raised, and not the full deadline).
- Tests: the plain-teardown tests share one package; two teardown tests run
with a live preview worker held in a fake encode (ffmpeg killed, step gets
min(CLOSE_WAIT_SECONDS, time left), thumbnails False while held and True
when the kill releases it); an interrupt-between-steps test; two warning
tests.
- TESTING.md and the ledger fixture comment: the refusal comes first, the
image worker and the observer share one 5 s deadline, and what an
interrupt between steps does.
Closes#377