Coordination: work that keeps its owner
Documented against OpenRig 0.5.14. Help text uses "node" where these pages say seat, for a seat's position in the running rig.
What it is for
A queue item is one unit of owned work: a row in the daemon's database with a destination seat, a body, a state and an append-only history of transitions. It survives the owner's turn ending, the owner compacting and the owner being replaced. A seat cannot close work without saying where it went, and handing work to another seat closes yours and opens theirs in one transaction, so nothing strands between seats. Durable does not mean automatic: a row can still need a person or a peer to notice it. What the queue guarantees is that the work stays recorded and attributable, with an owner and a history, whatever happens to the seats.
Around the queue sit three smaller surfaces. A stream is an append-only intake log for observations nobody has to act on yet. A view is a named lens over coordination state, such as what is held, what is waiting on a person, or which claimed rows have stalled. A project record turns a raw observation into a routed, typed, deduplicated row instead of a hand-made one.
The three verbs you will use first
Create a row for a seat. The destination is the seat that owns the work (help sometimes says "node" for a seat's position in the running rig). Multiline bodies go through --body-file; --mission and --slice attach the work to the work tree as tags.
rig queue create --destination dev-impl@my-rig --body-file brief.md --mission search-experience --slice 01-search-page
Claim it, then close it honestly. Claim moves pending to in-progress. Closing to done requires a closure reason from a fixed set: handed_off_to, blocked_on, denied, canceled, no-follow-on, escalation. A note without --state never changes state. Closure records delivery, not acceptance; acceptance is the next stage's verdict on its own row.
rig queue claim qitem-20260901100000-abcd1234
rig queue update qitem-20260901100000-abcd1234 --note "matching any title word, not the whole phrase"
rig queue update qitem-20260901100000-abcd1234 --state done --closure-reason no-follow-on --note "accepted, one loose end"
Hand it on. One transaction: the source row closes as handed-off and a new row opens at --to. Omit the body to carry the source body forward.
rig queue handoff qitem-20260901100000-abcd1234 --to build-checker@my-rig --note "candidate ready; keyboard path per requirement 2"
Reading the board
rig queue list defaults to active rows in your current rig, like docker ps; -a adds history and -A crosses rigs. --owned shows only the obligations assigned to you. rig queue show <id> gives a bounded preview; --full --json prints the complete item record without truncation. It is the item, not its history: the transitions are a separate read. rig queue transitions <id> is the audit trail of what happened to a row. rig view show held lists what is parked and on what; rig view show escalations lists what waits on a person; rig view show pickup derives whether a claimed row is working, stalled after claim, parked or unclaimed.
Parking on a real blocker
rig queue block <id> --on <blocker> parks a row as held with a continuation and one live wake, either a watchdog job or a timer (--wake-after 15m). A park on a human seat needs a plain-language summary and a durable evidence reference, because a person will judge it. Closing a blocked row would be a lie; sitting on it silently looks identical to a crash. rig queue resolve writes the decision onto the row and wakes the owner.
| Command | What it does (from help) | Help source |
|---|---|---|
rig project |
Coordination L2 , agent-backed classifier with daemon-enforced lease + idempotency + reclaim | project.txt |
rig project classify |
Project a stream item with classification fields (idempotent on stream_item_id; requires active lease) | project.classify.txt |
rig project lease-acquire |
Acquire the active classifier lease for the caller | project.lease-acquire.txt |
rig project lease-heartbeat |
Send a heartbeat for an active classifier lease (extends TTL) | project.lease-heartbeat.txt |
rig project lease-show |
Show the currently-active classifier lease | project.lease-show.txt |
rig project list |
List project classifications with filters | project.list.txt |
rig project reclaim-classifier |
Operator-verb: reclaim the active classifier lease. Use --if-dead to refuse if holder is still alive. | project.reclaim-classifier.txt |
rig project show |
Show one project classification | project.show.txt |
rig queue |
Coordination L3 , owned-work queue + inbox/outbox | queue.txt |
rig queue block |
Park a qitem as HELD with a continuation and wake. Choose a watchdog id, timer, or live blocker. | queue.block.txt |
rig queue claim |
Claim a qitem (pending → in-progress); computes closure_required_at from tier | queue.claim.txt |
rig queue create |
Create a new qitem | queue.create.txt |
rig queue fallback |
Reroute a qitem to a fallback destination (e.g. unreachable seat) | queue.fallback.txt |
rig queue handoff |
Transactional handoff: closes source as handed-off + creates new qitem owned by --to | queue.handoff.txt |
rig queue handoff-and-complete |
Atomic close (state=done, closure_reason=handed_off_to) + create new qitem owned by --to. Variant of handoff that fully terminates the source qitem. | queue.handoff-and-complete.txt |
rig queue inbox-absorb |
Absorb a pending inbox entry into the receiver's main queue | queue.inbox-absorb.txt |
rig queue inbox-deny |
Deny a pending inbox entry with a recorded reason | queue.inbox-deny.txt |
rig queue inbox-drop |
Drop a mailbox-style entry into a destination's inbox | queue.inbox-drop.txt |
rig queue inbox-pending |
List pending inbox entries for a destination seat | queue.inbox-pending.txt |
rig queue list |
List qitems (default: active + compact + current-rig; like 'docker ps') | queue.list.txt |
rig queue outbox-list |
List outbox entries for a sender seat | queue.outbox-list.txt |
rig queue outbox-record |
Record an outbound dispatch in the sender's outbox | queue.outbox-record.txt |
rig queue overdue |
List in-progress qitems past their closure_required_at deadline (current rig, bounded, body-free by default) | queue.overdue.txt |
rig queue resolve |
Resolve a leg-1 parked qitem (state=blocked on a human seat): records the decision text durably in queue_transitions, unparks blocked -> in-progress, and nudges the owner. Non-closure. | queue.resolve.txt |
rig queue show |
Show one qitem and its derived waiting state (bounded preview; --full for complete body) | queue.show.txt |
rig queue transitions |
Show the append-only transition log for a qitem | queue.transitions.txt |
rig queue unclaim |
Release a claimed qitem (in-progress → pending) | queue.unclaim.txt |
rig queue undelivered |
List PENDING qitems whose create-path nudge FAILED (delivery never reached the destination; current rig, bounded, body-free by default) | queue.undelivered.txt |
rig queue update |
Append a note and/or mutate qitem state. A note without --state never changes row state. state=done REQUIRES --closure-reason (one of: handed_off_to, blocked_on, denied, canceled, no-follow-on, escalation). Closure ≠ acceptance: handed_off_to records delivery to the next stage; acceptance is the next stage's verdict on its own qitem, not this closure. | queue.update.txt |
rig queue whoami |
Show the caller's queue position from the daemon's perspective | queue.whoami.txt |
rig stream |
Coordination L1 , append-only intake stream | stream.txt |
rig stream archive |
Soft-archive a stream item (audit row preserved) | stream.archive.txt |
rig stream emit |
Append a stream item | stream.emit.txt |
rig stream list |
List stream items chronologically | stream.list.txt |
rig stream show |
Fetch one stream item by id | stream.show.txt |
rig stream watch |
Watch the stream (initial replay + live items) | stream.watch.txt |
rig view |
Coordination L5 , daemon-backed views over coordination state | view.txt |
rig view list |
List built-in + custom views | view.list.txt |
rig view register |
Register or update a custom view | view.register.txt |
rig view show |
Run a view (built-in or custom). Built-in views: recently-active, founder, pod-load, escalations, held, activity, pickup | view.show.txt |
What it does not do
- Closing a row is not acceptance.
handed_off_torecords delivery; the receiver's own verdict lives on the receiver's row. - A message (
rig send) is not a row. If another seat must act, create or hand off a row. queue listreports up to its--limit(default 100); a board can be larger. Confirm the returned count is under the limit before claiming nothing is held.- Tags and priority are set at create or handoff; the list view is a projection and
show --fullis the record.
Where it goes next
- Workflows: a declared spec that projects the next row when a step closes, so you stop relaying.
- The terminal UI:
attentionandpickupare these rows seen from the operator's side. - Messaging: the informing channel that sits beside the obligating one.