docs: teach what 0.7.9 changed in the map, references and three help texts (#2571)

The packaged capability map takes in 0.7.9's changes, and its header marker moves to capability-delta-v0.7.9. Two lines 0.7.9 made stale are corrected: an emit now opens or notes an intake row for queue.worker, and any registered person can settle an ask asked of someone else, recorded as themselves. It also covers indeterminate receipts, --closure-required-at, guidance placement for fresh Pi and Codex 0.164.0+ seats with the cases that still use the repository's AGENTS.md, what rig down takes back and keeps, the rebuild for wrapper and symlink Claude launches, and the daemon HTTP client reference. rig-spec's managed_blocks and guidance_merge rows and agent-spec's target row say where guidance normally goes. Help text: rig stream emit names the intake row and how to keep emits passive, rig send --verify says exit 1 can mean unconfirmed, and rig down says what it takes back and what it keeps. Docs and help text only.
This commit is contained in:
Mike Schwarz authored and GitHub committed 2026-11-05 09:19:51 -08:00
1 parent af4aff14fe
commit 73cf8138e7
7 files changed
+76 -21

No files matched your search

+5
View File
@@ -462,6 +462,11 @@ do not establish connectivity to a live peer.
| `rig stream read` | — | `--limit <n>`<br>`--reader <session>`<br>`--json` |
| `rig stream act <streamItemId>` | — | `--work <qitemId>`<br>`--decline <reason>`<br>`--duplicate <id>`<br>`--reader <session>`<br>`--json` |
Stream intake: the `stream.intake` setting (default `queue.worker`, or a canonical `<seat>@<rig>`) receives each emitted item.
It opens an intake row for that seat, which wakes it, or adds a note to that seat's intake row still pending; a `critical`
or interrupting item makes the row urgent. `rig config set stream.intake off` keeps emits passive. A runner's
default-permit record (tag `runner-permission-permit`) opens no row.
### queue
| Invocation | Aliases | Declared options |
+1 -1
View File
@@ -440,7 +440,7 @@ guidance:
|-------|------|----------|---------|-------------|
| `id` | string | yes | — | Resource identifier. A `rig-role` guidance resource is never merged; deliver a role with a `send_text` startup file. |
| `path` | string | yes | — | Relative path to the guidance file. |
| `target` | string | no | — | Parsed but not used: the runtime decides the file. Claude merges into the rig's `managed_blocks` file (`CLAUDE.md` by default, or `CLAUDE.local.md`); Codex, Pi and OMP merge into `<cwd>/AGENTS.md`. |
| `target` | string | no | — | Parsed but not used: the runtime decides the file. Claude merges into the rig's `managed_blocks` file (`CLAUDE.md` by default, or `CLAUDE.local.md`); Codex, Pi and OMP merge into `<cwd>/AGENTS.md`, except that a fresh Pi seat normally uses its own agent folder's `AGENTS.md` and a fresh Codex 0.164.0+ seat normally gets launch developer instructions; the conditions are in [Codex guidance at launch](agent-startup-guide.md#codex-guidance-at-launch) and [Runtime Differences](agent-startup-guide.md#runtime-differences). |
| `merge` | string | no | `managed_block` | Only `managed_block` is applied. Any other value, such as `append`, merges nothing. |
---
+2 -2
View File
@@ -180,7 +180,7 @@ edges:
| `non_interruptive` | boolean | no | — | Pod-aware rig launch-warning default. With full-bypass Claude/Codex seats, true accepts or hides supported harness warnings using launch flags. Explicit CLI choices override this field; this field overrides the machine default. It does not grant permissions, change native settings files, or bypass login. |
| `permission_policy` | string | no | — | Permission policy attached to the rig. Either a built-in (`builtin:locked`, `builtin:standard`, `builtin:open`, `builtin:yolo`, `builtin:auto`) or a safe relative path to a custom policy file (resolved from this spec's directory; no `..`, no absolute, no empty segments, each segment `[A-Za-z0-9][A-Za-z0-9._-]*`), or `none`, a recorded choice of the floor. Absent uses the default floor with the scoped team launch allowances described below. A bare built-in name such as `yolo` is refused ("use 'builtin:yolo'"), and so is an explicit `null`. A custom file that is missing, unreadable or invalid isn't a validation error: it resolves to the floor, and preflight warns. A member may set its own `permission_policy` (not on a terminal member), which takes precedence over the rig-level one; there is no pod level. See "Attaching a permission policy" below. |
| `env` | map | no | — | Launch environment for every seat in the rig: `NAME: value` pairs. A member's own `env` overrides it name by name. Names match `^[A-Z_][A-Z0-9_]*$`, names starting `OPENRIG_` are reserved, and values must be non-empty strings (quote numbers and booleans). Values are not secret. See "Launch environment" below. |
| `managed_blocks` | map | no | `CLAUDE.md` | File that receives OpenRig's managed instruction blocks for Claude Code members. Only the `claude-code` key is accepted, with `CLAUDE.md` or `CLAUDE.local.md`. Codex, Pi and OMP members use `AGENTS.md`. See "Choosing the Claude instruction file" below. |
| `managed_blocks` | map | no | `CLAUDE.md` | File that receives OpenRig's managed instruction blocks for Claude Code members. Only the `claude-code` key is accepted, with `CLAUDE.md` or `CLAUDE.local.md`. Codex, Pi and OMP members use `AGENTS.md`, except that a fresh Pi seat normally uses its own agent folder's `AGENTS.md` and a fresh Codex 0.164.0+ seat normally gets launch developer instructions; a link, a conflicting or unreadable Codex config layer, or a resume keeps the repository file. See [Codex guidance at launch](agent-startup-guide.md#codex-guidance-at-launch) and [Runtime Differences](agent-startup-guide.md#runtime-differences). See "Choosing the Claude instruction file" below. |
| `workspace` | object | no | — | The rig's workspace: `workspace_root` (required), `repos[]` of `{name, path, kind}` with `kind` one of `user`, `project`, `knowledge`, `lab` or `delivery` and unique names, an optional `default_repo` naming one of them, and an optional `knowledge_root`. Relative repo paths resolve against `workspace_root`. |
| `docs` | Doc[] | no | — | Documentation files that should travel with the rig. Included in rig bundles. Each entry has a `path` field (safe relative path). The engine does not consume these — they are for humans and agents setting up the environment before launch. |
| `startup` | StartupBlock | no | — | Rig-level startup files and actions. Applied to all members via the startup layering model. |
@@ -1077,7 +1077,7 @@ file; missing optional files do not trigger that warning.
| Hint | Behavior |
|------|----------|
| `auto` | System chooses based on file type and context. |
| `guidance_merge` | Merged as a managed block into the runtime's guidance file: for Claude, the `managed_blocks` file (`CLAUDE.md` or `CLAUDE.local.md`); for Codex, Pi and OMP, `AGENTS.md`. Delivered before harness boot. |
| `guidance_merge` | Merged as a managed block into the runtime's guidance file: for Claude, the `managed_blocks` file (`CLAUDE.md` or `CLAUDE.local.md`); for Codex, Pi and OMP, `AGENTS.md`, except that a fresh Pi seat normally uses its own agent folder's and a fresh Codex 0.164.0+ seat normally gets launch developer instructions (the conditions are in [Codex guidance at launch](agent-startup-guide.md#codex-guidance-at-launch) and [Runtime Differences](agent-startup-guide.md#runtime-differences)). Delivered before harness boot. |
| `skill_install` | Installed as a skill in the runtime's skill directory. Delivered before harness boot. |
| `send_text` | Sent as text to the agent's terminal after the harness is ready. Requires the agent TUI to be active. |
+5
View File
@@ -147,6 +147,11 @@ Before running it, check who is working (rig ps --nodes --rig <rig>) and that th
don't stop a team you didn't start unless asked. OpenRig snapshots the rig first (best-effort), and
rig up <rig> --existing brings it back, resuming each seat's conversation where its harness allows. With
--delete the rig record is removed too, so it can't be brought back that way.
Once no live seat uses a working folder, rig down also takes back what OpenRig added there: its
guidance blocks, and in a Claude seat's folder the status line, activity hooks and context collector.
It keeps and lists an edited skills-line block, edited team skill files, and settings or a collector
that don't match what OpenRig wrote or that another seat shares by a link. Any other guidance block
goes even if someone edited it. rig up <rig> --existing puts the guidance back.
When your resolved seat belongs to this rig, confirm before stopping it. Without a terminal,
the command warns and exits without stopping; re-run with --yes to confirm explicitly.`);
const getDepsF = () => depsOverride ?? { lifecycleDeps: realDeps(), clientFactory: (url: string) => new DaemonClient(url) };
+1 -1
View File
@@ -242,7 +242,7 @@ export function sendCommand(depsOverride?: SendDeps): Command {
.option("--to <sessions>", "Multi-recipient: comma-list or repeated (--to a,b or --to a --to b)", collectSessions, [] as string[])
.option("--pod <name>", "Send to every seat in a pod (fan-out, per-recipient results)")
.option("--rig <name>", "Send to every seat in a rig (fan-out, per-recipient results)")
.option("--verify", "Verify pane only delivery by checking content after send")
.option("--verify", "Verify pane only delivery by checking content after send. Exit 1 can mean unconfirmed, not failed: the message may have arrived, so inspect with rig capture before any resend")
.option("--force", "Back-compat no-op: a mid-task/busy pane already sends-with-advisory by default; --force never bypasses the interactive-prompt/permission guard")
.option("--wait-for-idle <seconds>", "Wait until the target is explicitly idle before sending. If it's still busy, or its activity is unknown, when the wait ends, nothing is sent (exit 1) and nothing is kept to send later; put separate work in a queue row (rig queue create)")
.option("--raw", "Send exact text/keystrokes without the From/To messaging envelope (still guarded against interactive prompts)")
+5
View File
@@ -112,6 +112,11 @@ export function streamCommand(depsOverride?: StreamDeps): Command {
.option("--interrupt", "Mark item as interrupting")
.option("--id <streamItemId>", "Idempotent stream_item_id (skip if not provided)")
.option("--json", "JSON output for agents")
.addHelpText("after", `
Stream intake is on by default: the seat named by stream.intake (queue.worker unless set)
gets an intake row for each item, which wakes it, or a note on its intake row still pending.
--hint-urgency critical or --interrupt makes that row urgent. The reply names only the stream item.
To keep emits passive: rig config set stream.intake off`)
.action(async (opts: {
source: string;
body: string;
@@ -11,7 +11,7 @@ not know exists.** So the point of what follows is not skill. It is recognition:
lands, something rhymes, and you go check instead of building.
Ninety-one top-level verbs ship (capability canon refreshed through
`capability-delta-v0.7.6`). This marker describes the pack's teaching, not publication or live
`capability-delta-v0.7.9`). This marker describes the pack's teaching, not publication or live
adoption. Read this once for shape, and let it make you suspicious that a thing already exists.
What changed in the installed version, and what to do about it, is one read away:
`rig context get reference/whats-new.md`.
@@ -108,7 +108,10 @@ unseen — which makes messages the one delivery channel that never gets skipped
- **`rig send`** — put words in front of one seat, several, a pod, or a rig. **`--verify` checks
pane-only delivery**: the text was staged at the far end, not that the agent consumed or acted
on it. Alternate-screen and queued-command cases can still yield false negatives, so
consequential delivery gets an effect check at the far end rather than a blind retry. A
consequential delivery gets an effect check at the far end rather than a blind retry.
`--verify` exits 1 when it can't confirm what its Enter did (`submission unconfirmed`, or text
staged but not submitted): the message may still have arrived, so inspect with `rig capture`
before any resend, and don't let a script resend on that exit code alone. A
producer-link advisory reading `no_activity_signal` means activity could not be determined;
confirm by effect, never relaunch on it. A send or wake to a seat whose latest hook is a
question waiting for a person is refused with `target_needs_input`, even when its screen
@@ -144,7 +147,7 @@ unseen — which makes messages the one delivery channel that never gets skipped
and the box was empty after Enter; it only reports.
- **`rig broadcast`** — one fact to everyone at once, rather than relaying it N times and getting
the wording wrong on the fourth. **Blast radius is real** — on a large rig this lands in every
seat's turn.
seat's turn. A broadcast that reached no one says so.
- **`rig capture <seat>`** — read what is on their screen right now. **`--rig` / `--pod`** captures
every seat in one call. `--lines N` is the last N lines (stderr says how many earlier lines were
cut); `--history-plus-pane` gives the older N history lines plus the whole pane. A short capture
@@ -171,8 +174,11 @@ unseen — which makes messages the one delivery channel that never gets skipped
connection refusals, and reset or closed connections are retried until that deadline; other errors,
including an error answer from the daemon such as a removed rig, still end the wait.
- **`rig stream emit` / `list` / `watch` / `archive`** — drop an observation somewhere the *next*
agent will find it. Emitting costs nothing and does not interrupt anyone; the value appears when
someone lists the stream before starting. **`rig stream show <id>`** says what became of one:
agent will find it. By default an emit also reaches the kernel's queue worker: it opens an
intake row for `queue.worker`, which wakes it like any queue row, or adds a note to that seat's
intake row still pending, and a `critical` or `--interrupt` item makes the row urgent.
`stream.intake` names the receiving seat; `rig config set stream.intake off` keeps emits passive.
A runner's default-permit record opens no row. **`rig stream show <id>`** says what became of one:
its routing, linked work and that work's state. Items emitted from 0.7.1 on are kept 30 days or
the newest 20,000 (`retention.stream_days`, `retention.stream_max_items`) unless a record names
them, and a body over 16 KiB is stored truncated.
@@ -262,7 +268,8 @@ unseen — which makes messages the one delivery channel that never gets skipped
piece and its matching Claude/Codex turn closure must arrive before pacing onward, including
the last piece. Initial missing evidence is explicitly unverified; a record lost or replaced
during verification stops the walk. Use `rig walk --help` for those receipts and bounds.
Delivery and turn completion do not prove comprehension.
A piece whose delivery or submission can't be confirmed reads unconfirmed, not lost: inspect
before resending. Delivery and turn completion do not prove comprehension.
- **`rig slack`** — inspect and manage one connector implementation. Use registered-human
readiness for the delivery decision and `queue create --verify` for its receipt; connector
setup or verification is not an outbound human message. After a connection gap the daemon
@@ -325,7 +332,9 @@ your context, your compaction and your replacement — and it is the only thing
`--note` does not reopen a terminal row; terminal-to-active repair requires explicit `--reopen`
with both `--state` and `--note`. `--summary` on its own corrects a row's subject in any state,
and a close with `--resolution "<outcome>"` stores the outcome on the row; `--state done
--evidence-ref <path>` also keeps the artifact's pointer on it.
--evidence-ref <path>` also keeps the artifact's pointer on it. To accept a re-estimate,
`--closure-required-at <iso>` on an in-progress row moves its deadline and keeps the claim,
recording the old and new time and who accepted it.
- **`rig queue handoff`** — pass work so the close and the create are **one transaction**, instead
of closing yours, failing to create theirs, and stranding the work in between. A standing sweep
checks recently closed rows (a 24-hour lookback) and flags a `handed_off_to` closure whose
@@ -367,6 +376,8 @@ your context, your compaction and your replacement — and it is the only thing
front of a seat that it can *refuse*. Mail, not assignment.
- **`rig queue outbox-record` / `outbox-list`** — what you dispatched, in a record that survives
your context. Stale requests you forgot are invisible to you and expensive to everyone else.
A receipt reads `indeterminate`, not delivered or failed, when the text may have reached the
seat: an unconfirmed send, or a write attempted before an error. Inspect before resending.
- **`rig queue fallback`** — reroute a row whose destination cannot receive it, without losing it
or rewriting its history.
@@ -516,6 +527,13 @@ not have to tear one down to change it, and you rarely have to start from nothin
rig. `rig up` with a pod-aware spec on a stopped team's name replaces that team (the earlier one
is archived), so check `rig ps --nodes` first. A rig name containing a dot is refused before
launch, because tmux would rename its sessions. Launch-created `AGENTS.md` or `CLAUDE` files now show in `git status`.
A fresh Pi seat normally keeps OpenRig's guidance in its own agent folder, and a fresh Codex
0.164.0+ seat normally gets it as launch developer instructions, so neither adds it to the
repository's `AGENTS.md`. The repository file is still used when the Pi folder or its `AGENTS.md`
is a link, when a Codex config layer sets `developer_instructions` or can't be read, and for a
Codex resume, fork, restore or handover successor, or an older or unknown Codex version
(`docs/reference/agent-startup-guide.md` has the rule). At
launch, a block a person edited is kept and named (`guidance_block_edited`), not replaced.
`rig up <rig> --existing` puts back the OpenRig guidance blocks `rig down` removed before a
resumed seat starts. A seat still missing one makes the rig `partially_restored` (its node lists
`guidanceGaps`) and `rig up` exits 1. A seat that wasn't running at the snapshot, but whose
@@ -563,8 +581,11 @@ not have to tear one down to change it, and you rarely have to start from nothin
permission requests reach a person: the default person, or one chosen with `rig seat set-permissions-to <seat>
--to <person> --reason "…"` (`--clear` returns to the default; `--deny` opts the seat in to refusal). When no one
can be asked, the request is permitted with the agent's own allow option, and a person's no is never a grant.
`docs/reference/community-harness-examples/dsh/` is an example runner, and
`node docs/reference/runner-conformance/check-runner.mjs --runner '<command with {agent}>' --name <harness>` checks a
Each permit OpenRig decides by default is recorded once, as a stream item from the seat that wakes no one:
`rig stream list --tag runner-permission-permit`. A person's reply in other words chooses nothing; the read
result carries it whole as `said`, for the runner to pass to the agent as an ordinary prompt, never as the answer.
The installed package's `daemon/docs/reference/community-harness-examples/dsh/` is an example runner, and
`node "$(npm root -g)/@openrig/cli/daemon/docs/reference/runner-conformance/check-runner.mjs" --runner '<command with {agent}>' --name <harness>` checks a
runner with no daemon, model, credentials or network.
`passes_model: true` sends the declared model as `OPENRIG_MODEL`; it does not establish the
effective model. Cursor and Hermes examples leave model passing off pending native qualification.
@@ -581,7 +602,12 @@ not have to tear one down to change it, and you rarely have to start from nothin
human mode it first prints one line with each agent's last known activity, or “unknown”: a
best-effort snapshot, not a record of what was interrupted. With `--host`, a remote teardown
that reports errors exits 2. For a community harness seat it prints `Pane stopped: <seat>`
(`paneOnly` in `--json`): the harness's own processes may keep running after its pane.
(`paneOnly` in `--json`): the harness's own processes may keep running after its pane. Once no
live seat uses a working folder, it takes back what OpenRig added there: its guidance blocks, and
a Claude folder's status line, activity hooks and context collector. It keeps and lists an
edited skills-line block, edited team skill files, and settings or a collector that don't match
what OpenRig wrote or that another seat shares by a link. Any other guidance block goes even if
someone edited it.
- **`rig launch <rig> [seat]`** — one seat is down; start just that one, without disturbing the
rest. It takes the rig's name or ID; a name shared by more than one active rig stops and lists their IDs. Add `--plan` to preview it first, locally or with `--host`; a plan is never sent to a
daemon older than 0.5.9, which would ignore it and launch. A seat whose agent exited to a shell in
@@ -751,7 +777,10 @@ version, from checking the environment to a useful report to the OpenRig team.
effectful handover path.** Both forms perform the operation by default; pass `--dry-run`
to plan without changing the seat. Check the selected source and continuity evidence first. A
seat can be handed over again into its own pane, so a seat left half-handed-over recovers by
running the handover again.
running the handover again. A Claude seat started through a `#!` wrapper that runs Claude without
`exec`, or through the installer's `~/.local/bin/claude` symlink, rebuilds with `--source
rebuild`; a failed rebuild leaves the resume target on the earlier conversation, so rebuild again
rather than relaunching it fresh.
- **`rig seat clear-attention` / `set-resume-token`** — clear a stale attention flag, or repair a
lost resume handle so restore works next time.
- **`rig seat continue <seat>`** — a launch stopped on Claude's bypass-permissions consent dialog.
@@ -821,7 +850,8 @@ version, from checking the environment to a useful report to the OpenRig team.
paste changes Claude's footer hint, and later sends wait behind it; check the seat's composer.
`rig seat status` shows the requested/effective mode; wait for pending activation to finish.
**`rig seat held-messages`** lists what was retained and **`rig seat retire-held-message`**
retires one; changing mode does not replay old held messages. Draft-aware returns the exact
retires one; changing mode does not replay old held messages. A seat that starts, or a successor
that takes it over, with held messages is told how many and how to read them; nothing is replayed. Draft-aware returns the exact
refusal and original ID immediately; callers decide further action, with no daemon retry timer.
- **`rig seat set-terminal-policy <seat> --preset no-peer-interventions|help-within-instructions|full-control
--reason <text>`** — choose how far OpenRig and peers may act on a seat: `--helper <addresses…>`
@@ -844,7 +874,11 @@ version, from checking the environment to a useful report to the OpenRig team.
that stays quiet after `/compact`; they don't wait for its next turn. The managed `/compact` is
kept short enough to run as a command and is sent only to an idle seat; its own result reads
`submitted, unconfirmed` (it reached the seat, not proof compaction ran), `uncertain` (not
replayed) or `not sent`, so confirm by effect. Claude seats that select `openrig-core` load its
replayed) or `not sent`, so confirm by effect. Before each paste (preparation prompt, `/compact`,
restore prompt) it checks the input box and holds that step while the box holds typed,
unreadable or changed input, so a draft needs no typing guard to protect it; the check is a read just before the paste,
not a lock. An idle Claude seat under the installed-update notice still reads idle, so it needs no
hand compaction for that. Claude seats that select `openrig-core` load its
hooks; a seat can give a slow refocus more time with `OPENRIG_REFOCUS_BUDGET_MS` (4500 to 52000).
The refocus work packet stays off by default for Claude Code and Codex;
`OPENRIG_REFOCUS_WORK_PACKET=1` turns it on, with each field bounded.
@@ -1105,14 +1139,16 @@ reaching them is ordinary work rather than an escalation.
System World teaches these mechanics; Project World decides when and why they apply.
Existing `<entityId>@host` blockers are internal custody labels mapped through the registry
to the external participant, not a separate outbound route.
- **`rig gateway human add`** — register a person and their connector binding. Registration or
- **`rig gateway human add`** — register a person and their connector binding, or none: a person
with no connector is asked on Steering and in the Feed only. Registration or
connector changes do not themselves authorize a message. Several people can be registered:
**`rig gateway default <id>`** (or `--default` on `human add`; `--clear` removes it) chooses the
default person, who receives the last escalation step, the notice digest, Mission Control's
my-queue view, workflow fallbacks and pairing approvals. One registered person is the default;
with several and none chosen, those wait (`undeliverable:no-default-person`). A registered person
can't settle an ask that was asked of someone else (`answer_not_recorded`), and a park addressed
to a registered person can be resolved.
with several and none chosen, those wait (`undeliverable:no-default-person`). Any registered
person can settle an ask that was asked of someone else, recorded as themselves beside the person
asked. The first committed answer wins; a later one gets 409 `qitem_already_terminal` and records
nothing. A park addressed to a registered person can be resolved.
- **`rig gateway channel add <id> --display-name <name> --binding
slack:<connectorRef>:<secretsRef>:<channelId>`** — a Slack shared channel as one participant,
`<id>@external` (Slack only). Anyone writing there reaches the team, registered or not. Each row
@@ -1400,6 +1436,10 @@ your circumstances is configuration, and the ones that are not, another agent ca
own risk.** Local assistants can connect locally. Internet access needs your own TLS tunnel or
proxy and a narrowly scoped, revocable token; see `reference/hosted-members.md`. Task terminal
following does not require internet exposure.
- **`reference/daemon-http-clients.md`** — for a program that calls the daemon's HTTP API instead of
the CLI. It covers the registered people, a person's open updates, a rig's outbox (every seat's
messages, newest first) in one request, Slack channels and people without holding the bot token, and opt-in decision revisions,
where a stale `expectedRevision` gets 409 and writes nothing.
- **`rig skill loadout --runtime <claude-code|codex>`** — inspect the exact catalog revision,
selectors, target, and current/missing/shadowed/conflicting state for one working directory.
`--apply` writes only the managed ownership set, is idempotent, and refuses local edits or