Repository navigation
OpenRig 0.6.10
0.6.10 is a fix release, and most of it came from the community: 38 of its 56 changes are from ten outside contributors. Setup can now be told which agent harnesses you use. A resumed Claude seat whose session ID changed proves and restores. Sends reach Codex seats that run behind a launcher, and Claude seats that show a suggested prompt. Restore puts back the guidance rig down removed, and attach commands name the tmux server the daemon actually uses. Several commands now tell the truth where they used to say "already running" or "fully restored".
npm install -g @openrig/cli
It is built from main at 3001cc43 (after #1170, which changes only code comments). Work merged to main after that point isn't in this release. If something breaks for you, please open an issue.
Before you upgrade
Restart the daemon after upgrading the CLI. The running daemon keeps its old build until it restarts: run rig daemon stop, then rig daemon start. Two database migrations run on the first start, and neither changes existing data:
099adds one partial index to the queue table, so the queue's recovery and stuck-sweep lookups stop scanning every row (#1073);101adds four empty columns tosessions, so OpenRig can remember a resumed Claude conversation's new ID (#1080).
There is no migration 100. The bundled openrig-core plugin goes from 0.1.8 to 0.1.9 (#1080).
Behaviour that changed:
rig capture --lines Nshows the last N lines. When earlier lines are cut, stderr says how many. In--json,linesis then the count returned, andrequestedLinesandomittedLinesare new. For the old output, N history lines plus the whole pane, add--history-plus-pane, which also keeps the old JSON without those two fields. Without--lines, nothing changed (#1136).- Compact
rig queue listrows carrysummary, and so dooverdueandundelivered. The fields they leave out are now absent instead ofnullor"", andfieldsElidednames them (#1096). rig launchno longer calls an exited agent running. On a seat whose agent exited to a shell in its kept pane,rig launch <rigId> <seat>returnsattention_requiredand exits 1, with the ways back. It used to report the seat already running (#1070).rig up <rig> --existingreports a seat still missing part of its guidance. The rig then readspartially_restoredinstead offully_restored, and the command exits 1 (#1068).lastNudgeResultreadsclaimedon a claimed row whose wake wasn't confirmed. The recorded value is kept in the newlastNudgeWireResult(#1094, reported in #165).rig chatroom historyreturns the newest messages when you give neither--afternor--since, still listed oldest first. Before, a long room returned its oldest (#1057).
Highlights
Setup asks only about what you use. rig setup --providers claude (or codex, both, or a comma list) installs and checks only the harnesses you chose. One you didn't choose reads skipped, never failed. Before, a person who used only Claude Code saw Codex checks fail. The first hour also stops showing tmux's "error connecting to …" when the daemon starts, and the next steps say the remaining steps are part of the install, not extras (#1065). On WSL2, a first rig daemon start after a timed-out probe goes ahead when the port is free. It's refused only when the port is really held, and the refusal names --port (#1061).
Restore.
- A resumed Claude seat whose session ID changed now proves. Claude can continue
--resumeunder a new conversation ID. When the first SessionStart hook from the process OpenRig launched reports that resume, OpenRig records the new ID. The seat restores asresumed, and sends stop warning that its identity can't be confirmed. Before, such a seat stayedattention_required(#1080). rig up --existingputs back the OpenRig guidance thatrig downremoved fromCLAUDE.md,CLAUDE.local.mdorAGENTS.md. This happens before a resumed seat starts, and the person's own text isn't touched. Before, the seat came back without its role and culture guidance while the restore read fully restored (#1068).- A restore no longer trusts a launcher's word. A launcher that isn't Claude can name one conversation while the Claude it started runs another. That restore now reads
attention_requiredinstead of a false resume (#1091).
Sends that used to be refused now arrive.
- Codex seats behind a launcher. A seat whose
codexis a launcher that starts Codex as a child now receivesrig sendand queue wakes. Before, every send was refused with "reports sh as the foreground command". This had been broken since 0.5.17 (#1088, reported in #1079). - Claude seats showing a suggested prompt. Claude's faint suggested prompt in an empty input box no longer reads as a person's draft, so a send to that idle seat goes through. Real typed text is still protected (#1139).
Seats tell the truth about their state.
- A seat whose tmux session is confirmed gone reads
detached, andrig ps --nodessays to restore or relaunch it. Before, it read as needing attention and could still look active (#1074). - A Codex seat showing its usage-limit banner reads
unknownwith reasonusage_limitinstead of idle, andrig provider signalscan show a provider-event signal for that seat's account that allows a switch decision (#973, towards #763).
Attach commands name the right tmux server. If the daemon was started inside tmux on a non-default socket, every attach command it prints now carries -L <name> or -S <path>. From inside tmux, run it as env -u TMUX <command>. This was 0.6.9's known issue about attach commands reporting "no sessions" (#1083).
Queue and escalation.
rig queue create --verifyreports an agent seat's wake result and any claim as soon as one is recorded. Before, it waited 30 seconds and saidstill-pending(#1029, towards #766).- New escalation setting:
queue.wake_human_rungdefaults toalways. Set it toexplicit-onlyto keep agent-to-agent escalations off the person's Slack unless the row is addressed to a person (#1090, towards #811).
Slack. A decision click that isn't recorded now gets one reply in the thread saying why. It covers clicks from someone who isn't registered, clicks on a decision sent to someone else or no longer waiting, and buttons that no longer match. A recorded click still gets its usual reply. It's best effort and needs the Slack bot token (#1067).
Teams are guided to ask less and say more. Starter and factory guidance now directs teams toward first steps and checks that need fewer approvals (#1082). The operator is instructed to explain what a launch changes in your project folder and to offer a separate copy before launch (#1086). Operators and leads are instructed to surface a waiting seat's prompt and attach command (#1087). The first-user check still needed four team approvals and didn't surface the reviewer's prompt until the person asked; see Known issues.
Dependency and install-script changes
- npm dependencies: none added, removed or changed, and the Node requirement is unchanged (
node >=22). OpenRig's own version fields advance to 0.6.10 (#1164). - Install scripts: unchanged. The package's only lifecycle script is still
postinstall: node scripts/check-abi.mjs. - Database: migrations
099and101, as above.
Everything else since 0.6.9
Seats and terminals.
rig addtakes a rig's name as well as its ID (#1027).rig startsays why it skipped an existing kernel and how to bring it back (#1060).- A Codex seat keeps its last context reading across quota-only usage records (#1124).
- A fresh Codex launch keeps git metadata paths that end in whitespace (#1134).
- When a caller of the daemon's terminal API names no provider, the daemon uses cmux if Herdr isn't available, and says so (#1071, towards #1069).
rig terminal openwithout--provider, and the TUI's "Open terminals", open Herdr, or plain tmux when Herdr is missing, never cmux. The TUI's preview now asks for the same provider as the window it opens, so it isn't refused when cmux is running (#1167). - A tmux started inside a Herdr pane is recognised by Herdr's own markers (#1130).
Queue, views and history.
_and%in arig view show <lens> --rig <name>rig name are no longer wildcards, in all seven lenses that filter by rig (#1126, #1165).rig askmatches chat keywords such asconfig.jsonorC++literally (#1127).rig heartbeatreads queue files with Windows line endings (#1120), and picks its latest proof correctly on a host not set to UTC (#1121).- The queue's recovery lookups no longer scan every row (#1073).
CLI output.
- A
?limit=that isn't a number returns 400, not 500 (#586). rig usage top|series --jsonprints the daemon's error as JSON (#1075), andrig usage topreads every sample in its window (#1116).rig workflow instantiateandprojectprint the instance and packet they made (#1102).rig transcript --tailkeeps a line ending in%(#1104).--jsonafter--no longer turns an error into JSON (#1106).rig envprints the daemon's error instead of a JavaScript one (#1115).- A file read over 1 MiB ends at a whole UTF-8 character (#1119).
TUI. The TUI:
- counts CR+LF as one Enter (#1111);
- keeps an emoji whole at a wrap (#1112);
- pages Local reading directories by 10 (#1113);
- skips fenced examples when opening a file at a heading (#1114).
Scope and progress.
- Progress rows go only under a matching
##heading (#1107). - Frontmatter updates stay inside the exact
---delimiters (#1110). - A capability delta expires only with a readable successor file (#1123).
- Fenced examples no longer count as slice sections (#1125) or progress tasks (#1128).
Packages. rig package install looks for a guidance block's closing marker only after its opening one (#1135).
Tests and repository checks.
- A scenario for the
rig upround trip (#1092). - The docs guard keeps unusual file names exact (#1105).
- The portability report handles header-shaped added text (#1108).
GET /api/bootstraplists same-second runs newest first (#1132).
Docs. The what-changed note, capability map and changelog were written for 0.6.10 (#1166).
How it was tested
- The final package:
openrig-cli-0.6.10-3001cc43.tgz, 4,171 files, SHA-256ae10446b8aa6634d92ae7e2d1807a7debc84a6f4f0a8ac001d8182da3b1e622f, built once from3001cc43in a clean environment. Compared file by file with the published 0.6.9 package, 359 files changed, 32 were added (the compiled files of eight new source files, including migrations 099 and 101) and none were removed. All but three are traced to the changes. The three are generated files whose sources are unchanged since 0.6.9: two type declarations list the same types in a different order, and one source map moves four source references. Installed from that exact package, it reports0.6.10 (3001cc43). The fuller installed checks ran on the package built just before it from18c0a0fd, which differs only in two build stamps and #1170's compiled comments and their maps. They passed, including migrations 099 and 101 and provider-free checks of the literal rig filter (#1126, #1165) and of the general partial-restore exit. That check doesn't establish the case of a seat still missing part of its guidance. - The first-user check ran on Linux only. A fresh non-sudo user on Linux, with no display, ran the website's skill line (
npx skills add mvschwarz/openrig --skill rigs) in a second terminal, then asked an open Claude Code session, in auto mode, to set up OpenRig. The skill loaded in that session. The agent said what OpenRig would write before asking to install, installed the exact package and started OpenRig, and the attach command it printed worked the first time: the operator was on screen 2 minutes 46 seconds after the ask (3 minutes 42 seconds with 0.6.9). Before launching a two-agent team into the person's folder, the operator said the team's settings would also start the person's own Claude Code there in accept-edits mode, and offered a separate copy. The team built and reviewed a small command-line tool and fixed what the review found: 18 minutes 20 seconds from the ask to finished, reviewed work (20 minutes 17 seconds with 0.6.9). The builder checked those fixes itself rather than asking for a second review, and said so. A new session also loaded the skill and gave an accurate status. It had help: the package came from a local registry instead of npm, through a one-line npm setting; Claude Code was installed and signed in beforehand, with its first-run screens and folder trust already done; the person's terminal was already a tmux session; the person read their usage once in the first session, which isn't sent to the agent; the person answered the skill installer's questions, including selecting Claude Code (see Known issues), and the agent's two questions (whether to install, and installing npm packages under their own folder instead of with sudo); and the person approved 6 permission prompts, 4 from the team and 2 in the new session (10 with 0.6.9, 6 and 4). One of the team's prompts waited about 4 to 5 minutes until the person asked how the review was going. What it found is under Known issues. - A real Slack decision was checked separately, on macOS, apart from the Linux first-user check above: the same package in an isolated install with no kernel and a test Slack app. The Slack input was real, sent by an agent driving a Slack web client signed in as a person. On an open decision, a typed answer in its thread was recorded as the decision's answer and handed back to the seat that asked. A button press on that decision after it closed wasn't recorded, and the bot replied in the thread: "This decision is no longer waiting for answers, so this click wasn't recorded." (#1067). On a second decision, a button press was recorded and handed back, the bot confirmed it in the thread, and a later typed reply in that thread reached the asking seat as a linked message. #1067's other reasons for not recording a click, and its check against replying twice, weren't exercised.
- Each change ran the repository's automated tests, merged into the main of its day, before it merged. The tests ran again on the release commit itself and passed, the package tests on macOS and the other checks on Linux.
- Not tested: a first install by a person whose terminal isn't already inside tmux; Codex, as the person's agent or on a team; the Herdr and Ghostty views and desktop apps; the TUI in a live session; a first install on macOS or native Windows with this package; and #1067's other reasons for not recording a click.
Known issues
rig queue create --verifycan reportoutcome: "indeterminate"for a row the seat already claimed. Readclaimfor pickup: neither the claim nor this outcome shows the message was displayed or read. It isn't a failed handoff, so don't re-run the create.- The latest first-install check used 0.6.10 on Linux only (a fresh user, no display, Claude Code only), with the help listed under How it was tested. Install, setup, a two-agent team and reviewed work all ran. macOS was last checked with 0.6.8, and native Windows hasn't been checked. It found the next item, and the first-steps and waiting-seat items below still apply.
- The skill installer may not select Claude Code. When
npx skills adddetects another agent, such as Codex, it asks which agents to install to, with Claude Code not selected. Pressing Enter on the defaults installs only to.agents/skills, which Claude Code doesn't read. Select Claude Code there. rig doctorstill checks both harnesses, including one you don't use.rig setup --providersdoesn't change it.rig tui --sharedstill attaches on the default tmux server, so it can't find the dashboard when the daemon runs on a non-default tmux socket. Userig tuithere instead.- A team's own first steps can still ask for approval in places, such as its roster file outside the project folder and the builder's and reviewer's test runs: 4 prompts in the check's small task (6 with 0.6.9).
- A seat waiting at a permission prompt shows no product notice of its own, and the operator and leads, who are told to tell you, may not. In the check, a reviewer waited about 4 to 5 minutes until the person asked. Check your seats:
rig ps --nodesshowsneeds_input. - A launched team still writes into its working folder: its skills,
CLAUDE.md,.mcp.json,.openrig/and an accept-edits.claude/settings.local.json. The operator now says so before you agree. - A resumed Claude seat still can't be confirmed after
/clear, an in-process/resume, a hand-started process or a launcher shim, or with a plugin older than 0.1.9. - Help without a prompt has been checked in a live Claude session for only one selected lifecycle-help command (#927), as in 0.6.9.
- Codex team seats don't yet ask before lifecycle commands such as
rig upandrig down. Claude Code team seats do. - The send gate trusts the latest recorded hook, as in 0.6.9.
- A Codex seat whose permission request was approved automatically can still read "needs input" (#896).
- After a restart,
rig statusshowsKernel: skippedwhatever the kernel seats' state. Read them withrig ps --nodes --rig kernel --full, and bring the kernel back withrig up kernel --existing. - Slack channel map: replies are matched to a thread by its timestamp alone, missed-message recovery covers the default channel only, and private channels and direct messages aren't supported targets, as in 0.6.9.
- Refocus after compaction hasn't been proven on a long-running install.
- Older issues, as in 0.6.9:
- the starter's Codex reviewer needs a Codex newer than 0.145;
- a restore can report a problem with a seat that works (#273);
- a
claudealias defined only in a nushell rc doesn't resolve; - after a reboot, start the daemon with
rig daemon startand bring your rig back withrig up <name> --existing; - the web UI's file preview runs scripts, so preview only files you trust;
- browser access isn't complete browser isolation;
- Codex network inside the sandbox hasn't been checked with real logins, managed policy bundles or on Linux.
Thanks
To the people whose pull requests are in this release:
- @AdamWhitehurst, @jayhemnani9910 and @xwcq, in their first contributions;
- @Coder8124, @DeryFerd, @haralez, @lab1207, @oodadoudou, @rem4ik4ever and @rudycelekli, whose 34 changes, 23 of them from @rudycelekli, each include a test.
And to the people whose reports shaped fixes here: