Handle stale jobs (worker crashed mid-execution) and implement graceful shutdown for clean Fly.io scale-down.
Acceptance criteria:
- Heartbeat mechanism: worker updates job heartbeat_at periodically
- Recovery: jobs with stale heartbeats are re-queued or marked failed
- Graceful shutdown: on SIGTERM, finish current job before exiting
- Configurable heartbeat interval and staleness threshold
- Logging for all recovery/shutdown events
Handle stale jobs (worker crashed mid-execution) and implement graceful shutdown for clean Fly.io scale-down.
Acceptance criteria: