"running" for two and a half minutes tells the user nothing. The job page now shows a
spinner, the elapsed time, and the pipeline step Nextflow is actually on.
- the API streams the Nextflow output into jobs.log as it arrives, instead of keeping it
only when the run dies. Writes are throttled to one every 3s, or immediately when a new
process starts, and are skipped for a job that has already finished, so a late line
cannot overwrite the loader's result.
- web/src/lib/progress.ts formats the elapsed time and picks the latest [PROCESS] line.
No percentage: the pipeline cannot honestly estimate one.
- the spinner animates only under prefers-reduced-motion: no-preference.
Verified on a live run: the page showed "VEP (tiny)" for the duration, then the variant
table replaced it on success.
Tests: api 53, web 20; ruff, mypy, svelte-check clean.