What's Fixed
- Fix stale cron lock files blocking scheduled feed updates (#161): a process killed before cleanup (e.g. container restart, OOM kill) left
/tmp/update_feeds_<frequency>.lockbehind, silently skipping every later run of that frequency. Locking now uses a kernel-managedflock, released automatically on process exit for any reason. Same fix applied tocleanup_entries.
Maintenance
- Make AI filter tests hermetic (mock
OpenAIAgent.completions), fixing CI failures caused by openai 2.53.0 rejecting empty api_key. - CI now installs dependencies from
uv.lockviauv sync --locked, eliminating dependency drift between CI and local/Docker builds.