852b3797d8
Root cause of a missed 9am notification: the read-only pipeline_status_report runs at 09:30, but enrich_buy_url (09:10, --apply) held the single global pipeline lock long past 09:30, so the status report recorded skipped_lock and never sent its Telegram digest. build_fingerprint_index (09:25) was starved the same way. - run_job/run_lib_script gain use_lock; the status report runs with use_lock=False since it only reads logs, pings Navidrome, and sends Telegram. It can no longer be blocked by a long write job, and running concurrently is safe. - _lib was silently dropping its timeout argument, so maintenance jobs had no timeout and a hung one held the lock until the next container restart. Thread timeout through _lib -> run_lib_script -> run_job, cap enrich_buy_url at 30m and build_fingerprint_index at 60m, and give the status report a 5m cap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>