release: 0.6.11 version and release text (#1253)

Version 0.6.10 to 0.6.11 in package.json, packages/{cli,daemon,ui}/package.json and package-lock.json; the 0.6.11 CHANGELOG section, whats-new note and capability page. Refs #1252.
This commit is contained in:
Mike Schwarz authored and GitHub committed 2026-10-13 23:21:16 -07:00
1 parent 1a73ec57bc
commit af1b61bf52
8 files changed
+413 -151

No files matched your search

+237
View File
@@ -8,6 +8,243 @@ deprecations, and behavioral changes. Breaking changes are called out explicitly
---
## [0.6.11]
0.6.11 is a fix release about recovery and wasted agent time, most of it from
the community. A send that waits for a seat to go idle no longer holds up every
other send to that seat, a parked seat isn't woken again for rows that haven't
changed, restore stops for a decision instead of starting a seat fresh when an
earlier conversation may still be resumable, a Codex seat at its usage limit
stays marked as limited while its screen redraws, and on Linux a Codex seat can
be restarted in place on the same conversation. It is built from the commit
tagged `v0.6.11`. The changes since 0.6.10:
### Before you upgrade
- Restart the daemon after upgrading the CLI (`rig daemon stop`, then `rig
daemon start`). One migration runs on the first start: `103` adds one column
to `sessions`, `intentionally_stopped`, which is 0 for every existing row
([#1192](https://github.com/mvschwarz/openrig/pull/1192)). There are no
migrations `100` or `102`. openrig-core stays at 0.1.9; two of its files
changed ([#1174](https://github.com/mvschwarz/openrig/pull/1174),
[#1066](https://github.com/mvschwarz/openrig/pull/1066)).
- Expect a restore to stop a seat at `awaiting-decision` and start nothing when
the seat wasn't running at the snapshot but an earlier session recorded a
resume token, because the token doesn't prove that conversation can still
resume. `rig up --existing` and `rig launch` no longer start it fresh, and
`rig launch` of such a seat exits 1; the message names the command that
starts it fresh on purpose
([#1141](https://github.com/mvschwarz/openrig/pull/1141)).
- Expect a restore of a rig whose seats are in pods to roll a seat back to
`awaiting-decision` as unresumable only when Claude, Codex or Pi reports its
conversation missing, starting nothing and leaving no new pane behind. A rig
where every seat ends this way reads `partially_restored` instead of
`failed`, with exit 1 either way. A Claude that exits to its shell for
another reason is reported failed with its pane kept, as in 0.6.10. Restores
of rigs without pods keep their earlier handling
([#1191](https://github.com/mvschwarz/openrig/pull/1191),
[#1218](https://github.com/mvschwarz/openrig/pull/1218)).
- Read `outcome: "claimed"` from `rig queue create --verify` for a claimed row
whose wake wasn't confirmed, instead of `indeterminate`
([#1168](https://github.com/mvschwarz/openrig/pull/1168)).
- Expect `rig send --wait-for-idle N` to wait before it takes the seat's
delivery lease, so other sends and queue wakes to that seat aren't held
behind it. N is now a deadline from the start of the wait, including any time
spent waiting for the lease, and a timeout names the wait you asked for
([#1103](https://github.com/mvschwarz/openrig/pull/1103),
[#1183](https://github.com/mvschwarz/openrig/pull/1183)).
- Expect `rig seat launch --fresh --stop` to refuse a seat with a still-live
older session before it stops the current agent. `--plan` previews a fresh
launch without changing anything and exits 0 even when it would be blocked;
`--reason` is required only to execute
([#1156](https://github.com/mvschwarz/openrig/pull/1156)).
- Expect a seat stopped with `rig seat stop` to be left out of its rig's state,
so the rig no longer reads `degraded` for it. `rig ps --nodes --json` carries
`intentionallyStopped`, and a rig whose seats were all stopped this way reads
`stopped` ([#1192](https://github.com/mvschwarz/openrig/pull/1192)).
- Read `rig queue whoami --work-candidates` as up to 50 held and 50 next rows,
with `heldTruncated` and `nextTruncated`; `heldAndNextTruncated` now means
either list was cut. With `OPENRIG_REFOCUS_WORK_PACKET` on (off by default,
as in 0.6.10), the refocus work packet lists held and next work separately,
up to 50 each ([#1066](https://github.com/mvschwarz/openrig/pull/1066)).
### Highlights
- Restart one Codex seat in place on Linux with `rig seat restart <seat>
--keep-conversation --reason "<why>"`: the same pane and conversation, on
whatever account its Codex home now holds. It doesn't switch accounts itself.
It refuses with nothing stopped unless the seat is a Codex seat OpenRig
launched, in a single pane, with a conversation it can prove and unchanged
running settings. `--plan` runs every check and stops nothing, and `--verify
--expect-account <account>` reports `moved` only when a tool turn has
completed in the same conversation since the restart and Codex's status names
that account. On macOS, a request that gets as
far as reading the running process refuses before stopping the seat
([#1196](https://github.com/mvschwarz/openrig/pull/1196),
[#1195](https://github.com/mvschwarz/openrig/pull/1195),
[#1212](https://github.com/mvschwarz/openrig/pull/1212)).
- Stop waking a parked seat whose occupant is known again for the same rows
after a wake was delivered, until it updates one of them or one changes
state. A failed, refused or unrecorded wake still repeats at the next park,
and a new occupant gets its first wake. Delivered means typed into the
seat's terminal, not read ([#1142](https://github.com/mvschwarz/openrig/pull/1142)).
- Keep a Codex seat at its usage limit `unknown` with reason `usage_limit` while
its screen redraws, instead of `running`, with `usage_limit` under REASON in
`rig ps --nodes`. It clears when a readable screen shows no banner, or when
Codex shows it's working again
([#1185](https://github.com/mvschwarz/openrig/pull/1185)).
- Report the Slack receipt beside the terminal wake from `rig queue create
--verify` for a registered person who is also a seat with a pane, in a
`gateway` object (`posted`, `transport-failed`, `never-posted` or
`still-pending`); posted isn't read. It waits for that receipt up to the
existing 30-second default, even when Slack isn't set up or the row won't be
posted, and then reports the Slack side as pending.
`GET /api/queue/:qitemId` returns `ownerNotificationLevel`
([#1085](https://github.com/mvschwarz/openrig/pull/1085)).
- Launch a forked Claude seat (`rig fork`, or `session_source: fork`) with its
own session ID, so strict restore and clear-attention can verify it as its
own conversation. Forking a Claude seat needs Claude Code 2.0.73 or later,
which OpenRig doesn't check; forks launched before this read `mismatch` until
they're relaunched ([#1144](https://github.com/mvschwarz/openrig/pull/1144)).
### Seats and restore
- Stop passing the launching Claude Code or Herdr session's identity variables,
such as `CLAUDECODE`, to seats; if removing them fails, the launch goes ahead
with a warning ([#1151](https://github.com/mvschwarz/openrig/pull/1151),
finishing [#771](https://github.com/mvschwarz/openrig/pull/771)).
- Warn on stderr when `rig up` chose `/` as the launch folder itself
([#1150](https://github.com/mvschwarz/openrig/pull/1150), from
[#226](https://github.com/mvschwarz/openrig/pull/226)).
- Expand a member `cwd` that is `~`, starts with `~/` or uses `$VAR` or
`${VAR}`, from the daemon's environment, when the path as written doesn't
exist
([#1153](https://github.com/mvschwarz/openrig/pull/1153)).
- Keep a late readiness result from overwriting a newer launch attempt
([#1188](https://github.com/mvschwarz/openrig/pull/1188)).
- Show a Codex seat's `runtimeContext.threadId` in `rig whoami --full --json`
when its stored conversation ID was verified resumable
([#911](https://github.com/mvschwarz/openrig/pull/911)).
### Sends and queue
- Confirm enveloped multi-line messages that the agent's screen indents in
`rig send --verify` and in queue wakes
([#1145](https://github.com/mvschwarz/openrig/pull/1145)).
- Read a Claude footer in auto, bypass or plan mode on the last line as idle
when no activity hook is reporting
([#1179](https://github.com/mvschwarz/openrig/pull/1179)).
- Show the provider's own reason for a failed Pi or OMP turn when it gives one
([#1181](https://github.com/mvschwarz/openrig/pull/1181)).
- Give a `handed-off` closure with no visible successor the same custody
advisory and stuck-sweep finding as a `done` closure
([#1189](https://github.com/mvschwarz/openrig/pull/1189)).
### Status and TUI
- Take a rig's running count and status in `rig ps` from the same set of
sessions as `rig ps --nodes`
([#1186](https://github.com/mvschwarz/openrig/pull/1186)).
- Say in the TUI when a queue sample hit its cap or failed to load: counts read
`N+`, a seat missing from the sample shows `?`, and Pulse no longer lists a
NEEDS YOU item a second time. The caps count the whole host
([#1175](https://github.com/mvschwarz/openrig/pull/1175)).
- Fill the TUI Topology table's Q, WORK and NOW columns again on drilled views
and on a seat's page ([#1173](https://github.com/mvschwarz/openrig/pull/1173)).
### Slack and ports
- Recover a reply sent with "Also send to channel" in the default channel after
a connection gap ([#1187](https://github.com/mvschwarz/openrig/pull/1187)).
- Refuse a `daemon.port` outside 0–65535 in `rig config set`, and fall back to
the file or default with a warning when the environment or `config.json`
holds one ([#1140](https://github.com/mvschwarz/openrig/pull/1140)); refuse
one in `rig daemon start --port`, with exit 1
([#1201](https://github.com/mvschwarz/openrig/pull/1201)).
### Scope, proof and refused requests
- Give parallel `rig scope slice create` calls different slice numbers. A
number is never reused, and each create leaves a hidden `slices/.nn-NN` claim
file ([#1007](https://github.com/mvschwarz/openrig/pull/1007)).
- Take `--project <id>` or a `<project>:` scope prefix in `rig proof show` and
`rig proof judge`; scope readiness for a project selected in the TUI uses
that project's own root
([#1149](https://github.com/mvschwarz/openrig/pull/1149), finishing
[#136](https://github.com/mvschwarz/openrig/pull/136)).
- Return 400 before storing anything from the chat send and topic routes for
payloads that used to fail with 500
([#1122](https://github.com/mvschwarz/openrig/pull/1122)); answer a
fractional or non-numeric generation in `/api/wake-resolve` with the usual
"does not exist" reply ([#1129](https://github.com/mvschwarz/openrig/pull/1129));
refuse a watchdog `scan_interval_seconds` that can't be turned into a number,
such as non-numeric text, a boolean or an empty array
([#1131](https://github.com/mvschwarz/openrig/pull/1131)); and match unmanaged
agent process names exactly, plus `claude.exe` and names cut to 15 or 16
characters ([#1133](https://github.com/mvschwarz/openrig/pull/1133)).
### Off by default
- Add `output.compact` (or `OPENRIG_OUTPUT_COMPACT`): the seven queue write
commands print a short receipt instead of the whole row, and `--full` prints
the whole row. While it's off, their output is unchanged
([#1137](https://github.com/mvschwarz/openrig/pull/1137)).
- Add `provider.usage_windows` (or `OPENRIG_PROVIDER_USAGE_WINDOWS` in the
daemon's environment): `rig provider status --refresh` reads a Codex login's
usage windows once. While it's off, `--refresh` says how to turn it on and
exits 1 ([#1194](https://github.com/mvschwarz/openrig/pull/1194)).
### Guidance and docs
- Split the `rigs` and `openrig-skills` skill descriptions by who is asking: a
person in their own session, or an agent inside a rig
([#1174](https://github.com/mvschwarz/openrig/pull/1174)).
- Add a reference page on keeping a watch for a person with today's queue
commands ([#1064](https://github.com/mvschwarz/openrig/pull/1064)); see Known
limitations.
### Dependency and install-script changes
- No npm dependency or lockfile change beyond OpenRig's own version, the same
`postinstall`, and the same `node >=22`.
### Tests and repository checks
- Fix daemon and CLI tests that failed on some Linux machines: ext4 inode
reuse, dash as `/bin/sh` and a 002 checkout umask
([#1148](https://github.com/mvschwarz/openrig/pull/1148), finishing
[#83](https://github.com/mvschwarz/openrig/pull/83)); clean up after the
pane-isolation tests ([#1169](https://github.com/mvschwarz/openrig/pull/1169));
keep the TUI default socket-path test from failing on macOS
([#1182](https://github.com/mvschwarz/openrig/pull/1182)); and run the
portability report when it's started through a symlinked path
([#1109](https://github.com/mvschwarz/openrig/pull/1109)).
### Known limitations
- `rig seat restart --keep-conversation` supports Linux only. Its automated
tests are hermetic: they don't restart a real Codex seat.
- The rig status API (`GET /api/rigs/:id/status`) can call a running rig
`blocked` because of one seat that isn't running: it folds a restore forecast
(that seat would stop for a decision) into current status. No seat is halted,
and `rig status` and the TUI's rig list don't show it for a running rig
([#1141](https://github.com/mvschwarz/openrig/pull/1141)).
- A Codex seat can keep reading as at its usage limit when an old banner is
followed by a submitted prompt and the agent's reply, with no Codex working
line and no input line below; it's recorded again every five minutes. The
case was constructed from the source and hasn't been seen in a real session
([#1185](https://github.com/mvschwarz/openrig/pull/1185)).
- The keeping-a-watch page says a timer fires once. When the typing guard holds
a one-shot `--wake-after` wake back (it shows as `retained`), that held-back
attempt is recorded as the timer's one fire and later wakes aren't, so the
timer isn't retired: it can wake the owner again at each interval while the
row stays set aside. A row sharing the timer through `--wake-watchdog`, after
the original row was handed off or stopped, loses its one wake if that wake
is held back.
Thanks to everyone whose pull requests are in this release; they are listed in
the release notes, with how it was tested.
## [0.6.10]
0.6.10 is a fix release, most of it from the community. Setup can be told
+131 -130
View File
@@ -1,7 +1,7 @@
# What changed in OpenRig 0.6.10
# What changed in OpenRig 0.6.11
This note is for an agent on an install that was just upgraded to 0.6.10. It lists only what behaves differently from
0.6.9 and what to do about it. For everything OpenRig can do, read the capability map:
This note is for an agent on an install that was just upgraded to 0.6.11. It lists only what behaves differently from
0.6.10 and what to do about it. For everything OpenRig can do, read the capability map:
`rig context get onboarding-width/public-what-you-can-do.md`. Each release replaces this file, so
`rig context get reference/whats-new.md` describes the installed version once the upgraded daemon is running. Without
a running daemon, read `$OPENRIG_HOME/reference/whats-new.md`. The daemon refreshes that copy when it starts, so right
@@ -9,158 +9,159 @@ after an upgrade it can still hold the previous version's note.
## After the upgrade
- **Restart the daemon** (`rig daemon stop`, then `rig daemon start`). Two migrations run on the first start: `099`
adds one partial index to the queue table, and `101` adds four empty columns to `sessions`. Neither changes existing
data. There is no migration `100`. The bundled openrig-core plugin goes from 0.1.8 to 0.1.9.
- **Restart the daemon** (`rig daemon stop`, then `rig daemon start`). One migration runs on the first start: `103`
adds one column to `sessions`, `intentionally_stopped`, which is 0 for every existing row. There are no migrations
`100` or `102`. The bundled openrig-core plugin stays at 0.1.9; two of its files changed.
- **Two new switches, both off by default:**
- `output.compact` (or `OPENRIG_OUTPUT_COMPACT`): the seven queue write commands (`rig queue create`, `claim`,
`unclaim`, `update`, `block`, `handoff` and `handoff-and-complete`) print a short receipt instead of the whole
row, and `--full` prints the whole row. While it's off their output is unchanged, `--full` is accepted, and
`rig config` lists the key.
- `provider.usage_windows` (or `OPENRIG_PROVIDER_USAGE_WINDOWS` in the daemon's environment): `rig provider status
--refresh` reads a Codex login's usage windows once. While it's off, `--refresh` says how to turn it on and exits 1.
## Output that changed shape
- **`rig capture --lines N` is the last N lines,** after blank rows at the bottom are dropped. When earlier lines are
cut, stderr says `[rig capture: <session>: N earlier lines not shown; last M shown]`. In `--json`, `lines` is then
the count returned, and `requestedLines` and `omittedLines` are new (per seat under `--rig` or `--pod`). For the old
output, N history lines plus the whole pane, add `--history-plus-pane`; it keeps the old JSON too, without
`requestedLines` or `omittedLines`. Without `--lines`, or with a non-numeric or zero `--lines`, nothing changed. A
short capture doesn't prove a seat is idle.
- **Compact `rig queue list` rows carry `summary`,** and so do `overdue` and `undelivered`. The fields they leave out
(`body`, `evidenceRef`, `humanDetail`, `waiting`, `chainOfRecord`, `replyTo`, `humanQuestions`, `humanAnswers`) are
now absent, not `null` or `""`, and `fieldsElided` names them. A filter that tested those fields for null must test
for presence. Read a full row with `rig queue show <id> --full --json`.
- **`lastNudgeResult` reads `claimed`** on a claimed row whose wake was recorded as `delivered-ack-pending` or
`indeterminate:…`. The recorded value is unchanged and shows in the new `lastNudgeWireResult`; unclaiming brings it
back. `claimed` is never promoted to `verified`.
- **`rig chatroom history` returns the newest messages** when you give neither `--after` nor `--since`, still listed
oldest first. Before, a room longer than the limit returned its oldest messages. `--after` and `--since` still page
forward from that point, and `rig chatroom wait` is unchanged.
- **`rig queue create --verify` reports `outcome: "claimed"`** for a claimed row whose wake wasn't confirmed, instead
of `indeterminate`. A claim is pickup, not proof the body was read.
- **`rig queue create --verify` to a registered person who is also a seat with a pane reports the Slack side too.**
Beside the terminal wake it adds a `gateway` object: `posted` (`connectorAccepted: true`), `transport-failed` or
`never-posted` (`connectorAccepted: false`, with the detail), or `still-pending` (`connectorAccepted: null`). The
wait is still bounded by the existing 30-second default, and it can use all of it even when Slack isn't set up or the
row won't be posted; the Slack side then reads `still-pending`. Posted isn't read, and "This is not a failed handoff"
isn't shown when Slack reports a failed delivery. `GET /api/queue/:qitemId` returns `ownerNotificationLevel`, or
`null`.
- **`rig queue whoami --work-candidates` returns up to 50 held and 50 next rows,** with `heldTruncated` and
`nextTruncated`. `heldAndNextTruncated` now means either list was cut. With `OPENRIG_REFOCUS_WORK_PACKET` on (off by
default, as in 0.6.10), the refocus work packet lists held and next work separately, up to 50 each.
- **`rig ps --nodes --json` carries `intentionallyStopped`,** and `rig ps --nodes` shows `usage_limit` under REASON for a
Codex seat at its usage limit.
## Seats and restore
- **`rig launch <rigId> <seat>` no longer calls an exited agent running.** When a seat's kept pane is at an idle shell,
the launch returns `attention_required` (HTTP 409, exit 1) with `Session alive, agent not running for '<seat>'` and
the ways back: resume it with `--snapshot-id <id>` when a snapshot can, `rig seat launch <session> --fresh --stop`, or
restart the agent in the pane. The pane and its history are kept. This covers Claude Code, Codex, Pi and OMP seats.
- **`rig up <rig> --existing` puts back the guidance `rig down` removed.** Before a resumed seat starts, the missing
OpenRig managed blocks go back into the rig's Claude file (`CLAUDE.md`, or `CLAUDE.local.md`) or `AGENTS.md` for
Codex. Existing blocks and the person's own text are untouched, and nothing is sent to the conversation. The
warnings say `Restore guidance: <seat>: put back missing blocks …`. A seat still missing a block keeps running, its
node lists `guidanceGaps`, the rig reads `partially_restored` instead of `fully_restored`, and `rig up` exits 1.
- **A resumed Claude seat whose session ID changed can prove.** When Claude continues `--resume T1` under a new ID T2,
and the first SessionStart hook from the process OpenRig launched reports `source: "resume"`, OpenRig records T2. The
seat restores as `resumed`, `rig seat clear-attention` can clear it, and sends stop warning that the launch identity
differs. Resume commands now start with `OPENRIG_RESUME_LAUNCH='<T1>'`. It needs openrig-core 0.1.9; `/clear`, an
in-process `/resume`, or a hand-started process still keep the refusal.
- **A restore no longer proves a seat from a launcher's token** when the launcher isn't Claude and the Claude it
started names a different conversation. That seat reads `mismatch` and the restore returns `attention_required`.
- **A seat whose tmux session is confirmed gone reads `detached`,** with activity `unknown` and reason
`session_missing`. `rig ps --nodes` shows `tmux session missing; restore or relaunch the seat`, `rig seat status`
prints a `Reason:` line, and `--full --json` adds `storedSessionStatus`. The stored status isn't rewritten.
- **A Codex seat at its usage limit reads `unknown` with reason `usage_limit`,** not idle, when its screen ends with
the `■ You've hit your usage limit` banner. For a seat bound to a known Codex account, `rig provider signals` can show
a provider-event signal for that account that allows a switch decision.
- **`rig add <rig> …` takes the rig's name as well as its ID.** A name two active rigs share is refused with
`rig_ambiguous` and the candidates. `rig launch` still takes an ID only.
- **`rig start` says why it skipped an existing kernel:** `Kernel auto-boot skipped (kernel rig already managed).` and,
if its seats aren't running, `rig up kernel --existing`.
- **A restore no longer starts a seat fresh when an earlier occupant left a resume token.** If a seat wasn't running
when the snapshot was taken, but an earlier session recorded a resume token, `rig up --existing` and `rig launch`
stop that seat at `awaiting-decision` and start nothing, because the token doesn't prove that conversation can still
resume. `rig launch` of such a seat exits 1 where it used to start it fresh. The message names the command that
starts it fresh on purpose. See the known gap below for how this shows in the rig status API.
- **In a restore of a rig whose seats are in pods, a seat is rolled back as unresumable only when its runtime reports
the conversation missing.** When Claude, Codex or Pi reports that, the seat goes back to `awaiting-decision` and
nothing starts, instead of a failed launch that left the new pane behind. A rig where every seat ends this way reads
`partially_restored` instead of `failed`; the exit code is 1 either way. A Claude that exits to its shell for another
reason keeps 0.6.10's result: the seat is reported failed and its pane is kept, so you can read what happened. Restores
of rigs without pods keep their earlier handling.
- **`rig seat launch --fresh --stop` checks before it stops anything.** A seat with a still-live older session is
refused before the current agent is stopped; 0.6.10 stopped it first. `--plan` previews a fresh launch without
changing anything and exits 0 even when it would be blocked. `--reason` is required only to execute; leaving it out
reports `missing_reason`.
- **A seat you stop on purpose no longer makes its rig read `degraded`.** `rig seat stop` records the stop, and `rig ps`
and the TUI leave that seat out of the rig's state; running counts still exclude it. A rig whose seats were all
stopped this way reads `stopped`.
- **Restart one Codex seat in place, on Linux:** `rig seat restart <seat> --keep-conversation --reason "<why>"`
restarts it in its own pane on the same conversation, so it starts again on whatever account its Codex home now
holds. It doesn't switch accounts itself. Before it stops anything, it checks that the seat is a Codex seat OpenRig
launched, in a single pane, with a conversation it can prove, and that relaunching wouldn't change the running
settings; any doubt refuses with nothing stopped. `--plan` runs every check and stops nothing.
`--verify --expect-account <account>` reports `moved` only when a tool turn has completed in the same conversation
since the restart and Codex's status names that account.
On macOS, a request that gets as far as reading the running process refuses before stopping the seat, because that
reading depends on `/proc`.
- **A forked Claude seat launches with its own session ID** (`rig fork`, or `session_source: fork`), so strict restore
and clear-attention can verify it as its own conversation. Forking a Claude seat needs Claude Code 2.0.73 or later,
which OpenRig doesn't check. Forks launched before this keep reading `mismatch` until they're relaunched.
- **Seats no longer inherit the launching Claude Code or Herdr session's identity variables,** such as `CLAUDECODE`.
If removing them fails, the launch goes ahead with a warning.
- **A member's `cwd` in a rig spec can be `~`, start with `~/`, or use `$VAR` or `${VAR}`,** expanded from the daemon's
environment, when the path as written doesn't exist. `rig up` warns on stderr when it chose `/` as the launch folder
itself.
- **A late readiness result no longer overwrites a newer launch attempt.**
## Sends and wakes
- **Codex seats behind a launcher receive sends.** When a seat's `codex` is a launcher that starts Codex as a child,
`rig send` and queue wakes used to refuse with "reports sh as the foreground command". The deepest `codex` on one
process chain now counts as the seat. Codex processes on separate branches, or naming different conversations, are
still refused.
- **Claude's faint suggested prompt isn't a person's draft.** A send to an idle Claude seat whose empty input box shows
only that suggestion is no longer refused as `prompt_draft`. OpenRig takes one styled capture to tell; real typed or
pasted text is still refused, and a suggestion that wraps onto a second row still reads as a draft.
- **`rig queue create --verify` reports a seat's wake and claim.** For an agent destination it returns as soon as a
wake result or a claim is recorded, bounded at 30 seconds, with `receiptSource: "terminal"`, `outcome`, `wakeResult`
and `claim {observed, claimedAt, pickup}`. An unconfirmed receipt is not a failed handoff. See the known gap below
for a row the seat already claimed.
- **Keep agent-to-agent escalations off the person's Slack (off by default).** `rig config set queue.wake_human_rung
explicit-only` (or `OPENRIG_QUEUE_WAKE_HUMAN_RUNG`) stops the wake ladder's last step at `rig view show escalations`
unless the row is addressed to a person: an `@external` address or a registered human. A seat stuck at a prompt only
a person can clear still reaches one, and an unreadable human registry posts everything. The default, `always`,
changes nothing.
- **`rig send --wait-for-idle N` waits before it takes the seat's delivery lease,** so other sends and queue wakes to
that seat aren't held behind a long wait. N is now a deadline from the start of the wait, including any time spent
waiting for the lease. A timeout names the wait you asked for.
- **A parked seat whose occupant is known isn't woken again for the same rows after a wake was delivered,** until it
updates one of them or one changes state. A failed, refused or unrecorded wake still repeats at the next park, and a
new occupant gets its first wake. "Delivered" means the wake was typed into the seat's terminal, not that the agent
read it.
- **`rig send --verify` confirms enveloped multi-line messages that the agent's screen indents,** and queue wakes use
the same check.
- **A Claude footer in auto, bypass or plan mode on the last line reads idle** when no activity hook is reporting.
- **A failed Pi or OMP turn shows the provider's own reason** when it gives one.
- **A `handed-off` closure with no visible successor** gets the same custody advisory and stuck-sweep finding as a
`done` closure.
## Slack
## Status
- **A decision click that isn't recorded gets one reply in the thread** saying why: the clicker isn't registered, the
decision was sent to someone else or is no longer waiting, the button no longer matches, or OpenRig can't find the
decision. Where it helps, the reply asks for an answer in words. A recorded click still gets its usual reply, and a
redelivered click gets no second one. It's best effort and needs the bot token. A successful press doesn't exercise
these replies.
## Terminals and attach
- **Attach commands name the daemon's tmux server.** When the daemon was started inside tmux on a non-default socket,
every attach command OpenRig prints carries `-L <name>` or `-S <path>`, including `tmuxAttachCommand` in `rig ps
--json`. From inside tmux, run it as `env -u TMUX <tmuxAttachCommand>`. On the default server nothing changed.
- **When a caller of the daemon's terminal API names no provider, the daemon uses cmux if Herdr isn't available** and
cmux is, and says so. A named `--provider` is used as named. `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.
- **A tmux started inside a Herdr pane is recognised** by Herdr's markers (`HERDR_ENV`, `HERDR_PANE_ID`,
`HERDR_SOCKET_PATH`), so `rig terminal open --window` opens in that Herdr.
## Setup
- **`rig setup --providers claude|codex|both`** (or a comma list) sets which harnesses it installs and checks. One not
chosen reads `skipped` with `Not selected: …`, never failed. Without the flag, setup is unchanged. `rig doctor` still
checks both.
- **A first `rig daemon start` after a timed-out probe goes ahead when the port is free,** as on WSL2. A port that's
really held is refused with `Address already in use (EADDRINUSE)` and the `--port` advice.
## Teams
- **Starter and factory teams run their own first steps and checks without stopping for approval** where they can:
plain `rig` commands, the file tool instead of a heredoc, the project's test command first. Their leads read the goal
from `rig queue show <id> --full`.
- **The operator says what a team launch changes in the person's folder before asking** (`CLAUDE.md`, skills,
`.mcp.json`, `.openrig/`, and an accept-edits `.claude/settings.local.json`), and offers a separate copy such as a git
worktree. When a seat shows `needs_input`, the operator or lead tells the person which seat, what it asks, and its
attach command.
- **A Codex seat at its usage limit stays `unknown` with reason `usage_limit`** while its screen redraws, instead of
reading `running`. It clears when a readable screen shows no banner, or when Codex shows it's working again. See the
known gap below.
- **`rig ps` takes a rig's running count and status from the same set of sessions as `rig ps --nodes`.**
- **`rig whoami --full --json` shows a Codex seat's `runtimeContext.threadId`** when its stored conversation ID was
verified resumable.
- **The TUI says when a queue sample hit its cap or failed to load:** counts read `N+`, a seat missing from the sample
shows `?`, and Pulse no longer lists a NEEDS YOU item a second time. The caps count the whole host, so a quiet rig can
read `?` while another rig is busy.
- **The TUI Topology table's Q, WORK and NOW columns fill again** on drilled views and on a seat's page.
## Smaller fixes
- `_` and `%` in a `rig view show <lens> --rig <name>` rig name are no longer wildcards, in all seven lenses that
filter by rig.
- `rig ask` matches chat keywords such as `config.json` or `C++` literally.
- `rig heartbeat` reads CRLF queue files and reads a zone-less proof timestamp as UTC when picking the latest.
- `rig usage top` reads every sample in its window; `rig usage top|series --json` prints the daemon's error as JSON.
- A `?limit=` that isn't a number returns 400, not 500.
- `rig workflow instantiate` and `project` print the instance and packet the daemon returned.
- `rig transcript --tail` keeps a line ending in `%` and drops a repeated prompt.
- `--json` after `--` no longer turns an error into JSON; `rig env` prints the daemon's error.
- A file read over 1 MiB ends at a whole UTF-8 character, and `truncatedAtBytes` says where.
- The TUI counts CR+LF as one Enter, keeps an emoji whole at a wrap, pages Local reading directories by 10, and skips
fenced examples when opening a file at a heading.
- Scope progress rows go only under a matching `##` heading, frontmatter updates stay inside the exact `---`
delimiters, a capability delta expires only with a readable successor file, and fenced examples no longer count as
slice sections or progress tasks.
- `rig package install` looks for a guidance block's closing marker only after its opening one.
- A Codex seat keeps its last context reading across quota-only usage records, and a fresh Codex launch keeps git
metadata paths that end in whitespace.
- A Slack reply sent with "Also send to channel" in the default channel is recovered after a connection gap.
- `rig config set daemon.port` refuses a port outside 0–65535, and a port like that from the environment or
`config.json` falls back to the file or default with a warning. `rig daemon start --port` refuses one too, with exit 1.
- Parallel `rig scope slice create` calls get different slice numbers. A number is never reused, and each create leaves
a hidden `slices/.nn-NN` claim file.
- `rig proof show` and `rig proof judge` take `--project <id>` or a `<project>:` scope prefix. Scope readiness for a
project selected in the TUI uses that project's own root.
- The chat send and topic routes return 400 before storing anything for payloads that used to fail with 500;
`/api/wake-resolve` answers a fractional or non-numeric generation with its usual "does not exist" reply; watchdog
registration refuses a `scan_interval_seconds` that can't be turned into a number (non-numeric text, a boolean, an
empty array); and unmanaged-pane discovery matches agent
process names exactly, plus `claude.exe` and names cut to 15 or 16 characters.
- The `rigs` and `openrig-skills` skill descriptions split by who is asking: a person in their own session, or an agent
inside a rig.
- A new reference page covers keeping a watch for a person with today's queue commands, installed at
`$OPENRIG_HOME/reference/keeping-a-watch.md`. See the known gap below.
## What to stop doing
- **Stop reading "already running" from `rig launch` as healthy** for a seat whose agent may have exited; 0.6.10 says
`attention_required`.
- **Stop reading `rig capture --lines N` as N history lines plus the pane.** Add `--history-plus-pane` for that.
- **Stop testing compact queue rows for null fields.** They're absent; check `fieldsElided`.
- **Stop attaching to the default tmux server** when the printed command names `-L` or `-S`.
- **Stop expecting a restore to start a seat fresh** when an earlier session left a resume token; decide at
`awaiting-decision`, or use the command the message names.
- **Stop reading `indeterminate` as the answer for a claimed row** from `rig queue create --verify`; 0.6.11 says
`claimed`.
- **Stop treating `degraded` as a stopped seat's doing** after `rig seat stop`; the rig leaves that seat out.
- **Stop counting a long `--wait-for-idle` as extra time after the lease;** N is a deadline from the start of the wait.
## Known gaps in 0.6.10
## Known gaps in 0.6.11
- **`rig queue create --verify` can report `outcome: "indeterminate"` for a row the seat already claimed,** with
"Terminal receipt unconfirmed (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.9 on Linux only.** macOS was last checked with 0.6.8, and native Windows
hasn't been checked.
- **`rig seat restart --keep-conversation` supports Linux only.** Its automated tests are hermetic: they don't restart a
real Codex seat.
- **The rig status API can call a running rig `blocked` because of one seat that isn't running.** It happens when the
latest snapshot recorded no occupant for that seat, an earlier session of the seat left a resume token, and its newest
session's restore policy is `resume_if_possible`. A restore from that snapshot would stop at the seat for a decision,
and `GET /api/rigs/:id/status` folds that forecast into the rig's status, so it mixes current status with restore
readiness: no seat is halted. `rig status` and the TUI's rig list don't show it for a running rig.
- **A Codex seat can keep reading as at its usage limit** when an old usage-limit banner is followed by a submitted
prompt and the agent's reply, with no Codex working line and no input line below. It's recorded again every five
minutes, where 0.6.10 let it age out. The case was constructed from the source and hasn't been seen in a real
session.
- **The keeping-a-watch page says a timer fires once; a held-back wake uses up that fire.** When the typing guard holds
a one-shot `--wake-after` wake back (it shows as `retained`), that held-back attempt is recorded as the timer's one
fire and later wakes aren't, so the timer isn't retired: it can wake the owner again at each interval while the row
stays set aside. A row sharing the timer through `--wake-watchdog`, after the original row was handed off or stopped,
loses its one wake if that wake is held back. Read the row's transitions after each wake.
- **After `rig scope slice create` says it couldn't verify membership, the slice was kept.** Check `mission.yaml` before
creating it again: creating it again makes a second slice with the same name.
- **The latest first-install check before this release used 0.6.10 on Linux only.** macOS was last checked with 0.6.8,
and native Windows hasn't been checked.
- **Only one selected lifecycle-help command has been checked in a live Claude session;** source and parser coverage
is broader. If a help command still asks, report it.
- **Codex team seats aren't asked before lifecycle commands yet.**
- **The send gate trusts the most recently recorded hook.** If hooks are recorded out of order, it can hold a send for
a question that's already answered, or miss one that's waiting. `rig capture` shows the real screen.
- **A Codex seat whose permission request was approved automatically can still read "needs input".**
- **A launched team still writes into its working folder;** the operator now says what changes before you agree.
- **A launched team still writes into its working folder;** the operator says what changes before you agree.
- **After a restart, `rig status` shows `Kernel: skipped` whatever the kernel seats' state.** Read them with
`rig ps --nodes --rig kernel --full`.
- **`rig tui --shared` still attaches on the default tmux server,** so it can't find the dashboard when the daemon runs
+5 -5
View File
@@ -1,12 +1,12 @@
{
"name": "openrig",
"version": "0.6.10",
"version": "0.6.11",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openrig",
"version": "0.6.10",
"version": "0.6.11",
"license": "Apache-2.0",
"workspaces": [
"packages/daemon",
@@ -7068,7 +7068,7 @@
},
"packages/cli": {
"name": "@openrig/cli",
"version": "0.6.10",
"version": "0.6.11",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7103,7 +7103,7 @@
},
"packages/daemon": {
"name": "@openrig/daemon",
"version": "0.6.10",
"version": "0.6.11",
"license": "Apache-2.0",
"dependencies": {
"@hono/node-server": "^1.13.0",
@@ -7144,7 +7144,7 @@
},
"packages/ui": {
"name": "@openrig/ui",
"version": "0.6.10",
"version": "0.6.11",
"license": "Apache-2.0",
"dependencies": {
"@fontsource-variable/jetbrains-mono": "^5.2.8",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "openrig",
"version": "0.6.10",
"version": "0.6.11",
"private": true,
"license": "Apache-2.0",
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@openrig/cli",
"version": "0.6.10",
"version": "0.6.11",
"type": "module",
"description": "Build your own network of agents from Claude Code, Codex and Pi: persistent teams with roles, shared context and owned work.",
"keywords": [
@@ -11,7 +11,7 @@ not know exists.** So the point of what follows is not skill. It is recognition:
lands, something rhymes, and you go check instead of building.
Eighty-seven top-level verbs ship (capability canon refreshed through
`capability-delta-v0.6.10`). This marker describes the pack's teaching, not publication or live
`capability-delta-v0.6.11`). This marker describes the pack's teaching, not publication or live
adoption. Read this once for shape, and let it make you suspicious that a thing already exists.
Model-divergence proclamations are live product (trust them; pins use canonical
model IDs).
@@ -90,6 +90,8 @@ unseen — which makes messages the one delivery channel that never gets skipped
confirm by effect, never relaunch on it. A send or wake to a seat whose latest hook is a
question waiting for a person is refused with `target_needs_input`, even when its screen
can't be read: read it with `rig capture` and get the question answered instead of retrying.
`--wait-for-idle N` waits before it takes the seat's delivery lease, so other sends and wakes to
that seat aren't held behind it; N is a deadline from the start of the wait.
Over `--host` to an http-registered host, a send that may have reached the remote reads
`remote-outcome-unknown` ("Delivery UNCONFIRMED"): check the target with `rig capture <session>
--host <id>` before any resend. Only a host that was never reached reads as unreachable.
@@ -184,10 +186,11 @@ your context, your compaction and your replacement — and it is the only thing
`handoff`'s, confirms the row was saved; the owner is woken after that. Before you say they were
told, read the row's transitions, or use `--verify`. For a seat it reports the wake's terminal
receipt and any claim separately: an unconfirmed receipt is not a failed handoff, and a claim is
pickup, not proof the body was read. For a row the seat already claimed, `outcome` can read
`indeterminate` while `claim` is accurate: read `claim`. It isn't a failed handoff, so don't
re-run the create. For a registered person who is also a seat with a pane, it also waits,
bounded, for the Slack receipt and reports it on its own.
pickup, not proof the body was read. For a claimed row whose wake wasn't confirmed, `outcome`
reads `claimed`; it isn't a failed handoff, so don't re-run the create. For a registered person
who is also a seat with a pane, it also waits for the Slack receipt and reports it on its own,
up to the 30-second default, even when Slack isn't set up or the row won't be posted. With `output.compact` on (off by default), the queue write commands print a short
receipt and `--full` prints the whole row.
- **`rig queue show`** — what a row *actually says*. The header is not the body.
- **`rig queue claim` / `unclaim`** — is this mine and running, or still pending where two agents
might double-work it. Put it down honestly when it is not yours.
@@ -202,7 +205,11 @@ your context, your compaction and your replacement — and it is the only thing
visible**, with a plain-language summary and a pointer to what a human must judge; `resolve`
writes their decision onto the durable record and wakes the owner. **Closing it would be a lie
and sitting on it silently is indistinguishable from a crash.** `--wake-after <duration>` arms
one wake for this park episode; a new park supersedes it and every exit route retires it.
one wake for this park episode; a new park supersedes it and every exit route retires it. In
this release a wake the typing guard holds back (`retained`) is recorded as that one fire and
later wakes aren't, so the timer isn't retired: it can wake the owner again at each interval
while the row stays parked. A row attached to a shared timer with `--wake-watchdog` loses its
one wake if that wake is held back.
- **`rig queue overdue`** — what was claimed and never closed in time. **Defaults to the current
rig**; ask for more if you mean more.
- **`rig queue undelivered`** — pending create-path nudge failures only. For gateway or human
@@ -360,7 +367,11 @@ not have to tear one down to change it, and you rarely have to start from nothin
is archived), so check `rig ps --nodes` first. Launch-created `AGENTS.md` or `CLAUDE` files now show in `git status`.
`rig up <rig> --existing` puts back the OpenRig guidance blocks `rig down` removed before a
resumed seat starts. A seat still missing one makes the rig `partially_restored` (its node lists
`guidanceGaps`) and `rig up` exits 1.
`guidanceGaps`) and `rig up` exits 1. A seat that wasn't running at the snapshot, but whose
earlier session left a resume token, stops at `awaiting-decision` instead of starting fresh, in
`rig up --existing` and in `rig launch` (exit 1); the message names the command that starts it
fresh on purpose. In a pod-aware rig, a seat is rolled back as unresumable only when its runtime
reports the conversation missing.
- **`rig down`** — stop a rig's seats and take it out of the running set. It ends the agents'
sessions and any work in progress; don't run it on a live team unless the person asked. In
human mode it first prints one line with each agent's last known activity, or “unknown”: a
@@ -373,7 +384,16 @@ not have to tear one down to change it, and you rarely have to start from nothin
`rig seat launch <session> --fresh --stop`.
- **`rig seat launch <seat> --fresh --reason <why>`** — deliberately create a blank occupant for
exactly one existing seat. It uses no resume, fork, rebuild, snapshot, or restore packet;
siblings and durable work stay put, and unmanaged ambiguity refuses.
siblings and durable work stay put, and unmanaged ambiguity refuses. With `--stop`, a seat with a
still-live older session is refused before anything is stopped; `--plan` previews it.
- **`rig seat restart <seat> --keep-conversation --reason <why>`** — restart one Codex seat in its
own pane on the same conversation, so it starts again on whatever account its Codex home now
holds; it doesn't switch accounts itself. It refuses with nothing stopped unless the seat is a
Codex seat OpenRig launched, in a single pane, with a conversation it can prove and unchanged
running settings. `--plan` runs every check and stops nothing; `--verify --expect-account
<account>` reports `moved` only when a tool turn has completed in the same conversation since
the restart and Codex's status names that account. Linux only: on macOS a
request that reaches the running-process check refuses before stopping the seat.
- **`rig add`** / **`rig expand`** — graft one more member, or a whole new pod, onto a rig that is
already running. `rig add` takes the rig's name or ID; a name two active rigs share is refused
with `rig_ambiguous` and the candidates. `rig grow --new-pod` and `rig expand` are one ingress; choose by input shape.
@@ -481,7 +501,8 @@ version, from checking the environment to a useful report to the OpenRig team.
updating Codex is the operator's job.
- **`rig seat set-model` / `stop` / `clean`** — persist the model for later managed resumes, stop
exactly one live seat (ending its session and any work in progress), or clear a dead seat's
stale binding. When the topology is right and only
stale binding. A stop is recorded, so the rig doesn't read `degraded` for that seat, and a rig
whose seats were all stopped this way reads `stopped`. When the topology is right and only
the occupant is wrong, use these seat lifecycle verbs or `rig handover`, not a rig down/up cycle.
Effective-model detection follows the identity-verified current occupant, not a retained
predecessor; a `<synthetic>` transcript record is skipped, so a PENDING model check is not a
@@ -569,7 +590,8 @@ scheme, and nothing downstream can see it.
source actually bound. When someone later asks where the contract items came from, the drop's
own echo is the answer — not a re-read of the files.
- **`rig proof judge` / `rig proof show`** — record an attributed judgment on a contract item once,
then read derived proof, slice, mission and project readiness. The owning scope selects
then read derived proof, slice, mission and project readiness. Both take `--project <id>` or a
`<project>:` scope prefix. The owning scope selects
`proofPolicy.judges` (nearest slice, mission or project policy wins); consult `rig proof --help`
for that setup and the item/evidence selectors. Accept, reject or withdraw against readable
evidence; corrections preserve history and unrelated judgments without ancestor status edits.
@@ -796,8 +818,10 @@ your circumstances is configuration, and the ones that are not, another agent ca
accounts, what the usage signals say, and whether a seat can be moved without stranding the
conversation it is in the middle of. **`provider signals` reports anomalies rather than a
listing** — unbound seats, accounts shared across several seats. A Codex seat showing its
usage-limit banner reads activity `unknown` with reason `usage_limit`, and `provider signals` can
show a provider-event signal for that seat's account that allows a switch decision.
usage-limit banner reads activity `unknown` with reason `usage_limit`, and keeps it while its
screen redraws; `provider signals` can show a provider-event signal for that seat's account that
allows a switch decision. With `provider.usage_windows` on (off by default), `rig provider status
--refresh` reads a Codex login's usage windows once.
- **Codex configuration fragments** — a `codex_config_fragment` must open with a table header and
never overrides a user-declared table; see `docs/reference/agent-spec.md`.
- **`rig env`** — the real services behind a rig: are they up, what are they saying, how do you
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@openrig/daemon",
"version": "0.6.10",
"version": "0.6.11",
"private": true,
"license": "Apache-2.0",
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@openrig/ui",
"version": "0.6.10",
"version": "0.6.11",
"private": true,
"license": "Apache-2.0",
"type": "module",