Problem
Lock expiry handling can attempt invalid transitions and increment retry counters non-atomically.
Evidence
src/types.ts:561 (claimed valid transitions exclude failed)
src/job-fsm.ts:417 (claimed can transition to failed on max retry path)
src/job-fsm.ts:434 (retry_count increment happens before transition)
Proposed Fix
- Make timeout terminalization follow a valid transition path.
- Update retry_count and state change atomically in one transaction/CAS guard.
- Add tests for expired
claimed and running jobs near max retries.
Acceptance Criteria
- No invalid transition attempts during lock-expiry cleanup.
- Retry counters remain consistent with state transitions.
- Expired jobs reliably reach
pending or failed terminal states.
Problem
Lock expiry handling can attempt invalid transitions and increment retry counters non-atomically.
Evidence
src/types.ts:561(claimedvalid transitions excludefailed)src/job-fsm.ts:417(claimedcan transition tofailedon max retry path)src/job-fsm.ts:434(retry_count increment happens before transition)Proposed Fix
claimedandrunningjobs near max retries.Acceptance Criteria
pendingorfailedterminal states.