Your own subscriptionsImproved
Before your first team starts, setup and rig doctor say which logins it needs, and the operator lets you choose if one is missing.
Every change in each OpenRig release, with the pull request behind it.
Latest release
OpenRig 0.7.15 is a steadiness release. When an OpenRig update changes its own Codex hooks, OpenRig now renews their approval itself, unless you've made your own choice about them, so your Codex agents don't stop at Codex's hook review. A slow daemon start gets three minutes before it's reported pending, a restart now picks up the saved conversation of an agent whose saved startup details are missing instead of stopping, and Slack link previews are off by default. There are fixes across delivery, Slack replies, terminal views and connected agents, many from people using OpenRig.
4 added16 changed9 fixedOpenRig renews its own changed Codex hook approvals. When a new openrig-core changes one of OpenRig's six Codex hook declarations, the launch that installs it renews those approvals from OpenRig's own record instead of stopping at Codex's hook review. This runs at daemon start in the daemon's Codex home, when hooks are on and a Codex seat selected openrig-core, and at each such seat's launch in its own Codex home. It renews only when the installed plugin matches the shipped one and every current approval matches OpenRig's saved record. A person's own choice in any layer OpenRig reads keeps the review; profile files passed with -p aren't read. No real Codex seat ran in its tests.
rig daemon start shows its progress about every 20 seconds.A slow start: rig daemon start now gives the daemon child it started a 180-second readiness budget, instead of 20 s, and prints "Waiting for daemon child <PID> readiness (…s elapsed; 180s limit)" about every 20 s. A quick start still returns at once, and a child that exits ends the wait. Let the wait finish. The budget bounds scheduling: synchronous work can run past the budget. A child still not ready when that budget is exhausted is reported pending as before: "Daemon startup is pending after the readiness deadline". Readiness remains unconfirmed; the child keeps running and the startup reservation is retained. Inspect the address and log it prints, and don't start it again until its restart steps are done: stop the named child PID and wait for it to exit, inspect daemon-start.lock, and only when both recorded launcher and child PIDs are absent, archive the lock and run rig daemon start. rig daemon stop cannot stop that unpublished child.
For an eligible seat in a rig with pods that restore starts in its own pane, a resume token with no saved startup context now lets restore try the saved conversation with an empty plan. It records the startup_context gap. A successful resume with that gap makes the rig read partially_restored; a missing conversation or failed start keeps its own status. No saved startup plan is replayed or saved startup-context row written; the adapter's ordinary bootstrap and existing skill restoration still run. An external CLI attachment is kept, no-token seats still wait for a decision, and legacy seats are unchanged. restore-check reads an eligible seat with a token yellow; for one with no saved context and no eligible token, it points to the read-only rig up <rig> --existing --plan preview.
rig slack setup --unfurl on to turn them back on. A community contribution.Slack previews: posts to a person no longer show link and media previews by default. An existing install stops showing them after its next connector rewire or daemon restart. Run rig slack setup --unfurl on to turn them back on; earlier previews aren't removed.
Stop the daemon, back up the database, install 0.7.15, then start the daemon. Your agents keep running through a daemon restart; don't use rig down, which ends them.
One migration runs before the daemon listens. Migration 165 adds four columns and two indexes to activity_grants, binding a runner's activity credentials to its actual launch. Going back to 0.7.14 after it isn't established; keep the backup.
rig daemon start shows its progress about every 20 seconds.A slow start: rig daemon start now gives the daemon child it started a 180-second readiness budget, instead of 20 s, and prints "Waiting for daemon child <PID> readiness (…s elapsed; 180s limit)" about every 20 s. A quick start still returns at once, and a child that exits ends the wait. Let the wait finish. The budget bounds scheduling: synchronous work can run past the budget. A child still not ready when that budget is exhausted is reported pending as before: "Daemon startup is pending after the readiness deadline". Readiness remains unconfirmed; the child keeps running and the startup reservation is retained. Inspect the address and log it prints, and don't start it again until its restart steps are done: stop the named child PID and wait for it to exit, inspect daemon-start.lock, and only when both recorded launcher and child PIDs are absent, archive the lock and run rig daemon start. rig daemon stop cannot stop that unpublished child.
openrig plugin carries the CLI's version, 0.7.15, and openrig-core moves to 0.1.30.The plugins: the openrig plugin carries the CLI's version, 0.7.15. openrig-core moves to 0.1.30, because its skills changed.
The slow-operation log adds three queue sites and three selected steps of an ordinary nodes read: nodes.inventory.build, nodes.inventory.activity_sync and nodes.inventory.terminal_work. These nodes records are written after a slow call completes; a missing record does not rule out unfinished work or work outside those steps. This changes no behaviour.
The wake ladder reads its prompt-refusal candidates from the open rows, instead of scanning the whole transition log on every tick. It returns the same rows. This removes one repeated scan; it isn't a measured fix for every stall.
The execution view's candidate read steps through the queue in windows and, on its cooperative path, yields to the event loop between them, so a mission filter that matches few rows no longer holds the loop for a whole history walk. One large row, or the history count, can still take time. Inside a transaction, on a memory or temporary database, or on a non-WAL file, the candidate read keeps its synchronous fallback.
restore-check and a full restore warn when a snapshot's named Codex profile has since been cleared from the seat; restore uses the current one. A community contribution.restore-check and a full restore warn when a snapshot recorded a named Codex profile that the current seat has cleared; restore uses the current selection. Nothing is refused.
rig seat restart --keep-conversation can't restart a seat whose tmux session is gone, it gives you the rig launch command that brings it back. A community contribution.When rig seat restart --keep-conversation refuses a recoverable seat whose tmux session is gone, it names the way back: rig launch '<rig>' '<node>' (add --plan to preview).
A context-usage watchdog reads its own seat's current occupant, not an archived generation's. A context watch whose seat can't be pinned, or has no recorded tenure, skips that tick with its reason instead of ending.
rig slack setup --unfurl on|off, and they're off by default. A community contribution.Slack previews on posts to a person are a setting: rig slack setup --unfurl on|off, and rig slack status shows which is in effect from the connector's next rewire. The default is off; see "Behaviour that changed".
Right before an automatic paste into a seat with the draft-aware guard, OpenRig re-checks: it holds the paste after recent client activity, re-reads the input after a short wait, and holds when tmux can't be read. The message is held and retained; rig seat held-messages shows it. An ordinary guarded paste waits about 300 ms longer. This narrows #3076's window; it doesn't close it. This is shown by the change's own tests; it's not yet checked with the real programs on this release.
A terminal seat whose tmux session runs under another name gets the exact text of a send, and a queued wake no longer types OpenRig's From/To envelope into its shell.
When the arrival note is recorded before the answer is routed, an answer to a reply in an older Slack thread posts back into that thread, not as a new top-level message; see Known limits for when it posts top-level. Only the conversation's newest thread answers a parked question, as before.
rig_team for its team by display name is told to leave rigId out, and a hosted member with no wake trigger is told when it picks up work.An assistant that passes its team's display name as rig_team's rigId is told to leave rigId out to see its own team, and a hosted member with no wake trigger is told it picks up work when its person asks, or on a schedule they set.
An external grant that works its own inbox is told only about the tools it's offered.
openrig plugin needs Claude Code 2.1.119 or later; on earlier versions, with its seat setting left blank, the skill loads but the agent has no OpenRig tools.The openrig plugin needs Claude Code 2.1.119 or later. On earlier versions, with the plugin's OpenRig seat setting left blank, Claude Code drops its MCP server: the skill loads, but the agent has no OpenRig tools.
The TUI keeps connected assistants' check-in lines when a rig's seat inventory can't be read, with the error beside them.
Runner activity grants are bound to the actual launch, and the replacement's activation revokes its predecessor's grant. A grant made before this release stays tied to the seat's occupant until then. A grant that can't be bound never blocks a launch or restore. This attributes reports to the run OpenRig selected; it doesn't prove a runner's identity.
A Codex seat's resume command in the node inventory and detail panel is built from what a real resume uses, with a label when the recorded launch differs. Workspace options that aren't recorded per launch can still read as a match.
Terminal views find tmux again when its cached path is gone, instead of tiles exiting 126 until a daemon restart.
SKILL.md with Windows (CRLF) line endings is now found and reaches the seat's managed plugins. A community contribution.A SKILL.md with CRLF line endings is discovered and reaches a seat's managed plugin loadout.
rig context work-install --mission warns when the mission doesn't exist.rig context work-install --mission <missing> warns that the mission doesn't exist, and missionRoot reads null; the exit code is unchanged.
OpenRig's own transitions (daemon@kernel and system:*) no longer count toward ceremony amplification, and the post-restore audit message matches the restore skill.
partially_restored when it works, instead of stopping as not restorable.Restore of an eligible seat with a resume token and no startup context now tries its saved conversation, and a successful resume reads partially_restored. It used to stop with "Harness not started: no startup context" and read the rig not restorable.
fully_restored while a seat restore didn't start (one claimed or added after its roster or snapshot was recorded), or a seat kept in its external CLI attachment, goes unnamed. A seat restore left as a bare shell after "Harness not started" still counts as running in rig ps. restore-check can also say "Restore tries …" for a self-attached member that restore leaves out; that member isn't restored.rig seat held-messages shows it. On 0.7.14, the clipped footer at 80x24 didn't do this.rig seat held-messages. A deliberate send reports failed, and its text stays in the seat's input box. This was seen on 0.7.12 and 0.7.14, and there's no fix for it in this release.rig commands such as rig whoami and rig queue show. Choosing a built-in policy such as standard when your team is set up doesn't change that at launch: the plan shows launch_posture=floor. Each prompt waits until someone approves it, in the seat or through your own agent, so a team can stall while nobody answers.config.toml or hooks.json is a symbolic link, OpenRig records its hook trust under the link's target, as in 0.7.14. A change to key it by the file's own name isn't in this release, and such a seat may be asked to review hooks again. With a linked config.toml, OpenRig can also miss a setting stored for it that turns OpenRig's hooks off, and set those hooks up anyway when it moves them into hooks.json. (#3078)Thank you to everyone whose work is in this release: @dajiaohuang, @Kayhusk, @billbenetti, @Aummadour, @smota, @vanducng, @zichen0116 and @Nikhila-Dhevi-R.
Thanks also for the reports behind these fixes: @Aummadour (#2989), @vanducng (#3128), @Alejandro-SJ (#2990), @billbenetti (#2976) and @Kayhusk (#3131).
Before your first team starts, setup and rig doctor say which logins it needs, and the operator lets you choose if one is missing.
rig queue list filters exactly by --tag, --mission and --slice, and several tags must all match. Thanks to @Aummadour.
rig terminal open --provider herdr reuses a live Herdr workspace, and Rex tiles show each agent and what it's doing. Thanks to @Kayhusk and @Tankard.
Stop the daemon, back up the database, install 0.7.14, then start the daemon. Your agents keep running through a daemon restart; don't use rig down, which ends them.
Three migrations run before the daemon listens. Migration 163 adds the network_installations table and four columns to network_bindings. Migrations 164 and 166 build indexes. The author's measurement of 166 took 3.47 s on 28,976 rows, not a real installation's size, so a large database can take longer. The write overhead, and going back to 0.7.13 after these three migrations, aren't established; keep the backup.
rig daemon stop can't stop that child.If the start is reported pending: the CLI waits 20 s, then may print "Daemon startup is pending after the readiness deadline". Readiness remains unconfirmed. It leaves the child running and the startup reservation retained, without recording the daemon. Inspect the address and log it prints. The child may later answer, and status can then report it running, but that does not finish this start's recording or release its reservation. Don't start it again until the steps below are done. The message's restart steps stop that child and clear the reservation: stop the named child PID and wait for it to exit, inspect daemon-start.lock, and only when both recorded launcher and child PIDs are absent, archive the lock and run rig daemon start. On a large database the new start can be reported pending again; reaching a recorded start this way hasn't been tested. rig daemon stop cannot stop that unpublished child.
openrig plugin now carries the CLI's version, 0.7.14; openrig-core stays 0.1.29.The openrig plugin carries the CLI's version, 0.7.14; openrig-core stays 0.1.29.
rig ps --nodes, the TUI and busy agents now take turns, one step at a time, instead of arriving as one burst.Node reads (rig ps --nodes, the TUI, several agents at once) take turns, one step at a time. In the change's own tests, health checks and queue reads were no longer held behind a whole burst. A comparison under load didn't attribute a gain to this change: health checks and queue reads were faster for the release as a whole, rig ps --nodes showed no change, and sends were inconclusive.
Bounded queue listings over retained history use indexes for their ordering and for live and archived owner notifications.
Codex seats re-checked in one readiness poll share process listings where each seat's observation order and the 2 s freshness allow; each keeps its own later observation and its own fallback.
New tmux servers raise their soft open-file limit to 8,192 or the hard limit where they can, keeping an already higher limit. This makes descriptor exhaustion less likely as panes and viewers add up; servers already running keep their limits.
A delegation parent gets one standing notice per child seat for unclaimed rows, not one per row, and held work gets its notice back when its typing hold clears.
An assistant connected over MCP reaches a seat by its plain name, stored under the seat's actual session; an unknown name, or one several seats match, says so.
This is for hosted agents connected through a grant service (experimental); seats OpenRig launches behave as before.
rig ps, rig_team and the TUI.Connected assistants appear, with their check-in, in rig ps, rig_team and the TUI's tables, and their person sees plain tool titles.
A team your agent hands work to knows how to ask you a question, and your answer wakes it. A click on an ask with several questions records that choice; the ask stays open until the last one.
openrig plugin for Claude's plugin directory follows handed-on work and keeps its reply route.A skill-only edition of the openrig plugin, for Claude's plugin directory, follows handed-on work and keeps its reply route.
When the readable person registry holds nobody, rig daemon start and rig gateway participants tell the setup agent to offer registration. The kernel operator is taught to include that offer in its greeting and register only on your yes.
A pairing request's description of itself is quoted wherever it's shown.
/model picker in Claude Code or Codex: it's refused until you close the picker, though this hasn't been checked with the real programs yet.An ordinary send is refused as needing input while an open Claude Code or Codex /model picker is positively identified; nothing is typed. Close the picker before trying to deliver the message. This is shown by the change's own tests; it hasn't yet been checked with the real Claude Code and Codex programs on this release.
rig up --existing, no longer adds OpenRig's guidance to your tracked AGENTS.md on Codex 0.164.0 or later in a rig with pods.On a resume of a Codex seat's own conversation in a rig with pods, including rig up --existing, OpenRig avoids adding missing guidance blocks to the repository's tracked AGENTS.md when Codex is 0.164.0 or later, no guidance file or developer instructions are configured, and the configuration and block sources can be read.
With recovery.auto_drive_provider_prompts on, Claude Code's gated-grants trust check is never answered for you, and the plain trust prompt is answered "Yes".
rig broadcast now shows a held recipient as retained, not sent.rig broadcast prints a held recipient as retained, not sent.
Account erasure also removes OpenRig's own wakes and notices for that account's seats.
A snapshot without sessions returns its invalid_snapshot_data blocker instead of throwing a TypeError; the restore still stops there. A retried no-launch import recovers the original rig by its operation ID.
A rebuilt briefing limits optional superseded recap paths to the newest three by default when one folder covers that history; the current recap and all artifact records remain. Other layouts keep the full list, and output.rebuild_recaps set to 0 lists all paths.
rig compact --state names the input check that stopped a managed compaction, and the TUI graph shows an unknown agent as unknown.rig compact --state names the input check that stopped a managed compaction, and the TUI's graph shows a seat the daemon reads as unknown as unknown.
rig workflow validate warns that harness pins aren't checked. A community contribution.Setting a context-pressure threshold explains when an environment override inverts the pair, and rig workflow validate warns that harness pins aren't checked against seats.
The config browser's entries say each setting's type, choices, range, format and write route.
rig network is experimental and unsupported, and its connector runs even with nothing bound.rig network is experimental, unsupported and at your own risk. Its connector isn't inert: the daemon starts it, sweeps leftover credential folders and schedules local rounds even with no binding.
A grant service can hold back only new work under its fair-use limit, and an app can read what needs a person, and the answers to it, by link.
Node reads: a nodes response is no longer one snapshot across its steps, and in a burst each nodes response comes later: about 43 ms against 21 ms median in a 24-request burst. One very large rig is still one step.
An assistant naming a seat now hears three errors: destination_ambiguous (several seats match; the candidates are listed), destination_not_found (no seat it can reach has that name) and destination_unchecked (the team couldn't be read; try again).
rig roster still prints it. (#3105 isn't in this release)git status. A block whose source can't be read is reported missing.config.toml or hooks.json is a symbolic link, OpenRig records its hook trust under the link's target, as in 0.7.13. A change to key it by the file's own name isn't in this release, and such a seat may be asked to review hooks again. With a linked config.toml, OpenRig can also miss a setting stored for it that turns OpenRig's hooks off, and set those hooks up anyway when it moves them into hooks.json. (#3078)Thank you to everyone whose work is in this release: @Kayhusk, @billbenetti, @cavalcanticampos, @Aummadour, @Tankard, @w4rc0n and @Totopo27.
Thanks also for the reports behind these fixes: @Kayhusk (#3035), @Tankard (#2583), @dajiaohuang (#2529), @billbenetti (#2728), @emilio-gagliardi (#3087), @korallis (#161) and @w4rc0n (#3017).
When a runner agent asks permission, your answer now gets a note back: who decides it, and whether the tool ran. The waiting agent has the decision in about half a second. If what you typed isn't clear, the agent reading it asks you back in your Feed, and your reply decides. Closing a request without deciding permits nothing.
A Claude agent that hits its usage limit now waits for the reset time in Claude's message, for example "resets Nov 10, 4pm", and picks its work back up then. Before, it was retried every few minutes. Thanks to @cavalcanticampos, and to @alperta for the report.
Before your first team starts, the operator tells you which commands it will ask about. It then makes one offer: allow the command families your goal repeats, for this project only. Say no and the team's defaults stay, and the offer isn't repeated.
Setting up OpenRig now offers to register you as the team's person, so your agents' questions have somewhere to go. rig daemon start and the rigs skill both make the offer. Nothing is registered without your yes, and rig gateway human add registers you any time.
OpenRig now keeps your edits to its blocks in AGENTS.md and CLAUDE.md, and removes duplicate copies it recognizes. You can tune its guidance for your project without the next update undoing it.
Back up the database, install 0.7.13, then restart the daemon: rig daemon stop, copy the database file (rig config get db.path prints its path), install OpenRig 0.7.13 using your existing installation method, then rig daemon start. Your agents keep running through a daemon restart; don't use rig down, which ends them. Three migrations run on the daemon's first start: 160 and 161 (for the experimental hub connector below) and 162 (indexes for session reads). Going back to 0.7.12 after them isn't established.
openrig plugin now shares the CLI's version number. If a Codex agent asks for hook approval after the upgrade, approve the hooks to continue.openrig-core is 0.1.29, and the openrig plugin now carries the CLI's version, 0.7.13. A Codex seat can ask for hook approval after the upgrade; see Codex hook review after an upgrade below.
A connected assistant (a hosted member; experimental and off by default) shows whether it's checking in, against a cadence its roster entry states (check_in_minutes, or check_in_on_request: true): checking in, overdue, no check-in yet, on request, or unknown. rig roster show and find print it as a Check-in line. It's a status only: work for a member that isn't checking in still queues and rings as before.
A handover whose successor was launched but not ready says it may be running, instead of "retry": look at the pane first. A handover also cleans up the retiring occupant's own claims and jobs.
rig unclaim, the guidance tells you to end the adopted session's process and tmux session, and a fresh launch reopens the tmux server when it needs to.After rig unclaim, the guidance for an adopted session says to end its process and its tmux session, and rig seat stop's help matches. A fresh launch after rig unclaim ended the server's last session reopens the server.
A handover whose successor was launched into the seat's own tmux session can reclaim a claim left by a removed owner, or by an archived owner whose latest session for that node is superseded, detached or exited; a live owner still refuses. When a seat with no declared route can't be woken, the finding goes to the item's creator, skipping a creator that is a terminal seat.
Speed: the daemon is much more responsive while it reads a project's proof, which now yields between missions; current-session reads for the node inventory use an index; the daemon's recorder and Linux clipboard discovery no longer wait on the main thread.
rig seat clear-attention checks, how compaction notices are routed, and how to start one stopped kernel seat with rig launch. A community contribution.Docs: what rig seat clear-attention's check proves, how managed compaction notices are routed, when the keyboard moves in herdr-app, a complete periodic-reminder registration, and starting one stopped kernel seat with rig launch.
Codex and Claude: completed Codex 0.167 turns read idle, and unsupported versions stay unknown; a usage-limit banner with a curly apostrophe is detected; refocus bounds Codex context and records what it left out; an unreadable Claude status-line cache gets its own reason.
TUI and CLI: instance rows are grouped by rig; for a quiet seat the daemon explicitly reads as unknown, the list, explorer and agent-detail status rows show unknown, not idle (screen motion still shows active, a daemon that serves no activity keeps the screen fallback, and the topology graph is unchanged); Feed times use the configured time zone; the CLI doesn't call a daemon stopped when the shell can't see its process (a sandbox), and says not to start another; ssh options are separated from the target, and the generated attach command quotes the session name.
Scope and workflows: qualified slice reads and proof discovery are scoped by mission; workflow spec reads are recorded across restarts; the spec library skips synthetic alias entries.
rig network connects one local seat to a hub you already have. Experimental and unsupported.rig network connects one local seat to a hub you already have. Experimental, unsupported and at your own risk. The connector uses the MCP SDK, which the installed package already included in 0.7.12.
A runner's answer is confirmed to you. Through 0.7.12 no note came back, and the runner waited for its next read.
A usage-limited Claude seat waits for its stated reset; don't release it by hand on a timer. A failed handover may have left its successor running; look at the pane before retrying.
rig host doctor checks them. A community contribution.Passive SSH host status reads unknown. Routine host listings no longer open a TCP connection to SSH hosts, because repeated probes closed without a handshake can make OpenSSH block real logins for a while. Hosts that used to read reachable now read unknown; rig host doctor still checks actively.
rig package install leaves a guidance file with a damaged OpenRig block alone and lists it, instead of adding a second copy.rig package install leaves a guidance file alone when a recognized managed block has no complete marker pair, lists it under "Left as it is:" and installs the rest, instead of appending a second copy. Launch and restore name such a file (guidance_block_markers_damaged).
rig up --existing can write OpenRig's managed guidance into a tracked AGENTS.md, leaving the worktree modified; check git status after either operation.rig up, rig start and rig context start the daemon without printing the offer either. Register with rig gateway human add. While nobody is registered, a later rig daemon start offers again, even after a no; nothing is registered without your yes. (#3028, #3041 isn't in this release)rig queue create invocations had a median about 10.4% slower than 0.7.12 (about +29 ms). Send latency stayed within the comparison's unchanged range. The cause remains unidentified. The standard idle-memory comparison was inconclusive. A post-hoc analysis of the same six runs found 7.9–8.6 MiB (4.2–5.3%) higher daemon RSS across three matched idle windows, using the median of three arm medians per version. The cause and steady-state behavior remain unestablished.rig up --existing stopped for hook review in each Codex pane; approving the hooks resumed all three conversations. A separate test of the same upgrade on a fresh Codex home, on another host, restored without review. The cause of the difference is not established.&&, ; or a pipe still asks unless every part is allowed, and OpenRig's own lifecycle commands still ask on Claude seats. (#3029)claude -p. If an interactive seat's limit report doesn't carry the message, the seat is retried as before. A reset in the past or more than 8 days away is ignored. (#2917)rig down keeps no stored host or boot identity, doesn't guard against another program running as you, and a daemon restart between losing the tmux server and the stop wasn't exercised. (#2962)agents.operator_session) that runs in an explicit or auto permission mode gets no OpenRig allowance for rig host approve or rig host deny, so Claude's review can refuse them.rig seat stop no longer suggests rig down for an adopted session (#3006). They weren't re-checked for this release unless named here.Thank you to everyone whose work is in this release: @Aummadour, @Kayhusk, @Coder8124, @DeryFerd, @EZotoff, @hgreene624, @cavalcanticampos, @ziadeh, @dajiaohuang and @billbenetti.
Thanks also for the reports behind these fixes: @jamesloosli (#2879), @Kayhusk (#2880 and #2951), @CaptObvious (#2948 and #3016), @alperta (#2917), @ziadeh (#2960) and @todd-dhango (#2984).
Your answer goes to an agent. Through 0.7.11 some answers acted on the request directly, and some had no receiver when no operator was set. Now these answers use the configured receiving agent or the kernel operator, with the question included. Answers wait when no receiver is available.
rig down now stops only the terminals it started, and names any it left running so you can stop them yourself.rig down is more careful. It stops only a tmux session that carries the seat's own OPENRIG_NODE_ID, on the server and session it read. A terminal OpenRig didn't create, a mismarked one or a replaced one is left running, and rig down exits 2 naming it and how to stop it yourself. A seat joined with rig attach as an external CLI is listed as not stopped, since OpenRig never stops it; that alone doesn't make rig down exit 2.
Codex "Hooks need review" with smol-toml 1.9 no longer needs a manual workaround.
A community harness can declare protocol: pi-rpc, presets can carry launch wrappers, and a seat can switch between Pi and another runtime. The community-maintained nodecode runner is listed in the reference.
Pi and OMP: typed edits submit in order on the affected Node releases (22.21.x to 22.22.0, 24.9.0 to 24.11.1, 25.0.0 to 25.1.0) instead of appending an insertion at the end.
rig down now stops only the terminals it started, and names any it left running so you can stop them yourself.rig down is more careful. It stops only a tmux session that carries the seat's own OPENRIG_NODE_ID, on the server and session it read. A terminal OpenRig didn't create, a mismarked one or a replaced one is left running, and rig down exits 2 naming it and how to stop it yourself. A seat joined with rig attach as an external CLI is listed as not stopped, since OpenRig never stops it; that alone doesn't make rig down exit 2.
openrig-core is 0.1.28. A Codex session kept running across the upgrade can ask for hook approval until it's relaunched.
rig gateway human add. Setup's guidance now asks your agent to offer it, and nothing is registered without your yes.Setup's guidance asks your agent to offer to register you as the team's person. In testing the agent didn't reliably make that offer (0 of 5 runs). Registering works when you ask for it: rig gateway human add. Nothing is registered without your yes, an existing default person is kept, and no person is chosen automatically. The empty-registry hint is right. A team you start from your own assistant fits your own logins, with a review before anything is committed.
Answers nothing else reads, such as a host pairing request or a mode's scheduled end, use the configured receiving agent or the kernel operator. Answers wait when no receiver is available, and nothing decides them meanwhile. To decide one yourself, use its own command: rig host approve or rig host deny for a pairing request, rig seat decide-permission for a runner's request. Closing an ask isn't permission, and words that were kept aren't a default permit.
Pairing answers go to the receiving agent, and you can decide directly in the TUI's pairing settings. A pairing request says who it went to and who reads the answer.
A runner's permission answer goes to the receiving agent, which decides while the runner waits, so a qualified answer such as "only if it's the test file" is read before anything acts. Your answer is kept and an explicit decision works, but the runner's confirmation updates to you aren't written in this release. Don't expect a confirmation in the Feed, a notice of the receiver's state or an immediate wake: the decision reaches the runner at its next read (up to about 21 seconds in testing). To decide one yourself: rig seat decide-permission <askId> --option <id> --reason "…". This is the runner's path only: a pairing request says who reads the answer, as above.
OPENRIG_RELAY_MODE=pull. A community contribution.A relay connector that can't accept incoming connections can pull pending messages for a person instead of being pushed to: set OPENRIG_RELAY_MODE=pull in the relay secrets file. Push stays the default. A person's gateway binding can be unset.
rig terminal open <view> --provider herdr-app. A community contribution.rig terminal open <view> --provider herdr-app opens a Rig view inside the herdr-app desktop window.
Queue content can be erased for closed-work retention and account deletion, and a retried create can't bring erased work back.
Each send records what's known about its delivery in one transport.delivery_evidence event: what was admitted, what reached the input, what the screen check showed, and for which occupant.
rig queue create flags an unresolved scope, rig queue show names a handed-off task's successor, and a custom blocker says what it's waiting for. A community contribution.rig queue create advises on an unresolved scope, slice lists show observed queue counts, a proof policy can require every listed judge, the execution ladder shows each slice's recorded status, rig queue show names a handed-off row's successor, and a custom blocker ID explains the wait.
rig seat status shows when that guidance was written.Every seat's managed guidance points to its skills, help and project context. rig seat status shows when guidance was written relative to the session's recorded moments, and what the seat's refocus hook recorded. A rebuilt seat's briefing lists older recaps as optional history.
rig queue show and rig parked are faster: they no longer re-read every item. A community contribution.Speed: queue listings, rig queue show and rig parked stop re-reading each item; the stuck sweep yields by elapsed time; Markdown section ends are found in one pass.
Delivery and drafts: Claude seats with a custom status line read idle and verify sends; a fresh idle hook doesn't type into a current Claude dialog; Claude's context hint and drawn cursor are read correctly; when the input can't be read, a deliberate override (--dangerously-interact) pastes with a warning and doesn't press Enter, so it isn't submitted; update notices beside the paste hint are recognized.
Codex: when you answer a Codex choice prompt, a message waiting on it is delivered instead of escalated; a working counter is compared only within one pane process; hook trust records are written under smol-toml 1.9, so launches no longer stop at "Hooks need review".
rig daemon start clears a reservation left from an earlier boot, and a Claude agent resumes the right conversation. A community contribution.Restore, start and handover: owed restore input is delivered after a bounded wait on unknown readiness; compaction uses the draft defaults and reports repeated unsent preparation; rig daemon start archives a start reservation left from an earlier boot; the kernel restart guidance describes the existing recovery; an earlier occupant can't replace a Claude seat's resume target; token switches keep the Claude launch; rebuild continuity and Codex launch choices are explained.
Queue and recovery: a polling hosted member (an outside assistant on the team; experimental and off by default) gets one standing notice; a hosted member's ring that times out reads unknown, and durable recovery doesn't repeat that recorded wake (other recovery paths can still ring it again); unroutable items wake as soon as the seat is reachable; the stuck sweep counts a finding once; a handoff doesn't change an escalation's owner; findings route to the seat's own fallback; a park on an outside condition with no wake says so; rig workflow validate is read-only.
Slack and people: a Slack reply that can't be read says the message "may have posted"; threads are recovered when needed; an ask settles after its original message is deleted; eligible asks post when quiet hours can't be read, marked when OpenRig can't fully check them; a held ask whose person has no connector closes as no-connector; update delivery is described without assuming Slack.
rig context recap-write writes where every reader looks, the installer tells you how to fix PATH, and daemon credentials stay out of a tmux server's environment from its next start. A community contribution.CLI and config: rig context recap-write writes where every reader looks; config accepts two keys the daemon already resolves; rig whoami says the team is still being built during rig up; rigs with @ in the name find attention; a seat waiting on a person names its question; the installer reports PATH gaps with shell hints; daemon credentials stay out of a tmux server's environment from its next start (a server already running keeps its old environment until it restarts).
Terminals: a Herdr grid whose blank filler cells have no label is confirmed, instead of reading every seat unconfirmed.
rig down leaves alone any terminal it can't show belongs to the agent.rig down leaves terminals it can't show belong to the seat; see Before you upgrade.
rig daemon start now archives a start reservation left over from a reboot, so you no longer clear it by hand. A community contribution.A daemon start reservation left after a reboot is archived by rig daemon start; don't clear it by hand.
rig down: a terminal it leaves running stays running until you stop it. It doesn't keep a stored host or boot identity, doesn't guard against another program running as you, and a daemon restart between losing the tmux server and the stop wasn't exercised. (#2962)agents.operator_session) that runs in an explicit or auto permission mode gets no OpenRig allowance for rig host approve or rig host deny, so Claude's review can refuse them. A kernel receiver in auto mode is included. The default kernel with the default policy passed at its tested scope.AGENTS.md restore; Codex account-home, upgrade and continuity checks; the OpenShell worker's second report; Pi model switches on real providers; ACP in a desktop app; Slack directory paging; some Slack setup cases (channel and thread precedence, a stopped receiver's delayed pickup, an inherited inbound default, a plain yes with no receiver); native checks of #2786, #2799, #2807 and #2813, with #2947 partly; a button-and-words answer, a non-pairing ask with an explicit owner, Steering's Approve page, and these answer and setup checks on a default model (the tested runs used smaller models); --wait-for-kernel (#2888), the installed effect of #2800, and #2720 beyond one platform.Thank you to everyone whose work is in this release: @billbenetti, @oodadoudou, @DeryFerd, @Aummadour, @seanmcn, @w4rc0n, @ziadeh, @vanducng, @smota, @sn1thy, @dajiaohuang and @Vaishnavi220506; to @KM199, co-author of #2947 and #2952, which finish their #2513 and #2515.
Thanks also for the reports behind these fixes: @nassersala (#2955), @djuntgen (#2804), @todd-dhango (#2851), @Kayhusk (#2796), @pr0xc3nt4ur1 (#2849 and #2850), @amsayfi (#2776), @oodadoudou (#2847) and @CaptObvious (#2933 and #2942).
Late verification update: a real Codex lifecycle journey passed its tested launch, same-conversation snapshot restore, existing-rig resume, Core restart with native sessions retained, and fresh-handover task cases. The packaged notes still list that journey as not run because this result arrived after their seal. This does not establish all models or all bidirectional team workflows.
Known limitation: a Codex snapshot restore or rig up --existing can write OpenRig's managed guidance blocks into a tracked AGENTS.md, leaving the worktree modified. Check git status after either operation. Snapshot restore was already disclosed in 0.7.11; the existing-rig trigger is newly observed, and its regression status is not established. A repair is selected for 0.7.13.
The Codex account-home smoke is partial: launch passed, while the account switch was not run after its dry-run requested a named saved profile. Codex ring-2 upgrade coverage and the Codex half of the person-setup checks remain not run at this release decision. The other limitations and coverage omissions in the release notes still apply.
The openrig plugin, shipped beside openrig-core, lets a person hand work to their local team from their own Claude Code or Codex, follow it, answer the team's questions and read the result. The plugin's README has the steps. VS Code, Copilot CLI and Cursor install it with no seat. Answers are recorded exactly as typed.
rig acp serve makes it an ACP agent, so a prompt becomes a task and the team's answer comes back as the reply.rig acp serve --to <member@rig> runs OpenRig as an agent in ACP apps such as Zed and T3 Code: a prompt becomes a queue task, each task the work reaches shows as a step, the closing resolution is the reply, and the team's questions reach the app while a turn is open.
rig config set transport.draft_delivery refuse.Under the default deliver, an ordinary send or work notice to a seat whose prompt holds a person's typed draft pastes the message at the cursor and submits the combined input, and the result says whether submission was confirmed. Menus, permission prompts, the typing guard, managed compaction and --wait-for-idle still refuse or wait.
/compact at the next idle moment instead of asking again. A community contribution.A prepared managed compaction is held as prepared and sends /compact at the next idle moment instead of asking the seat to prepare again. rig compact --state shows it and --cancel disarms it. Managed compaction also sends /compact under Claude Code's bare update banner.
On Linux, a daemon run as a systemd user service starts the seats' tmux server in its own user scope, so stopping or restarting the daemon's unit no longer ends the seats. A daemon started from a login session starts the server as before.
Run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. Back up your database first. Five migrations run at the daemon's first start (150 to 154). With the daemon stopped, copy the file $OPENRIG_DB names. Going back to 0.7.10 after these migrations isn't established.
The openrig-core plugin moves from 0.1.26 to 0.1.27. Its activity relay and refocus hooks and three skills changed. The CHANGELOG says replaced files are kept under $OPENRIG_HOME/backups/managed-refresh/<id>/ for reapplying local edits; this release's checks didn't test that route.
rig config set transport.draft_delivery refuse.Sends now join a person's draft (transport.draft_delivery = deliver). To keep the old refusal, run rig config set transport.draft_delivery refuse.
PI_CODING_AGENT_DIR in its env: is used as one and needs an auth.json there. A Pi seat that already has its own login can stop at launch, so check those first. A community contribution.A Pi seat that declares an absolute PI_CODING_AGENT_DIR in its env: now uses it as its account home and needs a readable auth.json there, or the launch stops. A Pi seat that already has its own Pi login also stops at launch when its spec declares an absolute PI_CODING_AGENT_DIR, even if that folder has an auth.json; the seat's login is kept, and the error names a missing account file rather than the existing login. This is shown by source and function-level tests, not a native run.
Linux, with the daemon run as a systemd user service: the seats move into their own scope only when their tmux server next starts fresh. Until then, stopping or restarting the daemon's unit still takes the seats down.
A draft only the input box shows is caught by one read before pasting.
Claude seats showing a statusLine or the background task panel read as a normal composer under the draft-aware guard.
A full held-message quota no longer drops a sender's later messages, and seats stopped while they owe work don't get a burst of undeliverable notices at each daemon start.
on_restore: follow_source. A community contribution.on_restore: follow_source on a skill refreshes it from its source when a seat is restored; keep_saved stays the default.
/compact instead of a refusal.The final /compact allows for the preparation's own fresh activity (23 seconds, against 9), so a seat that's already idle gets /compact instead of a refusal.
A restore stopped at a prompt, such as Claude's resume selection, clears itself once the seat runs the conversation it was restoring.
A work notice refused at a prompt no longer goes in right after "Compacted" while the compaction still owes its restore request.
A Codex helper inside a Claude seat no longer becomes the seat's resume token; a Claude rebuild handover checks its priming packet; restoring activity hooks finds the agent's own source.
@openrig/acp launcher runs the matching CLI's rig acp serve through npx.The @openrig/acp launcher runs the matching @openrig/cli's rig acp serve for the ACP registry's npx launch, released at the same version.
Assistants connected through a grant service can list and answer the team's questions as a registered person, and --task-destination names the receiver for new tasks.
The relay gateway connector sends questions, updates and notices to an operator-owned bridge over loopback HTTP and takes replies back. The bridge is yours.
The web UI's For You feed answers a local ask's questions on its card.
--host, and whoever held a task hears when another machine takes it over. A community contribution.rig queue show, list, transitions, update and block take --host <id>; cross-host handoffs that override a claim notify the claimer.
rig queue artifact knows what to diff.An openrig.code-result/v1 manifest gives rig queue artifact the commit pair to diff.
rig workflow unregister removes old versions, and trace --full shows the whole trail. A community contribution.Workflows keep their own spec and root objective, rig workflow unregister removes versions, and trace --full returns the whole trail.
One backlog notice replaces a finding per task for a seat that reads without claiming; claims read working while a Claude owner has a live background shell or a managed restore is owed.
workspace.root. A community contribution.A helper harness inside a seat no longer reports its turns as the seat's; refocus traces projects outside workspace.root.
rig provider switch, and Pi seats with their own account home start and resume again; the switch is new, so check the seat afterwards. A community contribution.rig provider switch --seat <pi seat> --to-account <name> --account-home <dir> --reason "<why>" moves a Pi seat to another account through a confirmed successor (--dry-run shows the plan); in our native run the successor started but the switch wasn't completed, so a completed switch is untested. A Pi seat whose spec declares its account home starts and resumes again.
--settings JSON that contains spaces verify again, and launcher scripts that exec Claude's symlink are recognised. A community contribution.A Claude seat launched with --settings JSON written with spaces can be verified again, and a Claude launcher script that execs the native installer's symlink becomes ready, with --no-chrome recognised; in our test, 0.7.10 also became ready under the same chain, so this isn't a demonstrated fix.
launch_wrapper works for Claude Code, Pi and Codex seats, and a wrapped seat never starts without its wrapper. A community contribution.launch_wrapper works for local Claude Code, Pi and Codex seats, and a wrapped seat never starts unwrapped.
Claude seats that load openrig-core themselves stop loading its skills twice.
rig attach --self outside tmux, rig host pair --timeout, clearer rig config set warnings, and steadier daemon start and stop. A community contribution.Also: rig attach --self outside tmux, rig host pair --timeout, rig config set naming a masking variable, daemon start and stop treating a blocked probe as unknown.
Answers to a pairing request now reach the target's kernel operator. When the target has an operator that can receive them, typed words and Approve or Deny choices in the TUI, Steering or Slack go to that agent as replies, and receiving one neither grants nor denies access. The operator acts on clear intent with rig host approve <code> or rig host deny <code> and asks back when the answer is unclear. Both commands also work from a plain terminal on the target, using its operator bearer (OPENRIG_AUTH_BEARER_TOKEN, or --bearer <token>). An Approve click on a request the operator owns waits for the operator to act; a stopped operator keeps the request, and the answer waits in its queue.
Checked on this package: real Slack with a real operator agent in one run (a button or a typed yes approved, a no denied, and a qualified reply got a clarifying question before the refusal denied it); the real TUI without a model (answer credentials, typed answers asked again with no operator, plain-terminal approve and deny, and expiry); and 29 of 29 contained cases with synthetic credentials. Not run: an agent reading answers given in the TUI, Slack thread replies beyond the tested path, and Steering in a browser.
With no operator, one that can't receive answers, or one OpenRig can't determine, the request says so: Approve and Deny decide directly, and a typed reply gets another ask instead of a denial (the no-operator case was checked; the other two come from the source).
TUI answers use the daemon's operator bearer when one is configured; a missing or wrong one leaves the answer unrecorded and says what to set. Ordinary terminal calls keep their own credential.
Denying or dropping a host pairing request in Steering now gives the requesting machine no access. The problem, that action returning the daemon access token, was found in the 0.7.9 and 0.7.10 source and reproduced with synthetic credentials on an earlier 0.7.11 build.
Herdr follow views work on macOS too (protocol 22).
Writable tiles reflow with the screen: they attach as in 0.7.10, so the screen in use sizes the seat and text reflows on resize, and once attached tmux handles typing and paste directly. Read-only tiles keep showing the seat without attaching, typing into it or resizing it. Fixed web geometry is opt-in (terminal.fixed_geometry, off by default); that browser option wasn't exercised in our checks. Checked in one run in real Herdr 0.9.5 on tmux 3.4 (reflow while viewing, typing and paste once attached, and a tmux window fixed by hand at 80x24), with typing and paste also checked on tmux 3.4, 3.3a and 3.6; phone-size screens and tmux 3.3a weren't run in Herdr.
Closing the herdr-core terminal that started OpenRig no longer ends the daemon or its seats. After merging, @w4rc0n ran a real close with herdr-app 0.1.13 in an isolated Linux sandbox: without the change the daemon, tmux server and seat ended, and with it they kept running. That sandbox had no systemd --user, so herdr-core's service-unit path wasn't run, and a tmux server started inside the terminal before the daemon still ends with it.
rig doctor says why tmux control mode is off. A community contribution.Terminal snapshots keep colours, a reattach during a broker teardown works, and rig doctor says why tmux control mode is off.
The stuck sweep batches its reads: on a copy of a busy 340 MB database, a pass went from about 11 s to about 5 s and the longest stall from about 10 s to 0.57 s.
view.changed isn't stored any more, and retention.events_days can prune history-only events, which can't be undone. A community contribution.view.changed events are no longer stored, and opt-in retention.events_days prunes eight history-only event types.
daemon.seat_poll_interval_ms lets you trade activity freshness for daemon CPU. A community contribution.The web UI loads the newest 100 events; daemon.seat_poll_interval_ms trades activity freshness for daemon CPU.
Docs and tests. Daemon HTTP clients and bearer tokens, the 0.7.10 capability map, a neutral TUI demo snapshot, a web UI editor timer, and test and CI fixes.
rig config set transport.draft_delivery refuse brings the refusal back.Sends and work notices that were refused with prompt_draft now go through by default, joined to the person's draft. rig config set transport.draft_delivery refuse restores the refusal from the next send, and under refuse a draft only the input box shows now refuses too.
PI_CODING_AGENT_DIR uses it as its account home, and won't launch without an auth.json there. A community contribution.A Pi seat with an absolute PI_CODING_AGENT_DIR uses it as its account home; no auth.json, no launch.
/api/events no longer sends view.changed. A community contribution./api/events no longer emits view.changed.
The stuck sweep files one backlog notice where it filed one per task.
rig compact over it reports already_in_progress. A community contribution.A prepared managed compaction stays waiting, and a manual rig compact over it reads already_in_progress.
HC_SCOPE, HC_TERMINAL_ID or HC_TERMINAL_SOCKET. A community contribution.The daemon and seats no longer inherit HC_SCOPE, HC_TERMINAL_ID or HC_TERMINAL_SOCKET.
Read-only terminal tiles show the seat without attaching; writable tiles attach as in 0.7.10, and detaching ends that viewer while the agent keeps running.
rig host approve or rig host deny.On a target with a kernel operator that can receive answers, an answer to a host pairing request no longer decides it: the operator decides with rig host approve <code> or rig host deny <code>.
✔ Update installed banner can paste the message and not press Enter, leaving it typed but unsent. Look at the input box before sending again. A fix is on main (#2786) and isn't in 0.7.11. Managed compaction under the same banner sent /compact 3 of 3 times in our test.rig compact <seat> --skip-map is the supported manual recovery route, subject to its normal idle and delivery checks; this route was not exercised by the 0.7.11 release checks./compact. Run rig compact <seat> --cancel, then send a restore request naming the newest restore map, marker and packet. A work notice refused at a prompt now waits for that step, but notices at daemon start and on a new handoff don't check for it yet. (#2575, #2666)delete-owned) now works for a custom image, and recreate and an exact resume passed in our native run. A restored guest takes in its startup content again, so strict recall after a restore isn't met. In our run, finishing the guest's task was assisted and time-boxed, so whether it finishes unassisted is unknown. Never give the guest the daemon's main API port (normally 7433), and after a same-generation reconciled launch, run rig environment connect yourself. (#2755)rig down can start a duplicate claude --resume for a moment. It's pre-existing and the same on 0.7.10, and we saw no conversation write from it.refuse, an unreadable input box lets the send go ahead, so an undetected draft goes with the message; under deliver, a result may not mention a draft it joined. (#2645, #2653)draft_input_unknown still isn't retried. (#2605)[file reply], keeps no words there and doesn't deny (from the source; not run). (#2900)rig host approve or rig host deny sends its outcome directly. A request that expires unanswered gets no further update. This comes from the source; no restart case was run. (#2900)env -u ordering is tested in macOS CI; for GNU and BusyBox it rests on their documented behaviour, because the Linux CI job doesn't exercise that branch. (#2782)rig terminal open; for a --follow view, use --no-follow first, then open a fresh view. The agent and its conversation aren't touched. In our run, kept 0.7.8 and 0.7.9 views kept their process, session and history through the upgrade and the refresh, but they already reflowed before it, so this isn't shown to repair a frozen viewer, and the follow-view upgrade didn't confirm, so it isn't qualified. (#2868)keep_saved skills: a skill whose source changes between rig down and the restore comes back missing, named in the restore's warnings; an edited seat copy is kept. (#2626)rig exec: checked with Claude Code and Codex through their ACP adapters. A cancel is acknowledged, not settled, and says nothing about further spend. Cancel with rig exec cancel, not rig acp cancel.openrig plugin hasn't run in Claude Desktop, the Codex app or Copilot CLI. A seatless app can't claim, update, hand off or answer questions, and everyone using the app on a machine acts as its seat. (#2647, #2657, #2683)launch_wrapper hasn't run with zsh, on macOS arm64 or with a real installed Claude, and an alias or shell function named claude stops the launch. (#2746)rig seat restart --keep-conversation refuses a Codex seat launched with developer instructions (settings_drift), and one started by a 0.6.x tmux-send script (#2200).hooks.json, OpenRig can leave its activity hooks and trust records unchanged. The range (^1.8.0) still permits 1.9.x; the repository lockfile uses 1.8.0. Not fixed in 0.7.11; a fix is on main (#2804) and isn't in this release. (#2720)AGENTS.md. Check git status before committing.unknown behind ProxyJump or ProxyCommand; advisories don't show on a native resume; seats handed over before 0.7.9 refuse stop, restart and clean; after a project-local install, plain rig isn't found in the TUI's own shell; with Claude Code 2.1.319, rig up can wrongly say "Startup prompt still staged … press Enter"; two npm installs into one folder at once once left a partial install, cause unknown.docs/reference/seat-delivery.md says drafts are protected without naming the setting. Under the default, transport.draft_delivery: deliver, an ordinary send that meets a person's draft is joined to it and submitted, unless the seat's typing guard holds input (draft-aware, openrig-urgent, urgent-only or hold).--binding on rig gateway human add is optional, though the CLI reference marks it required.--delivery-class (for example --delivery-class B).Thank you to everyone whose work is in this release: @billbenetti, @seanmcn, @smota, @Aummadour, @dajiaohuang, @w4rc0n, @Mohsintl, @twotnguyen, @ziadeh and @Nikhi00718; to @w4rc0n for running the real terminal close behind #2737.
Thanks to @billbenetti for the reports behind #2752, #2660, #2738, #2749, #2666 and #2665; to @pr0xc3nt4ur1 for the report behind #2740 and #2743; to @oneandonlydean for the process chain behind #2751; to @niklasbaldi for the reports and causes behind #2654 and #2671; to @vadym-abstract-factory for the report behind #2717; to @w4rc0n for the fix and root cause in #2821; to @ziadeh for the reports behind #2622 and #2486; and to @mlc-factory-bot for the reports behind #2605 and #2607.
rig exec, and a step held after compaction now goes in instead of waiting forever.3 added13 changed11 fixedrig exec run: it runs one turn and reports back, and you decide whether to accept the work.rig exec run <row> --harness claude|codex runs one turn through the maintained ACP adapter, in a connector that outlives the command. Use --plan, --wait, status and cancel. One run per row, and --again starts another turn. The outcome is the agent's report. Accepting the work stays with you.
rig compact <seat> --state says when that happened.After two idle polls that can't read the input box, the held step goes in, and while a later step is still owed, rig compact <seat> --state says the last one went in over a box it couldn't read.
Delivery leaves every tmux mode, and a refusal says why.
The rigs skill tries a user-writable npm prefix or a version manager's Node before a project-local install.
uses key gets one. A community contribution.Spec advisories show as launch warnings and never stop a launch, and an unknown uses key gets one.
Run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. There are no migrations.
The openrig-core plugin moves from 0.1.25 to 0.1.26. It adds a permission-request hook and changes the refocus hook. Replaced files are kept under $OPENRIG_HOME/backups/managed-refresh/<id>/, so reapply any local edits from there.
rig agent validate <path>: a single-value uses.<category> now selects that resource, so a member fails to resolve if its pool doesn't hold it.Run rig agent validate <path>: a single-value uses.<category> now selects that resource, so a member fails to resolve if the pool doesn't hold it.
guest.py. Its cleanup still fails against OpenShell 0.1.6.OpenShell users: rebuild the guest image with this release's guest.py (see daemon/assets/openshell/README.md).
A stale record naming a reused tmux pane no longer stops a send from leaving the mode.
Writable views size the pane they show.
Herdr views kept from 0.7.5 through 0.7.9 keep working after upgrading (Linux Herdr 0.9.5 / protocol 22): when only OpenRig's tile script changed, a viewer stays confirmed and a follow view goes on adding and closing tiles. A kept viewer that's already running keeps its earlier sizing for as long as it runs, its own re-attaches included. With a live Herdr after upgrading from 0.7.9, a kept viewer and a follow view's join worked. Closing a tile when a seat leaves wasn't confirmed. It follows @natefaerber's approach in #2467.
rig seat status shows a Claude seat's latest permission request, with suggested rules labelled. Nothing is applied or approved, and suggested rules can contain sensitive values. A community contribution.rig seat status shows a Claude seat's latest permission request, with suggested rules labelled. Nothing is applied or approved.
rig broadcast says UNCONFIRMED instead of FAILED for an uncertain recipient, refusals for seats handed over before 0.7.9 say why, rig roster reads conflicting activity as unknown, and set-runtime finds pod recaps. A community contribution.Routing and status: a send to <seat>@<rig>@<this host's ID> stays local; rig broadcast says UNCONFIRMED, not FAILED, for an uncertain recipient; refusals for seats handed over before 0.7.9 say why; rig roster reads conflicting activity as unknown; set-runtime finds pod recaps.
Refocus names a trace gap instead of failing.
The stuck sweep stops filing informational updates to people as unclaimed work.
rig slack status counts cross-host relays still in flight. A community contribution.rig slack status counts cross-host relays in flight.
rig works in managed Codex seats however OpenRig was installed, with a Codex that supports allow_login_shell, because tool commands now run in a non-login shell, so login-only shell setup may be missing.Plain rig works in managed Codex seats however OpenRig was installed, with a Codex that supports allow_login_shell: tool commands now run in a non-login shell, and rig config set launch.codex_login_shell true defers to Codex's own setting.
rig doctor gives up on a silent listener after 2 seconds. A community contribution.Errors are clearer: a refused terminal token says "Terminal auth failed"; the TUI shows the daemon's launch refusal; rig doctor gives up on a silent listener after 2 seconds.
The execution view reads the review registry once per request. Queue listings build one recovery index instead of a scan per listed task. The event drain reads at most 500 rows at a time. On a test fixture, full listings were about 63% faster with the same output. The listing and drain changes are unmeasured on a live install.
The guest passes the exec's CA settings to Claude, so API calls stop failing with SELF_SIGNED_CERT_IN_CHAIN. TLS checks stay on. With OpenShell 0.1.6 the guest now authenticates, does useful work, makes a verified export and completes its task.
environment_cleanup_unconfirmed.Owned-environment deletes read Podman's inventory, and an unconfirmed cleanup stops as environment_cleanup_unconfirmed. The maintained cleanup still fails against OpenShell 0.1.6 (see Known issues).
Docs and tests. Codex named profiles, openrig-core skill loading, what the runner contract has run, telemetry's guarantee beside the separate, untested openrig-telemetry exporter, and a real-tmux test that waits for the prompt.
A held post-compaction step goes in over an unreadable box, so an unrecognised draft may receive the restore text.
Sends leave any tmux mode a person has open.
rig up can print advisory warnings.rig up can print advisory warnings.
login: true gets Codex's refusal.Managed Codex seats run tool commands in a non-login shell, so login- or rc-only setup, shell functions and aliases may be missing, and a model request for login: true gets Codex's refusal.
delete-owned) fails against OpenShell 0.1.6, which doesn't mount a workspace volume, so recreate and restore can't run. Never give the guest the daemon's main API port (normally 7433). After a same-generation reconciled launch, run rig environment connect yourself.rig exec: it was checked with Claude Code and Codex through their ACP adapters. A cancel is acknowledged, not settled, and says nothing about further spend. Cancel with rig exec cancel, not rig acp cancel./compact. Run rig compact <seat> --cancel, then send a restore request naming the newest restore map, marker and packet. (#2575)✔ Update installed · Restart to update banner, and a message held that way isn't replayed. Managed compaction can also stop before sending /compact (target_activity_unknown) on a Claude seat showing that banner; in our test, a freshly launched seat once let it through, which isn't a tested fix. (#2605)execs the native installer's symlink can still lead to a readiness timeout even though Claude is visible. The launch check also does not recognize --no-chrome. This pre-existing issue is not fixed in 0.7.10. (#2341)rig seat restart --keep-conversation refuses a Codex seat that was launched with developer instructions (settings_drift on developer_instructions) and stops nothing.hooks.json in the Codex home, OpenRig can leave its activity hooks and trust records unchanged and log "its trust records couldn't be written exactly". The reporter saw Codex stop at "Hooks need review". The dependency range in this release permits the affected version; our repository lockfile uses 1.8.0. This is a pre-existing issue, not fixed in 0.7.10. (#2720)AGENTS.md, even on Codex 0.164 or later, leaving the working tree dirty. Check git status before committing.unknown behind ProxyJump or ProxyCommand, which doesn't mean the connection is broken.rig isn't found in the TUI's own shell (managed Codex seats are fine). Use the full path.rig up can wrongly say "Startup prompt still staged … press Enter". Pressing Enter on the empty box adds nothing.Thank you to everyone whose work is in this release: @dajiaohuang, @Aummadour, @billbenetti, @smota, @Nikhila-Dhevi-R and @Vaishnavi220506; to @AlephCasara, whose work on a fork pointed us to the unpaged event notification drain (#2610), and to @natefaerber, whose approach in #2467 the Herdr view fix follows; and, for reports carried into this release, @billbenetti, @KM199, @ziadeh, @dajiaohuang, @jajabong, @george661 and @aanestesia.
Thanks also to @smota for the OpenTelemetry discussion behind #2589.
Before release we tested the exact package: the private and stock content checks and the release Tests; a real upgrade from 0.7.9 on our own servers; the speed and memory baseline (no worse, slightly faster); the OpenShell worker's sign-in, useful work, verified export and finished task (its cleanup still fails, and recreate and restore weren't run); Slack on a real workspace; a Claude first user from the website to a finished result; Codex first-user setup (plain rig in every Codex seat); and 98 selected broader regression cells (57 passed, 8 had other results, 14 were incomplete and 19 weren't run), with no product regression found. A Codex first user didn't reach a finished result in our test: both attempts stopped on errors in our test setup, so that path's end result is untested.
rig stream emit opens a queue task for the kernel's queue worker. To keep 0.7.8's behaviour, run rig config set stream.intake off after installing. A community contribution.Stream intake is on by default. Each rig stream emit now opens an intake row for the kernel queue worker (queue.worker), or adds a note to the one still unclaimed. The row wakes the queue worker like any queue row, and earlier stream history isn't replayed. To keep 0.7.8's behaviour, with no intake rows, run this after installing: rig config set stream.intake off.
A person's typed words reach the agent, and the ask says what they do. A reply of just yes or no counts as the agent's allow or reject. "Any other words choose nothing": OpenRig's default permits the request when the agent offered an allow option, and the words come back whole in the read result as said. Section 7 of docs/reference/harness-runner-contract.md lets a runner queue them for the agent "as an ordinary prompt" after the current turn: "They're never the answer."
rig stream list --tag runner-permission-permit.Each permit OpenRig grants by default is recorded, once, as a stream item from the seat: when no one can be asked, and when an ask is closed without a choice (a row passed to an agent seat included). The record names the tool call, why no person answered, the option the agent got with its kind, and the request or ask. Read them with rig stream list --tag runner-permission-permit. A record has no destination, and one that can't be written doesn't change the permit. Stream intake reads past it, so it opens no intake row and wakes no one.
A working beat keeps a long, quiet turn reading working (section 4); a runner that sends none behaves as before. The Pi runner and the dsh example post it, and the conformance check covers it and no longer falsely fails a correct runner on a busy machine.
Delivery: fewer deliveries held or misdirected on Claude seats (prompt suggestions, wrapped lines, a wake's own paste, the Theme picker, quoted permission questions); held messages are announced when a seat starts or changes occupant; undelivered reminders retry; a stalled tmux client is ended after 30 seconds.
Restart the daemon after installing: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. Four migrations (146 to 149) run on the first start.
rig stream emit opens a queue task for the kernel's queue worker. To keep 0.7.8's behaviour, run rig config set stream.intake off after installing. A community contribution.Stream intake is on by default. Each rig stream emit now opens an intake row for the kernel queue worker (queue.worker), or adds a note to the one still unclaimed. The row wakes the queue worker like any queue row, and earlier stream history isn't replayed. To keep 0.7.8's behaviour, with no intake rows, run this after installing: rig config set stream.intake off.
The bundled openrig-core plugin advances from 0.1.24 to 0.1.25: its seat-continuity-and-handover skill changed. Managed refresh preserves replaced files under $OPENRIG_HOME/backups/managed-refresh/<id>/; reapply local edits you still need from that copy.
If you run an OpenShell environment, rebuild its guest image with this release's helper (daemon/assets/openshell/README.md). An older helper rejects the new startup step, and the error names the rebuild.
Experimental and unsupported. Off by default. Use at your own risk. This path needs a grant service that you supply and run; ordinary use of OpenRig doesn't need one. With rig mcp serve --http --grant-service <url>, a connected assistant can now claim, update and park the rows addressed to its own seat, and see its team with rig_team, within the scope its existing tools have. Serving MCP over HTTP behind your own tunnel "is like opening a port in your firewall." See docs/reference/hosted-members.md.
New daemon reads, two of them by @dajiaohuang: people and the default person, a person's open updates without Slack, a rig's messages in one request, and Slack channels and people without the client holding the bot token. An opt-in decisionRevision lets a client settle exactly the decision its person reviewed. docs/reference/daemon-http-clients.md covers them. The people, updates and messages reads pass their route tests, but no real client used them in our release testing.
specs.builtins_visible: false hides built-in specs, a Claude member's plugin_channels pass to --channels (not yet run with a real channel plugin), and rig context add <url> installs into a new nested name. A community contribution.Options and views: specs.builtins_visible: false hides built-in specs; plugin_channels passes a Claude member's plugin channels to --channels (by @Aschenbath, carrying on @todie's fork work), warns beside claude_mcp: none, and hasn't been run with a real channel plugin; rig context add <url> installs into a new nested name; TUI and web UI display fixes.
Status and receipts: idle Claude and busy Codex seats read correctly in more layouts; stale window samples expire, so a seat whose pane can't be read reads unknown rather than its last verdict; uncertain sends read unconfirmed or indeterminate instead of delivered, lost or failed.
CLAUDE.md and AGENTS.md files stop growing, and several Claude rebuild and resume failures are repaired.Guidance and handover: an edited culture or startup file reaches the next start, while your own edit to a managed block is kept; shared CLAUDE.md and AGENTS.md files stop growing; handover successors get their guidance and a list of their startup files; several Claude rebuild and resume failures are repaired.
rig, rig doctor no longer hangs on a silent port, and upgrade backups work without the sqlite3 CLI.Install and hosts: the upgrade skill backs up without the sqlite3 CLI when Node has node:sqlite; preflight warns when a Codex seat's login shell can't find rig; rig host ls reads your ssh config with ssh -G, which runs any Match exec command in it; rig doctor no longer hangs on a port held by a listener that never replies; a scoped launch on tmux 3.4 keeps its default command.
The OpenShell worker still doesn't work in 0.7.9. Don't rely on this path. 0.7.9 repairs the layer that stopped it in 0.7.8: in our release testing the guest's agent now starts and reaches its first input. Startup reaches the guest through a hash-checked first-input file, and nothing is typed through the host viewer; the case where the viewer exits wasn't run in our release testing. Readiness checks the guest's own execution, and a failed owned delete reports the stage that failed. Our release testing on 0.7.9 then found two more problems: The worker can't reach its model. The guest's Claude starts, but every API call fails with SELF_SIGNED_CERT_IN_CHAIN. The guest launcher builds a clean environment and leaves out the CA settings the OpenShell exec supplies (NODE_EXTRA_CA_CERTS, SSL_CERT_FILE, REQUESTS_CA_BUNDLE and CURL_CA_BUNDLE). Deleting an owned environment doesn't run. Its inventory step misreads a "Not Found" reply, so the delete is never sent and the owned resources stay. In our test they were removed with the vendor's own cleanup. Attached resources were kept, as intended, and the worker stopped cleanly. With the four CA settings passed through by hand, a worker did useful work; a verified export, an exact restore and a finished task weren't shown. Fixes for both problems are on main (#2602, #2603). They aren't in 0.7.9 and haven't been run end to end.
rig config set stream.intake off keeps 0.7.8's behaviour.Stream intake is on by default (see Before you upgrade).
AGENTS.md.Fresh Pi seats, and fresh Codex seats on 0.164.0 or later, get OpenRig's guidance outside the repository AGENTS.md: Pi in its own agent folder (unless that file or folder is a link), Codex as launch developer instructions. Codex still uses the repository file for a resume, fork, restore or handover successor, an older or unknown version, or a config layer that sets developer_instructions or can't be read. If only your shell startup sets CODEX_HOME, OpenRig reads ~/.codex, so a developer_instructions in your home is replaced for that session; declare the same absolute path as CODEX_HOME in the member's or rig's env: to have it checked.
rig down removes OpenRig's own additions from a working folder once no live seat uses them.rig down removes OpenRig's own additions from a working folder once no live seat uses them.
After upgrading, the Slack connector edits asks that ended earlier to show they were handled, at Slack's edit rate: about an hour for 450 asks. rig slack status shows pending edits.
qitem_already_terminal and records nothing.A later answer to a settled ask gets 409 qitem_already_terminal and records nothing.
rig send --verify reports unconfirmed and exits 1 when it can't see what its Enter did. A community contribution.rig send --verify reports unconfirmed and exits 1, not delivered, when it can't see what its Enter did.
rig export with no -o writes rig-export.yaml beside an existing rig.yaml instead of replacing it. A community contribution.rig export with no -o writes rig-export.yaml beside an existing rig.yaml instead of replacing it.
rig workspace validate exits 1 for malformed optional frontmatter. A community contribution.rig workspace validate exits 1 for malformed optional frontmatter.
rig env lists the matching rig IDs and stops, and rig doctor --spec reports unknown, instead of using the first match. A community contribution.An active rig name that matches more than one rig makes rig env down, status and logs list the matching rig IDs and stop, and rig doctor --spec report conformance as unknown, instead of using the first match.
<workspace.root>/kernel; existing kernels stay where they are.New default kernels start in <workspace.root>/kernel. Existing kernels stay where they are; docs/reference/agent-startup-guide.md describes the optional move.
rig environment connect yourself; non-text startup actions aren't supported on environment seats.truncated.unknown behind a ProxyJump or ProxyCommand; that isn't proof the connection is broken. (#2488)CLAUDE.md or AGENTS.md that already grew isn't trimmed.✔ Update installed · Restart to update on its own line. 0.7.9 still doesn't recognize that bare banner, though it recognizes /rc and the full versioned banner. A message the draft-aware delivery path holds isn't replayed automatically by that path. (#2605)rig compact <seat> --state and rig seat status show the restore as owed, and from the second failed attempt the seat's owner gets a queue item naming it. To restore by hand, send the seat a restore request naming its newest restore map, its restore marker and its packet, then settle the owed attempt with rig compact <seat> --cancel; a poll can still race that step. Reported on 0.7.8, and 0.7.9 behaves the same way. (#2575)rig seat stop, restart and clean refuse them as before. (#2440)rig broadcast: an uncertain recipient's outbox receipt now reads indeterminate, but the broadcast's own output for that recipient still says FAILED. Check that seat with rig capture before resending. (#2507)rig: command not found when rig isn't on the login shell's PATH: with Node outside it, or when npm can't install globally and OpenRig is installed inside the project instead. Preflight now warns at launch. In our testing the agents recovered by calling rig by its full path; the getting-started guide describes a ~/.profile fix, which we didn't run.deepseek/deepseek-v4-flash through dsh's pi-ai OpenRouter chat-completions profile, against 0.7.8 Core: two useful queue tasks, queued and multiline input, a quiet tool interval of about 26 seconds that still read working, allow-once and reject-once with their file effects, cancel, a return to the same conversation with recall, and shutdown. The permission answers came from an automated test operator, and the run's preset added resume: true, which the shipped preset doesn't declare. dsh's own DeepSeek Messages route through OpenRouter failed with HTTP 400, and the cause isn't established. Not run: a missing-conversation refusal, cross-host restore, OpenShell, and other adapters, models or providers. 0.7.8's release tests had already run its dsh example end to end, so the 0.7.8 CHANGELOG's "No harness has run end to end under the contract yet" was out of date.env: names, the conformance check's false failures, a person's typed words, the README's operator address, a rebuild behind a symlink, the rebuild receipt, a click on a re-parked ask, and recording a permit made when no one can be asked: a person's answer is recorded on the ask, and a default permit as the stream item above. The other 0.7.8, 0.7.7 and 0.7.6 known limits still apply.Thank you to everyone whose work is in this release: @porterchild, @Mohsintl, @Nikhi00718, @oodadoudou, @AdityaxDeore, @w4rc0n, @genius8267, @Aschenbath, @DeryFerd, @mohitdixit02, @Vaishnavi220506, @Nikhila-Dhevi-R, @natefaerber, @dajiaohuang, @Aummadour, @KM199 and @Totopo27; to @todie and @seanmcn, whose fork work is carried in #2439 and #2400; and, for reports carried into this release, @ziadeh, @billbenetti, @eisenbergjerry, @ch-davidriott, @puniserv, @oneandonlydean, @sabnanikl-dev, @gifflen, @pvl-agent, @EZotoff, @adam-nectar, @bpamiri, @tgrundtvig, @aanestesia, @AdamWhitehurst and @eisenrigbot.
Thanks also to @z4cc, @hitianqi, @jimallen, @m3ac-AllbrittenJ and @lkraider for reports and field feedback.
rig seat set-permissions-to chooses someone else, a request is permitted when no one can be asked, and refusing is opt-in with --deny.A runner seat's permission requests now reach a person, and the default is permit. The runner contract's first version refused every request. Section 7 of docs/reference/harness-runner-contract.md now covers who is asked: With a default person, "They get an ordinary ask in the Feed and on Slack. No setup is needed." To choose someone else, run rig seat set-permissions-to <seat> --to <person> --reason "…". --clear returns to the default. When no one can be asked, the request is "Permitted at once, with the agent's own allow option." Refusal is opt-in, with --deny. "A person's no is never a grant." An unanswered request "stays pending and visible" until the agent's turn ends: "It's never timed out into a grant."
rig launch --seats first-starts seats; skill copies, activity hooks and startup declarations are kept across rig down, resumes and exports; and stops are clearer. A community contribution.Seats: an isolated tmux server per OpenRig home (rig config set terminal.tmux_server isolated); claude_mcp: none for a Claude member; resuming with a new token file; first starts on rig launch --seats; an accurate account record and kept effort after rig provider switch; skill copies, activity hooks and startup declarations kept across rig down, resumes and exports; clearer stops for handover's fork:<seat>, a missing conversation, claude not found, Codex restart refusals and failed unpins.
OPENRIG_TMUX_CONTROL=1 when control clients end together, and a submit key a read-only client blocks is pasted instead. A community contribution.tmux: with OPENRIG_TMUX_CONTROL=1, no crash on tmux 3.3a to 3.7c when the control client ends while another leaves; a submit key that a read-only client blocks is pasted instead.
Slack and usage: typed replies to parked decisions are recorded as answers; row bodies render Markdown; resolved decisions stop showing as live asks; OpenRouter charge retries aren't delayed.
rig terminal open mission:<id> --follow --provider herdr follows a mission. Linux Herdr 0.9.5 only. A community contribution.The TUI and views: agent pages show health and recent work; pod, spec and instance-table views read correctly; rig terminal open mission:<id> --follow --provider herdr follows a mission.
Restart the daemon after installing: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. Four migrations (142 to 145) store a Claude seat's MCP opt-out, seat activity grants, OpenShell environment bindings and the person chosen to answer a seat's permission requests.
The bundled openrig-core plugin advances from 0.1.23 to 0.1.24. One line of its seat-continuity skill changed. Managed refresh preserves replaced files under $OPENRIG_HOME/backups/managed-refresh/<id>/; reapply local edits you still need from that copy.
The install is larger: in the 5 November clean-install check, 0.7.8 resolves to 118 npm packages (including OpenRig itself), against 0.7.6's 32. The MCP SDK is now a runtime dependency.
A runner conformance check: node docs/reference/runner-conformance/check-runner.mjs --runner '<runner command with {agent}>' --name <harness>. It covers the answered path, and needs Node and tmux but no daemon, model, credentials or network.
dsh) comes with its preset to build against. OpenRig doesn't install it.An example runner for DeepSeek Harness (dsh), with its preset, is under docs/reference/community-harness-examples/dsh/. OpenRig doesn't install it.
A seat activity grant lets a runner outside the host's hook setup report activity for one seat and launch, without the install-wide hook token.
0.7.8 includes rig environment (setup, create, attach) and a reference for binding a seat to an NVIDIA OpenShell sandbox (daemon/assets/openshell/README.md). In our release testing the worker never became usable: after the sandbox was created and the native process started, rig environment connect failed when its check timed out after 5 seconds, so no team work ran. Don't rely on this path in 0.7.8. The packaged CHANGELOG and What's new describe it as working; this release body replaces them on that point.
rig host edit and rig host remove arrive, OpenRig warns when another user's daemon holds the port, and rig daemon status shows a pending start. A community contribution.Hosts and setup: rig host edit and rig host remove; a warning when another OS user's daemon holds the port; rig daemon status shows a pending start.
Wakes: OPENRIG_WAKE_SUSPEND matches destinations with a colon; prompt escalations stay deliverable without a reachable person; reminders stop at a full quota; human@kernel raises no false finding; OpenRig's own Codex hooks are trusted when no choice is recorded; refusals name their fix.
Also: MCP text is cut between whole characters; an ACP cancel survives a failed note; long transcript lines read faster; there are Pi and kernel dashboard recovery guides.
--deny keeps a seat refusing.A runner following section 7 gets answers or permits, not refusals. --deny keeps a seat refusing.
OPENRIG_TMUX_CONTROL=1 uses spawned clients instead of a control client.On tmux older than 3.7c, OPENRIG_TMUX_CONTROL=1 uses spawned clients instead of a control client.
OPENRIG_DSH and OPENRIG_DSH_HOME aren't accepted in a rig spec's env:. A preset command wrapper that exports them was the route we observed. (Fixed on main, #2414; not in 0.7.8.)/abort in the pane. A /abort sent with rig send is an ordinary prompt.allow_always from a permit: with no one to ask, "If the agent offers only allow_always, the harness then remembers a permission nobody chose."ANTHROPIC_API_KEY; subscription or OAuth credentials aren't supported. "Provider registration and image construction can incur costs."operator@kernel; the actual kernel operator is operator-agent@kernel.rig whoami --json ran on the host. The missing check is the same in 0.7.6; environments are a new way to trigger it.delete-owned didn't confirm its delete in our test, and the vendor's own delete cleaned up. A delete still finds the sandbox by name after reading its ID, so a deliberate name replacement in that gap is an open race.rig seat set-typing-guard <seat> --mode draft-aware protects an unsent draft.rig: command not found. In our first-user test, asking the agent to fix PATH recovered it.claude, a provider switch can't read the running effort (it uses the authored effort, and says so), and rig down may briefly run a resume probe.rig seat continue can refuse a healthy auto-mode Claude seat with attention_required. Ordinary sends still work.provenanceRecordWritten and departingSessionKilled as false even when both happened, so don't re-run a handover on those two fields alone. (Fixed on main, #2420.)Thank you to everyone whose work is in this release: @Aschenbath, @dajiaohuang, @Vaishnavi220506, @Nikhila-Dhevi-R, @Nikhi00718, @oodadoudou, @DeryFerd, @ch-davidriott, @vanducng, @Ethereal49, @AdityaxDeore and @Mydudeclaps; to @bpamiri for dsh-seat, whose fake agent the conformance check's stand-in follows; and, for reports carried into this release, @salbang, @ziadeh, @davey64, @bpamiri, @oneandonlydean, @xwcq, @seanmcn and @AlexGhanem.
Managed compaction no longer types into a draft. With the optional typing guard off (the default), compaction's preparation prompt could be pasted onto a message someone had typed but not sent. Now the preparation prompt, /compact and the restore prompts check the input box first: typed or unreadable input holds the step with a reason. A held restore prompt goes ahead on its own once the box is empty; a manual rig compact says why it stopped, to be retried once the box is empty. An empty box or Claude's own suggestion goes ahead.
A Claude seat under the "Update installed" line reads idle again. After Claude installs an update, it prints "✔ Update installed · /restart to apply" (or "Restart to apply") below its mode bar. OpenRig didn't recognize that line, so a seat at an empty prompt read unknown instead of idle, and managed compaction waited. Both spellings are now recognized; lines that only look similar still read unknown.
A Claude seat launched through a wrapper script can be rebuilt again. On 0.7.6, rig seat handover --source rebuild on a seat whose claude is a #! script that starts the real Claude without exec stopped after 30 seconds with "Waiting to confirm the new Claude process in this pane", though the new Claude was running. The readiness check now also accepts the script's own direct child when it names this launch's conversation; every other check is unchanged.
Restart the daemon after installing so the fixes take effect: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. There are no database migrations. The bundled openrig-core plugin stays at 0.1.23 with unchanged files.
A failed handover no longer moves the seat's resume target to the new, unprimed conversation while the seat keeps its previous occupant.
Thank you to @oneandonlydean for the report and the evidence in #2341.
rig provider switch moves a running agent to another account home, with a fresh conversation and a handover; it keeps its address and work. A community contribution.Move a running seat to another account home with rig provider switch --seat <seat> --to-account <name> --account-home <dir> (preview with --dry-run). It starts a fresh conversation with a handover, and the seat keeps its address and work.
rig terminal open slice:<name-or-id> --follow --provider herdr shows the agents with open work in that slice, each once. Linux Herdr 0.9.5 only.rig terminal open slice:<name-or-id> --follow --provider herdr shows the current owners of the slice's open work: pending, in-progress and blocked queue rows tagged with that slice. Each owner appears once, with all its obligations listed. Tag a row with rig queue create --slice <name-or-id>; handoffs keep the tag.
Slice following targets Linux Herdr 0.9.5 / protocol 22. Following a whole mission isn't in this release.
rig daemon start says startup is pending and leaves the daemon running, instead of killing it.Startup: when only the readiness deadline passes and the daemon is still starting, rig daemon start exits nonzero with a pending message naming the process, its endpoint and the log. The daemon is left running, and a second start stays blocked. rig daemon stop can't reach that unpublished process; the message gives the manual restart.
A queue wake refused at a selection prompt is retried once the prompt clears. Work sent to a terminal-only seat raises a finding for a person. Cross-host rig queue create --verify reads the destination's receipt.
Restart the daemon after installing: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. Two database updates record a seat's selected account home and whether a community-harness launch declared a runner.
The bundled openrig-core plugin goes to 0.1.23: its Claude activity hook now clears permission marks after a tool batch. Replaced files are preserved under $OPENRIG_HOME/backups/managed-refresh/<id>/; reapply any local edits you still need.
rig daemon start may report that startup is still pending. Follow the guidance it prints before any recovery.On a large database, rig daemon start may now report that startup is still pending instead of failing. Follow the guidance it prints before trying any recovery.
New slice views start with four automatic tiles; --max-tiles changes that. A known empty slice keeps following and fills again. An incomplete read keeps the previous viewers, and missing or ambiguous slices are named, never shown as an empty team. Pins, drafts, unknown input and focus still protect a departed viewer, and closing a viewer never stops its agent.
When a slice's folder name repeats across missions, tag its work with the slice's unique ID (or add --mission). A row tagged only with the shared name can't be placed, so the view reads incomplete until it is.
Slice following targets Linux Herdr 0.9.5 / protocol 22. Following a whole mission isn't in this release.
An owner whose join was refused before any pane split now joins on a later refresh, and a viewer that hasn't attached yet can carry on.
Named Herdr sessions use their configured endpoint throughout, and the TUI's terminal action opens the agent, pod or rig in view.
A Claude seat can switch between subscription and API key on the same conversation (--to-account api --api-key-file <file>, back with --to-account plan --token-file <file>). In-flight work is interrupted. The API-key path is not qualified yet, so check the resulting account and conversation. A new Claude member can name its own token file in its spec with claude_token.
Managed seats inherit the daemon's SSH agent for git over SSH.
Community-harness presets can opt into runner: true (with launch_result: true) so the seat's activity follows its runner, and passes_model: true to receive the declared model as OPENRIG_MODEL. That says which model was passed, not which one runs. New draft author contracts describe harness, runner and platform duties, marking what's implemented and what's proposed.
rig expand keeps the member settings rig up accepts, and a restore keeps a model set with rig seat set-model.rig expand keeps the member settings rig up accepts, including env, effort and startup settings, and a restore keeps a model set with rig seat set-model.
view_required and unknown_provider, where it returned 200 with an error body.Viewer API: POST /api/terminal/viewer/ensure returns HTTP 400 for view_required and unknown_provider, where it returned 200 with an error body. Keep reading the body's code.
A verified exited process in a retained pane reads pane_exited, not running and idle, and its work goes to the usual recovery finding.
Smaller fixes cover inventory reads, UTC snapshot ages, TUI emoji, help text and test fixtures.
rig status then shows the kernel as partial_ready, and rig ps shows the seats needing attention. No message is sent. This also happens on 0.7.5.humanAnswers doesn't hold for such a parked question.rig seat held-messages before resending. A larger pane or a shorter message may help; turning the guard off removes draft protection and isn't a fix.rig seat restart <seat> --keep-conversation refuses, nothing is stopped; leave the seat running and report it with your CLI and daemon versions.Thank you to everyone whose work is in this release: @seanmcn, @DeryFerd, @Aschenbath, @Vaishnavi220506, @bradvin, @jay23606, @rudycelekli and @Nikhi00718; to @akushonkamen, @jcmurrayii, @KM199 and @pdurlej for changes, reports and reproductions that shaped it; to @appleguy, @al-robertson-cto and @skv-io, whose reports led to fixes and documentation here; and to @bpamiri, whose runner-preset proposal on #43 shaped the runner field.
rig terminal open qitem:<id> --follow --provider herdr keeps the agents working on a task together in one Herdr workspace.rig terminal open qitem:<id> --follow --provider herdr shows the current owners of a task's open work as viewer tiles in one Herdr workspace. Joining agents get viewer tiles; departures close viewers, not agents or conversations. --pin, --suppress and --max-tiles adjust the view; --no-follow keeps a fixed layout. Defaults are eight tiles, four seconds of departure grace and twelve more seconds for a focused leaver.
The preview is limited to Linux Herdr 0.9.5 / protocol 22 and requires no internet exposure.
rig send waits up to 60 seconds for its result. An unconfirmed send may still have arrived, so check before sending again.rig send waits up to 60 seconds for its result, locally and over HTTP, plus a requested idle wait. A send can still read unconfirmed sooner, for example when a connection drops. An unconfirmed send may still have been delivered; input may be held off-screen by a busy recipient. Reconcile before resending. No automatic resend is added.
With a Codex seat's typing guard set to draft-aware or openrig-urgent, a message OpenRig can't confirm will stay visible in the composer is held before it's typed, so nothing is left typed and unsent. A message that fits is delivered and submitted once, and a person's draft stays protected. The default (guard off) and other runtimes are unchanged. Delivery's guards also recognize Codex 0.164's two-row composer footer, so a truly empty Codex 0.164 composer can receive typed delivery.
A wake recorded as unroutable is retried through its existing intent once the seat has a pane; stuck findings require delivery or custody evidence to close.
rig down after a rolled-back launch stays down. A community contribution.Fresh Claude handovers wait for the new process and its current input frame. A rolled-back launch followed by rig down stays down on rig start --last.
escalates_to edge that did nothing before now takes part in recovery for an agent with no delegation parent (no agent that hands it work).Restart the daemon after installing: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. A database update stores deferred escalation addresses while preserving existing edges. Previously inert escalates_to edges now affect recovery for seats without a delegation parent.
Startup refreshes openrig-core to 0.1.22. Its queue-handoff skill teaches agents to park long waits with a continuation and wake. Replaced files are preserved under $OPENRIG_HOME/backups/managed-refresh/; reapply local edits you still need. No setting is added or removed.
If Codex requests hook review, review the hooks you intend to enable. The earlier hook-refresh remedy, rig seat restart <seat> --keep-conversation --reason "refresh hooks" (preview with --plan), has an unresolved refusal report; read #2200 below before relying on it. Upgrading does not restore approvals an earlier OpenRig removed.
escalates_to address in another rig on the same daemon. A community contribution.Parentless recovery can use an escalates_to address in another rig on the same daemon. A delegation parent still wins; an open recovery keeps its recorded owner.
rig reconcile-session as the fix.Runtime send refusals return HTTP 409 instead of 500. A stale Claude pane names rig reconcile-session <seat> as the repair.
Follow mode retains departed tiles with drafts or unreadable input. A completely empty task drains removable tiles and stops following once none remain; run --follow again to resume that workspace.
The Overview reads the selected rig's current configuration; the TUI uses the configured local host name; snapshot status matches the scheduler.
Terminal results distinguish pane_unconfirmed from opened and skipped panes. An all-unconfirmed open exits nonzero; inspect before retrying because something may have opened.
pi-tui example, clearer hosted-member guidance (hosted members stay experimental, unsupported, off by default and at your own risk), and tmux, capture, port and scope-folder repairs. A community contribution.The pi-tui example runs Pi's own terminal UI with a per-seat agent folder and startup input. Hosted-member guidance says how a member without a wake trigger gets work, that a listed tool is not a grant, and that finished work closes with no-follow-on. Other changes repair tmux separator parsing for attach --self replies, normalize capture/transcript line counts, warn on invalid MCP daemon ports, release unread notification response bodies, and accept scope folders numbered 100 and above.
Hosted members retain 0.7.4's framing: experimental, unsupported, off by default and at your own risk. Local assistants can connect locally. Internet access requires your own TLS tunnel or proxy and a narrowly scoped token; anyone holding a valid token can act within its grant. Revoke it when finished with rig mcp token revoke <name>.
What you'll usually see is one agent. A queue item has one owner at a time, and handing it off closes it, so following an ordinary task shows its current owner, replaced by the next owner after a handoff. Several agents appear together only when several open rows descend from the task at the same time, by handoff or by naming it in their chain of record.
Clients can add or reuse a verified viewer without rearranging existing panes through POST /api/terminal/viewer/ensure. Membership grants no input authority.
Following larger scopes of work, such as a slice or a mission, isn't in this release.
The view recognizes Codex 0.164's two-row composer footer, so a departed Codex agent's empty composer no longer reads as unconfirmed input that keeps its tile.
draft-aware or openrig-urgent, OpenRig holds a message before pasting it when it can't confirm the whole message will stay visible in the composer. That can happen in small task-following tiles, and many wrapped messages are held even when they would have fit. A held message is not delivered. Use a larger pane; a shorter message may also fit; turning the guard off removes draft protection and is not a fix. A very long message (over 1,000 characters) is held whatever the pane size, so shorten it.--session <name>, OpenRig may resolve Herdr's default socket location rather than a custom endpoint your daemon is configured to use. The configured endpoint works without --session. To reach a specific endpoint, set HERDR_SOCKET_PATH to it explicitly; don't rely on XDG_CONFIG_HOME, which the default resolver doesn't read.ignore-size is not isolation.pi-tui unattended, without typing into it: a wake can submit a draft someone is typing or enter an unrecognized dialog. Busy-turn wakes and native resume remain unqualified; a plain terminal receives no queue wakes. See the example's limits.rig down stops a community harness's pane; inspect any independently spawned processes before relying on their exit.Thank you to everyone whose work is in this release: @icey-zzz, @Aschenbath, @DeryFerd, @Nikhi00718 and @dajiaohuang; to @rudycelekli for the work completed in #2160 and @todie for the snapshot-status change followed in #2168; and, for reports, @agraubert, @AdamWhitehurst (#1544, #2049), @kevinhsykes (#2151), @aanestesia (#605), @todie (#1419) and @tgrundtvig (#21).
Task following was checked with real agents on Linux Herdr 0.9.5: tiles joined and left as genuine work moved (3 → 4 → 3), a focused leaver stayed briefly before closing, a person's typed draft survived a join, the tile cap, pins and suppression behaved as described, and turning following off and on again kept the same agents. The empty-task stop was confirmed from the recorded events, and on screen in a recorded run. Resource use was measured only as whole-machine CPU in one window, not for the daemon alone.
Performance against 0.7.4 was measured on an earlier build of this release, on one machine, with a synthetic workload: no measured change in command latency, memory or CPU.
Protected Codex delivery (#2242) was checked with real Codex agents: a fitting message at 80×24 was submitted once (a model reply was not checked), in a 30×9 pane it was held before paste in both guard modes, and at 32×9 a person's unsent draft was kept in both modes. The 65×9 tile, messages with hard line breaks, and very long messages were not run natively.
Assistants on your machine can already reach OpenRig's MCP server locally. A cloud-hosted assistant can join a rig over MCP under a grant for its seat. Its roster entry declares "hosted": true; rig_team shows its capabilities, caveat and activity as unknown, never idle. The connection teaches it to check its inbox, claim work, return an answer or hand it on, and keep work that needs a person's approval until the answer arrives. This is experimental and unsupported. It's off by default. Nothing in OpenRig listens on the internet unless you set it up yourself. You serve rig mcp serve --http, put it behind your own TLS tunnel or proxy, and issue a token. Doing that is like opening a port in your firewall. Anyone with the URL and a valid token can act as that member within its grant. Treat the token like a password, give the member the narrowest grant, and revoke it when you're done (rig mcp token revoke <name>). We don't support, and take no responsibility for, an OpenRig reachable from the internet, just as with running OpenRig itself on the open internet. Use at your own risk. A real Grok claimed work, returned a useful note, came back in a new conversation and was refused after its grant was revoked, with its work kept. Other assistants weren't tried.
Resume the exact Claude Code or Codex conversation you choose. rig seat history --rig <id> --node-id <id> lists the Claude and Codex conversations that exact node could resume. A client can then resume the history a person reviewed. It refuses rather than substitute another conversation or start fresh. Resuming a reviewed history has no CLI yet. It works only through the daemon's startup review, for clients. With Codex 0.164 on a low-effort model, the resumed conversation didn't recall an earlier fact, and the same happened outside OpenRig. This completes the three stages agreed in #1837.
Clients on MCP protocol revision 2026-07-28, which has no initialize handshake, now work with rig mcp serve over stdio or --http. Existing 2025 clients still work on the same endpoint. A 2026-07-28 client (SDK 2.x) was shown working at installed scope. Serving over --http from the internet is experimental, unsupported and off by default. Anyone with the URL and a valid token can act within its grant. Give the narrowest grant, revoke it when you're done, and use it at your own risk.
rig terminal open and the daemon's terminal preview accept qitem:<id> as a read-only membership view. It names stopped, missing and external owners. It doesn't follow a task as it moves, keep a reusable viewer or grant input. An explicit open still has the provider's usual workspace effects.
Parks on a registered person's own address resolve only from a Slack reply written after the question. They keep their summary and evidence and show in NEEDS YOU.
Install with npm install -g @openrig/[email protected], then run rig daemon stop && rig daemon start. On first start, a database update adds a column recording which grant's caller acted. Startup refreshes openrig-core 0.1.21: the queue-handoff skill and Claude hooks changed. It first copies replaced files under $OPENRIG_HOME/backups/managed-refresh/; reapply any edits from the copy. Claude seats get the new rate-limit hook at their next launch, resume, restore or handover. If a Codex seat stops at "Hooks need review", review the hooks in Codex. A Codex seat running through the upgrade warns "Hook failed … plugin contents changed; hook approval required", and some OpenRig hooks stop running in it. Codex 0.164's /permissions menu has no hook item. Preview with --plan, then restart the seat on its own conversation with rig seat restart <seat> --keep-conversation --reason "<why>": the warning goes away and OpenRig's hooks run again. This was tested on Linux with Codex 0.164; seats started after the upgrade aren't affected. Going back to 0.7.3 leaves the new column in place, unread.
A hosted member's roster entry can declare a webhook trigger using secret names only. OpenRig sends a pointer to the work when it lands. A 2xx response means the endpoint accepted the ring, not that the member woke. If it doesn't claim the work in time, its person is told. rig_team and rig roster show show the member's last MCP call; rig_team also shows its latest ring. No webhook consumer was shown waking from a ring. An ordinary chat app cannot receive unsolicited events, so without a webhook-capable runner the assistant sees work only when it checks. Hosted members and internet-facing MCP are experimental, unsupported, off by default and used at your own risk. Only Grok was tried.
When work waits for a member nothing can wake, OpenRig tells its person on Steering, the TUI's Feed and Slack. The notice goes to the person, not the member. For hosted members, this notice wasn't shown with a registered person. Hosted members and internet-facing MCP are experimental, unsupported, off by default and used at your own risk. Only Grok was tried.
Rows record whose grant acted: attribution, not authentication. A caller's seat that was created but never launched is served instead of refused. A caller granted through a grant service hands work to its granted team, never to a caller seat, and cannot attach tags that hide text from a person asked about it. For advanced remote setups, rig mcp serve --http --grant-service <url> checks each request's key with an external grant service, with nothing cached. --oauth-resource and --oauth-issuer add OAuth protected-resource discovery (RFC 9728) and standard sign-in challenges; the key and grant still decide what a caller may do. This is experimental and unsupported. It's off by default. Nothing in OpenRig listens on the internet unless you set it up yourself. You serve rig mcp serve --http, put it behind your own TLS tunnel or proxy, and issue a token. Doing that is like opening a port in your firewall. Anyone with the URL and a valid token can act as that member within its grant. Treat the token like a password, give the member the narrowest grant, and revoke it when you're done (rig mcp token revoke <name>). We don't support, and take no responsibility for, an OpenRig reachable from the internet, just as with running OpenRig itself on the open internet. Use at your own risk.
A Claude seat stopped by a rate limit is recognised from Claude's StopFailure hook, and a delayed older hook no longer replaces a seat's current state (#1908, #2113). A fresh Claude handover reports delivery only once the packet is submitted (#1863). Periodic snapshots keep a down agent's resume source (#2123). A resumed Pi seat no longer prints Entry not found on every restart (#2122).
The TUI starts in a terminal that reports 0 rows or columns (#2099) and lists rigs by name (#2134). The reviews count only open rows as held (#2136). Identity lookup no longer prints tmux errors (#2103). The packaged CHANGELOG.md lists every change.
Startup brings back a kernel only when this start found it down, which is what a reboot leaves. A kernel already down before the start stays down. rig start and rig daemon start --wait-for-kernel explain why and show rig up kernel --existing as the way back. The wait-for-kernel command still exits 1 for a deliberately skipped kernel, but no longer reports a timeout and an authentication fix. This fixes 0.7.3's known issue of a long-gone kernel returning. Restore evidence lasts one daemon process: if the first daemon after a reboot exits before restore starts a seat, the next start leaves the kernel down and says so.
rig up kernel --existing.rig export doesn't write a README, and openrig.dev/rigs' check fails until one is added and declared in rig.yaml docs. Add it, then run rig bundle check on the folder before you submit.rig down stops the pane only.ps before relying on it.rig attach --self can send, but replies to it may fail with transport_unavailable.unconfirmed. The packet can be left typed but not sent in a Claude successor's prompt. In our test, the seat's next ordinary task got it consumed.Thank you to everyone whose work is in this release: @Aschenbath, @Nikhi00718, @bradvin, @dajiaohuang and @seanmcn, and, for reports and reviews, @pr0xc3nt4ur1 (#1822), @duncanleung (#2130), @ziadeh (#2129), @alperta (#99), @AdamWhitehurst (#1544), @smota (discussion #2117) and @oSquashBlossomo.
Register more than one person (rig gateway human add) and choose the default (rig gateway default <id>), who receives the last escalation step, the notice digest and workflow fallbacks.
rig gateway channel add <id> --binding slack:… registers a Slack shared channel as one participant. Anyone writing there reaches the team, and each row names the channel, the sender and the policy. A channel's messages never answer or close an ask.
rig gateway participants shows where it came from. It informs their judgment; nothing enforces it.rig gateway org set and group set give organizations and groups a readable policy, and rig gateway participants shows it with its source. It's context for your agents' judgment; nothing enforces it.
rig seat set-permissions <seat> --codex-permissions <file> gives a Codex seat its own sandbox and approval settings on every managed launch.rig seat set-permissions <seat> --codex-permissions <file> gives a Codex seat its own sandbox and approval settings, passed on every managed launch.
docs/reference/community-harness-presets.md is the contract: what a harness gets from OpenRig and what it doesn't, how to write one, and how promotion is judged. Tests cover it.
Restart the daemon after installing: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start. One database update applies on the daemon's first start. Startup refreshes OpenRig's own plugin (openrig-core 0.1.20; the messaging-the-human skill changed), first copying any file it replaces under $OPENRIG_HOME/backups/managed-refresh/. If you edited one, reapply your change from the copy.
rig gateway default <id>. Until you do, the last escalation step and the notice digest wait.If you register a second person, choose a default: rig gateway default <id>. Until you do, the last escalation step and the notice digest wait.
ANTHROPIC_BASE_URL, declare it in the rig's or member's env:.If a seat relied on the daemon's own environment (ANTHROPIC_BASE_URL, OPENAI_BASE_URL, CLAUDE_CODE_USE_BEDROCK), declare it in the rig's or member's env:. The first seat on a new tmux server now gets the same scoped environment as every other seat.
Going back to 0.7.2 keeps every registered person, but not the default person, shared channels, organizations, groups or policy. It keeps a Codex seat's permission settings without reading them, so its launches of that seat can be broader.
rig down names community harness seats whose processes may outlive their pane, and a Hermes gateway runs per seat.An OpenClaw seat whose last local turn was refused shows as needing attention, rig down names community harness seats whose processes may outlive their pane, and a Hermes gateway runs per seat with the example launcher.
A registered person can't settle an ask that was asked of someone else (answer_not_recorded); from the TUI, the primary user can.
target_needs_input.A send to a Claude seat at its "Resume session" picker refuses with target_needs_input.
rig seat set-permissions <seat> --codex-profile <name> picks which Codex configuration profile a seat uses on its future managed launches. Requested by @bpamiri.rig seat set-permissions <seat> --codex-profile <name> selects that seat's Codex configuration profile for future managed launches. Requested in #1534 by @bpamiri.
Codex's own trust and config edits survive OpenRig's next launch, and a single-quoted trust table no longer gains a duplicate that stopped Codex starting. Resume handles a path with a space, and a seat started under a launcher gets its generation record.
rig slack post-open-asks posts the asks still open, and the reply hint on a person's message now answers in their Slack thread.rig slack post-open-asks posts the asks still open, and the reply hint on a person's message now answers in their Slack thread.
When an agent parks its own ask on the person it asked, a colleague's reply in that thread goes to the agent. Incoming Slack messages are not automatically reposted to Slack as new asks; an agent can still deliberately ask a follow-up.
whose filter chooses whose queue you see, and settling someone else's ask from the TUI is recorded as the primary user's, with the person asked kept.The Feed's whose <person|all|default> chooses whose queue you see. Settling someone else's ask from the TUI is recorded as the primary user's, keeping the person asked: attribution on a trusted network, not a login.
The TUI opens views in cmux when it runs inside cmux, and keeps a registered remote host in its tree on every tab.
rig capture --readable reads a small seat at a readable size, then gives its window back.rig capture --readable reads a small seat at a readable size and gives its window back, and a window gets its own size back after the web terminal.
rig doctor checks that tmux can capture a pane, and new seats keep Claude's Shift+Enter.rig doctor checks that tmux can capture a pane, and new seats keep tmux's TERM_PROGRAM for Claude's Shift+Enter.
rig scope --workspace <path> mission create refuses a path that doesn't exist.rig scope --workspace <path> mission create refuses a path that doesn't exist.
--wait-for-idle waits work, a dropped local send reads unconfirmed, rig export keeps pod startup files, and the delivery digest says why it sent nothing. A community contribution.Also: --wait-for-idle over 300 seconds works; a dropped local send reads unconfirmed; saved seat settings can target a node id; rig export keeps pod startup files; rig scope --workspace creates the first mission there; the delivery digest says why it sent nothing.
rig down stops the pane only; check the harness's own processes afterwards.ps before relying on it.rig or rig tui started in a terminal that reports 0 rows or columns crashes on its first frame, as in 0.7.2. Start it in a terminal with a size. The fix (#2099) is on main for the next release.rig down kernel; a kernel stopped that way stays down on later starts. rig daemon start --no-kernel skips kernel startup entirely. A fix is planned for a later release.communityHarness) and its original database update; renaming them would break a return to 0.7.2.Thank you to everyone whose work is in this release: @Aschenbath, @Coder8124, @bradvin, @sn1thy and @DeryFerd, and, for reports and diagnoses, @AdamWhitehurst (#2041, #2049, #2057), @borfast (#2029, #17), @jimallen (#17), @R14014 (#1069), @kainne44 (#70), @VltrnOne (#1653), @d3fvxl (#800), @fsafey (#1799), @MichelMabinuola (#980), @rakoort (#1679), @bpamiri (#1534) and @george661 (#1710).
rig seat set-runtime <seat> --runtime claude-code|codex moves a live seat between Codex and Claude Code, keeping its address, its queued tasks and its claims. A community contribution.rig seat set-runtime <seat> --runtime claude-code|codex --reason "<why>" moves a live seat between Codex and Claude Code. The successor starts first, gets a handover and confirms it before the old runtime stops, and the seat keeps its address, queue rows and claims. --dry-run shows the settings, what is cleared and the costs; --recover finishes an interrupted switch. Built on @Aschenbath's design in #1214.
env:.A seat can run on its own Claude or Codex login. Sign in to a separate home once, natively, then name it as an absolute CLAUDE_CONFIG_DIR or CODEX_HOME in the member's or rig's env:. It applies at the seat's next launch, and rig seat status and rig provider status show which home a seat uses and where it comes from.
rig seat set-permissions <seat> --rules <file.json>.Claude tool rules per member. Claude members that share a project folder can keep their own tool rules: claude_permissions with allow and deny lists in the spec, or rig seat set-permissions <seat> --rules <file.json> --reason "<why>" for an existing seat. A change is audited and applies at the next managed launch or resume; OpenRig never writes the rules into the project's Claude settings. Checked natively on Claude Code 2.1.309: two seats in one folder enforce their own rules, a managed policy wins, and fresh, resume and fork launches enforce them. See Known issues for what isn't claimed.
A working Claude seat that quotes approval-prompt text in its own output, such as › 1. Yes, proceed (y), no longer has sends and queue wakes refused as if it were at a prompt, including when Claude draws its input box high in a tall pane. Real permission, question and MCP dialogs still refuse.
LEARNED.md.A Codex seat on the default workspace-write sandbox can still commit after a resume, fork or restore, and can write its own topology folder, so it keeps its LEARNED.md. When the sandbox refuses its recap, the daemon saves it.
Restart the daemon after installing. Six database updates apply on its first start: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start.
Startup replaces OpenRig's own plugin and skill files (openrig-core goes from 0.1.18 to 0.1.19; the delegating-work and openrig-user skills changed). As in 0.7.1, it first copies each file it replaces under $OPENRIG_HOME/backups/managed-refresh/ and logs where, edited or not. If you did edit one, reapply your change from the copy.
env:.On Linux, if a seat's tools use the session bus, set the bus address in the rig's or member's env:. Seats now start with an address that can't connect, even when a shell startup file sets XDG_RUNTIME_DIR (see Behaviour that changed and Known issues).
CLAUDE_CONFIG_DIR or CODEX_HOME in the rig spec's env:. A one-off rig up --env no longer applies them.Declare a seat's own CLAUDE_CONFIG_DIR or CODEX_HOME in the rig spec's env:. A one-off rig up --env no longer applies those two, and says so.
If you might go back to an earlier version, set equivalent native Claude rules first. Code from before #1914 opens the upgraded database but leaves per-member Claude tool rules out of launch, so a seat's denies stop applying. docs/reference/rig-spec.md has the details.
rig seat clear-attention <seat> clears it, and the send refusal says so.After a person declines a Claude permission prompt, rig seat clear-attention <seat> --reason "<what you saw>" clears the prompt the latest hook still names, and the send refusal says to.
rig launch <rig> <seat> first-starts one seat of a team imported with --materialize-only.rig launch <rig> <seat> first-starts one seat of a team imported with --materialize-only, without restoring the others.
On Linux, a seat launched by OpenRig now gets the daemon's XDG_RUNTIME_DIR, with DBUS_SESSION_BUS_ADDRESS=disabled:, a session bus address that can't connect. Tools whose sockets live in the runtime directory work in seats without per-tool setup, and a seat's D-Bus clients don't find or start the session bus on their own. A seat's own XDG_RUNTIME_DIR, from env: for example, leaves both as before, and its own bus address is kept. Unchanged: macOS, a daemon started without XDG_RUNTIME_DIR, and terminal.inherit_tmux_environment on. See Known issues.
/command typed mid-turn runs at once instead of being refused.In a Pi seat that OpenRig runs, an extension /command typed mid-turn runs at once instead of being refused as a steer.
A pod seat that never launched starts fresh from its saved launch recipe after a daemon restart, instead of waiting at a shell.
rig down settles its seats, so rig archive and rig up can go ahead.After a team's tmux server dies, rig down settles its seats, so rig archive and rig up can proceed.
rig start, and rig down names the terminals it stops.A team of terminal seats reads fully restored after rig start, and rig down names the terminals it stops.
A launch whose tmux made no session fails as session_not_created or session_unconfirmed instead of reading launched.
A seat held at a choice prompt that no hook announces, such as Claude's usage-limit dialog, now escalates while it holds work.
A Pi or OMP seat's second startup block reaches the running turn instead of raising runtime_error.
rig stream act <id> records what a reader did about a stream item, and rig stream show lists it.rig stream act <id> records what a reader did about a stream item: --work <row>, --decline "<reason>" or --duplicate <id>. rig stream show lists each reader's current action.
rig send to a Codex seat mid-turn says the message joins the running turn, and names --wait-for-idle for separate work.rig send to a mid-turn Codex seat says the message joins the running turn and may redirect it, and names --wait-for-idle for separate work.
rig send to a seat switching runtime is held, not typed; send it again after the switch.A rig send to a seat that is switching runtime is held, not typed (outcome: retained, reason: runtime_switch_in_progress); send it again after the switch.
stuck-sweep@system. A community contribution.A row OpenRig creates itself, such as a stuck-sweep finding or a workflow escalation, wakes its seat from OpenRig's own sender with no reply line, instead of from the row's creator. A stuck-sweep closure is recorded as stuck-sweep@system.
agents.operator_session set, a dead seat's finding goes to that agent first, then the operator seat.With agents.operator_session set, a dead seat's finding goes to that agent first, then the operator seat (workspace.operator_seat_name), then the row's creator. Approvals still reach the person. With it unset, routing is as before.
queue.wake_human_rung, and only one reaches a person at a time.An alert for a seat at a choice prompt follows queue.wake_human_rung: under explicit-only it stays with the operator seat as a visible row, unless that seat is a person. Only one choice-prompt alert reaches a person at a time on a machine; the others wait as visible rows and post when it retires. Permission-prompt alerts post as before.
Cross-host queue writes wait 15 seconds for the daemon's answer, and a timeout reads "queue request got no answer in time" with the ID to reconcile by.
A draft in a Claude seat's input box that starts with a blank line no longer reads as an empty box, so a send isn't typed into it.
A draft-aware send to a Claude seat keeps ownership of its paste when Claude's footer changes to a hint such as "paste again to expand" (see Known issues for #14).
An ordinary rig send to an adopted Pi window waiting at a confirmation dialog is refused with target_needs_input and types nothing, instead of choosing the highlighted answer (#2015). A later change extends that recognition to Pi's input and editor dialogs, including help rows that wrap in an 80-column pane (#2026). A Pi seat that OpenRig runs shows an extension dialog in its pane, cancels it and marks the seat as needing attention (#1996).
A queue wake refused at an approval prompt is retried once when the seat's attention clears, instead of waiting for the stuck sweep.
rig queue resolve <qitemId> --decision "<evidence>" also releases a task held until a typed blocker such as external: clears. A community contribution.rig queue resolve <row> --decision "<evidence>" also releases a row parked on a typed blocker such as external:, fold: or auth:.
rig queue whoami and rig proof add find work in other catalogued projects, and rig scope mission create writes the mission's name. A community contribution.rig queue whoami resolves a project-tagged row against its catalogued project, rig proof add finds a slice in another catalogued project, and rig scope mission create writes the mission's name.
rig queue create whose outcome is unknown reads the task back once before reporting, and a timed-out cross-host write reads INDETERMINATE.A rig queue create whose outcome is unknown reads the row back once by its ID before reporting, and a cross-host write that times out reads INDETERMINATE instead of failed.
A dead seat's stuck-sweep finding goes to someone who can act, not to the dead seat, and says which rule chose them.
The parked-owner reminder no longer reaches a seat in the first 5 minutes after it starts waiting, such as just after a handoff or a question to a person. A seat at an approval or question prompt gets no grace.
A stalled-after-claim finding's age counts from the stall, not the claim.
haiku with the plan permission is told that Claude Code answers its plan-mode turns with Sonnet, and how to set a full Haiku id.A Claude seat set to the alias haiku with the plan permission is told at launch, at restore and in rig seat status that Claude Code answers its plan-mode turns with Sonnet, and how to set a full Haiku id.
When Claude refuses a startup turn late, for example on an expired login, OpenRig checks again before the next startup input's Enter and holds the rest as owed.
The model-divergence monitor no longer flags a Claude seat pinned to an undated id that answers with its dated snapshot, or to a Bedrock inference-profile id.
hooks.json, OpenRig's activity hooks go there instead of config.toml.On a Codex home with a hooks.json, OpenRig's activity hooks go there, and its own old inline block moves out of config.toml.
rig seat restart --keep-conversation on a Codex seat handles a path with a space, finds the resumed conversation, and says honestly when it can't prove the resume.rig seat restart --keep-conversation on a Codex seat keeps a writable root whose path holds a space, looks for the resumed conversation in the home the running Codex uses, and, when it can't prove the resume, says the pane restarted instead of "nothing was restarted".
hooks.json, OpenRig puts its activity hooks there. Your own hooks, their trust and your disables stay. A community contribution.When a Codex home has a hooks.json, OpenRig puts its activity hooks there and moves its own old inline block out of config.toml. Your hooks, their trust and your disables stay; @fsafey found the mixed-format problem in their fork. Inline hook trust is keyed by the managed group's actual position.
login_required instead of waiting out the readiness timeout. A community contribution.A signed-out Codex seat at the sign-in chooser or API-key entry reports login_required instead of waiting out the readiness timeout (Codex 0.164.0 and 0.162.1).
From <seat> on <machine>, so update anything that read the sender from the last line.Every Slack post starts with From <seat> on <machine>, and an escalation's headline reads Waiting on <seat>: <summary>; update anything that read the sender from the last line.
Slack: every post names its sender first, an escalation names the seat the work waits on, a reply from another registered person reaches the agent as their own message instead of answering someone else's question, and Slack rows name who wrote.
rig capture says when a pane smaller than 80x24 may cut off a seat's prompt, with the command to resize it.rig capture says when a pane smaller than 80x24 may cut off the prompt a seat is at, with the command to resize it.
OpenRig's MCP server adds rig_queue_handoff and rig_queue_unclaim (36 tools), so an assistant can pass held work on, or put it back, in one step.
rig up --env CLAUDE_CONFIG_DIR=… or CODEX_HOME=… isn't applied, and the CLI says so. Name a seat's home in the spec.rig up --env CLAUDE_CONFIG_DIR=… or CODEX_HOME=… isn't applied, and the CLI says so; other --env values work as before. Name a seat's home in the spec's env:.
rig seat status --json always carries permissions.account.advisories.rig seat status --json always carries permissions.account.advisories (empty unless there's an advisory).
rig acp run --help names now ships: rig context get reference/acp-agents.md.The guide that rig acp run --help names now ships: rig context get reference/acp-agents.md.
From contributors: queued terminal input is dropped after its client disconnects (#1636, @Vaishnavi220506); TUI focused summaries load their health findings (#1986, @Kero-66 and @Aschenbath); the TUI keeps the stream's connection state across pages (#2014, @Nikhi00718); the web dashboard reads a skipped kernel boot as "Boot not tracked", not "Unknown" (#1917, @Aschenbath, reported by @Kero-66); the compaction-and-restore scenario runs through a launch script, and the test-system docs state the CI job's real counts (#1924, #1925, @DeryFerd).
Guidance: the installer guide says what setup and starting Codex seats write to your home configuration, and the operator puts project work on a team's queue; a Codex user who declines the remembered command rule is offered the operator conversation; rig queue update --help and its refusal say how to cancel a row (--state done --closure-reason canceled); rig skill audit says what its stale and hash findings mean; 14 subcommands that showed a blank help summary now have one; the openrig-user skill says a queue create's request ID isn't the row; delegating-work also applies when judging a delegated result; and docs/reference/seat-delivery.md lists all six typing-guard modes.
--plan warns that it would.A service bundle install on a machine without Docker Compose v2 stops with compose_missing before it writes the target or creates the team, and --plan warns that it would.
rig export copies the team's culture file and names each seat whose agent ref points outside the export.rig export copies the team's culture file and names each seat whose agent ref points outside the exported folder.
rig compact <seat> --state shows a restore that is still owed, and repeated failures open one queue item for whoever can act.rig compact <seat> --state and seat status show an owed restore stage and its last delivery result, and repeated failures open one queue item for whoever can act.
RECAP.md or recap-superseded/.The recap store refuses to write through a link at RECAP.md or recap-superseded/ (recap_write_refused), a layout that used to work.
A managed Claude restore reads its own restore files without stopping at a Read approval, including on macOS, through a symlinked home or project, and for the generic or configured post-compact-extra.md and preparation root. The grants apply from the seat's next launch or resume.
A seat restored with claude --resume that stops at Claude's resume chooser in a tall pane is reported as waiting for a person's choice instead of resumed, and a Codex model chooser there reads as model_selection_gate. An old chooser above a resumed session no longer reads as live.
After a managed compaction, a Claude seat's restore starts on the next poll instead of waiting for something to change its screen.
rig provider switch --seat <seat> moves one seat to another subscription login on the same conversation, and rig provider precheck shows what it would do.rig provider switch --seat <seat> now moves one seat to another subscription login on the same conversation. A Codex seat moves to a login saved in its own Codex home (--to-account <name>, Linux only), after its current login is saved as before-switch-<time>. A Claude seat moves to its own subscription token file (--token-file <path>, made with claude setup-token), and --stored-login moves it back; OpenRig keeps only the file's path and your label, never the token. rig provider precheck --seat <seat> shows what a switch would do, changing nothing.
rig provider status --refresh can read a Claude token's usage on request.rig provider status --refresh --provider claude --claude-token-file <path> --credential-label <label> reads a Claude token's usage on request, one model turn per refresh.
A community-harness preset can set first_input: true to hand the harness its first startup turn at launch instead of pasting it into the pane. The Cursor example uses it and is no longer startup-assisted, and OpenClaw seats keep named conversations as a local agent or a Gateway client.
rig terminal open <view> --window opens the team's view there. A community contribution.Rex is a terminal provider. From a Rex pane, rig terminal open <view> --window and the TUI open the team's view as a Rex session; --provider rex selects it.
rig provider switch now acts; it used to answer failed_safely every time.rig provider switch acts: it used to answer failed_safely every time.
The Cursor reference preset is startup_assisted: false and passes its first prompt at launch.
An open rig view keeps a seat's tile when its tmux session is replaced, and a fresh replacement prints how to reopen the view.
The daemon starts listening before it works through a backlog of queue notifications, so startup doesn't time out behind them.
A startup database-conflict check that can't get an answer now says so, instead of reading like a clean one.
Proof-source monitoring watches the missions root, not the whole workspace.
Queue views, health reads with long histories and send checks do less repeated work.
XDG_RUNTIME_DIR used to let a seat's clients find the session bus; now the seat keeps DBUS_SESSION_BUS_ADDRESS=disabled:. To use a session bus, set its address in the rig's or member's env:. systemctl --user reaches the person's user service manager from a seat, whatever the bus address. A Codex stdio MCP server still needs env_vars = ["XDG_RUNTIME_DIR"] in Codex's config.toml to see the variable. (#2036)full_bypass). Handover and restore carry the rules, but aren't proven to keep the same conversation. An allow list doesn't withdraw broader inherited grants, and these are Claude's own tool rules, not OS or credential isolation. A change applies at the next launch or resume, not in a running process. Going back to code from before #1914 drops the stored rules from launch (see Before you upgrade). (#1914)rig seat restart <peer> --keep-conversation for each. A runtime switch starts a new native conversation (only the handover carries over), clears the source runtime's model, effort and Codex profile, and doesn't apply Claude launch additions such as an agent file or run startup slash commands. Selected separate-home restart/restore and useful conversation-continuity cases passed. Runtime switching worked in both directions in a minimal setup; one direction required an extra Enter. See Verification and remaining limits below for the untested paths.rig slack disable then enable for it, which marks waiting alerts as seen.rig daemon start can take 20 to 40 seconds before its listener warning, longer than the TUI's 30-second "restore everything" wait. On a slow host, run rig daemon start yourself first.claude setup-token) still gets no automatic usage reading. The reader accepts only claude.ai subscription logins and reports not_subscription_login for any other. Read a token's usage on request with rig provider status --refresh --provider claude --claude-token-file <path> --credential-label <label>; the label is yours, not an account the provider confirmed./usr/bin/env support for -0 and -u (option support checked on GNU coreutils and macOS 15; BusyBox and older macOS unverified). Without the required option support, launch stops instead of falling back to credential-bearing command-line arguments.⏸ manual mode on), an unframed box, and Codex seats are unchanged. Inspect the current native prompt and the refusal before retrying; do not assume that waiting 15 seconds clears it.lsof. Without a working lsof, the check can't tell whether another live daemon holds the database. The daemon now says so at startup and on /healthz, but the optional daemon.db_conflict: stop stops only on a confirmed conflict, so it doesn't stop then. The warning for a database outside OPENRIG_HOME doesn't depend on lsof. (#1974)policies.claude_compaction.message_file_path still asks once, and a packet read can ask after the native conversation changes. In 0.7.1's representative test, the restore also asked to run four read-only commands, which these grants don't cover. Check the retained restore map and reported gaps before treating restoration as complete. (#1940, #1952, #1962) A native check on Claude 2.1.309 passed the Read grants with no approval prompt; a complete restore with no help isn't claimed.rig compact <seat> --state and seat status now show the owed stage and its last delivery result; also read its saved restore map. Before sending a manual restore request, reconcile the native conversation and pending state to avoid a duplicate; do not repeat /compact merely because the restore request has not arrived. (#1953)haiku. That's Claude Code's own behaviour, and OpenRig now says so. Configuring the full id claude-haiku-5-5 gave a Haiku answer in a plan-mode follow-up on Claude Code 2.1.309. (#1942)rig queue create --host now reads INDETERMINATE, and the CLI reads the row back once by its ID. If it's still unknown, check that host for the original row ID before retrying. If the row exists, do not create a replacement. If a retry is needed, reuse the same --id and payload; an unsuccessful read is not proof that the row is absent. (#1911, #1978)$OPENRIG_HOME/plugins/openrig-core holds files that didn't ship, the Codex plugin still installs or upgrades, but OpenRig approves nothing itself: an existing approval stays as it was, and Codex's own hook review applies. On a restart without a version change, if a hook file or the plugin manifest there differs from what this version shipped, OpenRig doesn't install or upgrade its Codex plugin. On a version upgrade, OpenRig's managed refresh replaces an edited plugin file with the shipped one and keeps your edited copy under $OPENRIG_HOME/backups/managed-refresh/; after upgrading, inspect those backups and reapply any deliberate customization.needs-input), because OpenRig doesn't feed Herdr a state. Use OpenRig's view or the Feed to find waiting seats. Reopening a view with --provider herdr adds a workspace each time; from inside Herdr, rig terminal open <view> --window reuses a matching one. (#2032)Thank you to everyone whose work is in this release: @Vaishnavi220506, @Aschenbath, @dajiaohuang, @DeryFerd, @vanducng, @Nikhila-Dhevi-R, @Nikhi00718 and @Kero-66, and, for reports, ideas and outside audit, @borfast, @BillyOutlast, @tianqizhao0704, @calv-io-n, @george661, @fsafey, @astral-fleet-sessions and the Heretek-AI team.
Thanks also to @alexveli1 and @george661, who reported #1764 (addressed by #1778 and #1944); @kainne44 and @bobbiejaxn, who reported #81 (partly addressed by #1919); @oneandonlydean, who reported #1813 (partly addressed by #1951); @todie, who reported #1419 (its closure attribution addressed by #1811); @reisalbuquerque, who reported #49 (partly addressed by #1503); @jimallen, who reported #17 (partly addressed by #2028); @parkingmeter, who reported #1933 (addressed by #1963); @vanducng, who reported #1939 (addressed by #1964 and #1941, open for confirmation); and @haichongfu and @vadym-abstract-factory, who reported #14 (worked on again in #1921; still open).
Thanks also to @reco for the runtime-switch request in #589; @pr0xc3nt4ur1 for the edge-preservation and update case in #1193; and @m3ac-AllbrittenJ and @lev-gpt for the stall-reporting and age evidence in #331.
This release's selected checks found no demonstrated regression against published 0.7.1 or data loss. This is not an all-paths pass. The sealed package, installed checks and a real 0.7.1 upgrade passed at their recorded scope; both first-user journeys completed.
The long-paste issue #14 remains open; the Codex model-picker limitation #2010 and ordinary Codex resume/restore with a space in a workspace or queue-state path remain. The fixed in-place restart path is not proof for ordinary restore. Existing Linux session-bus, Claude member-rule, Pi recognition and other documented limits still apply.
Hermes, Cursor's plug-in work and the Codex member-permission counterpart are not included. Follow-up coverage review is scheduled for 2026-10-26 at 12:00 UTC; that is a review date, not a promise that every gap will be closed.
rig mcp serve --http serves one on another machine. A community contribution.OpenRig's MCP server grows from 23 to 34 tools, including identity, restore status, a rig's team and lead, following a handoff, reading a result and deciding inside a person's decision room. rig mcp serve --http serves an assistant on another machine, each caller acting as its own seat.
rig seat set-typing-guard. Input it holds stays readable and is never replayed.rig seat set-typing-guard <seat> --mode off|openrig-urgent|urgent-only|hold sets how much automatic input reaches a seat. rig send --urgent or an urgent queue row marks a message urgent, naming who marked it. Held input stays readable and is never replayed.
Asks to you. An ask lands on the TUI's Feed. Every ask still posts to Slack by default; rig gateway human set <id> slack-subscription urgent-only keeps Slack for asks marked --alert, which stand out with a mention.
rig skill loadout --seat <seat> shows them. A community contribution.Team skills live in each seat's own storage, not your project's .claude/skills or .agents/skills; rig skill loadout --seat <seat> shows them.
A daemon restart, such as an upgrade, picks up a managed compaction where it stopped.
Restart the daemon after installing. Eight database updates apply on its first start: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start.
Startup replaces OpenRig's own plugin and skill files (openrig-core goes from 0.1.17 to 0.1.18). As in 0.7.0, it first copies each file it replaces under $OPENRIG_HOME/backups/managed-refresh/ and logs where, edited or not. If you did edit one, reapply your change from the copy.
Claude seats need Claude Code 2.1.280 or newer to see their team skills (claude --version).
acceptEdits, set it back once by hand. 0.7.1 stops changing it.If an earlier version reset your worktree's Claude permission mode, set it back once by hand. Launching a managed Claude seat used to rewrite defaultMode in .claude/settings.local.json to acceptEdits; 0.7.1 stops, but doesn't repair files already changed.
If you might go back to 0.7.0, undo Slack subscription choices first. 0.7.0 can't read a person file that holds one, so its people registry stops loading. Save each choice (rig gateway human show <id> --json > <id>.json), then run rig gateway human set <id> slack-subscription unset: someone on urgent-only gets every ask in Slack again, as 0.7.0 does. Set it again after you return to 0.7.1. The unset removes only the Slack subscription, so a person file that still holds a subscriptions: entry fails on 0.7.0 too. Don't restore an older gateway folder or database instead: that can lose newer people, bindings and delivery records.
If you go back to 0.7.0 and then upgrade again, old process evidence can keep a seat reading running instead of being relaunched.
rig seat set-terminal-policy. Existing seats keep full control.rig seat set-terminal-policy <seat> --preset no-peer-interventions|help-within-instructions|full-control sets how far OpenRig and other agents may act on a seat, with exceptions for compaction and model changes. Existing seats keep full control.
rig edge add and rig edge remove change one edge on a running rig.rig edge add and rig edge remove change one edge on a running rig.
rig attach as an outside app stays attached through rig down and restore.A seat joined with rig attach as an outside app stays attached through rig down and restore.
New seats get the daemon's OPENRIG_DB and TMUX_TMPDIR.
After a daemon restart that can't see the seats' tmux server, running agents are no longer detached and relaunched beside themselves.
A seat waiting at a prompt that only its pane shows, such as a Codex approval prompt, is shown as needing attention, with its reason, in the seat view, rig ps, the compact JSON and the rig count.
rig watchdog update changes a job in place, and the context watch takes token or percent thresholds. A community contribution.rig watchdog update retunes a job in place; the context watch takes token or percent thresholds.
rig stream subscribe and rig stream read, and rig stream show <id> says what became of one.rig stream subscribe <seat> and rig stream read give a seat bounded pages of the observations meant for it, and rig stream show <id> says what became of one.
rig project wake --decide, and gets back anything uncertain.Off by default: once decisions are enabled, rig project wake --decide lets your intake seat route stream observations with one bounded typed decision each, and hands anything uncertain back to that seat.
Stream retention is on: items emitted after the upgrade are deleted after 30 days, or beyond the newest 20,000, unless a record names them (retention.stream_days, retention.stream_max_items). History from before the upgrade is kept.
rig queue show --json drops lastNudgeInputBox, and send results no longer describe the input box.rig queue show --json drops lastNudgeInputBox, and send results no longer describe the input box.
An urgent or critical row's wake starts with Urgent (marked by …):.
rig queue show and rig queue whoami print notices for people on stderr.rig queue show and rig queue whoami print human notices on stderr.
rig send --dangerously-interact stops and shows you text already typed into a seat's input box instead of pasting over it.rig send --dangerously-interact --reason into a seat's input box stops and shows text already typed or pasted there, apart from suggestions, instead of pasting over it; clear it and retry, or pass --type-without-checking. Keys for a recognized native menu are sent as before.
rig send to a terminal seat types exactly your text, without the From and To lines, and queue wakes type nothing into it.rig send to a terminal seat types exactly your text, without the From/To lines, and queue wakes type nothing into it.
A stream body over 16 KiB is stored truncated and marked, and rig stream list --after from a pruned item returns stream_cursor_expired instead of an empty list.
A send held for a draft in the seat's input box reports inputPhase: "not_reached", and a managed compaction prompt held that way counts as not sent.
Reminders and workflow keepalives survive a seat swap.
One stuck row on a removed rig no longer stops the stuck sweep from flagging the rest, and stopped watchdog jobs release their old schedules.
A Claude member can bring its own agent file, system prompt file, plugin folders and Advisor model.
A Claude seat whose startup turn is refused reports its remaining startup context as owed; with an expired login, later startup inputs can still be submitted first (see Known issues).
A rebuilt Codex seat keeps its narrower sandbox, and read-only Codex profiles launch.
Upgrading OpenRig no longer stops a working Codex seat at "Hooks need review". OpenRig can renew approval of its own Codex plugin during an upgrade when the prior approval exactly matches the previous shipped bundle, nothing is disabled, and the installed bytes match the shipped bundle. Explicit disables and unrelated hooks are preserved.
An answer retried from Slack or Steering after an interrupted close is used once, and a replayed Slack reply stays absorbed.
rig acp run <qitemId> hands a task to an ACP agent such as Hermes or OpenClaw, and a new guide covers A2A agents.rig acp run <row> hands a row's task to an ACP agent such as Hermes or OpenClaw; a new guide covers A2A agents.
rig ps --nodes separates every column with a space and adds an ATTN column, so update scripts that read columns by position.rig ps --nodes separates every column with a space and adds an ATTN column before REASON; update scripts that read columns by position.
rig down asks before stopping the rig you're in, and without a terminal it stops nothing and prints the command with --yes.rig down asks before stopping the rig you're in; without a terminal it stops nothing and prints the --yes command.
rig up --plan no longer starts a stopped daemon; it exits with daemon_not_running.rig up --plan no longer starts a stopped daemon; it exits with daemon_not_running.
rig provider moves is back with a new job: filing and reading subscription move reports. It switches nothing.rig provider moves is back with a new job: filing and reading subscription move reports. It switches nothing.
From contributors: launch probe evidence (#1499, @Aschenbath); request IDs for creates and checked stops (#1790, #1792, @bradvin); faster cost history, ordered stream replay, kept web-UI drafts and guarded sends at Claude's MCP prompts (#1756, #1757, #1758, #1864, #1865, @Nikhi00718); a non-blocking preflight (#1759, @icey-zzz); clearer compact-plan output (#1629, @taljeri); exports keep culture files (#1657, @Totopo27); no flash in terminal views (#1663, @Vaishnavi220506); pod startup files for added seats (#1701, @AdamWhitehurst); Pi idle heartbeats (#1702, @okle100); the rig ps activity column (#1614, @shravansumanthanan); full workflow trails (#1732, @psbanka).
rig up <spec> --name <rig> runs one spec as several rigs. A community contribution.rig up <spec> --name <rig> runs one spec as several rigs.
rig bundle install <bundle> --plan --target <folder> previews the services an install would run. Proven on Linux.Off by default since 0.6.12: with bundle.services_enabled on (rig config set bundle.services_enabled true), a bundle carries its Compose file, rig bundle inspect shows each service before anything runs, and rig bundle install <bundle> --target <folder> starts its services, then its seats, in that folder. In 0.7.1, --plan --target previews the services an install would run, the before-install view also names a Claude member's own agent, prompt and plugin folders, and the example secrets-manager team publishes Vault's port on the host's loopback only. Proven on Linux; not run on macOS.
policies.claude_compaction.preparation_root puts restore maps where seats may write.
CLAUDE.md or AGENTS.md no longer overwrite each other's role, and rig down puts your guidance files back exactly as they were.A seat's role no longer overwrites the others' in a shared CLAUDE.md or AGENTS.md, and rig down restores your guidance files byte for byte.
Optional daemon.db_conflict: stop keeps a second daemon off a database another live daemon holds; the default still only warns.
rig seat status shows the permissions a seat's next launch will use and where each one comes from, and rig setup asks before adding to your shared guidance files.rig seat status shows the permissions a seat's next fresh launch will use and where each comes from; rig setup asks before adding OpenRig's line to your shared guidance files.
Community harnesses can report, name and reopen conversations, with examples for Cursor, Hermes and OpenClaw.
rig setup --providers is remembered, so OpenRig starts seats only for the tools you chose.rig setup --providers is remembered (provider.selected), so the kernel starts seats only for the harnesses you chose.
Herdr: tiles come back after a Herdr restart (one over SSH needs reopening), --session picks a Herdr session, and the TUI's terminal button works over SSH.
rig daemon start waits for a slow daemon instead of stopping it, and only warns when a secondary listener such as Tailscale's can't be checked. A community contribution.rig daemon start waits for a slow daemon instead of stopping it, and warns rather than fails when only a secondary listener, such as Tailscale's, can't be verified.
On Ubuntu 22.04's tmux 3.2a, a closing session no longer sends the query that crashes tmux.
OpenRig's hooks run without Node on the seat's PATH.
env command lines.Provider credentials and the activity-hook token stay off tmux, shell and env command lines; @pr0xc3nt4ur1 first raised it in #1360.
rig slack disable then enable for it, which marks waiting alerts as seen.rig daemon start can take 20 to 40 seconds before its listener warning, longer than the TUI's 30-second "restore everything" wait. On a slow host, run rig daemon start yourself first.claude setup-token) gets no usage reading. The reader accepts only claude.ai subscription logins and reports not_subscription_login for any other./usr/bin/env support for -0 and -u (option support checked on GNU coreutils and macOS 15; BusyBox and older macOS unverified). Without the required option support, launch stops instead of falling back to credential-bearing command-line arguments.rig acp run --help points to reference/acp-agents.md, which is not included in this release's reference context pack. Read daemon/docs/reference/acp-agents.md inside the installed @openrig/cli package instead.lsof. #1763's warning that another live daemon is using the same database, and the optional daemon.db_conflict: stop, find that daemon with lsof. On a host without a working lsof (each lsof call times out after 1 s), the check is skipped without a message, so neither the warning nor the stop happens. The warning for a database outside OPENRIG_HOME doesn't depend on lsof.openrig-core test on Claude Code 2.1.309 (acceptEdits), the restore and audit completed after three one-time Read approvals (the restore marker, post-compaction instructions and refocusing skill) plus four approvals for read-only commands. Check the retained restore map and reported gaps before treating restoration as complete.rig compact <seat> --state and its saved restore map. Before sending a manual restore request, reconcile the native conversation and pending state to avoid a duplicate; do not repeat /compact merely because the restore request has not arrived.reference/whats-new.md) overstates the hold behavior. Resolve the login and follow the seat's reported continuation guidance; this test did not verify recovery. (#1869)haiku and the plan permission answered on Sonnet in one observed run. Configuring the full id claude-haiku-5-5 gave a Haiku answer in the plan-mode follow-up.attention_required and needs one operator acknowledgement: rig seat clear-attention <seat> --reason "<why>". This wasn't rechecked natively on 0.7.1. (#1870)rig up --existing can then stop. Reported on 0.7.0; the same recognition checks remain in 0.7.1. (#1764)rig queue create --host request can time out or return failure even though the destination host created the row. Check that host for the original row ID before retrying. If the row exists, do not create a replacement. If a retry is needed, reuse the same --id and payload; an unsuccessful read is not proof that the row is absent.$OPENRIG_HOME/plugins/openrig-core holds files that didn't ship, the Codex plugin still installs or upgrades, but OpenRig approves nothing itself: an existing approval stays as it was, and Codex's own hook review applies. On a restart without a version change, if a hook file or the plugin manifest there differs from what this version shipped, OpenRig doesn't install or upgrade its Codex plugin. On a version upgrade, OpenRig's managed refresh replaces an edited plugin file with the shipped one and keeps your edited copy under $OPENRIG_HOME/backups/managed-refresh/; after upgrading, inspect those backups and reapply any deliberate customization.CODEX_HOME set in a seat's environment, rig seat restart --keep-conversation can report that the resume was not proven and that nothing restarted, although the process actually restarted and resumed. Inspect the seat's pane and native /status before retrying; a failed proof read is not proof that no restart occurred.rig provider switch does not switch a seat's account in 0.7.1. Its precheck can refuse an unknown target, and its execution path is not yet wired. The separate home-level Codex auth-switch/restart path is not this command.Thank you to everyone whose work is in this release: @Aschenbath, @bradvin, @Nikhi00718, @AdamWhitehurst, @puniserv, @pdurlej, @klueless-io, @shravansumanthanan, @taljeri, @Totopo27, @Vaishnavi220506, @okle100, @dajiaohuang, @icey-zzz, @akushonkamen, @psbanka and @adampog, and, for reports and ideas, @lev-gpt, @XVVH, @Kero-66, @pr0xc3nt4ur1, @VltrnOne, @BillyOutlast, @gogabrielordonez, @geoff-dhango, @alexveli1, @aanestesia, @team-sudarshana, @oneandonlydean, @t1m3fr33d0m, @smota and @z4cc.
Thanks also to @george661, who reported #1710 (partly addressed by #1721); @m3ac-AllbrittenJ, who reported #331 (partly addressed by #1801); @shintaii and @gopinathrimc, who reported #27 (partly addressed by #1735); @kainne44 and @bobbiejaxn, who reported #81 (partly addressed by #1876 and #1946); and @haichongfu and @vadym-abstract-factory, who reported #14 (partly addressed by #1871).
After a reboot, the daemon restores a kernel whose seats are all detached.
Quiet hours for the person. rig gateway human quiet set <id> --daily HH:MM-HH:MM (or --until) holds routine asks while the person is away and posts each one once when they're back. Escalations still go through.
rig archive, rig snapshot, rig export and rig restore --rig now take a rig's name instead of its id, and say so when two rigs share a name. A community contribution.Rig names everywhere. archive, unarchive, release, shrink, expand, snapshot, export, restore --rig and the matching MCP tools take a rig's name. A name two rigs share says so.
A seat missing a startup file no longer blocks the whole rig's restore; the other seats come back.
A busy daemon gets the real request; the CLI refuses only when it's confirmed down, and a timed-out write says its outcome is unknown.
Restart the daemon after installing. Six database updates apply on its first start: run npm install -g @openrig/[email protected], then rig daemon stop && rig daemon start.
If you pass accounts or API keys to new agents through tmux's global environment (tmux set-environment -g …), new agents no longer inherit it. Put the values in the seat's env, pass rig up --env KEY=VALUE, or keep the old behaviour with rig config set terminal.inherit_tmux_environment true. rig setup warns when it sees a custom tmux configuration. Running agents aren't affected.
Startup replaces OpenRig's own plugin and skill files with 0.7.0's copies. It first copies each file it replaces under $OPENRIG_HOME/backups/managed-refresh/ and logs where, whether or not you edited it: about 22 copies on the first start after upgrading from 0.6.14, so a copy doesn't mean you changed anything. If you did edit one, your change may stop working until you reapply it from the copy; the log line names the original file.
rig host doctor once for that host.If you write queue rows to another machine by its own id (member@rig@<self-id>), run rig host doctor <alias> once per host so the binding learns its address.
rig provider moves is gone, so a script that calls it needs changing.If a script uses rig provider moves, change it: the command and its setting are gone.
New agents start from a clean environment, not tmux's global one.
Seats added to a running rig get its culture and startup files (rigs created on 0.7.0).
rig up --env now reaches every way a seat can be launched.rig up --env reaches every launch shape.
Modes for the person. rig gateway human mode saves and applies a person's modes, ends them on a schedule with --until, and reports what each one changed. Inside a mode's agreed "decision room", the agent that asked can record a delegated decision; permission prompts are never decided this way.
rig queue show --json says why a wake didn't get through. A community contribution.rig queue show --json says why a wake didn't land.
A done close can't use --closure-reason blocked_on; use rig queue block <id> --on <child>.
Watchdog deliveries are recorded as they happened, and repeated refusals at a prompt raise an alert.
Before a new Claude agent's first startup message, OpenRig looks briefly (up to about five seconds) for Claude's input box, and keeps its checks on the submission. It doesn't guarantee delivery; see Known issues.
A new Claude agent's startup text can stay in its input box unsent. If a fresh Claude seat sits idle with text at its prompt, open its terminal and press Enter.
Codex seats that select openrig-core get its refocus and skills: OpenRig installs the plugin into Codex and, on a first install, trusts its own six hooks after checking their files, so a fresh Codex seat starts without Codex's hook review. The file check happens only when trust is granted: a later edit to the cached hook scripts keeps that trust, as with any hook trusted in Codex. The trust covers that Codex home, so your own Codex sessions there load the plugin too; its hooks do nothing outside an OpenRig seat. A plugin or hook you already disabled, or left untrusted, keeps your choice.
Slack: a thread reply answers only a question posted before it, and a rejected message isn't re-posted.
The TUI's agent table shows each seat's configured effort.
A long-open TUI says when its build differs from the daemon's, and refreshes less often.
rig provider moves and its setting are removed; report a subscription move as a task instead. rig slack verify drops --reason and --actor.rig provider moves and provider.subscription_moves are removed; report a subscription move as a queue item instead. rig slack verify lost --reason and --actor.
rig up --plan waits as long as a real launch, and rig seat restart and rig policy permissions apply now ask for permission.rig up --plan waits as long as an apply. rig seat restart, and policy permissions apply, now ask for permission.
rig gateway human list shows availability, rig attach prints Sender:, and a reused deliveryId no longer stops a send.Output shapes: rig gateway human list prints availability (available|focus|away|off); rig attach prints Sender:; a reused deliveryId no longer deduplicates a send.
rig ps --rig now filters correctly and says when it doesn't know a rig. A community contribution.rig ps --rig and --host --rig report an unknown rig and filter correctly.
rig compact --cancel stops a compaction that's already under way, without restarting the daemon.rig compact --cancel stops a managed compaction that already sent /compact, with no daemon restart.
A new agent's first startup message says it's OpenRig's identity context, not a task, and a seat with nothing else to start with is asked to confirm its identity and wait for an assignment.
Team agents are asked for permission less often: 15 housekeeping commands no longer prompt.
rig setup keeps 10,000 lines of tmux history, down from 50,000. A community contribution.rig setup keeps 10,000 rows of tmux history, down from 50,000.
env -u SSH_CONNECTION -u SSH_CLIENT -u SSH_TTY rig tui, or run rig terminal open '<view>' --provider herdr. A fix is on its way.rig daemon stop && rig daemon start). Don't use rig slack disable then enable for it: enabling marks any alerts waiting to post to Slack as already seen, so open exchanges miss them.tmux -V. A replacement version has not been verified against this crash.Thank you to everyone whose work is in this release: @Nikhi00718, @Aschenbath, @PROACTIVA-US, @jayhemnani9910, @rudycelekli, @markankamaransheogarat-sys, @haralez, @tianxingjian2406, @1solomonwakhungu, @AdamWhitehurst, @Quentin-M, @arxh80, @DeryFerd, @okle100, @zichen0116 and @13pgpg.
Tested on our own machines, and with first-time setups on Claude and on Codex, before release. A first-time setup on a Mac wasn't completed.
Agents with no recorded pane can be repaired. rig reconcile-session <seat> --repair-missing-pane --no-launch fills in only the missing pane after looking at the session twice. It keeps the seat's session, resume token and history, and adopts nothing. It refuses, changing nothing, when there's more than one pane or window, the pane changes between its two looks, a seat operation is running, or typing protection is on. If messages to an agent are refused with "Managed pane identity unavailable or changed; no input written." and that seat's pane was never recorded (seats an older OpenRig launched are often in this state), repair it in place, then send again; the repair needs typing protection off for that seat, so turn it off only if the person agrees, and back on afterwards.
The in-place repair refuses adopted seats and ambiguous panes. For a confirmed live seat, plain rig reconcile-session <seat> --no-launch re-adopts it into a new session row and attempts to capture its resume token; conversation continuity is not verified. If the intended pane is unclear, use rig context get help.
A getting-started page for people. docs/reference/quickstart.md explains how the pieces fit, the quick way in through the rigs skill, and what OpenRig changes on your machine. getting-started.md becomes the setup reference for the agent doing the setup.
rig context get reference/quickstart.md doesn't resolve. Read the page on GitHub or in the package's docs/reference/.
rig ask --wake refuses a runtime it can't wake (Pi, custom or unrecorded) instead of quietly trying a Claude wake. Upgrade the CLI and the daemon together to catch every case.
rig ps and the TUI read the list of agents through an index instead of scanning the whole event log.An indexed inventory read. The inventory read behind rig ps and each rig tui refresh now finds launch fences through an existing index instead of scanning the whole event log, and returns the same rows.
The refusals name the fix. The send refusal and the compaction refusal for a seat with no recorded pane now name the repair command, and the compaction refusal explains how to turn typing protection off and on with the person's agreement. rig config --help lists the new Mac setting, rig ask --help explains its exit codes, and the CLI reference and the openrig-user skill list the repair.
The bundled openrig-core plugin goes from 0.1.14 to 0.1.15, and /healthz gains an euid field beside pid.
Refocus does less work on a busy machine. It finds each notes file itself instead of starting the CLI once per level.
A manual compaction waits through an approval. When a seat stops at an ordinary approval prompt while preparing, rig compact keeps waiting inside its deadline instead of giving up. OpenRig never answers the approval itself. A manual rig compact can take longer to answer: its preparation gets 180 seconds (was 120) and the request 240 seconds (was 180).
After a compaction, confirm it ran by the restore request or the drop in context, and check that refocus showed the agent's current work.
An optional Mac check, off by default. On a Mac shared by several accounts, rig config set transport.local_user_guard true makes the CLI refuse a local daemon that another account runs. It's a guard against reaching the wrong daemon by accident, not authentication.
Restart the daemon after upgrading the CLI: run rig daemon stop, then rig daemon start. No database migration runs. Coming from 0.6.12 or earlier, read 0.6.13's notes first: its migration runs on the first start.
The roadmap drops three finished items.
rig reconcile-session <seat> --no-launch re-adopts it into a new session row and attempts to capture its resume token; conversation continuity is not verified. If the intended pane is unclear, use rig context get help.rig commands can reach the first user's daemon on the default port unless the Mac check above is on. Running each person's daemon on its own port lets both work, but doesn't keep them apart.rig up <rig> --existing can refuse to restart a rig after one of its seats was stopped on purpose. Use rig restore <snapshot> --rig <rig> instead; the stopped seat stays awaiting your decision.rig tui keeps the daemon busy, re-reading every 30 seconds, and keeps its old code after an upgrade. Quit it when you're done, and reopen it after upgrading.rig context get reference/quickstart.md doesn't resolve. Read the page on GitHub or in the package's docs/reference/.See which model a seat was actually using. rig ps --nodes, rig roster show and rig roster find show the model each seat's current agent was last seen using, beside its configured model, with where and when it was read. Claude and Pi readings come from the agent's own responses; Codex's come from its recorded turn settings. Missing or stale evidence reads unknown, never the configured model. Plain rig ps --nodes prints one model line per seat after the table, and JSON gains modelObservation.
Move a seat to a new working folder: rig seat set-cwd <seat> --cwd <absolute-path> --reason <text> saves an existing seat's working folder for its next fresh launch or rebuild handover, and keeps its address, queue and history. It refuses when files already in the new folder would clash with the startup files the next launch writes. The running agent doesn't move: switch with rig seat launch <seat> --fresh --stop --reason "<why>" or a rebuild handover. rig seat status shows the saved folder.
rig seat set-cwd checks the new folder once: a refusal can leave the folder created, and background work, such as a Claude seat's collector files or a managed compaction's restore map, can use the saved folder before you switch. Switch promptly, and don't run rig down/rig up or a fork handover first.
A Claude seat handed over in place waits for the new Claude. A fresh handover that reuses the old occupant's pane could read the old Claude's screen as the successor being ready, and type the handover packet into a shell before the new Claude had started. A ready result taken from that history is now checked against the current screen, so the packet waits. This corrects the common case.
A fresh in-place handover of a Claude seat can still report ready early in some cases: a screen without a header whose process list can't be read, a Claude process seen but not proven, or a pane or screen that can't be read. Check that the successor read its packet.
Slack recovers what it missed in more places. Missed-message recovery used to read only the configured channel's top-level history, so a reply in an older thread or a message in a mapped channel was lost for good. It now also recovers the channel map's channels from when each was adopted, replies in tracked threads whose root was posted or which closed in the last seven days, and, on a machine without its own Socket Mode connection, each channel the hub has relayed to it, from that channel's first relayed event. A recovered reply lands as a late row in its thread and never answers a decision; the seat reads it and decides. A Slack rate limit now holds that method for every channel, or every thread, and is kept across a restart. rig slack status shows a line per channel and a thread line. On its first start, threads inside the seven-day window are scanned once from their root; replies that already landed are recognised and not delivered twice.
Missed replies in older open threads aren't caught up; slack-thread-coverage.json isn't pruned yet; a default-channel backlog can drain at up to about half its earlier rate while threads also need calls; and a downgrade to an older release and back inside a rate-limit window can let other channels call Slack during that window.
rig grow <rig> and rig remove <rig> <node> accept a rig name as well as its id; a name two active rigs share is refused with the candidate ids.
After a failed restore, a fresh launch that reports ready clears the old restore warning: rig ps and rig seat status stop showing attention_required from it, and rig seat clear-attention no longer refuses.
A Claude Code or Codex seat showing a complete idle screen reads idle in JSON and filters even when the terminal repaints, instead of running.
Parked rows for one seat whose wake timers fall due in the same pass now arrive as one message naming every row, instead of one interruption each. A single reminder, a custom --wake-message and repeating waits keep their own message.
A rig send --wait-for-idle whose caller went away (Ctrl-C, or its own timeout) used to keep waiting in the daemon and type once the seat went idle; if no input has started, it now types nothing, then or later, and is refused with caller_cancelled. The same holds for broadcast recipients not yet reached and for Enter-only sends.
When an agent closes an item addressed to a person and the follow-up can't be verified, the stuck-item finding goes to the agent that closed it instead of to the person.
rig queue list --state "pending, in-progress" with a space after the comma now matches both states, as does the MCP rig_queue_list tool.
rig restore-check can report caveats where it used to be green. Its hook check now tells apart a saved hooks resource, the core plugin's relay, and neither, and reads a broken or unknown plugin selection as a caveat. It still exits 0.
Managed Claude seats get your editor and display. Seats launched with a native permission mode now receive EDITOR, VISUAL, DISPLAY, XAUTHORITY and an absolute WAYLAND_DISPLAY, so Ctrl+G opens your editor and image paste can work. A running seat picks it up at its next launch (rig seat launch <seat> --fresh --stop --reason "<why>", or rig down then rig up --existing). A git commit without -m inside such a seat now opens your editor.
The refocus work packet stays off for both Claude Code and Codex. With OPENRIG_REFOCUS_WORK_PACKET=1, each field is now bounded: one-line summaries of about 160 characters with a rig queue show <id> pointer, at most 20 held and 10 next rows with a count of how many are shown, and section bodies cut at about 1,500 characters. There's no total size cap.
The bundled openrig-core plugin goes from 0.1.13 to 0.1.14. The Claude activity-relay and context-collector hooks OpenRig writes into a project's .claude/settings.local.json now call the daemon's own Node by its absolute path instead of bare node, so a Claude session with an older PATH stops showing "node: command not found" after each reply. Existing bare-node entries are refreshed automatically, and your own wrappers are kept.
The plugin's own manifest hooks still call bare node, so a Claude session with an older PATH can still show a Stop-hook error from them, and two plugin hook runs for the same seat aren't serialized.
Claude Code 2.1.303's MCP-server approval menu now reads as needing input, so a restore doesn't call that seat ready and an ordinary send no longer pastes into the menu.
A fresh running hook still sends into Claude's MCP approval menu.
A Claude launched through a wrapper script (a claude on PATH that execs the real binary) is now proven by its executable path, so a restored auto-mode seat whose banner has scrolled away resumes ready instead of needing attention.
When rig seat restart --keep-conversation stops at a Codex startup screen, the report names it (hook review, folder trust, model choice or update), says who decides, and points to rig capture and the recovery command.
rig seat restart --keep-conversation --help says an adopted seat refuses with claimed_session and which conversation a restart can prove.
Codex's current "Trust this folder?" panel reads as a folder-trust gate instead of booting or ready, so startup text and Enter don't reach it.