Skill v1.0.1
currentAutomated scan100/100+2 new
version: "1.0.1" name: queue-handoff description: Use when ending a turn, finishing a slice, blocked on another agent's work, or escalating to a human — durable work handoff via queue items so the system keeps moving across compactions, missed messages, and interruptions. Covers the hot-potato terminal-turn-rule (active work ends by passing the ball, not by going idle), default-nudge semantics, and when --no-nudge is appropriate for intentional cold park or human gate. metadata: openrig: stage: factory-approved last_verified: "2026-06-24" distribution_scope: product-bound source_evidence: | Daemon-backed rig queue shipped in v0.2.0 (PL-004 Phase A) with handed-off-to / handed-off-from / state field shape. rig queue is canonical for new work; rigx queue is recovery-only fallback. The daemon enforces hot-potato strict-rejection at the API. Body resynced from canonical 2026-06-24 (demo-blocker fix: corrected the default-nudge guidance — the default already nudges; the previously-described extra notify flag does not exist on the shipped CLI). sibling_skills: [] transfer_test: pending
Queue Handoff
Durable work handoff via queue items. Lets the system keep moving through compactions, missed messages, and interruptions by passing the ball forward instead of leaving work suspended in chat or in-flight without an owner.
Use this when
- Ending a turn on substantive work. Active work should end by
passing the ball to an owner or to the human — never by going idle with the rig appearing dormant.
- Finishing a slice that has a clear next step. Default-nudge:
receiver gets a wake-ping plus the durable queue item.
- Blocked on another agent's work. Park the qitem with
closure_reason: blocked_on and the blocker qitem id.
- Escalating to the human. Make the escalation a durable attention
item, not just a chat message.
Don't use this when
- The work is genuinely complete and there's no follow-on owner. Use
closure_reason: no-follow-on (terminal completion) or canceled/denied as appropriate.
- The handoff would be too small and turn work into bureaucracy. Bundle
the work into a coherent slice instead of decomposing every step.
- The handoff would be too broad and lose ownership/proof/closure
criteria. Shape the qitem so the receiver knows the expected next action and closure evidence.
The hot-potato terminal-turn-rule
Active work ends by passing the ball to a named next owner or to the human. The qitem state machine enforces this:
pending → in-progress → done requires closure_reason from one of:
handed_off_to— work continues at a different seat (target = new owner)blocked_on— parked pending another qitem (target = blocker qitem id)denied— receiver rejected the workcanceled— sender or receiver withdrewno-follow-on— terminal completion, nothing else neededescalation— kicked up to a higher tier (target = escalation target)
Three of those (handed_off_to, blocked_on, escalation) additionally require closure_target. The daemon enforces this at the domain layer; every surface (CLI, MCP, future UI) inherits the same guarantee.
Default-nudge semantics (the syntax footgun)
| Command | Nudges by default? | When to use | |
|---|---|---|---|
rig queue create | yes | New qitem created from scratch | |
rig queue handoff | yes | Transactional close-as-handed-off + create-new | |
rig queue handoff-and-complete | yes | Atomic close + create-new; default nudge wakes the new owner | |
rigx queue handoff (filesystem v0 prototype; recovery-only fallback since 2026-05-11) | yes | Legacy artifact; qitems invisible to daemon-backed reads; deprecated with removal queued. Use rig queue handoff (daemon-backed) for all new substantive work. |
Footgun: --no-nudge accidentally added to a live-loop handoff. The shipped 0.3.1 CLI nudges by default on every queue write surface (rig queue create, rig queue handoff, AND rig queue handoff-and-complete). The only suppression flag is --no-nudge — appropriate for intentional cold park, human-gate signal, or a deliberate poll-driven workflow, but NOT for live-loop handoffs where motion matters.
Rule: in a live loop, omit --no-nudge and trust the default. --no-nudge is the opt-out, not the opt-in. If you find yourself reaching for --notify, stop — that flag does not exist on the shipped 0.3.1 CLI; you may be following a stale instruction that inverted the default-nudge polarity.
Queue-body hygiene (token + parse safety)
The qitem body is durable DATA the daemon stores and replays on every rig queue show <id> / --json read. Keep it small and parse-safe — a bloated or malformed body costs every future reader, not just the recipient.
- No large command output in bodies. Do NOT paste
rig ps/--nodes
dumps, big JSON blobs, full proof output, diffs, or transcript chunks into a qitem body. Link the artifact PATH (e.g. missions/<m>/<slice>/proof.md) or summarize in prose, then point at the file for the detail. A pasted dump makes rig queue show <id> --json huge — a second-order token bloat: bloated DATA living in the queue, distinct from the command-default output bombs the token-burn emergency pack covers. (Sensor: dev1-guard token-burn-flag 8ea201e4, 2026-06; founder-directed cure.)
- Substantive bodies go through `--body-file`, not inline `--body`.
For anything beyond a short line, write the body to a file and pass --body-file <path> (or - for stdin). Inline --body with shell metacharacters is fragile.
- No raw backticks in bodies. Backticks in an inline body are shell
command-substitution and corrupt the payload (or execute). If you need code/command spans, use --body-file, or drop the backticks and write the command in plain text.
Heuristic: if the thing you want to include is more than a few lines or contains shell metacharacters (backticks, $, quotes, newlines-with-pipes), it belongs in a file you LINK, not in the body you paste.
Product backstop (defense-in-depth, NOT a substitute for this discipline): rig queue show oversized-body truncation/preview is tracked separately as slice OPR.0.4.1.3. The behavioral rule here is the primary, durable cure; the product truncation is the safety net.
Failure modes (6; verbatim)
- Agent ends a turn without a handoff, so the rig appears idle.
- Agent creates a queue item with
--no-nudgeinside a live loop, intending suppression of attention but breaking immediate motion.--no-nudgeis for intentional cold park / human gate, not for routine live-loop handoffs. The opposite footgun — adding a--notifyflag that does not exist on the shipped 0.3.1 CLI — comes from following stale instructions; the default already nudges. - Queue item is too small and turns work into bureaucracy.
- Queue item is too broad and loses ownership, proof, or closure criteria.
- Human escalation happens in chat but not as a durable attention item.
- Agent pastes a large command dump (ps/nodes, big JSON, proof blob) into the qitem body, bloating the stored DATA so every future
rig queue show --jsonread is huge. Link the proof PATH or summarize in prose; substantive bodies go through--body-file; no raw backticks inline.
Durable handoff field shape
Every qitem carries:
handed_off_to— destination session (qualifiedpod-member@rigform)handed_off_from— source sessionstate— one of:pending | in-progress | done | blocked | failed | denied | canceled | handed-offclosure_reason+closure_target— set on terminal closure per hot-potato rule
The fields are auditable across both rigx queue (config-layer) and rig queue (daemon-shipped) surfaces. Watchdog policies and workflow runtime project new owners off these fields.
Two surfaces (same shape)
| Surface | Status | When to use | |
|---|---|---|---|
rig queue ... (daemon-shipped, v0.2.0) | Active host coordination surface | Daemon-backed PL-004 work; SQLite-canonical | |
rigx queue ... (config-layer dogfood) | Coexists with daemon | Workflows still operating on the temporary substrate coordination layer; legacy artifacts |
Default posture: prefer daemon rig queue for new work. If a daemon-backed coordination command fails, debug the command/runtime/schema edge directly — don't fall back to stale pre-upgrade assumptions.
See also
looping-workflowsskill — operating discipline for self-driving rig-shaped loops; queue-handoff is its current handoff substrateintake-routingskill — how raw signals enter the system and become routed work that flows through the queue