CI / Check (pull_request) Successful in 5m49s
CI / Detect Changes (pull_request) Has been skipped
CI / Deploy Agent (pull_request) Has been skipped
CI / Deploy Dashboard (pull_request) Has been skipped
CI / Deploy Docs (pull_request) Has been skipped
CI / Deploy MCP (pull_request) Has been skipped
The control-plane pull queue behind the Werkbank runner flow (implements sharang/werkbank#3). A JobQueue over a `werkbank_jobs` collection: - enqueue — idempotent by job id (unique index; duplicate is a no-op) - lease — atomic find-and-modify of the oldest queued job the runner can run, matched by executor and by labels (job labels must be a subset of the runner's, empty/absent matches any), returns the job + a lease token, bumps attempts - heartbeat — extends the lease, flips leased→running, surfaces a cancel request; None means the lease was lost (token mismatch / already terminal) - complete — records the terminal result, token-guarded and only from an active state, so it's idempotent - cancel — queued→cancelled outright, in-flight flagged for the next heartbeat - sweep_expired — the visibility timeout: expired leases go back to queued, or to expired once attempts hit max, so a crashed runner's job recovers All transitions are single atomic Mongo updates guarded by the lease token, so two runners can never both own a job. Every op takes an explicit `now` for deterministic tests. Adds JobRecord/LeasedJob/HeartbeatAck to the contract (BSON datetimes so range queries compare correctly) and the werkbank_jobs indexes. Tests: 5 integration against a real Mongo (idempotent enqueue, executor+label matching + FIFO, heartbeat/cancel, token-guarded idempotent complete, sweep requeue→expire; skip cleanly with no Mongo) + 2 unit. clippy + fmt clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>