| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| OpenRig 0.6.12 source code.tar.gz | 2026-10-19 | 11.5 MB | |
| OpenRig 0.6.12 source code.zip | 2026-10-19 | 14.1 MB | |
| README.md | 2026-10-19 | 65.3 kB | |
| Totals: 3 Items | 25.8 MB | 0 | |
OpenRig 0.6.12
0.6.12 is a fix release about recovery and everyday operation, and most of it came from the community: 121 of its 206 changes are from 23 outside contributors. Restore brings back what you left running and leaves down what you stopped: an ordinary terminal seat relaunches fresh, rig start --last keeps a rig you took down on purpose down, and a slow Claude start ends as needing attention instead of failed. Managed compaction sends a /compact short enough to run again, and Claude seats now load the hooks OpenRig ships for them. You can set one seat's reasoning effort, give a team environment variables in its spec, change a seat's permission policy in place, launch a rig by its name, and read what each seat reports it costs. The CLI starts faster, and the daemon does much less work on a busy machine.
npm install -g @openrig/cli
It's built from 9e5382dd: main at 48fe7827, which holds 198 changes made since 0.6.11 (and five that 0.6.11 already shipped), plus eight changes merged later and picked onto it: #1491, #1488, #1492, #1496, #1483, #1504, #1506 and #1518, without [#1506]'s one edit to an agent startup guide section this release doesn't have, and without [#1518]'s edits to code from #1498, which isn't in this release. Nothing else merged after 48fe7827 is 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. Twelve database migrations run on the first start, whatever you use:
100adds the typing guard's mode columns (#1481);104addsnodes.effort_choice(#1209);105adds two columns tousage_samplesfor Claude's client-side cost estimate (#1233);107adds thepi_usage_entriestable (#1237), and108adds two columns to it and api_usage_chargestable (#1244);109makes the mode store's unique index per category, keeping every row (#1274);110addsworkflow_instances.scope_json(#1273);111addsrigs.env_jsonandnodes.env_json(#1294);112adds two indexes for reading recent queue activity, about 10 to 12 MB on a long-running install's database (#1326);113addsapplied_launch_observations.daemon_opt_out(#1371);114addssessions.agent_app(#1392);115rebuilds the Slack thread map keyed by channel and thread timestamp, keeping existing rows (#1436).
There are no migrations 102 or 106, and no earlier migration was changed.
The bundled openrig-core plugin goes from 0.1.9 to 0.1.13, and Claude seats now run its hooks. A Claude seat whose plugins include openrig-core (every agent spec OpenRig ships selects it) now starts with CLAUDE_CODE_PLUGIN_DIRS pointing at OpenRig's copy, so its activity relay, compaction save and restore hooks, and refocus actually run. Before, the plugin was copied to a folder Claude Code doesn't load. It needs Claude Code 2.1.280 or later; an older Claude Code ignores the setting, and OpenRig doesn't check the version. A seat that's already running picks it up at its next launch, restore or handover (#1344). The refocus hook may now take up to 60 seconds instead of 5, so a refocus that hangs can hold up a prompt for up to a minute (#1475).
Six new settings, all off except one: output.whoami_peers (default 8, used only while output.compact is on), plus bundle.services_enabled, provider.subscription_moves, usage.pi_cost_facts, usage.pi_openrouter_charge and transport.verify_input_box, all false. "Off by default" below says what each does and what acts with it off. output.compact and provider.usage_windows stay off and cover more than in 0.6.11.
Behaviour that changed:
rig start --lastleaves down a rig you stopped on purpose withrig downorrig seat stop, and prints how to bring it back (rig start --rigs <rig>);--jsoncarrieskeptDown.--all,--rigsand the picker are unchanged (#1238). Afterrig down,rig psand the TUI read the rigstoppedinstead of recoverable (#1254), and the printed restore command isrig up '<name>' --existing, which works even when the name matches a shipped starter (#1425).- An ordinary terminal seat relaunches fresh on restore and re-runs its startup actions, instead of stopping at
awaiting-decisionon every restore after its first. A required startup file missing for such a seat now blocks the whole restore before anything launches (required_startup_file_missing) (#1328). - Restore stops a seat whose current runtime differs from the one its snapshot started with, before creating its terminal session, and
--freshdoesn't bypass it (#1190). - A slow start ends as needing attention, not failed. A restored Claude seat that hasn't drawn its screen is watched for up to
runtime.readiness_timeout_seconds(30 s by default) and then endsattention_requiredwith its pane and attempted resume token kept, so a restore can take longer: up to about 27 seconds more for each seat that never starts, one after another (#1359). A seat is described as "returned to a shell" only when the process tree shows an idle shell (#1357, #1395, #1373), and the older restore path for rigs without pods keeps such a seat for attention instead of rolling it back (#1364). - A Pi or OMP seat whose agent has exited to a bare shell reads
attention_required(process_identity_mismatch) instead of running, sorig startoffers its rig as a restore candidate (#1391). - A send to a pane in tmux copy or view mode leaves the mode once and delivers. A pane that can't leave its mode gets no text, and the send is refused with
pane_in_mode(HTTP 409). A person scrolled back in that pane is returned to the bottom (#912, reported in #331). rig send --dangerously-interacttypes exactly the bytes and keys you give it, in any state and over every transport: a lone CR, Tab, Space or Esc acts as that key. Enter is added only when a complete answer is visibly staged in a recognised Claude Code or Codex input box; anywhere else, put CR in the payload yourself (#1366).- Managed
/compactis kept to 600 characters, sent only to an idle seat, and reported separately. Since 0.6.10 the managed command had grown long enough that Claude Code took it as pasted text, so it didn't run while the attempt read as delivered. The rest of the instructions move into the restore map and the restore request.rig compactandrig compact --stateshow a separatecompactresult:submitted, unconfirmed(it reached the seat; that isn't proof compaction ran),uncertain(not replayed) ornot sent. A running draft-aware seat with no recorded pane is refused withpane_unknown_protected:rig compactexits 1 (was 2) and the route answers 409 (was 502). Over the shared transport, a write that throws without a code makesrig sendexit 1 with HTTP 409 instead of 2 with 500 (#1483, towards #27). rig queue updaterefusals you can fix answer HTTP 400 and exit 1, not 500 and exit 2: eleven error codes for closure fields,blocked_onor wake options where they can't be stored, and a watchdog that isn't live or targets someone else.blocker_not_found,blocker_not_liveandblocker_malformedstill exit 2 (#1319).rig askexits 1 for an unknown or ambiguous rig instead of 0 (#1202).rig add, single-seatrig launch(including--retry-startup-from) andrig launch --seatswait up to 120 seconds for the daemon instead of 5. A timeout there still isn't a rollback, so checkrig psbefore running it again (#1287, #1271).- A runtime's
--versioncheck gives up after 30 seconds. At daemon start a hung probe no longer keeps the daemon from listening, andrig bootstrapnow blocks on a runtime that is installed but fails or times out its check, which it reports apart from one that's missing (#1211).rig up's preflight fails a Claude, Codex or OMP check that doesn't answer within 30 seconds (a warning for Pi), and stopping the daemon ends the probes it started (#1301). - Claude login detection is narrower. Only a current refusal (
Not logged in · Please run /login,Login expired · Please run /loginorOAuth token revoked · Please run /login) readslogin_required. The "Not logged in" footer alone no longer does, so a seat signed in through a gateway starts, resumes and restores normally (#1417, reported in #1405). - The
fablemodel alias now namesclaude-fable-5-1, so afablepin on a seat runningclaude-fable-5raises a divergence notice. A Claude pin ending[1m]no longer does when the seat runs that model (#1482). Pinned Pi seats are now checked, and a Pi thinking-level suffix such as:highdoesn't count as a divergence (#1349, #1403). - A custom permission policy saved with Windows (CRLF) line endings now takes effect. It used to fail to parse, so the seat fell back to the advisory floor; now it resolves to its declared posture at the next launch or restore (#1402).
rig bundle createrefuses harness login files (.claude/.credentials.json,.codex/auth.json,.pi/agent/auth.json) anywhere in an agent folder or carried project. An existing archive holding one without a record now fails verify, unpack and install; install answers 400 even with--force. "Off by default" covers the opt-in (#1488).rig scope mission createwritesstatus: planned, which keeps a new mission out of the project's proof rollup until you set itactive(#1289). With--workspace <project>it creates the mission inside that project, under its declaredmissions.root, which now wins over amissions/folder for every command that reads missions (#1430, reported in #70).- On Linux and macOS, the daemon runs tmux directly instead of through
/bin/sh. SetOPENRIG_TMUX_SHELL=1when starting the daemon to keep the old path (#1241). - The daemon writes Codex's
config.tomlonly when a Codex seat exists or launches, so a daemon that never runs Codex leaves~/.codex/config.tomlalone (#1297). - Slack: a person's new message in a rig's own mapped channel now goes to that rig's representative (or a seat named with
--inbound), and every seat post's sender line names the machine (from <seat> on <host id>), on one machine too (#1436). The app manifest asks for one more scope,users:read(#1433). rig removeandrig shrinkkeep a seat that receives work while it's being stopped: the late work goes to your--fallback, or the stopped seat is kept and the command answers 409 with the work listed (#1459). A stalerig unclaimthat would detach the seat's newer occupant is refused with 409session_not_current(#1379).rig seat statusreadsTyping guard: on (hold)for hold, and its JSON'sdesiredandeffectivebooleans now mean hold only (#1481).rig usage topno longer counts a new conversation, or a reset window, as burn. Tokens and rates are measured within one history and one window, so figures can drop and rankings change (#1348, reported in #774; #1473).- The execution view binds a queue row to a mission by its exact
mission:tag first (#1304), and aslice:tag can name a slice by its SPECid:as well as its folder (#1331).
Highlights
Restore and launch.
rig launchtakes a rig's name as well as its ID, locally and with--host. A name two active rigs share stops before anything is sent and lists their IDs (rig_ambiguous). Before, it took only an ID, and a name failed with not found (#1312).- A Codex seat that forks a conversation keeps its startup context when the new conversation's ID arrives late. The launch waits up to the readiness timeout for a verified child; if none arrives, the seat stops at
attention_required, andrig seat continue <seat>delivers its role once (#1438, reported in #317). A handover to a forked Codex conversation completes with the ID marked pending instead of failing (#1216). - A seat whose startup failed for a recoverable readiness reason becomes ready after a successful send or capture (#1236, towards #7). A periodic snapshot taken while
rig downwas stopping a rig no longer replaces the complete pre-down snapshot (#1147).
Set up a seat without touching the spec.
- Set one seat's reasoning effort:
rig seat set-effort <seat> --effort <level> --reason "<why>"(or--clear) saves it, and it's used at the seat's next launch, restore, handover or in-place Codex restart; nothing restarts.rig seat effort <seat>reports what was requested, what's saved, what the running process was launched with and what the session recorded (#1209). - Change an existing seat's permission policy:
rig policy apply <policy> --seat <seat> --reason "<why>"stores it for the seat's next restore, resume or launch. The running agent and the spec file don't change (#1285). - Give a team environment variables in its spec: an
env:block on the rig and on any member inrig.yamlreaches every seat, including Claude Code's cleared environment, carries into restores and handovers, andrig exportwrites it back.rig up <spec> --env KEY=VALUEadds a value for one launch. Names match^[A-Z_][A-Z0-9_]*$, andOPENRIG_*is reserved. The values aren't secret: they're stored in OpenRig's database and snapshots and copied by export and bundles (#1294).
Compaction and hooks. Besides the shorter managed /compact and the plugin hooks above: automatic compaction ignores a context reading taken before a seat was stopped, replaced, handed over or restarted (#1365), and with managed compaction on, Claude sessions OpenRig launches carry idleCompaction: false, so Claude Code 2.1.290 or later doesn't compact them on its own while idle (#1282). A seat can give a slow refocus more time with OPENRIG_REFOCUS_BUDGET_MS, from 4500 (the default) to 52000 ms (#1475).
Queue rows that say what happened.
rig queue update <id> --summary "<text>"on its own corrects a row's subject in any state (#1270, reported in #1040).rig queue update <id> --state <closing state> --resolution "<outcome>"stores the outcome on the row,rig queue showreturns it, and a later fallback adds its line instead of erasing it (#1292).rig queue show <id> --fullon a closed row addsclosingTransition: its state, reason, target, who closed it, when, and the closing note (#1290).- An agent with no shell can hand work to the team through
rig mcp serve, which gains five queue tools (rig_queue_create,rig_queue_show,rig_queue_list,rig_queue_claimandrig_queue_update), acting as the seat named byOPENRIG_SESSION_NAME. Nothing wakes such an agent; it sees new work when it checks (#1441).
What a seat costs. rig usage cost [--seat <session>] [--json] shows what each seat's harness reports about cost beside its tokens: for Claude, the status line's own estimate for the current session (labelled an estimate, not an invoice); for Codex, tokens and a note that Codex reports no cost. A missing figure reads "not reported", never $0. It needs no setting (#1233), and the TUI's new System → Cost page shows the same lines (#1261).
Faster. The CLI loads only the command being run and turns on Node's compile cache, so rig queue list and rig ps start several times faster in the author's measurements (#1380). The daemon runs tmux without a shell, captures up to 24 transcripts in one tmux call, skips reading terminals that haven't changed, and reads queue activity and obligations with far fewer queries (#1241, #1242, #1262, #1263, #1326, #1369, #1384, #1389; reported in #161 and #308). The timings are the authors' own.
Off by default, and what acts anyway
output.compact(OPENRIG_OUTPUT_COMPACT, from 0.6.11) now also shortensrig queue showandrig queue transitions(--fullprints everything;rig queue transitions --fullis new) (#1224), and boundsrig whoami --jsonpeers tooutput.whoami_peers(new, default 8), connected peers first;--all-peerslists everyone (#1225). Over SSH--host, the note's full-list command now names the host (#1248).provider.usage_windows(OPENRIG_PROVIDER_USAGE_WINDOWS, daemon, from 0.6.11) now also shows Claude's 5-hour and weekly windows from the seats' status lines inrig provider status, with--provider codex|claudeto limit a refresh (#1197); each seat's configured account (#1235); and, with--all-hostsor--hosts <ids>, every registered machine's windows, listed once per allowance and never added up (#1246). A Claude account's current availability always readsunknown, because nothing links a seat's reading to the login it used; each window still shows as that seat's reading (#1504). The TUI's System → Usage and Usage · all hosts pages are always listed and, with the setting off, say how to turn it on (#1243, #1259).usage.pi_cost_factsandusage.pi_openrouter_charge(OPENRIG_USAGE_PI_COST_FACTS,OPENRIG_USAGE_PI_OPENROUTER_CHARGE): Pi's own cost estimate inrig usage cost, counted once with a fork's inherited entries kept apart (#1237), and OpenRouter's actual charge beside it, never added to it. With both on, the Pi runner asks OpenRouter for each request's charge with the key OpenRig already gives the seat (#1244). A Pi seat reads both switches when it launches or resumes, so a change takes effect then; what was recorded stays visible.provider.subscription_moves(OPENRIG_PROVIDER_SUBSCRIPTION_MOVES): a record of moves of a Codex home's seats between subscriptions,rig provider moves [--home|--seat|--limit],rig provider moves show <id>andrig provider moves record --file <json|->, plus a section of theopenrig-userskill for an agent a person asks to manage subscriptions. While it's off, the commands exit 1 and the routes answer 409 (#1450).bundle.services_enabled(OPENRIG_BUNDLE_SERVICES_ENABLED): a bundle carries its declared Compose file,rig bundle inspectshows each service before anything runs, andrig upandrig bootstrapinstall it into a lasting target folder (#1474).transport.verify_input_box(OPENRIG_TRANSPORT_VERIFY_INPUT_BOX): a--verifysend to Claude Code or Codex reads verified only when the text was seen in the input box and the box was empty after Enter. It only reports; nothing is retried. Multi-line sends and wakes to Claude Code stay unconfirmed (#1267).- Per seat:
rig seat set-typing-guard <seat> --mode draft-aware --reason "<why>"checks the input box before typing and before Enter, and holds or refuses a message instead of typing over someone's unsent text; nothing retries it.--mode holdis the existing on, and--mode offthe default (#1481). - Per bundle:
rig bundle create --include-login-filesincludes those login files only when recipients should have them and the login's owner agrees, and records their paths asincluded_login_files(#1488). - Daemon environment:
OPENRIG_TMUX_CONTROL=1sends the daemon's routine tmux commands through one long-lived control client (#1383). - What acts with every setting off: the twelve migrations; the plugin hooks in Claude seats; Claude's cost estimate is recorded from the status line, and
rig usage costand the TUI's Cost page work; a Pimodels.jsonnotice can report a provider key's presence instead of unknown, becausemodels.jsonis now read the way Pi reads it (#1244); and the draft-aware guard's shared send and startup code runs for every seat.
Dependency and install-script changes
- npm dependencies: the daemon now declares
string-width(^8.3.0), which was already in the installed tree, so the lockfile adds no package (#1481). The daemon package exports two more entry points,./composer-prompts(#635) and./workflow-scope(#1273). The Node requirement is unchanged (node >=22). - Install scripts: unchanged. The package's only lifecycle script is still
postinstall: node scripts/check-abi.mjs. - Database: the twelve migrations above.
Everything else since 0.6.11
Seats, launch and restore.
- A failed process-lineage check says what it found (for example, that the running Codex was launched with a different conversation than the seat records), instead of blaming the pane's foreground label (#1398).
rig reconcile-sessionno longer reports a runtime drift for a pane readingshwhen Claude or Codex is running in it (#1395, reported in #1199); a Codex seat started through a shell wrapper isn't reported as returned to a shell while it starts (#1373, reported in #79). - When a Claude seat's startup prompt is still unsent, the launch presses Enter up to twice, each time only while the box holds exactly that prompt, and more Claude footers are recognised, so fewer healthy launches warn "Startup submission unverified" (#1295).
- In a Claude seat started with a permission mode, Shift+Enter inserts a newline when tmux's
extended-keysis on: the launch passes the pane'sTERM_PROGRAMandTERM_PROGRAM_VERSIONto Claude (#1399). The getting-started guide says how to add a newline when Shift+Enter submits (#1404). - The Codex resume command OpenRig prints keeps
--no-daemonwhen the seat's last managed launch used it; for seats launched before this, the guidance says the choice wasn't recorded (#1371, reported in #69). The daemon logs why it couldn't capture a Codex seat's resume token, once per reason, and stops those captures when it shuts down (#1284). rig seat set-resume-tokenwrites to the seat's latest session even after the system clock moved backwards (#1204). Whenrig seat cleanrefuses because an older session is still alive, its advice names that session instead of suggestingrig seat stop, which would act on the current occupant (#1206).- A launch leaves a project's
.claude/settings.local.jsonor.mcp.jsonuntouched, with a warning, when it isn't a JSON object, instead of overwriting it (#1311). OpenRig no longer rewrites a Claude seat's settings file every 30 seconds when its status line is already in place (#1286), and replaces a read-only copy of its context collector instead of failing (#1251). The temporary launch script removes itself with/bin/rmor, if that's missing, the shell's ownrm, so the agent still launches underset -e(#1310). - A daemon with its own
OPENRIG_HOMEbut the realHOMEorCODEX_HOMEwrites one advisory line todaemon.logand starts anyway (#1299). WithHOMEunset,rig authand the daemon look for Codex sign-in files in the account's real home (#1418). An exported but emptyOPENRIG_HOMEis treated as unset by the TUI's socket, the terminal token lookup andrig crash-cart(#1470). - An OMP seat's restore catch-up and history refresh work past 1 MiB of history when OMP offers its RPC protocol v2, up to 64 MiB (#1279, reported in #1275). A failed Pi or OMP turn shows the first usable error field (#1208).
rig bootstrapandrig requirementsresolve a relative spec path from your own folder when the target is this install's local daemon (#1213).rig create --jsonsays why a create failed, indetail(#1378).rig status --jsonprints the daemon, kernel, workspace root, rigs and cmux state as one object;daemon.reachable: nullmeans unconfirmed, not down (#1291).- OpenRig 0.6.12 adds
rig community-harness listfor installed community-harness presets, showing their maintainer and declared limits. These harnesses are not tested by OpenRig. Support is launch-only: no resume or fork, no resource projection or startup-file delivery, and identity remains unconfirmed. A quiet screen is not proof that the seat is idle (#1392, #1518).
Sends, wakes and the queue.
- Codex's
»prompt is recognised when reading an input box, so a staged message on a Codex seat can get its one guarded Enter (#635), andrig send --verifytells a message still in a Codex input box from one that was delivered (#1220). - A Codex seat reads as needing a person only when its pane shows a real approval or selection prompt; an unreadable pane still gets there after a short grace, as
permission_request_unverified(#943, towards #896). - A held-back wake no longer uses up a one-shot park timer (0.6.11's known issue): a wake the typing guard holds back is tried again at the timer's interval, and a shared one-shot timer retires when its last attachment is consumed (#1222).
- Stopping or retiring a watchdog while a check is running stops it: no late wake and no late record (#1325); its last attempt's time is still recorded (#1439). A waiting row whose blocker changes while an earlier wake is being sent still gets its next wake (#1435). A row parked on its owner's own repeating reminder isn't counted as stranded once the reminder has delivered, and
rig parkedmarks itservedByOwnReminder(#1424). - Closing a row as handed off without a verifiable successor now points to
rig queue handoff, and the stuck sweep flags a row closed onto itself (#1358, refs #318). A cross-host handoff's closing record carries the sender's identity, as a local one does (#1333). Absorbing an inbox entry into queue work is one transaction, so overlapping absorbs make one row (#1451). - Help, warnings and the shipped skills say
--summaryis a row's subject everywhere it's listed, and carry theproject:,mission:andslice:tags (#1354); the reply hint for messages from a person includes--summary(#1355). The TUI's RECENT list shows the first line of a row's body when it has no summary (#1393). - With nobody registered, a send to a person says to register one with
rig gateway human addinstead of reporting a missing registry projection (#1219).
Status, transcripts and the TUI.
rig capture --lines Nthat cut lines says activity is unknown, on stderr and asactivity: "unknown"in--json(#1226).rig pswith a context-usage filter but no--nodessays on stderr that the filter wasn't applied (#1437).- A stopped or removed seat's transcript capture stops, and its saved transcript stays readable at any age (#1281). A quiet seat's transcript health can read
livewith reasoncapture_unchangedwhile its last capture is more than 10 seconds old (#1262).rig transcript --tail Nno longer cuts off the first requested line (#1227). - The TUI's slice header says what its proof count counts:
acceptedwith a judgment policy,pairedwithout (#1288). TUI helpers keep working after the folder you started it in is deleted (#1485, reported in #1479); Open terminals sends the window's width, so a wide terminal opens the default view (#1205); the file reader finds headings with combining marks (#1471); the Help list stops at its last command (#1469); a sideways trackpad swipe no longer scrolls up or down (#1458); and rows cut to width keep emoji whole (#1453). GET /api/hostsreads an IPv6 HTTP host as reachable when it is (#1457). The web UI's Log page keeps emoji whole in shortened previews (#1454).GET /api/eventstakes?replay=0|<n>|alland streams its replay 500 events at a time; the default is unchanged (#1387).
Workflows, scope and proof.
rig workflow instantiateandrig workflow runtake--project,--mission,--sliceand--tags, stamped on every packet so the work shows on the slice's Queue tab;instantiate-lifecycletakes them from the lifecycle. An unknown project creates the instance unscoped with a warning (#1273). A workflow'spreferred_targetsentry can be writtenmember@{rig}to address whichever rig the instance is bound to (#1293). An edited workflow spec restored with an older modification time is picked up (#1363).- The execution view shows a slice parked on an
external:gate as a waiting lane (#1303), and shows amerged:<pr>report on the merged rung, counting it as merged only with acandidate:<sha>that matches the slice's built commit (#1302). A slice dependency can name a sibling by its SPECid:(#1372). - Files saved with Windows (CRLF) line endings read the same as Unix ones in
SPEC.mdintents (#1316), checkbox blocks (#1315),PROGRESS.md(#1314), proof and review headers (#1402) and artifact-pool watchdog reads (#1322). - The Scopes view reads a proof drop's folded evidence references (#1461) and mini-requirements numbered
1)(#1460). The daemon's scope audit answers "mission not found" for a mission name that leads outside the slices root (#1221). rig modekeeps a saved mode and a work posture side by side at one target, andrig mode unset --category mode|postureremoves one (#1274); therig mode setpreview reads an unusable answer as unknown (#1283); andrig mode's human output marks the eight saved fields nothing in OpenRig acts on yet (#1307).
Usage. rig usage series --since/--until (#1305) and rig bundle history --since (#1306) say when a bound isn't a date or time. rig usage top no longer shows a negative rate after a window resets (#1473).
Slack and notifications.
- One Slack app can serve several machines: the machine holding the app-level token relays the channels listed in
forwardChannelsto the machines that own them, and a person's answer posts in their own thread (#1436, reported in #192). AbotInboxblock delivers named bots' posts in one channel to one seat, as rows marked as data from a program (#1433). - A workflow gate waiting on a person shows that person the question, not the agent packet (#1143, reported in #1013), and still posts when its tags are very long (#1240). A seat's follow-up to a button answer, or to a reaction on a resolved ask, lands in that ask's thread (#1228).
rig slack manifest --helpand the setup guide say how to paste the manifest when Slack shows it empty (#1207, reported in #158). - An ntfy notification title with an em dash, an emoji or other non-ASCII text is delivered as written (#1317), and shortened notification bodies, slice stories and
rig askexcerpts keep emoji whole (#1472).
Bundles, specs and packs.
- A member's own
mechanicsurvives bundling and other spec rewrites (#1464). A blank list item in a rig spec, agent spec or startupfiles:list gets a validation error at its path instead of a crash (#1318), and an agent spec profile written as a bare key reads as an empty profile (#1320). - Context packs (#1234) and agent images (#1465) accept file names with two dots inside a name, such as
notes..md; a real..segment is still refused. An empty Docker Composepsresult reads as no services instead of unparseable output (#1452). On macOS,rig file copyreports how many bytes it copied (#1232).
Requests the daemon now answers cleanly. A route given a JSON body of null answers 400 invalid_json instead of 500 (#1342); a limit of 2^63 or more on queue overdue and usage series answers 400 (#1456); chat search behind rig ask matches _ and % literally (#1455); rig restore's not-found hint gives the working rig snapshot list <rig> (#1466); rig watchdog register warns when a cadence such as 5m will be read as 5 seconds (#1463); and rig whoami --host <id> --full forwards --full, which a remote older than v0.4.0 refuses (#1231).
Skills and guidance.
- The
rigsskill has a person's own Claude Code or Codex offer to join the team before its first message to the operator, so the operator sees a named teammate; inside tmux it says the effects first and the person chooses (#1492, #1496). For a Codex user it makes one optional offer of a removable rules file so sixrigcommands run without approval prompts (#1467). Setup re-checks a failed network check with network access before asking anyone to sign in again, installs throughrig setup, and the operator offers the Workshop configuration that fits the person's providers (#1434). delegating-worksays to brief a peer according to the model it runs, whichrig ps --nodes --jsonshows asmodel(#1486). Theopenrig-userskill adds an opt-in loop that wakes an attached app's agent when work arrives (#1444).rig ask --wakehelp and two skills explain the target forms (#1426).- The operator reads the keeping-a-watch page when a person asks it to watch something or remind them (#1217), and the page teaches a "warn me when my allowance runs low" watch (#1266, #1268).
- User-visible text says "harness" for the agent software around a model, and "community harness" for one an outside contributor maintains;
docs/reference/topology-naming.mddefines the terms (#1506).
Docs. The agent startup guide explains how a Codex seat compacts and how to size it (#1340); a new page explains how to keep your own Claude status line with OpenRig's context collection (#1308, reported in #1272); the rig spec reference says a HOME value reaches Pi's agent (#1335); and getting started pins the rigs skill to your installed release, with separate Claude Code and Codex commands and a Linux note for Codex's sandbox (#1431). In the repository: the README says only the older web UI is in maintenance mode (#1491, reported in #55) and points contributors' agents to the developing-openrig skill (#1370); the roadmap links the public board (#1423); the contributor guides describe the one-home skill workflow (#1432); and the coordination notes say which queue fields answer pane delivery (#1277, reported in #165).
Tests and repository checks. The Linux checks run on pushes to main (#1487); shipped skills regenerate from one home in the repository (#1396); a daemon-restart scenario joins the installed-package checks (#1440); the snapshot tick looks up its restore source only when a seat changed (#1375); tests use stub runtimes (#1298), clean up their temporary folders (#1300), keep compaction packets out of the shared folder (#1352, #1362) and pass on macOS's temporary folder (#1330); timing-sensitive tests wait on conditions (#1245, #1255, #1427, #1443, #1447); the native transcript suite runs concurrently again (#1377); cross-host usage gains tests (#1265); and two repository scripts were fixed (#1229, #1230).
How it was tested
- The final package: 4,438 files and 7,594,843 bytes (sha256
c16c934850d44139cd6b0cce400e84f976db448766fa15dccf8213cdc721598c), built from9e5382ddand stamped with it. An independent read matched every file against the release's source. - Compared with 0.6.11: 206 changes; the package grows from 4,208 files and 7,102,511 bytes to 4,438 files and 7,594,843 bytes.
- The source: an independent read confirmed that the release's source is exactly main at
48fe7827plus the first six picked changes, each identical to its merged original; the same read checked #1506, the seventh, and #1518, the eighth, at the sites where each was picked without its edits that depend on #1498. That's a check of what's in the release, not of how it behaves. - Each change ran the repository's automated tests, merged into the main of its day, before it merged. On the release commit itself, 344 selected tests, the build, the CLI type check, the generator and the docs and audit checks passed, and the packaged help ran for three commands; that's a selected set, not the full test suite.
- Upgraded installs: three long-running Linux installs moved to this release, two from the released 0.6.11 and one from a pinned 0.6.11 build. Each kept its queue rows and their contents, its running agent processes and its team layout, and each database passed its integrity check. That doesn't show that each agent's own conversation carried on.
- Teams at work after the upgrade: two Codex seats started through the shipped launcher sent messages, handed work off and were woken in both directions. A daemon restart in the middle of work kept a parked row and a deliberately stopped seat as they were. The delivery and idle-detection checks matched 0.6.11's except for one deliberate change, the clearer message when pressing Enter fails (163 of 164, against 164 of 164). A Pi agent launched, replied and received its messages; when woken for work, it answered early, sent a message to itself and didn't close its row. The agents were Claude Code 2.1.299 and 2.1.303 and Codex 0.163.
- A Claude agent through ordinary prompts, compaction and restore, with the plugin hooks loaded: six managed compactions were started by command, not by the automatic threshold. Four compacted and restored: one of them needed a person to point the agent to its restore map, and another needed seven approvals. Two failed, for different reasons (see Known issues). After compaction, refocus didn't meet its check: for active work its trace reported a gap after timing out, and for parked work it showed a general fallback. No prompt stall from the hooks showed up in the samples taken (#1344), which doesn't show there's none. A Codex seat compacted natively; Codex refocus wasn't run.
- A full snapshot restore brought back the three seats meant to be running and kept the stopped seat stopped, but reported
partially_restoredoverall, with that stopped seat left awaiting a decision. Work and each conversation after the restore weren't checked. - The first-user check, on a Mac with fresh user accounts: a person using Claude Code as their own agent installed OpenRig, reached a running team and got a useful change on a local branch, with some one-off approvals along the way. A person using Codex got the same result end to end after a workaround: Codex ran with
--no-daemon, and the person answered 19 one-off approvals. Running both people on one Mac found the cross-user problem in Known issues. The Mac had been used before, so this isn't a brand-new-machine result. - Sharing a team through the registry: a submission passed the registry's real pull-request check. We opened and closed the pull request for the person, so a person's own GitHub sign-in and submission weren't run.
- Compared with 0.6.11, the paths checked showed no problem newly introduced by this release. That covers the paths compared, not everything. Where problems did show up (the Mac cross-user routing and the two compaction failures), the code involved matches 0.6.11's, but 0.6.11 wasn't run alongside to compare.
- Our own team's install moved to this release, stalled while its host was under heavy load, and was put back on 0.6.10. The evidence points to the host running short of resources, but whether the stall came from this release isn't established. The install then moved to this release again from a fresh backup: its database passed its integrity check, its running agent sessions were kept, and a queue round trip worked at normal load. That shows a good start, not how it holds up over time.
- Not run on this release: a working day of use, the automatic compaction threshold and slow leaks (these checks were deliberate events over a few hours); a team with one machine still on an older release; the 30-second
--verifywait from the package; a shared-server restart on a Mac; a brand-new Mac; native Windows; the installed-package scenarios on this exact release (they ran on an earlier build); Codex refocus and its packet; a real Codex fork; and a restore after a reboot. Other behaviour described in these notes comes from each change's own tests and reviews. Slack wasn't run on this release: the gate question (#1143), one app across several machines (#1436) and the standing Slack checks ship without a native run, and they're checked in real use after release.
Known issues
- On a Mac with more than one user account, a second user's
rigcommands can reach the first user's OpenRig. In the first-user check, the second person's ordinary commands reached the first person's daemon on its default port (7433), read one of its queue rows and sent a request to the first person's operator, which ran its checks and refused to work on the other user's private project. Running each user's daemon on its own port let both people work, but it doesn't keep them apart. The code involved matches 0.6.11's; 0.6.11 wasn't run to compare. It's being diagnosed for 0.6.13. - Managed compaction failed in two of six runs on this release. In one, saving the agent's recap needed a one-off approval, so the agent stopped at the approval and the compaction was never sent. In the other, the restore map was ready about ten seconds after the 120-second preparation deadline, so the compaction wasn't sent. The code involved matches 0.6.11's; 0.6.11 wasn't run to compare. Confirm that a compaction ran as described in the next item.
- After a compaction, refocus may not show the agent's current work. For active work, its trace can time out and report a gap; for parked work, it can show a general fallback. The code involved matches 0.6.11's; 0.6.11 wasn't run to compare.
- The one full snapshot restore run on this release reported
partially_restored: the three seats meant to be running came back, and a deliberately stopped seat was left awaiting a decision. - Managed compaction's command budget is 600 characters, set from one comparison on Claude Code 2.1.282 (792 characters ran as a command, 850 didn't), and a later Claude Code could move that line. Nothing confirms compaction ran; read
submitted, unconfirmedas reached, and confirm by the restore request or the drop in context (#1483). - Two plugin hook runs for the same seat aren't serialized: if a harness overlaps them, a post-compaction record can be lost or a refocus delivered twice. Overlapping runs weren't tested, and the samples that showed no prompt stall don't show that overlaps or stalls can't happen (#1344, #1475).
rig policy currentand plainrig psdon't show a policy stored withrig policy apply --seat;rig seat statusand pod-aware export do (#1285).env:and--envvalues aren't secret, and members added later withrig growcan't carry a member-levelenv:(#1294).rig up --envis not forwarded for flat-node specs or v1 bundles, although the launch may succeed. Do not rely on the flag for those formats in this release (#1294).- A fresh handover of a Claude seat in the classic renderer can report
completebefore the new Claude is ready, because the readiness check can match the previous occupant's text still in the pane, so the handover packet may be typed before the successor starts. 0.6.11 has the same behaviour. Until it's corrected, check that the successor read its packet (#1544). - One Slack app across machines was simulated in one process, never run on two real machines. Relayed events are trusted from the calling daemon, a relay that keeps being refused is retried with no limit,
rig slack verifyon the hub doesn't check relayed channels, and an answer from a seat other than the one the message reached still posts at the top level (#1436). - The draft-aware typing guard waits for idle inside the seat's delivery lease when the input box is empty, which can delay other work for that seat (not measured), and it can't guard text a person types in the instant before OpenRig types (#1481).
- A Claude account's availability always reads
unknownwith usage windows on, until a seat's reading can be linked to its login (#1504). - A restore starts seats one after another, so each seat that never draws its screen adds about the readiness timeout (#1359).
- A delivery already in transport when its watchdog stops still completes, with its records (#1325).
- The recent-activity index costs about 10 to 12 MB on a long-running install, and each new transition writes one more index entry (#1326).
- The
openrig-userskill's subscription section mentions apps that don't ship in this release; don't look for them (#1450). - With
bundle.services_enabledon,rig up <file>.rigbundleinstalls into the current folder when you don't give--target(#1474). - A send to a seat can still be refused for a quoted permission prompt that isn't really waiting; this is unchanged from earlier releases.
- Carried from 0.6.11:
rig seat restart --keep-conversationsupports Linux only, and its native result hasn't been re-run on 0.6.12.- The rig status API can call a running rig
blockedbecause of one seat that isn't running: it folds a restore forecast into current status (#1141). - A Codex seat can keep reading as at its usage limit in a constructed screen case that hasn't been seen in a real session (#1185).
- After
rig scope slice createsays it couldn't verify membership, the slice was kept. Checkmission.yamlbefore creating it again (#1007). - The first-install check is still limited: on this release it ran on a Mac that had been used before, with fresh user accounts, for Claude Code and Codex (see How it was tested). A brand-new Mac and native Windows haven't been checked, and Linux was last checked with 0.6.11.
- A second session in the same folder can misread a running team; the operator can point a person without a display at the shared dashboard without saying how to open it; the skill installer may not select Claude Code when it detects another agent;
rig doctorchecks both harnesses;rig tui --sharedattaches on the default tmux server; a team's first steps can still ask for approval; a seat waiting at a permission prompt shows no product notice of its own; a launched team writes into its working folder; a resumed Claude seat can't be confirmed after/clear, an in-process/resumeor a hand-started process; Codex team seats don't ask before lifecycle commands; the send gate trusts the latest recorded hook; and after a restartrig statusshowsKernel: skipped. - A Claude Code seat whose permission request was approved automatically can still read "needs input"; the Codex case is fixed (#943, #896).
- Slack missed-message recovery covers the default channel only, and private channels and direct messages aren't supported targets.
- Older issues, as in 0.6.11: 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 withrig 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; and 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:
- @akushonkamen, @alxledesma, @Jacob-9909, @Mr-Neutr0n, @Sethhhhhhh and @sn1thy, in their first contributions;
- @AdamWhitehurst, @adampog, @Coder8124, @dajiaohuang, @danielkuykendall23-boop, @DeryFerd, @haralez, @Nikhi00718, @oodadoudou, @Quentin-M, @rudycelekli, @shravansumanthanan, @smota, @Totopo27, @Vaishnavi220506, @XTLine and @zichen0116.
To the people whose earlier work was finished here: @Aschenbath (#1072, re-landed with @Mr-Neutr0n's commits as #1481, and #1158 in #1438) and @dajiaohuang (#104, in #1430).
And to the people whose reports shaped fixes here:
- @a4w-h4y (#158);
- @AlexGhanem (#1275);
- @archuity (#1405);
- @celaya-solutions (#79);
- @d3fvxl (#774);
- @davey64 (#1199 and #1479);
- @floynk-agent (#896);
- @jethrolarson (#55);
- @kainne44 (#70);
- @korallis (#161 and #308);
- @m3ac-AllbrittenJ (#317, #318 and #331);
- @mlc-factory-bot (#192);
- @natefaerber (#1272);
- @psbanka (#1040);
- @reisalbuquerque (#69);
- @roALAB1 (#165);
- @shintaii (#27);
- @tianqizhao0704 (#1013).