Repository navigation
0.5.0 - Service hardening
Service hardening release. No change to the decode parameters validated in 0.4.0; the reference file transcribes at the same 2.75 words/sec. Public API contract unchanged; new fields and the /health endpoint are additive.
Queue and worker
- Cleanup now actually runs: once an hour on every worker wake, keyed on completion time, deleting files and rows for the same jobs, plus a sweep of orphaned files older than two days that no live job owns.
- MFA's per-job working corpus under /mfa is removed after alignment (the aligner runs with --clean), closing a container-layer disk leak.
- Jobs stuck in 'processing' are recovered on every wake, not only at startup.
- Transient failures (CUDA OOM, I/O) are retried through the attempt counter with a poll interval between attempts instead of erroring the job on the first exception.
- The worker moves straight to the next queued job instead of sleeping 30 s between jobs.
- The dead second garbage check is gone; empty alignment output falls back to Whisper timings without counting an attempt.
Upload and status
- Duplicate-GUID uploads are serialized and return 409 (case-insensitive) instead of racing to a 500.
- Undecodable uploads return 400 and leave no file behind; the row is claimed before the file is written so the worker cannot see a half-uploaded job.
- Extension allowlist (.mp3 .wav .m4a .flac .ogg .aac .mp4) and a 1 GiB body cap.
- Duration is probed with ffprobe instead of decoding the whole file to PCM in the request thread.
- Upload and status use the same ETA math, counting the in-flight job, and status never reports a completion time in the past.
- GUIDs must be canonical hyphenated form.
- Additive fields: processing_seconds, words_per_second, attempt_count, mfa_applied on /transcriptions rows and completed /status bodies.
Operability
- GET /health with worker liveness, last wake, queue depth and model state; 503 when the worker is dead or stale. Docker HEALTHCHECK added.
- runDocker.sh builds before stopping anything, keeps a transcription-api:rollback tag, and waits for /health.
- Quieter logs: idle transition logged once, wake/sleep at DEBUG, MFA output only on failure, GUID on every job line.
Repo and CI
- Test job (pytest and ruff) runs on push and pull request, and the image publish job depends on it.
- 127 tests, app.py at 93 percent coverage (was 13 tests, 42 percent).
- Stale SQLite file removed from git and from the image; host tooling excluded from the image; requirements-dev.txt added.
- free-disk-space action pinned to a commit.
- docs/PUNCHLIST.md tracks the full service and pipeline review with per-item status.