mirror of
https://github.com/mvschwarz/openrig.git
synced 2026-11-09 11:51:37 -10:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d9e8e271a | ||
|
|
0d1c4b3d3c | ||
|
|
18bf132ff6 |
No files matched your search
+337
@@ -8,6 +8,343 @@ deprecations, and behavioral changes. Breaking changes are called out explicitly
|
||||
|
||||
---
|
||||
|
||||
## [0.7.4]
|
||||
|
||||
OpenRig 0.7.4 lets an assistant you already use work as a member of your team.
|
||||
An assistant connected over MCP can be listed on its rig's team as a hosted
|
||||
member, learns from the connection how to take, finish and hand on work, can
|
||||
ask a person while keeping the item, and can be rung by a webhook when work
|
||||
lands for it; when nothing can wake it, its person is told instead.
|
||||
`rig mcp serve --http` can check each remote caller's key with an external
|
||||
grant service, offer OAuth discovery, record whose grant acted, and serve MCP
|
||||
clients on protocol revision 2026-07-28 beside 2025's. You can list the
|
||||
conversations a seat could resume, and a client can resume the one a person
|
||||
reviewed. Daemon start now brings back only a kernel that this start found
|
||||
down. It is built from the commit tagged `v0.7.4`. The changes since 0.7.3:
|
||||
|
||||
### Before you upgrade
|
||||
|
||||
- **Restart the daemon after installing.** One database update applies on its
|
||||
first start (migration 140). It adds a column, empty on earlier rows, that
|
||||
records which grant's caller acted, to queue transitions and their archive,
|
||||
inbox and outbox entries, and stream items.
|
||||
```bash
|
||||
npm install -g @openrig/cli@0.7.4
|
||||
rig daemon stop && rig daemon start
|
||||
```
|
||||
- **The bundled openrig-core plugin goes from 0.1.20 to 0.1.21.** The
|
||||
`queue-handoff` skill gains writing guidance, and the Claude hooks add
|
||||
`StopFailure`, which reports a stop caused by a rate limit. As before,
|
||||
startup first copies each file it replaces under
|
||||
`$OPENRIG_HOME/backups/managed-refresh/<id>/`; if you edited one, reapply
|
||||
your change from the copy. A Claude seat gets the new hook at its next
|
||||
launch, resume, restore or handover. Codex sees its openrig-core plugin as
|
||||
changed: if a Codex seat stops at "Hooks need review", review the hooks in
|
||||
Codex.
|
||||
- **Going back to 0.7.3** leaves migration 140's column in place, unread.
|
||||
|
||||
### What's new and fixed
|
||||
|
||||
**Assistants as team members**
|
||||
|
||||
- **A rig's team shows the members that live outside a terminal.** A roster
|
||||
entry can mark a member as hosted (`"hosted": true`), such as an assistant
|
||||
connected over MCP. `rig_team` lists a rig's hosted members with their
|
||||
declared capabilities and caveat, no pane, and activity `unknown`: OpenRig
|
||||
doesn't observe a hosted member between its calls, so it never reads idle.
|
||||
A roster that can't be read gives a note, never "no members". `rig roster
|
||||
show` and `find` say the member is hosted.
|
||||
([#2095](https://github.com/mvschwarz/openrig/pull/2095))
|
||||
- **The connection teaches the assistant how to work.** The MCP server's
|
||||
instructions say that its inbox is the items addressed to its seat, that a
|
||||
wake only points at the inbox, and to claim an item, do it, then close it
|
||||
with the answer or hand it on. When an item needs a person's approval first,
|
||||
it keeps the item and asks: it blocks the item on that person with the
|
||||
question as the summary, and the answer returns the item in progress. A
|
||||
hosted member can call `rig_whoami` to learn the seat it acts as.
|
||||
([#2095](https://github.com/mvschwarz/openrig/pull/2095),
|
||||
[#2127](https://github.com/mvschwarz/openrig/pull/2127))
|
||||
- **When work waits for a member nothing can wake, the person is told.** The
|
||||
stuck sweep used to address its finding to that same member. Now it goes to
|
||||
the person, on Steering and the TUI's Feed, and to Slack under the default
|
||||
subscription, saying to ask the member to check or to fix the address.
|
||||
([#2110](https://github.com/mvschwarz/openrig/pull/2110))
|
||||
- **A hosted member can be rung when work lands for it.** Its roster entry
|
||||
declares a webhook trigger: `wake.webhook` with `url_ref`,
|
||||
`authorization_ref` and optionally `secrets_env_file`. These are secret
|
||||
names, read from the daemon's environment or a 0600 env file; values never
|
||||
go in rosters or rows. OpenRig POSTs a pointer to the row (the event
|
||||
`work-waiting`, the row id, destination, summary and sender, never the row's
|
||||
body), waits up to 10 seconds and doesn't follow redirects. A 2xx is
|
||||
recorded as the ring being accepted, not as the member waking. If the member
|
||||
doesn't claim the work by the stuck sweep's unclaimed age, its person is
|
||||
told. ([#2115](https://github.com/mvschwarz/openrig/pull/2115))
|
||||
- **The team sees when a hosted member last showed up.** `rig_team` shows when
|
||||
each hosted member last called the team's MCP server, and its latest ring
|
||||
and how that went; `rig roster show` and `find` show the last call. With no
|
||||
evidence it says unknown, never idle, and a claim on a row is still the only
|
||||
pickup. ([#2121](https://github.com/mvschwarz/openrig/pull/2121))
|
||||
|
||||
**Remote MCP callers and grants**
|
||||
|
||||
- **`rig mcp serve --http --grant-service <url>`** checks each request's key
|
||||
with an external grant service instead of the local token file, on every
|
||||
request, with nothing cached. `--grant-service-header-file <path>` sends one
|
||||
`Name: value` header with each lookup.
|
||||
([#2096](https://github.com/mvschwarz/openrig/pull/2096),
|
||||
[#2141](https://github.com/mvschwarz/openrig/pull/2141))
|
||||
- **OAuth discovery:** `--oauth-resource <url>` with `--oauth-issuer <url>`
|
||||
publishes OAuth protected-resource metadata (RFC 9728), so an MCP client
|
||||
that signs in with OAuth can find out how to authenticate, and a request
|
||||
with no credential or a bad one gets a standard challenge. The key and its
|
||||
grant still decide what the caller may do.
|
||||
([#2135](https://github.com/mvschwarz/openrig/pull/2135))
|
||||
- **Whose grant acted is recorded.** The rows a granted caller's actions write
|
||||
record the caller's principal (`principal:v1`): its source, its grant name
|
||||
or id and, for a grant service, the grant's version. It's attribution, not
|
||||
authentication, and never a credential.
|
||||
([#2098](https://github.com/mvschwarz/openrig/pull/2098),
|
||||
[#2141](https://github.com/mvschwarz/openrig/pull/2141))
|
||||
- **A caller's seat that was created but never launched** (for example with
|
||||
`rig import --materialize-only`) is served, instead of every request being
|
||||
refused with `seat_unavailable`.
|
||||
([#2125](https://github.com/mvschwarz/openrig/pull/2125))
|
||||
- **A caller granted through a grant service** hands its tasks to the team it
|
||||
was granted, never to its own caller seat or another caller's
|
||||
([#2132](https://github.com/mvschwarz/openrig/pull/2132)), and can't attach
|
||||
tags that claim OpenRig's own Slack provenance or a workflow's internal
|
||||
sign-off, so a person asked about its task sees its whole text
|
||||
([#2126](https://github.com/mvschwarz/openrig/pull/2126)).
|
||||
|
||||
**MCP protocol 2026-07-28**
|
||||
|
||||
- `rig mcp serve`, over stdio or `--http`, serves clients on MCP protocol
|
||||
revision 2026-07-28, which has no `initialize` handshake, sends its version
|
||||
on every request and may open with `server/discover`. They reach the same
|
||||
tools and the same work loop. Clients that open with 2025's `initialize`
|
||||
keep working unchanged, on the same endpoint and process.
|
||||
([#2112](https://github.com/mvschwarz/openrig/pull/2112))
|
||||
|
||||
**Resuming the conversation you chose**
|
||||
|
||||
- **`rig seat history --rig <id> --node-id <id>`** lists the recorded Claude and Codex
|
||||
conversations this exact node could resume, read-only and without native
|
||||
tokens (`--json`; `--snapshot-id` with `--history-session-id` checks one
|
||||
reference it returned). The rig ID is `rigId` in `rig ps --nodes --json`, and the
|
||||
node ID is `identity.nodeId` in `rig whoami --session <seat> --json`. ([#2100](https://github.com/mvschwarz/openrig/pull/2100))
|
||||
- **A client can resume the history a person reviewed** for an exact node,
|
||||
through the daemon's startup review. Applying it rechecks the choice and the
|
||||
settings through the existing restore path, and refuses, rather than
|
||||
substituting another conversation or starting fresh, if the history changed
|
||||
or became unavailable. A running or unverified terminal is left alone. With
|
||||
0.7.3's saved seat settings by node id
|
||||
([#2051](https://github.com/mvschwarz/openrig/pull/2051)), this completes
|
||||
the three stages agreed in
|
||||
[#1837](https://github.com/mvschwarz/openrig/issues/1837).
|
||||
([#2109](https://github.com/mvschwarz/openrig/pull/2109))
|
||||
|
||||
**Task views**
|
||||
|
||||
- `rig terminal open` and the daemon's terminal preview accept `qitem:<id>`: the current local
|
||||
owners of that task, meaning its pending, in-progress and blocked rows
|
||||
through explicitly linked successors, without closed predecessors or past
|
||||
senders. Stopped, missing, external and unresolved owners are named, and
|
||||
incomplete lineage is reported rather than cut short. It's a read-only
|
||||
membership view: it doesn't follow the task as it moves, and an explicit
|
||||
open still has the provider's usual workspace effects. Preview and open
|
||||
responses now carry `viewDescriptor` (`kind`, `name`).
|
||||
([#2131](https://github.com/mvschwarz/openrig/pull/2131))
|
||||
|
||||
**The kernel at daemon start**
|
||||
|
||||
- **Startup brings back a kernel only when this start found it down,** which
|
||||
is what a reboot leaves. A kernel that was already down before this start
|
||||
stays down, with its old conversations. `rig start` and `rig daemon start
|
||||
--wait-for-kernel` say why and how to bring it back (`rig up kernel
|
||||
--existing`); `--wait-for-kernel` no longer prints a timeout and an
|
||||
authentication hint for a kernel skipped on purpose, and still exits 1.
|
||||
([#2146](https://github.com/mvschwarz/openrig/pull/2146),
|
||||
[#2152](https://github.com/mvschwarz/openrig/pull/2152),
|
||||
[#2156](https://github.com/mvschwarz/openrig/pull/2156))
|
||||
|
||||
**Seats and runtimes**
|
||||
|
||||
- **A Claude seat stopped by a rate limit is recognised** from Claude's
|
||||
`StopFailure` hook, even when its status line shows no usage window, and
|
||||
pending handoffs use the existing wake ladder and retry timer. A delayed
|
||||
older Claude hook no longer replaces the current state in send readiness,
|
||||
attention, review telemetry or the wake scheduler.
|
||||
([#1908](https://github.com/mvschwarz/openrig/pull/1908),
|
||||
[#2113](https://github.com/mvschwarz/openrig/pull/2113))
|
||||
- **`rig handover --source fresh` on Claude** reports the restore packet
|
||||
delivered only when Claude's composer shows it submitted. If it's still
|
||||
staged after one retried Enter, the handover fails with
|
||||
`context_delivery_failed`.
|
||||
([#1863](https://github.com/mvschwarz/openrig/pull/1863))
|
||||
- **A periodic snapshot between separate named-agent launches** keeps a down
|
||||
agent's resume source, including its restore policy and community harness
|
||||
selection, without claiming it was running.
|
||||
([#2123](https://github.com/mvschwarz/openrig/pull/2123), fixes
|
||||
[#1822](https://github.com/mvschwarz/openrig/issues/1822))
|
||||
- **A resumed Pi seat** no longer prints `Entry not found` after `READY` on
|
||||
every restart: a saved history cursor Pi doesn't hold is recovered.
|
||||
([#2122](https://github.com/mvschwarz/openrig/pull/2122))
|
||||
|
||||
**People, parks and reviews**
|
||||
|
||||
- **A park on a registered person's own address** (`<id>@external`) resolves
|
||||
only from a Slack reply written after its question was posted
|
||||
([#2106](https://github.com/mvschwarz/openrig/pull/2106)), keeps its
|
||||
`--summary` and `--evidence-ref`
|
||||
([#2107](https://github.com/mvschwarz/openrig/pull/2107)), and shows in
|
||||
NEEDS YOU in the slice, mission and rig reviews, with asks to that address,
|
||||
instead of the person being listed as an agent holding work
|
||||
([#2108](https://github.com/mvschwarz/openrig/pull/2108)).
|
||||
- **The reviews' agents band** counts only open rows as held, and a seat with
|
||||
work in progress reads as working even when it also has an older blocked
|
||||
row. ([#2136](https://github.com/mvschwarz/openrig/pull/2136), fixes
|
||||
[#2129](https://github.com/mvschwarz/openrig/issues/2129))
|
||||
|
||||
**TUI and CLI**
|
||||
|
||||
- `rig` or `rig tui` started in a terminal that reports 0 rows or columns
|
||||
waits and draws on the next resize, instead of crashing on its first frame.
|
||||
([#2099](https://github.com/mvschwarz/openrig/pull/2099))
|
||||
- The TUI lists a host's rigs by name, in `rig ps`'s order.
|
||||
([#2134](https://github.com/mvschwarz/openrig/pull/2134), fixes
|
||||
[#2130](https://github.com/mvschwarz/openrig/issues/2130))
|
||||
- Opening a seat whose runtime doesn't report effort no longer shows a failed
|
||||
read in the TUI header. ([#2102](https://github.com/mvschwarz/openrig/pull/2102))
|
||||
- `rig whoami`, `rig down`, `rig ask` and `rig health` in a tmux pane without
|
||||
`OPENRIG_SESSION_NAME` no longer print tmux's `invalid option` errors.
|
||||
([#2103](https://github.com/mvschwarz/openrig/pull/2103))
|
||||
|
||||
**Also:** an artifact whose frontmatter header isn't closed no longer wakes an
|
||||
artifact-pool worker as ready
|
||||
([#2016](https://github.com/mvschwarz/openrig/pull/2016)); with Pi cost
|
||||
reporting on, a seat that now runs Claude or Codex shows its current cost, and
|
||||
a charge lookup retried during a re-post finishes
|
||||
([#2120](https://github.com/mvschwarz/openrig/pull/2120)); the
|
||||
`queue-handoff` skill says to write a handoff that can be acted on after one
|
||||
read, as guidance and not a filter
|
||||
([#2154](https://github.com/mvschwarz/openrig/pull/2154),
|
||||
[#2155](https://github.com/mvschwarz/openrig/pull/2155)); the harness preset
|
||||
guide says to check that a harness answers on its own first
|
||||
([#2116](https://github.com/mvschwarz/openrig/pull/2116)); seat environments
|
||||
are exercised on Linux in CI
|
||||
([#2101](https://github.com/mvschwarz/openrig/pull/2101)); and portability and
|
||||
test fixes ([#2147](https://github.com/mvschwarz/openrig/pull/2147),
|
||||
[#2148](https://github.com/mvschwarz/openrig/pull/2148),
|
||||
[#2149](https://github.com/mvschwarz/openrig/pull/2149)).
|
||||
|
||||
### Behaviour that changed
|
||||
|
||||
- A kernel that was already down before daemon start is no longer restored on
|
||||
that start; see "The kernel at daemon start".
|
||||
- `rig daemon start --wait-for-kernel` for a kernel skipped on purpose prints
|
||||
the reason and the way back instead of a timeout header and an
|
||||
authentication fix. It still exits 1.
|
||||
- Work waiting for a member nothing can wake is reported to its person, not
|
||||
to that member.
|
||||
- A caller granted through a grant service can't address its own or another
|
||||
caller seat, or set OpenRig's Slack provenance or a workflow's internal
|
||||
sign-off tags.
|
||||
- A park on a registered person's address resolves only from a reply written
|
||||
after its question.
|
||||
|
||||
### Known issues
|
||||
|
||||
- **A webhook ring proves only that the endpoint accepted it.** Whether the
|
||||
member woke and took the work is its claim on the row. An ordinary chat app
|
||||
can't receive unsolicited events, so a hosted assistant without a
|
||||
webhook-capable runner sees work only when it checks.
|
||||
([#2115](https://github.com/mvschwarz/openrig/pull/2115))
|
||||
- **A recorded principal is attribution, not authentication.** The daemon
|
||||
records what the MCP adapter tells it about the caller it checked.
|
||||
([#2098](https://github.com/mvschwarz/openrig/pull/2098))
|
||||
- **The task view (`qitem:<id>`) is membership only.** It doesn't follow a
|
||||
task as it moves, keep a reusable viewer, or change who may type into a
|
||||
seat. ([#2131](https://github.com/mvschwarz/openrig/pull/2131))
|
||||
- **Resuming a reviewed history has no CLI yet.** `rig seat history` lists
|
||||
and checks; applying a choice is through the daemon's startup review, for
|
||||
clients. Choices are limited to this node's eligible Claude and Codex
|
||||
histories in the current compatible snapshot.
|
||||
([#2100](https://github.com/mvschwarz/openrig/pull/2100),
|
||||
[#2109](https://github.com/mvschwarz/openrig/pull/2109))
|
||||
- **The kernel's restore evidence lasts one daemon process.** If the first
|
||||
daemon after a reboot exits before the kernel's restore starts a seat, the
|
||||
next start finds it already down and leaves it down, saying so. Bring it
|
||||
back with `rig up kernel --existing`. (0.7.3's issue of a long-gone kernel
|
||||
returning on daemon start is fixed by
|
||||
[#2146](https://github.com/mvschwarz/openrig/pull/2146).)
|
||||
- **OpenClaw's interrupted local turns are still not recovered.** The seat
|
||||
shows as needing attention, and a send submits a new turn: inspect the pane
|
||||
with `rig capture` first. For an unattended seat, use the Gateway preset.
|
||||
([#2092](https://github.com/mvschwarz/openrig/pull/2092))
|
||||
- **Whether processes a community harness starts outside its pane survive is
|
||||
still not exercised**, and `rig down` stops only the pane.
|
||||
([#2088](https://github.com/mvschwarz/openrig/pull/2088),
|
||||
[#2077](https://github.com/mvschwarz/openrig/pull/2077))
|
||||
- **Hermes:** as in 0.7.3, the example preset doesn't declare `resume`, and
|
||||
whether a seat's Hermes gateway exits once idle is unknown, although
|
||||
`docs/reference/community-harness-presets.md` says it exits. Check with `ps`
|
||||
before relying on it.
|
||||
- **A Codex seat's own permission settings** were enforced natively in 0.7.3's
|
||||
test with Codex 0.164.0; other Codex versions weren't tested.
|
||||
([#2048](https://github.com/mvschwarz/openrig/pull/2048))
|
||||
- **Upgrading doesn't restore Codex hook approvals that an earlier OpenRig
|
||||
removed.** If Codex asks for hook review, approve the hooks you mean to
|
||||
enable. ([#2035](https://github.com/mvschwarz/openrig/pull/2035))
|
||||
- **After the last managed session ends, an empty tmux server may stay
|
||||
running.** That alone doesn't mean an agent is still running.
|
||||
- **Slack threads from before 0.7.3** keep 0.7.3's limits: a reply on an ask
|
||||
parked before the fix can still reach the person asked, and a message
|
||||
received before 0.7.3 can still show OpenRig's routing footer, policy text
|
||||
and attachment paths when an agent asks a person about it.
|
||||
([#2119](https://github.com/mvschwarz/openrig/pull/2119),
|
||||
[#2124](https://github.com/mvschwarz/openrig/pull/2124))
|
||||
- **Shared channels are Slack only**, and the primary user's authority in the
|
||||
TUI is attribution, not authentication.
|
||||
([#1992](https://github.com/mvschwarz/openrig/pull/1992),
|
||||
[#2006](https://github.com/mvschwarz/openrig/pull/2006))
|
||||
- **The cmux path wasn't tried in a real cmux**, and a remote host's rigs are
|
||||
read over HTTP only. ([#2080](https://github.com/mvschwarz/openrig/pull/2080),
|
||||
[#2052](https://github.com/mvschwarz/openrig/pull/2052))
|
||||
- **Window sizing:** a browser that closes while the daemon is down leaves the
|
||||
window at the browser's size until the next web-terminal visit, and a
|
||||
`--readable` capture isn't atomic with a person's own edits.
|
||||
([#2065](https://github.com/mvschwarz/openrig/pull/2065),
|
||||
[#2075](https://github.com/mvschwarz/openrig/pull/2075))
|
||||
- **The runtime-switch handover change** hasn't been shown to cure the
|
||||
unsent-handover case that prompted it.
|
||||
([#2054](https://github.com/mvschwarz/openrig/pull/2054))
|
||||
- The community harness field keeps its name (`communityHarness`) and its
|
||||
original database update; renaming them would break a return to 0.7.2.
|
||||
- Not in this release: verified task viewers
|
||||
([#2133](https://github.com/mvschwarz/openrig/pull/2133)), switching a seat
|
||||
to an isolated account home
|
||||
([#2138](https://github.com/mvschwarz/openrig/issues/2138),
|
||||
[#2143](https://github.com/mvschwarz/openrig/pull/2143)), source evidence for
|
||||
resolving stuck findings
|
||||
([#2153](https://github.com/mvschwarz/openrig/pull/2153)), the stale-pane
|
||||
repair message ([#2157](https://github.com/mvschwarz/openrig/pull/2157)),
|
||||
current launch evidence for fresh handovers
|
||||
([#2159](https://github.com/mvschwarz/openrig/pull/2159)), and a warning for
|
||||
out-of-range MCP daemon ports
|
||||
([#2160](https://github.com/mvschwarz/openrig/pull/2160)). Hermes resume and
|
||||
measured idle exit, and OpenClaw interrupted-turn recovery, aren't in this
|
||||
release either. The limits listed for 0.7.3 still apply unless a change
|
||||
above names them fixed.
|
||||
|
||||
### Credits
|
||||
|
||||
Thank you to everyone whose work is in this release: @Aschenbath (#1908,
|
||||
#2101, #2113), @Nikhi00718 (#1863, #2016, #2106, #2107, #2108), @bradvin
|
||||
(#2100, #2109), @dajiaohuang (#2123) and @seanmcn (#2147, #2148, #2149). And
|
||||
thank you to @pr0xc3nt4ur1 (#1822), @duncanleung (#2130), @ziadeh (#2129),
|
||||
@alperta (#99), @smota (discussion #2117) and @oSquashBlossomo, whose reports
|
||||
and reviews led to fixes here.
|
||||
|
||||
## [0.7.3]
|
||||
|
||||
OpenRig 0.7.3 lets a team work with several people. You can register more than
|
||||
|
||||
@@ -26,9 +26,9 @@ use:
|
||||
|
||||
```sh
|
||||
# Claude Code
|
||||
npx skills add https://github.com/mvschwarz/openrig/tree/v0.7.0/skills/rigs --skill rigs --agent claude-code
|
||||
npx skills add https://github.com/mvschwarz/openrig/tree/v0.7.4/skills/rigs --skill rigs --agent claude-code
|
||||
# Codex
|
||||
npx skills add https://github.com/mvschwarz/openrig/tree/v0.7.0/skills/rigs --skill rigs --agent codex
|
||||
npx skills add https://github.com/mvschwarz/openrig/tree/v0.7.4/skills/rigs --skill rigs --agent codex
|
||||
```
|
||||
|
||||
Then type `/rigs` in Claude Code, or `$rigs` in Codex, and say what you want built. The skill has your agent tell
|
||||
@@ -68,11 +68,11 @@ Requires Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude Co
|
||||
|
||||
### Install it yourself
|
||||
|
||||
This runs OpenRig's install script from the `v0.7.0` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
|
||||
This runs OpenRig's install script from the `v0.7.4` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.0/scripts/install.sh | sh -s -- --dry-run
|
||||
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.0/scripts/install.sh | sh
|
||||
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.4/scripts/install.sh | sh -s -- --dry-run
|
||||
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.4/scripts/install.sh | sh
|
||||
```
|
||||
|
||||
If a provider isn't signed in yet, the last step reports `FAILED [4/4]`, and `rig setup` lists the sign-in under "Some steps need attention". If the only remaining failures are provider sign-ins, the install steps finished; sign in to each selected provider as below and continue.
|
||||
|
||||
@@ -191,11 +191,11 @@ You can also read [`skills/rigs/SKILL.md`](../../skills/rigs/SKILL.md) directly.
|
||||
script will do and changes nothing:
|
||||
|
||||
```sh
|
||||
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.0/scripts/install.sh | sh -s -- --dry-run
|
||||
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.4/scripts/install.sh | sh -s -- --dry-run
|
||||
```
|
||||
|
||||
The same command without `--dry-run`,
|
||||
`curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.0/scripts/install.sh | sh`, installs the
|
||||
`curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.7.4/scripts/install.sh | sh`, installs the
|
||||
latest published `@openrig/cli` with `npm install -g`,
|
||||
runs the Node.js and SQLite check, then `rig setup --dry-run` and `rig setup`. `rig setup` checks both Claude Code and
|
||||
Codex and may install a missing one, as described below. A failed step prints
|
||||
@@ -841,7 +841,7 @@ the lifecycle API without booting a new kernel, then stop the remaining rigs.
|
||||
| Shared terminal is absent | Inspect the existing kernel binding and recovery state; use standalone `rig tui` while resolving it. |
|
||||
| Viewing terminal was closed | Open the conversations again with `rig terminal open saved:kernel --window`; `rig tui --shared` is only the dashboard fallback if that window cannot open. Do not relaunch the team. |
|
||||
| Daemon restarted but tmux survived | Re-read `rig status` and the existing queue; a daemon restart is not a fresh project. |
|
||||
| Host reboot lost tmux sessions | Starting the daemon restores the kernel by itself when all of its seats were lost; check `rig status`, and if it reports the restore failed, run `rig up kernel --existing`. For other rigs, open `rig`, start the daemon if needed (press **S** if it opens on the work views), and select the existing rig and seats. Resume is the default; a fresh conversation needs a separate decision. |
|
||||
| Host reboot lost tmux sessions | Starting the daemon restores the kernel by itself when that start finds all of its seats lost; a kernel that was already down before the reboot stays down, and `rig start` names `rig up kernel --existing`. Check `rig status`, and if it reports the restore failed, run `rig up kernel --existing`. For other rigs, open `rig`, start the daemon if needed (press **S** if it opens on the work views), and select the existing rig and seats. Resume is the default; a fresh conversation needs a separate decision. |
|
||||
| Launch reports no usable snapshot | Inspect the existing rig and retained project files, then follow the same-seat recovery below. |
|
||||
| Work is waiting on a prompt or decision | Read the row, transition and named prompt; preserve the obligation until the missing decision arrives. |
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ npx skills add https://github.com/mvschwarz/openrig/tree/<release-tag>/skills/ri
|
||||
npx skills add https://github.com/mvschwarz/openrig/tree/<release-tag>/skills/rigs --skill rigs --agent codex
|
||||
```
|
||||
|
||||
For a new install, use the latest release's tag, for example `v0.7.0`. If OpenRig is already installed, use the tag
|
||||
For a new install, use the latest release's tag, for example `v0.7.4`. If OpenRig is already installed, use the tag
|
||||
that matches `rig --version`, or upgrade first. If the command fails with `npx: command not found`, Node.js isn't
|
||||
installed or isn't on your PATH yet (see [What you need](#what-you-need)). Then type `/rigs` in Claude Code, or `$rigs` in Codex, and say what
|
||||
you want built.
|
||||
|
||||
+109
-170
@@ -1,7 +1,7 @@
|
||||
# What changed in OpenRig 0.7.1
|
||||
# What changed in OpenRig 0.7.4
|
||||
|
||||
This note is for an agent on an install that was just upgraded to 0.7.1. It lists only what behaves differently from
|
||||
0.7.0 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.7.4. It lists only what behaves differently from
|
||||
0.7.3 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,184 +9,123 @@ 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`). Eight migrations run on the first start (124, 125,
|
||||
127, 128, 129, 130, 131 and 135). Nine settings are added: `policies.claude_compaction.preparation_root` (unset),
|
||||
`skills.router_line.enabled` (off), `decisions.enabled` (false), `decisions.consumers`, `decisions.template_dir`,
|
||||
`retention.stream_days` (30), `retention.stream_max_items` (20000), `provider.selected` (empty) and
|
||||
`daemon.db_conflict` (`warn`). None is removed.
|
||||
- **Stream retention is on.** Stream items emitted after the upgrade are deleted after 30 days, or beyond the newest
|
||||
20,000, unless a record names them (a classification, duplicate link, attempt or disposition). History from before the
|
||||
upgrade is kept. Raise `retention.stream_days` or `retention.stream_max_items` to keep more.
|
||||
- **The bundled openrig-core plugin goes from 0.1.17 to 0.1.18.** Startup replaces the installed plugin's changed files:
|
||||
its Claude hook definitions, three hook scripts and the pre-compaction hook (so hooks start on a seat whose PATH has
|
||||
no Node), and the `openrig-user`, `messaging-the-human` and `forming-an-openrig-mental-model` skills. As in
|
||||
0.7.0, it first copies each file it replaces under `$OPENRIG_HOME/backups/managed-refresh/<id>/`, edited or not, and
|
||||
logs `[plugin-vendor] preserved previous contents of <file> at <copy> before managed refresh`. A copy doesn't mean
|
||||
anyone edited the file; if someone did, reapply the change from the copy.
|
||||
- **Claude seats need Claude Code 2.1.280 or newer to see their team skills,** which now arrive as a per-seat plugin
|
||||
through `CLAUDE_CODE_PLUGIN_DIRS` (below). OpenRig doesn't check the version. A running seat gets the new layout at its
|
||||
next launch, restore or handover.
|
||||
- **If a worktree's `.claude/settings.local.json` says `"defaultMode": "acceptEdits"` and the person didn't choose it,**
|
||||
an earlier OpenRig wrote it when it added or freshly launched a managed Claude seat. 0.7.1 no longer writes it but
|
||||
doesn't repair it; ask the person which mode they want and set it once.
|
||||
- **Restart the daemon** (`rig daemon stop`, then `rig daemon start`). One migration runs on the first start (140). It
|
||||
adds a nullable `identity_principal` column, empty on earlier rows, to queue transitions and their archive, inbox and
|
||||
outbox entries, and stream items. Going back to 0.7.3 leaves the column in place, unread.
|
||||
- **The bundled openrig-core plugin goes from 0.1.20 to 0.1.21.** The `queue-handoff` skill gains a paragraph on writing a
|
||||
handoff that can be acted on after one read, and the Claude hooks add `StopFailure`, which reports a stop caused by a
|
||||
rate limit. As before, startup first copies each file it replaces under `$OPENRIG_HOME/backups/managed-refresh/<id>/`,
|
||||
edited or not, and logs where. A copy doesn't mean anyone edited the file; if someone did, reapply the change from
|
||||
the copy.
|
||||
- **Claude seats get the new hook at their next launch, resume, restore or handover,** not in a running process.
|
||||
- **Codex seats:** OpenRig's Codex plugin is openrig-core, so Codex sees it as changed. As before, OpenRig renews its own
|
||||
hook approval only where the installed plugin folder matches what shipped. If a Codex seat stops at Codex's "Hooks
|
||||
need review" after the upgrade, review the hooks in Codex.
|
||||
- **No setting is added or removed.**
|
||||
|
||||
## New things you can do
|
||||
|
||||
- **Choose how much automatic input reaches a seat:** `rig seat set-typing-guard <seat> --mode <mode> --reason "…"`, where
|
||||
`<mode>` adds `openrig-urgent` (OpenRig's own notices and anything urgent) and `urgent-only` between `off` and `hold`.
|
||||
Mark a message urgent with `rig send --urgent`, or create the row at priority `urgent` or `critical`. Held input stays
|
||||
readable (`rig seat held-messages`) and is never replayed.
|
||||
- **Choose how far OpenRig and peers may act on a seat:** `rig seat set-terminal-policy <seat> --preset
|
||||
no-peer-interventions|help-within-instructions|full-control --reason "…"`, with `--helper <addresses…>`,
|
||||
`--rig-default` (seats added later), and exceptions such as `--peer-compaction deny` or `--openrig-model allow`.
|
||||
Managed compaction and saved model or effort changes are checked; a denial is `terminal_policy_refused`. Other
|
||||
interventions are guidance only.
|
||||
- **Read a seat's planned permissions:** `rig seat status <seat>` shows what its next fresh managed launch will pass and
|
||||
where each part comes from, and its terminal policy. `rig setup --router-line yes|no` decides whether OpenRig adds its
|
||||
one line to shared guidance files.
|
||||
- **Let a person choose whether every ask reaches Slack:** `rig gateway human set <id> slack-subscription
|
||||
every-ask|urgent-only|unset`. Every ask is on the TUI's Feed either way. Under `urgent-only`, only an ask
|
||||
created or handed off with `--alert` posts. An ask marked `--alert` stands out in Slack (an interrupt with a mention)
|
||||
under either setting, so use it only for something only they can do, or an approval whose wait costs now.
|
||||
- **Give one Claude member its own setup** in the rig spec: `agent_file`, `append_system_prompt_file`, `plugin_dirs` and
|
||||
`advisor` (an Advisor model). They're copied into that seat's storage, never the project.
|
||||
- **See a seat's own skills:** `rig skill loadout --seat <session|self>`.
|
||||
- **Reach the team from an assistant without a shell:** the MCP server has 34 tools, including `rig_whoami`,
|
||||
`rig_restore_status`, `rig_team`, `rig_telemetry_events`, following a handoff, reading a finished item's artifact and
|
||||
deciding inside a person's decision room. `rig mcp serve --http` serves them over HTTP; `rig mcp token add <name>
|
||||
--seat <session>` gives each caller its own seat.
|
||||
- **Hand a row's task to an outside agent:** `rig acp run <row>` for an ACP agent (Hermes, OpenClaw).
|
||||
`docs/reference/a2a-agents.md` covers A2A agents.
|
||||
- **Run a community harness that names, reports or reopens its conversations:** preset fields `launch_result`, `resume`,
|
||||
`names_conversation` and `startup_assisted`, with examples for Cursor, Hermes and OpenClaw under
|
||||
`docs/reference/community-harness-examples/`.
|
||||
- **Change one edge on a running rig:** `rig edge add <rig> <from> <to> --kind <kind>` and `rig edge remove <rig>
|
||||
<edge-id>` (`--plan`, `--json`). A `delegates_to` change says when it moves who work routes to.
|
||||
- **Run one spec as several rigs:** `rig up <spec> --name <rig>`.
|
||||
- **Retune a watchdog in place:** `rig watchdog update <jobId> [--interval-seconds n] [--message text] [--spec path]`
|
||||
keeps its id and attachments. The context watch takes `--threshold-tokens` or `--threshold-percent`.
|
||||
- **Put restore maps where seats may write:** `rig config set policies.claude_compaction.preparation_root <abs path>`.
|
||||
- **Pick a Herdr session:** `rig terminal open <view> --provider herdr --session <name>`.
|
||||
- **Close a row with its artifact:** `rig queue update <id> --state done --evidence-ref <path>`.
|
||||
- **File and read subscription move reports:** `rig provider moves report` and `rig provider moves`. `--host <id>` and
|
||||
`--codex-home <dir>` on `rig auth status|list|switch` and `rig seat restart` act on another machine's Codex home.
|
||||
- **Route stream observations with typed decisions (opt-in, off by default):** once `decisions.enabled` is true,
|
||||
`decisions.consumers` includes `stream` and the intake seat has `OPENROUTER_API_KEY`, `rig project wake --decide`
|
||||
gives each eligible stream observation one bounded typed decision during that seat's wake: create a row for a supplied
|
||||
owner, join supplied work, or record a duplicate or no action. Anything uncertain, refused or failed goes to the
|
||||
intake seat as its own disposition, and the model isn't asked again. `rig project decisions status` shows the state
|
||||
without making a call. Without `--decide`, or with decisions off, nothing changes; turning decisions off no longer
|
||||
strands an accepted create or join whose effect hadn't landed.
|
||||
- **Read the stream as a subscriber:** `rig stream subscribe <seat>` (`--tags`, `--type`; re-subscribing keeps the
|
||||
place), then `rig stream read` returns the next bounded page for the calling seat (at most 20 items and 64 KiB, with
|
||||
`more`, `unread` and any `gap`). `rig stream subscriptions` lists readers; `rig stream unsubscribe <seat>` stops one.
|
||||
`rig stream show <id>` says what became of an observation.
|
||||
- **Keep the kernel to the harnesses you chose:** `rig setup --providers <list>` is now saved as `provider.selected`, and
|
||||
the kernel starts seats only for those.
|
||||
- **Stop a second daemon on a live database:** `rig config set daemon.db_conflict stop` refuses a start whose database a
|
||||
matching live daemon already holds (the default `warn` only warns). `rig daemon start --allow-db-conflict` allows one
|
||||
deliberate start.
|
||||
- **Put an assistant that lives outside a terminal on a team:** add a roster entry for its seat with `"hosted": true`
|
||||
and connect the assistant to `rig mcp serve` under a grant for that seat (`rig mcp token add <name> --seat
|
||||
<member>@<rig> --rig <rig>`, or a grant service, below). `rig_team` then lists it as a hosted member with its declared
|
||||
capabilities and caveat, no pane, and activity `unknown`; `rig roster show` and `find` say it's hosted. The server's
|
||||
instructions teach it the loop (inbox, claim, close or hand on, and asking a person while keeping the item), and it
|
||||
can call `rig_whoami` to learn its seat.
|
||||
- **Ring a hosted member when work lands for it:** declare `wake.webhook` on its roster entry, with `url_ref`,
|
||||
`authorization_ref` and optionally `secrets_env_file` (an absolute path to a 0600 env file). The refs are secret names
|
||||
read from the daemon's environment or that file; never put values in a roster. OpenRig POSTs `{source, schema_version,
|
||||
event: "work-waiting", qitem_id, destination, summary, from}`, never the row's body, waits up to 10 seconds and
|
||||
doesn't follow redirects.
|
||||
- **See when a hosted member last showed up:** `rig_team` shows its last call to the team's MCP server and its latest
|
||||
ring with how that went; `rig roster show` and `find` show the last call.
|
||||
- **Check remote callers with an external grant service:** `rig mcp serve --http --grant-service <url>`, with
|
||||
`--grant-service-header-file <path>` for one `Name: value` header on each lookup. Each request is checked; nothing is
|
||||
cached.
|
||||
- **Let OAuth clients discover how to sign in:** add `--oauth-resource <url>` (the public https URL clients reach, its
|
||||
path ending in `/mcp`) and `--oauth-issuer <url>` to `--grant-service`. The server publishes OAuth protected-resource
|
||||
metadata (RFC 9728) and answers a missing or bad credential with a standard challenge.
|
||||
- **Serve newer MCP clients:** clients on protocol revision 2026-07-28 (no `initialize`, the version on every request,
|
||||
possibly opening with `server/discover`) work with `rig mcp serve` over stdio or `--http`, beside clients on the 2025
|
||||
revisions, on the same endpoint.
|
||||
- **List the conversations a seat could resume:** `rig seat history --rig <id> --node-id <id>` (`--json`), read-only and
|
||||
without native tokens; `--snapshot-id <id>` with `--history-session-id <id>` checks one reference it returned. The IDs
|
||||
are `rigId` in `rig ps --nodes --json` and `identity.nodeId` in `rig whoami --session <seat> --json`. A client can then
|
||||
ask the daemon's startup review for that node to resume the history the person reviewed.
|
||||
- **Preview or open a task's current owners:** `rig terminal open qitem:<id>`; the daemon's preview,
|
||||
`GET /api/terminal/preview?view=qitem:<id>`, returns the same view without opening it.
|
||||
|
||||
## Behaviour that changed
|
||||
|
||||
- **Team skills live in each seat's own storage** (`$OPENRIG_HOME/state/seats/<rig id>/<logical seat>/<runtime>/`), not
|
||||
in the project's `.claude/skills` or `.agents/skills`. Claude seats get them as a generated plugin (`openrig:<id>`),
|
||||
Codex seats as their own catalog. If a link sits in that path, the seat starts without them and the result names
|
||||
what wasn't delivered.
|
||||
- **Urgent wakes are labelled:** an urgent or critical row's wake starts with `Urgent (marked by …):` at every seat. A
|
||||
seat on `hold` gets one held notice per wake instead of re-nudges, and lifecycle work is refused at the middle levels as
|
||||
at `hold`.
|
||||
- **A daemon restart picks up a managed compaction where it stopped.** An owed restore step resumes, a `/compact` that
|
||||
may have been sent is never sent again, and `rig compact --state` shows anything stranded or owed.
|
||||
- **A Claude seat whose startup turn is refused** (an expired login, say) holds the rest of its startup context as owed.
|
||||
A startup input sent before the refusal is noticed can still be submitted (see Known issues in the
|
||||
[0.7.1 release notes](https://github.com/mvschwarz/openrig/releases/tag/v0.7.1)).
|
||||
- **`rig send` refuses with `target_needs_input`** when a Claude seat's hook has just reported it running and its screen
|
||||
shows an MCP enablement menu, a question or a permission prompt.
|
||||
- **`rig down` asks before stopping the caller's own rig.** Without a terminal it exits 1, stops nothing and prints the
|
||||
`--yes` command.
|
||||
- **`rig up --plan` doesn't start a stopped daemon:** it exits 1 with `daemon_not_running` and names `rig daemon start`
|
||||
and `--no-kernel`.
|
||||
- **`rig daemon start`** waits up to 20 seconds for a slow daemon, and starts with a warning when only a secondary
|
||||
listener, such as Tailscale's, can't be verified.
|
||||
- **A seat joined with `rig attach` as an outside app** (Claude Desktop) stays attached through `rig down` and restore
|
||||
(`left_attached`). To replace it, `rig unclaim <name>`, then launch.
|
||||
- **New seats get the daemon's `OPENRIG_DB` and `TMUX_TMPDIR`.**
|
||||
- **A rebuilt Codex seat keeps its observed permissions,** and a read-only Codex profile launches without OpenRig's
|
||||
writable roots.
|
||||
- **A seat's own role** goes only to that seat, never into a shared `CLAUDE.md` or `AGENTS.md`, and `rig down` returns
|
||||
guidance files byte for byte.
|
||||
- **Workflow actions** (`project`, `route`, `resume`, `abort`) record the calling agent; a request with neither identity
|
||||
nor actor gets the shared `actor_required` error.
|
||||
- **`rig provider moves` is back** for subscription move reports. It switches nothing.
|
||||
- **`--dangerously-interact` into a seat's input box stops first** when the box already holds typed or pasted text: it
|
||||
shows that text (apart from suggestions) and types nothing. Clear the box and retry, or pass `--type-without-checking`,
|
||||
which clears nothing. Keys for a recognized native menu are sent as before.
|
||||
- **A terminal seat gets exactly the text sent to it,** without the From/To lines (the result says `envelopeOmitted`).
|
||||
A queue wake to a terminal seat types nothing and fails `failed:terminal-seat`; the row stays queued.
|
||||
- **A daemon restart that can't see the seats' tmux server** no longer detaches seats whose recorded process still
|
||||
runs, so it doesn't relaunch them beside themselves.
|
||||
- **Provider credentials and the activity-hook token stay off tmux, shell and `env` command lines** at launch and
|
||||
handover. A launch whose staging fails stops instead of falling back.
|
||||
- **An answer retried from Slack or Steering** after an interrupted close reuses the first reply and finishes the
|
||||
request once.
|
||||
- **One bad row no longer stops the stuck sweep** from flagging the others; **a malformed unrelated diagnosis row** no
|
||||
longer stops health diagnoses from listing.
|
||||
- **The kernel at daemon start:** startup restores a kernel only when this start's reconcile found its seats down (what
|
||||
a reboot leaves). A kernel that was already down before this start stays down. `rig start` prints `Kernel auto-boot
|
||||
skipped: kernel rig already managed; it was already down before this daemon start, so it was not restored. Bring it
|
||||
back with: rig up kernel --existing`.
|
||||
- **`rig daemon start --wait-for-kernel`** for a kernel skipped on purpose prints the same reason and way back that `rig
|
||||
start` gives, instead of "did not reach ready / partial_ready within …ms" and a runtime-auth fix. It still exits 1. A
|
||||
kernel still booting at the deadline, and the failure states, keep their wording.
|
||||
- **Work waiting for a member nothing can wake** is reported to that member's person (Steering, the TUI's Feed, and Slack
|
||||
under the default subscription), not to the member.
|
||||
- **A rung hosted member that doesn't claim its work** by the stuck sweep's unclaimed age is reported to its person, as
|
||||
for a member with no trigger.
|
||||
- **A caller granted through a grant service** can address only its granted team, not its own or another caller seat,
|
||||
and can't set OpenRig's Slack provenance tags or a workflow's internal sign-off.
|
||||
- **A caller's seat that was created but never launched** is served by `rig mcp serve --http` instead of refused with
|
||||
`seat_unavailable`.
|
||||
- **A park on a registered person's own address** (`<id>@external`) resolves only from a Slack reply written after its
|
||||
question; it keeps `--summary` and `--evidence-ref`; and it shows in NEEDS YOU in the reviews, with asks to that
|
||||
address.
|
||||
- **The reviews' agents band** counts only open rows as held, and a seat with work in progress reads as working.
|
||||
- **A Claude seat stopped by a rate limit** is recognised from the `StopFailure` hook, and a delayed older Claude hook no
|
||||
longer replaces a seat's current state.
|
||||
- **`rig handover --source fresh` on Claude** reports delivery only when the packet is submitted, and fails with
|
||||
`context_delivery_failed` if it's still staged after one retry.
|
||||
- **A periodic snapshot** between separate named-agent launches keeps a down agent's resume source.
|
||||
- **A resumed Pi seat** no longer prints `Entry not found` after `READY` on every restart.
|
||||
- **The TUI** starts in a terminal that reports 0 rows or columns, lists rigs by name as `rig ps` does, and no longer
|
||||
reports a refused effort read as a failure.
|
||||
- **Identity lookup** (`rig whoami`, `rig down`, `rig ask`, `rig health`) no longer prints tmux's `invalid option` errors.
|
||||
- **An artifact whose frontmatter isn't closed** no longer wakes an artifact-pool worker as ready.
|
||||
|
||||
## Output that changed shape
|
||||
|
||||
- **`rig ps --nodes`** separates every cell with one space (the default row is 5 columns wider), adds an `ATTN` column
|
||||
(`yes`, `no` or `?`) before `REASON`, and marks a `running` seat whose tmux couldn't be reached as unconfirmed.
|
||||
- **`rig queue show --json`** no longer has `lastNudgeInputBox`, and send results no longer describe the input box.
|
||||
- **`rig queue show` and `rig queue whoami`** print their human notices on stderr, so stdout is the JSON.
|
||||
- **A claimed row whose owner waits on a person** reads pickup `needs-input`, with the reason.
|
||||
- **`rig down --json`** adds `leftRunning`; `rig reconcile-session` says whether resume metadata was recorded.
|
||||
- **`rig compact-plan`** labels its thresholds as its own and says whether automatic compaction is on.
|
||||
- **A send held for a draft** in the seat's input box reports `inputPhase: "not_reached"`: it was never typed.
|
||||
- **A stream body over 16 KiB** is stored truncated, ending `[truncated by OpenRig: kept N of M bytes]`, and reads mark it
|
||||
`bodyTruncated`. `rig stream list --after <sortKey>` from a pruned item returns 410 `stream_cursor_expired`, naming
|
||||
`--since` to resume, instead of an empty list.
|
||||
- **`rig_team`** can carry hosted members (activity `unknown`, their capabilities, caveat, last call and latest ring)
|
||||
and `hostedMembersNote` when a roster can't be read.
|
||||
- **Terminal preview and open responses** carry `viewDescriptor` (`kind`, `name`).
|
||||
- **Rows written by a granted MCP caller's actions** carry `identity_principal` (`principal:v1`: source, id and, for a
|
||||
grant service, grant and version).
|
||||
- **A webhook ring** is recorded on the row as `wake-accepted:webhook (<url_ref>) answered <status>` for a 2xx.
|
||||
- **`rig seat history`** is new, with `--json`.
|
||||
|
||||
## What to stop doing
|
||||
|
||||
- **Don't read `lastNudgeInputBox`.** It's gone.
|
||||
- **Don't parse `rig ps --nodes` by column position.** Use `--json`, with `--fields` to pick fields.
|
||||
- **Don't look for a team seat's skills in the project folders.** Use `rig skill loadout --seat`.
|
||||
- **Don't stop and re-register a watchdog to change it.** Use `rig watchdog update`.
|
||||
- **Don't take a rig down to fix one edge.** Use `rig edge add` or `remove`.
|
||||
- **Don't print `OPENRIG_ACTIVITY_*` values** while looking for identity. Use `rig whoami`.
|
||||
- **Don't use `--dangerously-interact` to type over a half-written input box.** It stops and shows the text; choose
|
||||
explicitly, or use `rig send --urgent` where the seat's interruption level allows it.
|
||||
- **Don't launch a remote caller's seat just to give it a session.** A created seat is served.
|
||||
- **Don't read a webhook ring's 2xx as the member waking.** Its claim on the row is the pickup.
|
||||
- **Don't read a hosted member's `unknown` activity as idle.** OpenRig doesn't observe it between calls.
|
||||
- **Don't expect a long-gone kernel to come back on daemon start.** Run `rig up kernel --existing` when you want it.
|
||||
- **Don't read `--wait-for-kernel`'s exit 1 for a skipped kernel as an auth problem.** Read the reason it prints.
|
||||
|
||||
## Known gaps in 0.7.1
|
||||
## Known gaps in 0.7.4
|
||||
|
||||
- **A new Claude seat's startup text can stay in its input box unsent.** If a fresh Claude seat sits idle with text at
|
||||
its prompt, press Enter in its pane, or ask the person to.
|
||||
- **Claude seats on a macOS native install can read as needing attention after a restore.** Check the pane before
|
||||
acting on it.
|
||||
- **A Slack channel-mapping change needs a daemon restart.** Don't use `rig slack disable` then `enable` for it: enabling
|
||||
marks any alerts waiting to post to Slack as already seen.
|
||||
- **Ubuntu 22.04's tmux 3.2a:** the query known to crash its server is gone, but a narrower race remains. Avoid 3.2a
|
||||
(`tmux -V`).
|
||||
- **`rig daemon start` can take 20 to 40 seconds** before its listener warning, longer than the TUI's 30-second "restore
|
||||
everything" wait. On a slow host, start the daemon yourself first.
|
||||
- **A launch that warns "Scoped tmux environment unavailable; retaining the previous environment"** didn't give that seat
|
||||
the clean environment. Check `env` in the seat before relying on OpenRig's variables.
|
||||
- **Going back to 0.7.0 with a Slack subscription set:** 0.7.0 can't read a person file that holds one, and its people
|
||||
registry stops loading. Save the choice first (`rig gateway human show <id> --json > <id>.json`), then run
|
||||
`rig gateway human set <id> slack-subscription unset` (`urgent-only` becomes every-ask, as on 0.7.0); set it again after
|
||||
returning to 0.7.1. A person file still holding a `subscriptions:` entry fails on 0.7.0 too. Don't restore an older
|
||||
gateway folder or database instead: that can lose newer people, bindings and delivery records.
|
||||
- **A Herdr tile over SSH** doesn't come back by itself after a Herdr restart. Reopen it with `rig terminal open <view>
|
||||
--provider herdr`.
|
||||
- **Delegated decisions:** the ask is created before the decision, so without quiet hours it can post to the person
|
||||
first. Pair a decision room with quiet hours, or decide before asking.
|
||||
- **`restore-check` still treats a missing startup file as rig-wide.** Trust `rig up --existing`'s per-seat result.
|
||||
- **Managed Claude launch requires `/usr/bin/env` support for `-0` and `-u`** (option support checked on GNU coreutils
|
||||
and macOS 15; BusyBox and older macOS unverified). Without the required option support, launch stops instead of
|
||||
falling back to credential-bearing command-line arguments.
|
||||
- **In draft-aware mode, an agent's multi-line message to a Claude seat can remain unsubmitted when the paste changes
|
||||
Claude's footer hint.** OpenRig withholds Enter, leaving the text in the composer and later sends waiting. Observed on
|
||||
Claude 2.1.309 with both 0.7.0 and the 0.7.1 pre-cut build; #14 remains open.
|
||||
- **A Claude seat signed in with a long-lived token (`claude setup-token`) gets no usage reading.** The reader accepts
|
||||
only claude.ai subscription logins and reports `not_subscription_login`.
|
||||
- **A webhook ring proves only that the endpoint accepted it.** An ordinary chat app can't receive unsolicited events,
|
||||
so a hosted assistant without a webhook-capable runner sees work only when it checks.
|
||||
- **A recorded principal is attribution, not authentication.**
|
||||
- **The `qitem:<id>` view is membership only:** it doesn't follow the task as it moves, keep a reusable viewer, or grant
|
||||
input. An explicit open still has the provider's usual workspace effects.
|
||||
- **Resuming a reviewed history has no CLI yet;** it's through the daemon's startup review, for clients, and limited to
|
||||
this node's eligible Claude and Codex histories in the current compatible snapshot.
|
||||
- **The kernel's restore evidence lasts one daemon process:** if the first daemon after a reboot exits before the
|
||||
kernel's restore starts a seat, the next start leaves the kernel down and says so.
|
||||
- **OpenClaw's interrupted local turns aren't recovered** (#2092). Capture the pane before sending; for an unattended
|
||||
seat, use the Gateway preset.
|
||||
- **Whether processes a community harness starts outside its pane survive isn't exercised** (#2088), and `rig down`
|
||||
stops the pane only (#2077).
|
||||
- **Hermes:** the preset doesn't declare `resume`, and whether a seat's gateway exits once idle is unknown; check with
|
||||
`ps`.
|
||||
- **A Codex seat's own permission settings** were enforced natively in 0.7.3's test with Codex 0.164.0; other versions
|
||||
weren't tested.
|
||||
- **Shared channels are Slack only,** and the primary user's authority in the TUI is attribution, not authentication.
|
||||
- **The cmux path wasn't tried in a real cmux,** and a remote host's rigs are read over HTTP only.
|
||||
- **Not in 0.7.4:** verified task viewers (#2133), switching a seat to an isolated account home (#2138, #2143), source
|
||||
evidence for resolving stuck findings (#2153), the stale-pane repair message (#2157), current launch evidence for
|
||||
fresh handovers (#2159), a warning for out-of-range MCP daemon ports (#2160), Hermes resume and measured idle exit,
|
||||
and OpenClaw interrupted-turn recovery. The gaps listed for 0.7.3 still apply unless a change above names them fixed.
|
||||
Generated
+5
-5
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "openrig",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "openrig",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"license": "Apache-2.0",
|
||||
"workspaces": [
|
||||
"packages/daemon",
|
||||
@@ -7346,7 +7346,7 @@
|
||||
},
|
||||
"packages/cli": {
|
||||
"name": "@openrig/cli",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -7384,7 +7384,7 @@
|
||||
},
|
||||
"packages/daemon": {
|
||||
"name": "@openrig/daemon",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@hono/node-server": "^1.13.0",
|
||||
@@ -7426,7 +7426,7 @@
|
||||
},
|
||||
"packages/ui": {
|
||||
"name": "@openrig/ui",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@fontsource-variable/jetbrains-mono": "^5.2.8",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "openrig",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"private": true,
|
||||
"license": "Apache-2.0",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openrig/cli",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"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.
|
||||
|
||||
Ninety top-level verbs ship (capability canon refreshed through
|
||||
`capability-delta-v0.7.3`). This marker describes the pack's teaching, not publication or live
|
||||
`capability-delta-v0.7.4`). 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.
|
||||
What changed in the installed version, and what to do about it, is one read away:
|
||||
`rig context get reference/whats-new.md`.
|
||||
@@ -88,7 +88,10 @@ one command away. Your memory of the fleet is a claim about the past.
|
||||
- **`rig roster list` / `show` / `find`** — who across your rigs and hosts is recommended for a
|
||||
kind of work, from JSON rosters in `<workspace.root>/rosters`. Read-only: it dispatches nothing
|
||||
and does not claim anyone is available. The built-in starter and factory leads publish their
|
||||
team's roster at first start. `show` and `find` include each seat's last observed model.
|
||||
team's roster at first start. `show` and `find` include each seat's last observed model. A
|
||||
roster entry marked `"hosted": true` is a member that lives outside a terminal (an assistant
|
||||
connected over MCP); `show` and `find` say so, and when it last called the team's MCP server.
|
||||
With no evidence that reads unknown, never idle.
|
||||
- **`rig telemetry events` / `transitions` / `tenures <node-id>`** — past events, queue
|
||||
transitions and a seat's occupants, one bounded page at a time with gaps reported. Reach for it
|
||||
before querying the database yourself.
|
||||
@@ -210,6 +213,12 @@ unseen — which makes messages the one delivery channel that never gets skipped
|
||||
existing view was reused, which is success. `--provider herdr` or `--provider cmux` opens the
|
||||
view in a provider that is already running, without opening a window; each such open adds a new
|
||||
workspace, so to come back to a view, focus its open space.
|
||||
**`qitem:<id>` as the view** previews or opens the current local owners of that task: its
|
||||
pending, in-progress and blocked rows through explicitly linked successors, without closed
|
||||
predecessors or past senders. It's a read-only membership view: stopped, missing, external and
|
||||
unresolved owners are named, and incomplete lineage is reported rather than cut short. It doesn't
|
||||
follow the task as it moves, and an explicit open still has the provider's usual workspace
|
||||
effects. Preview and open responses carry `viewDescriptor` (`kind`, `name`).
|
||||
Add `--session <name>` to select a Herdr session for that request; `--session default`
|
||||
explicitly selects its default session. `rig terminal status --session <name>` inspects
|
||||
the same endpoint. Omitting the flag keeps the daemon's configured endpoint. Herdr tiles come
|
||||
@@ -594,6 +603,12 @@ because someone lost work once.
|
||||
When your user says OpenRig isn't working, start with **`rig context get help`**: the one help guide for the installed
|
||||
version, from checking the environment to a useful report to the OpenRig team.
|
||||
|
||||
- **`rig seat history --rig <id> --node-id <id>`** — which recorded Claude or Codex conversations this exact node
|
||||
could resume, read-only (`--json`; check one reference with `--snapshot-id` and `--history-session-id` together).
|
||||
The IDs are `rigId` in `rig ps --nodes --json` and `identity.nodeId` in `rig whoami --session <seat> --json`.
|
||||
A client can then ask the daemon's startup review for that node to resume
|
||||
the history the person reviewed; it rechecks the choice and refuses rather than substitute another
|
||||
conversation or start fresh.
|
||||
- **`rig start`** — the box rebooted and everything is gone: bring the whole topology back in one
|
||||
move, rather than hand-restoring rig by rig. Selected-rig recovery now demands positive runtime
|
||||
evidence and refuses stale identity by name rather than substituting an occupant. `--last`
|
||||
@@ -604,6 +619,9 @@ version, from checking the environment to a useful report to the OpenRig team.
|
||||
Stop distinguishes process/listener exit from a clean asynchronous drain: inspect the matching
|
||||
`daemon-shutdown.json` and log when completion is incomplete or unverified. No target is a
|
||||
distinct no-op, and a timeout never proves down. Use command help for exact limits and recovery.
|
||||
Startup brings back a kernel that this start found down (what a reboot leaves). A kernel that
|
||||
was already down before this start stays down: `rig start` and `rig daemon start
|
||||
--wait-for-kernel` say so, and `rig up kernel --existing` brings it back.
|
||||
`/healthz` reports the daemon's effective UID as `euid`, beside `pid`. Running several OpenRig
|
||||
homes on one machine on purpose: `rig config set daemon.db_conflict stop` refuses a start whose
|
||||
database another live daemon already holds (the default, `warn`, only warns), and
|
||||
@@ -1279,14 +1297,28 @@ your circumstances is configuration, and the ones that are not, another agent ca
|
||||
shell command. Its queue tools (`rig_queue_create`, `rig_queue_show`, `rig_queue_list`,
|
||||
`rig_queue_claim`, `rig_queue_update`, `rig_queue_handoff`, `rig_queue_unclaim`) act as the seat
|
||||
named by `OPENRIG_SESSION_NAME`, so an agent with no shell can hand work to the team, read the
|
||||
closing note as its answer, and pass on or put back work it holds. Nothing
|
||||
wakes such an agent; it sees new work when it checks. Its tools cover the whole delegation loop:
|
||||
closing note as its answer, and pass on or put back work it holds. Unless it declares a webhook
|
||||
trigger (below), nothing wakes such an agent; it sees new work when it checks. Its tools cover
|
||||
the whole delegation loop:
|
||||
find its seat, team and lead (`rig_whoami`, `rig_team`), hand work on and follow the handoff's
|
||||
successor, find finished work and read its artifact, decide inside a person's decision room,
|
||||
follow a restore it started (`rig_restore_status`) and read the event log
|
||||
(`rig_telemetry_events`). **`rig mcp serve --http`** serves the same tools to a client on another
|
||||
host; `rig mcp token add <name> --seat <session>` gives each caller its own grant, acting as that
|
||||
seat.
|
||||
seat. `--grant-service <url>` checks each request's key with an external grant service instead
|
||||
of the token file (`--grant-service-header-file` adds one header to each lookup), and
|
||||
`--oauth-resource` with `--oauth-issuer` lets an OAuth client discover how to authenticate and
|
||||
get a standard challenge; the key and its grant still decide what a caller may do. The rows a
|
||||
granted caller's actions write record whose grant acted: attribution, not authentication.
|
||||
Clients on MCP protocol revision 2026-07-28 and on the 2025 revisions share the same endpoint.
|
||||
**An assistant connected this way can be a hosted member of a rig:** mark its roster entry
|
||||
`"hosted": true` and `rig_team` lists it with its declared capabilities and caveat, activity
|
||||
`unknown`. The server's instructions teach it the loop: its inbox, claiming, closing or handing
|
||||
on, and asking a person while keeping the item (it blocks the item on that person, and the
|
||||
answer returns it in progress). A roster entry can declare a webhook trigger (`wake.webhook`,
|
||||
with secret names, never values): OpenRig then POSTs a pointer to the row when work lands, and a
|
||||
2xx records only that the ring was accepted, not that anything woke. When work waits for a
|
||||
member nothing can wake, or a rung member doesn't claim it in time, its person is told.
|
||||
- **`rig skill loadout --runtime <claude-code|codex>`** — inspect the exact catalog revision,
|
||||
selectors, target, and current/missing/shadowed/conflicting state for one working directory.
|
||||
`--apply` writes only the managed ownership set, is idempotent, and refuses local edits or
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openrig/daemon",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"private": true,
|
||||
"license": "Apache-2.0",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openrig/ui",
|
||||
"version": "0.7.1",
|
||||
"version": "0.7.4",
|
||||
"private": true,
|
||||
"license": "Apache-2.0",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"release": "0.7.2",
|
||||
"archiveSha256": "42b4d4980c062f49f99db7e843a2ba96c0066a420cbaace381f435e22699d4c5",
|
||||
"release": "0.7.3",
|
||||
"archiveSha256": "cac4a448427697b7062c0f68fa56dcfebf5168cdcd8b57c8ad4b939a4d127d99",
|
||||
"plugins": {
|
||||
"openrig-core": {
|
||||
"version": "0.1.19",
|
||||
"sha256": "21343eb7a36b0726a50372edc781b8e5b344c819a456499552f2560fb9712cb1"
|
||||
"version": "0.1.20",
|
||||
"sha256": "b3b5f3d71b1343ae5c71752ea29d3e0db86bce585604562744e543e9ccbe7e44"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user