Skip to content

OpenRig v0.6.10

Latest

Choose a tag to compare

@mvschwarz mvschwarz released this 12 Oct 07:01
· 149 commits to main since this release
3001cc4

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:

  • 099 adds one partial index to the queue table, so the queue's recovery and stuck-sweep lookups stop scanning every row (#1073);
  • 101 adds four empty columns to sessions, 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 N shows the last N lines. When earlier lines are cut, stderr says how many. In --json, lines is then the count returned, and requestedLines and omittedLines are 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 list rows carry summary, and so do overdue and undelivered. The fields they leave out are now absent instead of null or "", and fieldsElided names them (#1096).
  • rig launch no longer calls an exited agent running. On a seat whose agent exited to a shell in its kept pane, rig launch <rigId> <seat> returns attention_required and exits 1, with the ways back. It used to report the seat already running (#1070).
  • rig up <rig> --existing reports a seat still missing part of its guidance. The rig then reads partially_restored instead of fully_restored, and the command exits 1 (#1068).
  • lastNudgeResult reads claimed on a claimed row whose wake wasn't confirmed. The recorded value is kept in the new lastNudgeWireResult (#1094, reported in #165).
  • rig chatroom history returns the newest messages when you give neither --after nor --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 --resume under 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 as resumed, and sends stop warning that its identity can't be confirmed. Before, such a seat stayed attention_required (#1080).
  • rig up --existing puts back the OpenRig guidance that rig down removed from CLAUDE.md, CLAUDE.local.md or AGENTS.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_required instead of a false resume (#1091).

Sends that used to be refused now arrive.

  • Codex seats behind a launcher. A seat whose codex is a launcher that starts Codex as a child now receives rig send and 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, and rig ps --nodes says 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 unknown with reason usage_limit instead of idle, and rig provider signals can 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 --verify reports an agent seat's wake result and any claim as soon as one is recorded. Before, it waited 30 seconds and said still-pending (#1029, towards #766).
  • New escalation setting: queue.wake_human_rung defaults to always. Set it to explicit-only to 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 099 and 101, as above.

Everything else since 0.6.9

Seats and terminals.

  • rig add takes a rig's name as well as its ID (#1027).
  • rig start says 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 open without --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 a rig view show <lens> --rig <name> rig name are no longer wildcards, in all seven lenses that filter by rig (#1126, #1165).
  • rig ask matches chat keywords such as config.json or C++ literally (#1127).
  • rig heartbeat reads 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 --json prints the daemon's error as JSON (#1075), and rig usage top reads every sample in its window (#1116).
  • rig workflow instantiate and project print the instance and packet they made (#1102).
  • rig transcript --tail keeps a line ending in % (#1104).
  • --json after -- no longer turns an error into JSON (#1106).
  • rig env prints 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 up round trip (#1092).
  • The docs guard keeps unusual file names exact (#1105).
  • The portability report handles header-shaped added text (#1108).
  • GET /api/bootstrap lists 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-256 ae10446b8aa6634d92ae7e2d1807a7debc84a6f4f0a8ac001d8182da3b1e622f, built once from 3001cc43 in 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 reports 0.6.10 (3001cc43). The fuller installed checks ran on the package built just before it from 18c0a0fd, 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 --verify can report outcome: "indeterminate" for a row the seat already claimed. Read claim for 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 add detects 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 doctor still checks both harnesses, including one you don't use. rig setup --providers doesn't change it.
  • rig tui --shared still attaches on the default tmux server, so it can't find the dashboard when the daemon runs on a non-default tmux socket. Use rig tui there 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 --nodes shows needs_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 up and rig 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 status shows Kernel: skipped whatever the kernel seats' state. Read them with rig ps --nodes --rig kernel --full, and bring the kernel back with rig 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 claude alias defined only in a nushell rc doesn't resolve;
    • after a reboot, start the daemon with rig daemon start and bring your rig back with rig 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:

And to the people whose reports shaped fixes here: