Skip to content

Releases

OpenRig 0.7.15

Choose a tag to compare

@mvschwarz mvschwarz released this 14 Nov 09:20

[0.7.15]

OpenRig 0.7.15 is a patch for steadier, more truthfully reported teams. A busy
daemon does less repeated synchronous work on a few read paths and names more
of what it was doing when it stalls. rig daemon start waits longer for a slow
start, and restore tries a saved conversation when an eligible seat has no
saved startup context. There are fixes across delivery, Slack replies, Codex seats and
connected assistants, many contributed by people using OpenRig. See Known
limits for what this release doesn't fix.

Before you upgrade

  • Stop the daemon, back up the database, install 0.7.15, then start the
    daemon.
    Your agents keep running through a daemon restart; don't use
    rig down, which ends them.

    rig daemon stop
    cp "$(rig config get db.path)" "$(rig config get db.path).before-0.7.15"
    npm install -g @openrig/[email protected]   # or your existing installation method
    rig daemon start
  • One migration runs before the daemon listens. Migration 165 adds four
    columns and two indexes to activity_grants, binding a runner's activity
    credentials to its actual launch. Going back to 0.7.14 after it isn't
    established; keep the backup. (#3060)

  • A slow start: rig daemon start now gives the daemon child it started a
    180-second readiness budget, instead of 20 s, and prints
    "Waiting for daemon child readiness (…s elapsed; 180s limit)" about
    every 20 s. A quick start still returns at once, and a child that exits ends
    the wait. Let the wait finish. The budget bounds scheduling: synchronous work
    can run past the budget. A child still not ready when that budget is
    exhausted is reported pending as before: "Daemon startup is pending after the readiness deadline".
    Readiness remains unconfirmed; the child keeps running and the startup
    reservation is retained. Inspect the address and log it prints, and don't
    start it again until its restart steps are done: stop the named child PID and
    wait for it to exit, inspect daemon-start.lock, and only when both recorded
    launcher and child PIDs are absent, archive the lock and run
    rig daemon start. rig daemon stop cannot stop that unpublished child. (#3118)

  • The plugins: the openrig plugin carries the CLI's version, 0.7.15.
    openrig-core moves to 0.1.30, because its skills changed.

Under load

  • The wake ladder reads its prompt-refusal candidates from the open rows,
    instead of scanning the whole transition log on every tick. It returns the
    same rows. This removes one repeated scan; it isn't a measured fix for every
    stall. (#3098)
  • The execution view's candidate read steps through the queue in windows and,
    on its cooperative path, yields to the event loop between them, so a mission
    filter that matches few rows no longer holds the loop for a whole history
    walk. One large row, or the history count, can still take time. Inside a
    transaction, on a memory or temporary database, or on a non-WAL file, the
    candidate read keeps its synchronous fallback. (#3122)
  • Snapshot refreshes share process listings where each seat's order and the
    2 s freshness allow; each seat still gets its two ordered observations and
    its own fallback. The reduction is derived from the source, not measured. (#3154)
  • The slow-operation log adds three queue sites and three selected steps of an
    ordinary nodes read: nodes.inventory.build,
    nodes.inventory.activity_sync and nodes.inventory.terminal_work. These
    nodes records are written after a slow call completes; a missing record does
    not rule out unfinished work or work outside those steps. This changes no
    behaviour. (#3100, #3138)

Restore and seats

  • For an eligible seat in a rig with pods that restore starts in its own pane,
    a resume token with no saved startup context now lets restore try the saved
    conversation with an empty plan. It records the startup_context gap. A
    successful resume with that gap makes the rig read partially_restored; a
    missing conversation or failed start keeps its own status. No saved startup
    plan is replayed or saved startup-context row written; the adapter's ordinary
    bootstrap and existing skill restoration still run. An external CLI
    attachment is kept, no-token seats still wait for a decision, and legacy
    seats are unchanged. restore-check reads an eligible seat with a token
    yellow; for one with no saved context and no eligible token, it points to the
    read-only rig up <rig> --existing --plan preview. (#3177)
  • When rig seat restart --keep-conversation refuses a recoverable seat whose
    tmux session is gone, it names the way back: rig launch '<rig>' '<node>'
    (add --plan to preview). (#3135)
  • restore-check and a full restore warn when a snapshot recorded a named
    Codex profile that the current seat has cleared; restore uses the current
    selection. Nothing is refused. (#3155)
  • A context-usage watchdog reads its own seat's current occupant, not an
    archived generation's. A context watch whose seat can't be pinned, or has no
    recorded tenure, skips that tick with its reason instead of ending. (#3027, #3139)

Delivery and people

  • Right before an automatic paste into a seat with the draft-aware guard,
    OpenRig re-checks: it holds the paste after recent client activity, re-reads
    the input after a short wait, and holds when tmux can't be read. The message
    is held and retained; rig seat held-messages shows it. An ordinary guarded
    paste waits about 300 ms longer. This narrows #3076's window; it doesn't close it.
    This is shown by the change's own tests; it's not yet checked with the real
    programs on this release. (#3097)
  • A terminal seat whose tmux session runs under another name gets the exact
    text of a send, and a queued wake no longer types OpenRig's From/To envelope
    into its shell. (#3074)
  • When the arrival note is recorded before the answer is routed, an answer to
    a reply in an older Slack thread posts back into that thread, not as a new
    top-level message; see Known limits for when it posts top-level. Only the
    conversation's newest thread answers a parked question, as before. (#3120)
  • Slack previews on posts to a person are a setting: rig slack setup --unfurl on|off,
    and rig slack status shows which is in effect from the connector's next
    rewire. The default is off; see "Behaviour that changed". (#3157)

Connected assistants

  • An assistant that passes its team's display name as rig_team's rigId is
    told to leave rigId out to see its own team, and a hosted member with no
    wake trigger is told it picks up work when its person asks, or on a schedule
    they set. (#3104)
  • An external grant that works its own inbox is told only about the tools it's
    offered. (#3140)
  • The TUI keeps connected assistants' check-in lines when a rig's seat
    inventory can't be read, with the error beside them. (#3105)
  • The openrig plugin needs Claude Code 2.1.119 or later. On earlier versions,
    with the plugin's OpenRig seat setting left blank, Claude Code drops its MCP
    server: the skill loads, but the agent has no OpenRig tools. (#3137)

Codex, runners and harnesses

  • OpenRig renews its own changed Codex hook approvals. When a new
    openrig-core changes one of OpenRig's six Codex hook declarations, the launch
    that installs it renews those approvals from OpenRig's own record instead of
    stopping at Codex's hook review. This runs at daemon start in the daemon's
    Codex home, when hooks are on and a Codex seat selected openrig-core, and at
    each such seat's launch in its own Codex home. It renews only when the
    installed plugin matches the shipped one and every current approval matches
    OpenRig's saved record. A person's own choice in any layer OpenRig reads
    keeps the review; profile files passed with -p aren't read. No real Codex
    seat ran in its tests. (#3143)
  • A Codex seat's resume command in the node inventory and detail panel is
    built from what a real resume uses, with a label when the recorded launch
    differs. Workspace options that aren't recorded per launch can still read as
    a match. (#3043)
  • Runner activity grants are bound to the actual launch, and the
    replacement's activation revokes its predecessor's grant. A grant made before
    this release stays tied to the seat's occupant until then. A grant that can't
    be bound never blocks a launch or restore. This attributes reports to
    the run OpenRig selected; it doesn't prove a runner's identity. (#3060)
  • Terminal views find tmux again when its cached path is gone, instead of
    tiles exiting 126 until a daemon restart. (#3129)
  • A SKILL.md with CRLF line endings is discovered and reaches a seat's
    managed plugin loadout. ([#...
Read more

OpenRig 0.7.14

Choose a tag to compare

@mvschwarz mvschwarz released this 13 Nov 16:51

[0.7.14]

OpenRig 0.7.14 is a patch for steadier circulation on a busy team. A burst of node
reads now takes turns. In the change's own tests, a health check or a queue read
then waited for one step of it instead of the whole burst; a comparison under
load didn't attribute that gain to this change. Bounded queue listings over a
long retained history use indexes instead of scanning it. An assistant connected to
your team can reach a seat by the name its team shows, connected assistants
appear in rig ps and the TUI, and setup guidance tells the agent to fit a
first team to your logins. There are fixes across delivery, seats and the TUI,
many contributed by people using OpenRig. See Known limits for what this
release doesn't fix.

Before you upgrade

  • Stop the daemon, back up the database, install 0.7.14, then start the
    daemon.
    Your agents keep running through a daemon restart; don't use
    rig down, which ends them.

    rig daemon stop
    cp "$(rig config get db.path)" "$(rig config get db.path).before-0.7.14"
    npm install -g @openrig/[email protected]   # or your existing installation method
    rig daemon start
  • Three migrations run before the daemon listens. Migration 163 adds the
    network_installations table and four columns to network_bindings.
    Migrations 164 and 166 build indexes. The author's measurement of 166 took
    3.47 s on 28,976 rows, not a real installation's size, so a large database can
    take longer. The write overhead, and going back to 0.7.13 after these three
    migrations, aren't established; keep the backup. (#3007, #3008, #3090)

  • If the start is reported pending: the CLI waits 20 s, then may print
    "Daemon startup is pending after the readiness deadline". Readiness remains
    unconfirmed. It leaves the child running and the startup reservation
    retained, without recording the daemon. Inspect the address and log it
    prints. The child may later answer, and status can then report it running,
    but that does not finish this start's recording or release its reservation.
    Don't start it again until the steps below are done. The message's restart
    steps stop that child and clear the reservation: stop the named child PID and
    wait for it to exit, inspect daemon-start.lock, and only when both recorded
    launcher and child PIDs are absent, archive the lock and run
    rig daemon start. On a large database the new start can be reported pending
    again; reaching a recorded start this way hasn't been tested.
    rig daemon stop cannot stop that unpublished child.

  • The openrig plugin carries the CLI's version, 0.7.14; openrig-core stays
    0.1.29.

Under load

  • Node reads (rig ps --nodes, the TUI, several agents at once) take turns,
    one step at a time. In the change's own tests, health checks and queue reads
    were no longer held behind a whole burst. A comparison under load didn't
    attribute a gain to this change: health checks and queue reads were faster
    for the release as a whole, rig ps --nodes showed no change, and sends were
    inconclusive. (#3101)
  • Bounded queue listings over retained history use indexes for their ordering
    and for live and archived owner notifications. (#3090)
  • Codex seats re-checked in one readiness poll share process listings where
    each seat's observation order and the 2 s freshness allow; each keeps its own
    later observation and its own fallback. (#3061)
  • New tmux servers raise their soft open-file limit to 8,192 or the hard limit
    where they can, keeping an already higher limit. This makes descriptor
    exhaustion less likely as panes and viewers add up; servers already running
    keep their limits. (#3070)
  • A delegation parent gets one standing notice per child seat for unclaimed
    rows, not one per row, and held work gets its notice back when its typing
    hold clears. (#3049, #3082)

Your team and the people it works for

  • An assistant connected over MCP reaches a seat by its plain name, stored
    under the seat's actual session; an unknown name, or one several seats match,
    says so. (#3088)
  • Connected assistants appear, with their check-in, in rig ps, rig_team and
    the TUI's tables, and their person sees plain tool titles. (#3057, #3058, #3092)
  • rig doctor and setup say a login is needed when a seat you start runs on
    that harness. The operator is taught to check each seat's runtime against
    your logins before launch, name any missing sign-in and let you choose.
    (#3077)
  • When the readable person registry holds nobody, rig daemon start and
    rig gateway participants tell the setup agent to offer registration. The
    kernel operator is taught to include that offer in its greeting and register
    only on your yes. (#3041, #3071)
  • A team your agent hands work to knows how to ask you a question, and your
    answer wakes it. A click on an ask with several questions records that
    choice; the ask stays open until the last one. (#3059, #3045)
  • A pairing request's description of itself is quoted wherever it's shown. (#3067)
  • rig queue list takes exact --tag, --mission and --slice filters, and
    several tags must all match. (#3066)
  • A skill-only edition of the openrig plugin, for Claude's plugin directory,
    follows handed-on work and keeps its reply route. (#3056, #3075)

Fixes

  • An ordinary send is refused as needing input while an open Claude Code or
    Codex /model picker is positively identified; nothing is typed. Close the
    picker before trying to deliver the message. This is shown by the change's
    own tests; it hasn't yet been checked with the real Claude Code and Codex
    programs on this release. (#3083)
  • On a resume of a Codex seat's own conversation in a rig with pods, including
    rig up --existing, OpenRig avoids adding missing guidance blocks to the
    repository's tracked AGENTS.md when Codex is 0.164.0 or later, no guidance
    file or developer instructions are configured, and the configuration and
    block sources can be read. (#3039)
  • With recovery.auto_drive_provider_prompts on, Claude Code's gated-grants
    trust check is never answered for you, and the plain trust prompt is answered
    "Yes". (#3073)
  • rig terminal open --provider herdr reuses a live Herdr workspace, and Rex
    tiles show the seat's agent and its activity. (#3068, #2992)
  • rig broadcast prints a held recipient as retained, not sent. (#3054)
  • Account erasure also removes OpenRig's own wakes and notices for that
    account's seats. (#3089)
  • A snapshot without sessions returns its invalid_snapshot_data blocker
    instead of throwing a TypeError; the restore still stops there. A retried
    no-launch import recovers the original rig by its operation ID. (#3069, #3042)
  • A rebuilt briefing limits optional superseded recap paths to the newest
    three by default when one folder covers that history; the current recap and
    all artifact records remain. Other layouts keep the full list, and
    output.rebuild_recaps set to 0 lists all paths. (#3055)
  • rig compact --state names the input check that stopped a managed
    compaction, and the TUI's graph shows a seat the daemon reads as unknown as
    unknown. (#3053, #3046)
  • Setting a context-pressure threshold explains when an environment override
    inverts the pair, and rig workflow validate warns that harness pins aren't
    checked against seats. (#2567, #3102)
  • The config browser's entries say each setting's type, choices, range, format
    and write route. (#3050)

Experimental

  • rig network is experimental, unsupported and at your own risk. Its connector
    isn't inert: the daemon starts it, sweeps leftover credential folders and
    schedules local rounds even with no binding. (#3007, #3084)
  • A grant service can hold back only new work under its fair-use limit, and an
    app can read what needs a person, and the answers to it, by link. (#3048, #3008)

Behaviour that changed

  • Node reads: a nodes response is ...
Read more

OpenRig 0.7.13

Choose a tag to compare

@mvschwarz mvschwarz released this 12 Nov 19:45

[0.7.13]

OpenRig 0.7.13 is a patch for people running their own agent teams. When you answer a runner's permission request, you now get a
note back saying who decides it, and the runner wakes on the decision. The
agent that reads your answers is told what an answer typed at your machine
means and how to ask you back. rig daemon start tells the agent setting
OpenRig up to offer to register you when nobody is registered yet, and a Claude
seat whose usage-limit message states a reset time waits for it instead of being
retried. There are fixes across delivery,
handover and recovery, the TUI and speed, many contributed by people using
OpenRig. In our tests, a first Claude user (with Codex absent) and a first Codex
user each went from a fresh install to a built, independently reviewed and
committed change. Two repairs aren't in this release: see Known limits.

Before you upgrade

  • Back up the database, install 0.7.13, then restart the daemon: rig daemon stop,
    copy the database file (rig config get db.path prints its path), install
    OpenRig 0.7.13 using your existing installation method, then rig daemon start. Your agents keep running through a daemon restart; don't
    use rig down, which ends them. Three migrations run on the daemon's first start: 160 and 161 (for the experimental hub connector below)
    and 162 (indexes for session reads). Going back to 0.7.12 after them isn't
    established. (#2993, #2997)
  • openrig-core is 0.1.29, and the openrig plugin now carries the CLI's
    version, 0.7.13.
    A Codex seat can ask for hook approval after the upgrade; see Codex hook review after an upgrade below. (#3034, #3064)

Answering your team

  • A runner's permission answer gets a note back to you: who decides it and in
    what state, or that it's kept and the tool hasn't run. A runner waiting on
    the decision gets it within about half a second. Read that note before answering again. If
    it says your answer couldn't be passed on, follow its retry instruction or use
    the rig seat decide-permission command it names.
    (#3001)
  • The answer a receiving agent reads now says what an answer typed at this
    machine's terminal or TUI means, to act on a clear answer with the request's
    own decision command, and how to ask you back with a new ask when it isn't
    clear. When the default receiving agent asks you back, the question reaches
    your Feed, and your reply decides. Closing a runner's request without
    deciding permits nothing. (#3030)
  • rig daemon start ends by telling the agent setting OpenRig up to offer to
    register you as the team's person, when the person registry can be read and
    holds nobody. The rigs skill's start step makes the same offer, and asking to
    be reachable registers you as the default person directly. In our
    fresh-install tests the setup agent passed the offer on in 5 of 6 installs,
    and a no registered nothing. Nobody is registered without your yes, and the
    exit code is unchanged.
    (#3028)
  • In the change's own tests, before a first team launches, the kernel operator
    says which commands it will ask permission for and reuses a choice you've
    already made. Otherwise it makes one offer: allow just the command families
    your goal repeats, for this project only, applied on your yes. On a no, the
    team's default stays and the offer isn't repeated. It hasn't been shown to
    make a first team ask you fewer times. (#3029)
  • A connected assistant (a hosted member; experimental and off by default) shows
    whether it's checking in, against a cadence its roster entry states
    (check_in_minutes, or check_in_on_request: true): checking in, overdue, no
    check-in yet, on request, or unknown. rig roster show and find print it as
    a Check-in line. It's a status only: work for a member that isn't checking in
    still queues and rings as before. (#3023)

Seats, handover and recovery

  • A Claude seat stopped by a usage limit whose message states a reset time (for
    example "resets Nov 10, 4pm") parks its pending work until then, instead of
    being retried every few minutes. (#2917)
  • A handover whose successor was launched but not ready says it may be running,
    instead of "retry": look at the pane first. A handover also cleans up the
    retiring occupant's own claims and jobs. (#3003, #3024)
  • After rig unclaim, the guidance for an adopted session says to end its
    process and its tmux session, and rig seat stop's help matches. A fresh
    launch after rig unclaim ended the server's last session reopens the server.
    (#2996, #3006, #3014, #3009)
  • A handover whose successor was launched into the seat's own tmux session
    can reclaim a claim left by a removed owner, or by an archived owner whose
    latest session for that node is superseded, detached or exited; a live owner
    still refuses.
    When a seat
    with no declared route can't be woken, the finding goes to the item's creator,
    skipping a creator that is a terminal seat. (#2869, #2987, #2995)

Fixes

  • Delivery: Claude's auto-update failure footers, including one clipped form,
    no longer hold a send to an idle Claude seat; an unrecognised wake result reads unknown, not
    delivered; an ordinary one-time park wake is kept and retried
    while its park is current and the failed attempt typed nothing into the seat
    (an attempt whose effect is unknown needs checking, and repeating waits and
    usage-limit expiry keep their own lifecycle); a custody-verified: note whose target is followed by a
    period, comma or other closing punctuation now verifies it; the Pi runner pane keeps the operator's
    draft out of the stream. (#2948, #3016, #3011, #3038, #3004, #2842)
  • Codex and Claude: completed Codex 0.167 turns read idle, and unsupported
    versions stay unknown; a usage-limit banner with a curly apostrophe is
    detected; refocus bounds Codex context and records what it left out; an
    unreadable Claude status-line cache gets its own reason. (#2954, #2879, #2951, #2880)
  • TUI and CLI: instance rows are grouped by rig; for a quiet seat the
    daemon explicitly reads as unknown, the list, explorer and agent-detail status
    rows show unknown, not idle (screen motion still shows active, a daemon that
    serves no activity keeps the screen fallback, and the topology graph is
    unchanged); Feed times use the configured time zone; the
    CLI doesn't call a daemon stopped when the shell can't see its process (a
    sandbox), and says not to start another; ssh options are separated from the
    target, and the generated attach command quotes the session name. (#2857, #3012, #3022, #2913, #2973, #2971)
  • Scope and workflows: qualified slice reads and proof discovery are scoped
    by mission; workflow spec reads are recorded across restarts; the spec library skips
    synthetic alias entries. (#2960, #2986, #2999)
  • Guidance and plugins: guidance cleanup in a repository's AGENTS.md or
    CLAUDE.md removes redundant recognized copies of an OpenRig-managed block,
    including after an editor rewrapped a marker, and keeps distinct edited
    copies. A saved write record lets OpenRig identify and keep your edits; on a
    fresh start, a differing block with no write record is refreshed to OpenRig's
    text and named, while an exact resume or restore keeps it; a bundled plugin's files,
    including a binary icon, are copied byte for byte; the plugins carry https
    repository URLs and a PNG icon for Claude's plugin directory, and the Codex
    manifests link the privacy policy and terms. (#3020, #3025, #3021, #3064)
  • Speed: the daemon is much more responsive while it reads a project's
    proof, which now yields between missions; current-session reads for the node inventory
    use an index; the daemon's recorder and Linux clipboard discovery no longer
    wait on the main thread.
    (#2970, [#2997](https://gi...
Read more

OpenRig 0.7.12

Choose a tag to compare

@mvschwarz mvschwarz released this 12 Nov 04:34

OpenRig 0.7.12 is a patch for people running their own agent teams, cut from
main 16e8b7fb. When you answer your team, by typing, clicking or qualifying
an answer, the answer now goes to an agent that reads it with the question and
decides. When no receiving agent is available, your answer waits. Setup's
guidance asks your agent to offer to register you as the team's person, and
registering works when you ask for it. rig down no longer stops a terminal it
can't show belongs to the seat. There are fixes across delivery, Codex,
restore, the queue, Slack and speed, many contributed by people using
OpenRig. Two repairs aren't in this release, and some checks weren't run: see
Known limits.

Before you upgrade

  • rig down is more careful. It stops only a tmux session that carries the
    seat's own OPENRIG_NODE_ID, on the server and session it read. A terminal
    OpenRig didn't create, a mismarked one or a replaced one is left running, and
    rig down exits 2 naming it and how to stop it yourself. A seat joined with
    rig attach as an external CLI is listed as not stopped, since OpenRig never
    stops it; that alone doesn't make rig down exit 2. (#2962)

  • Adopted tmux sessions: rig down can leave them running, even when
    rig seat stop suggests that route. To end only an adopted session, use
    rig unclaim <session> to release it from OpenRig, then end that process
    and its tmux session. Unclaim leaves the process running; closing only the
    viewing window does not end it.

  • openrig-core is 0.1.28. A Codex session kept running across the upgrade
    can ask for hook approval until it's relaunched.

Answering your team

  • Answers nothing else reads, such as a host pairing request or a mode's
    scheduled end, use the configured receiving agent or the kernel operator.
    Answers wait when no receiver is available, and nothing decides them
    meanwhile. To decide one yourself, use its own command: rig host approve or
    rig host deny for a pairing request, rig seat decide-permission for a
    runner's request. Closing an ask isn't permission, and words that were kept
    aren't a default permit. (#2923)
  • Pairing answers go to the receiving agent, and you can decide directly in the
    TUI's pairing settings. A pairing request says who it went to and who reads
    the answer. (#2931, #2935)
  • A runner's permission answer goes to the receiving agent, which decides while
    the runner waits, so a qualified answer such as "only if it's the test file"
    is read before anything acts. Your answer is kept and an explicit decision
    works, but the runner's confirmation updates to you aren't written in this
    release. Don't expect a confirmation in the Feed, a notice of the receiver's
    state or an immediate wake: the decision reaches the runner at its next read
    (up to about 21 seconds in testing). To decide one yourself:
    rig seat decide-permission <askId> --option <id> --reason "…". This is the
    runner's path only: a pairing request says who reads the answer, as above. (#2934, #2938, #2950, #2966)
  • Setup's guidance asks your agent to offer to register you as the team's
    person. In testing the agent didn't reliably make that offer (0 of 5 runs).
    Registering works when you ask for it: rig gateway human add. Nothing is
    registered without your yes, an existing default person is kept, and no person
    is chosen automatically. The empty-registry hint is right. A team you start
    from your own assistant fits your own logins,
    with a review before anything is committed. (#2924, #2905)

Harnesses and connections

  • A community harness can declare protocol: pi-rpc, presets can carry launch
    wrappers, and a seat can switch between Pi and another runtime. The
    community-maintained nodecode runner is listed in the reference.
    (#2870, #2759, #2669, #2859)
  • A relay connector that can't accept incoming connections can pull pending
    messages for a person instead of being pushed to: set
    OPENRIG_RELAY_MODE=pull in the relay secrets file. Push stays the default.
    A person's gateway binding can be unset. (#2844, #2812)
  • rig terminal open <view> --provider herdr-app opens a Rig view inside the
    herdr-app desktop window. (#2744, #2956, #2981)

Queue, scope and seats

  • Queue content can be erased for closed-work retention and account deletion,
    and a retried create can't bring erased work back. (#2837, #2843)
  • Each send records what's known about its delivery in one
    transport.delivery_evidence event: what was admitted, what reached the
    input, what the screen check showed, and for which occupant. (#2937, #2943)
  • rig queue create advises on an unresolved scope, slice lists show observed
    queue counts, a proof policy can require every listed judge, the execution
    ladder shows each slice's recorded status, rig queue show names a handed-off
    row's successor, and a custom blocker ID explains the wait.
    (#2901, #2902, #2867, #2872, #2874, #2983)
  • Every seat's managed guidance points to its skills, help and project context.
    rig seat status shows when guidance was written relative to the session's
    recorded moments, and what
    the seat's refocus hook recorded. A rebuilt seat's briefing lists older recaps
    as optional history. (#2918, #2920, #2916, #2876)

Fixes

  • Delivery and drafts: Claude seats with a custom status line read idle and
    verify sends; a fresh idle hook doesn't type into a current Claude dialog;
    Claude's context hint and drawn cursor are read correctly; when the input
    can't be read, a deliberate override (--dangerously-interact) pastes with a
    warning and doesn't press Enter, so it isn't submitted; update notices beside the
    paste hint are recognized. (#2807, #2813, #2947, #2942, #2933, #2800, #2786)
  • Codex: when you answer a Codex choice prompt, a message waiting on it is
    delivered instead of escalated; a working counter is compared only within one pane process; hook
    trust records are written under smol-toml 1.9, so launches no longer stop at
    "Hooks need review". (#2952, #2980, #2804)
  • Restore, start and handover: owed restore input is delivered after a
    bounded wait on unknown readiness; compaction uses the draft defaults and
    reports repeated unsent preparation; rig daemon start archives a start
    reservation left from an earlier boot; the kernel restart guidance describes
    the existing recovery; an earlier occupant can't replace a Claude seat's
    resume target; token switches keep the Claude launch; rebuild continuity and
    Codex launch choices are explained.
    (#2818, #2799, #2797, #2915, #2965, #2796, #2853, #2906)
  • Queue and recovery: a polling hosted member (an outside assistant on the
    team; experimental and off by default) gets one standing notice; a hosted
    member's ring that times out reads unknown, and durable recovery doesn't
    repeat that recorded wake (other recovery paths can still ring it again);
    unroutable items wake as soon as the seat is reachable; the stuck sweep counts
    a finding once; an escalation keeps its owner through a handoff; findings route to the
    seat's own fallback; a park on an outside condition with no wake says so;
    rig workflow validate is read-only.
    (#2864, #2957, #2790, [#2824](https://github.com/mvschwarz/open...
Read more

OpenRig 0.7.11

Choose a tag to compare

@mvschwarz mvschwarz released this 10 Nov 20:39

OpenRig 0.7.11 is a patch for people running their own agent teams. An ordinary send or work notice now goes into a person's typed draft by default instead of being refused (see Behaviour that changed). A person can work with their team from their own Claude Code or Codex through the new openrig plugin, or from an ACP app such as Zed or T3 Code, and, as an experiment that's off by default, answer the team's questions from an assistant connected through a grant service. A prepared managed compaction waits for an idle moment instead of asking again, and a restore stopped at a prompt clears itself. On Linux, a daemon run as a systemd user service no longer takes its seats down when its unit stops or restarts, and writable terminal tiles reflow text when the screen resizes, as in 0.7.10. There are fixes across the queue, workflows, launch and speed under load, many contributed or reported by people using OpenRig. The OpenShell worker's maintained cleanup now works on OpenShell 0.1.6, but a restored guest takes in its startup content again, so the worker still isn't end to end.

The runtime results below were earned on earlier builds of 0.7.11 and carried to this final package, whose changes since them are in terminal tiles and host pairing. This final package itself got archive and content checks of those changes, a code review, the release Tests, and checks of host pairing: real Slack with a real operator agent (4 of 4 answer paths, one run), the real TUI without a model, and 29 of 29 contained cases with synthetic credentials. The tile changes were checked on an earlier 0.7.11 build with the same tile code: typing and pasting into a tile on tmux 3.4, 3.3a and 3.6, a check of text reflowing in a terminal, and one run in real Herdr 0.9.5 on tmux 3.4 (one run each), which passed. What we tested on the CLI and the new @openrig/acp launcher: the private and stock content checks and the release Tests; an upgrade from 0.7.10 with Claude (continuity, relaunch, and event retention with no loss of data you'd act on); the speed and memory baseline (8 of 8 measures unchanged); the OpenShell worker on OpenShell 0.1.6 (its maintained cleanup, an exact restore, and its reports and exports passed; strict recall after a restore wasn't met, and finishing its task was assisted and time-boxed); ACP on Claude through a headless ACP client; managed compaction under Claude Code's update banner (3 of 3); Slack on a real workspace, including a button answer and a message in flight across hosts; messaging between 0.6.11 and 0.7.11 in both directions; a Claude first user from the website to a finished result with no help; and the selected regression cells (13 of 15 and 19 of 19 passed, none failed). Testing found four regressions against 0.7.10, all fixed in this package (archive file modes; Pi seats with their own account home not starting; typing into a writable tile not reaching the agent on tmux older than 3.5; and a tile someone was only viewing not fitting or reflowing to the screen), a probable fifth that it also fixes (a multi-line paste into a terminal tile could arrive split), and two accepted changes, disclosed below (a draft-aware send under the update banner, under Known issues, and a Pi upgrade stop, under Before you upgrade). Otherwise no regression or data loss was demonstrated. Not run: a Codex first user reaching a finished result (for the third release), the Codex upgrade and journey checks, a Codex account home, the ACP desktop app, an agent reading pairing answers given in the TUI, Slack directory paging, whether a switched Pi account's selection persists, and the 0.7.10 comparison for the tile fix (#2757).

Before you upgrade

npm install -g @openrig/[email protected]
rig daemon stop && rig daemon start
  • Back up your database first. Five migrations run at the daemon's first start (150 to 154). With the daemon stopped, copy the file $OPENRIG_DB names. Going back to 0.7.10 after these migrations isn't established.
  • The openrig-core plugin moves from 0.1.26 to 0.1.27. Its activity relay and refocus hooks and three skills changed. The CHANGELOG says replaced files are kept under $OPENRIG_HOME/backups/managed-refresh/<id>/ for reapplying local edits; this release's checks didn't test that route. (#2756)
  • Sends now join a person's draft (transport.draft_delivery = deliver). To keep the old refusal, run rig config set transport.draft_delivery refuse. (#2645)
  • A Pi seat that declares an absolute PI_CODING_AGENT_DIR in its env: now uses it as its account home and needs a readable auth.json there, or the launch stops. A Pi seat that already has its own Pi login also stops at launch when its spec declares an absolute PI_CODING_AGENT_DIR, even if that folder has an auth.json; the seat's login is kept, and the error names a missing account file rather than the existing login. This is shown by source and function-level tests, not a native run. (#2630)
  • Linux, with the daemon run as a systemd user service: the seats move into their own scope only when their tmux server next starts fresh. Until then, stopping or restarting the daemon's unit still takes the seats down. (#2749)

What's new and fixed

Sends and drafts.

  • Under the default deliver, an ordinary send or work notice to a seat whose prompt holds a person's typed draft pastes the message at the cursor and submits the combined input, and the result says whether submission was confirmed. Menus, permission prompts, the typing guard, managed compaction and --wait-for-idle still refuse or wait. (#2645)
  • A draft only the input box shows is caught by one read before pasting. (#2653)
  • Claude seats showing a statusLine or the background task panel read as a normal composer under the draft-aware guard. (#2703)
  • A full held-message quota no longer drops a sender's later messages, and seats stopped while they owe work don't get a burst of undeliverable notices at each daemon start. (#2701, #2620)

Compaction, restore and handover.

  • A prepared managed compaction is held as prepared and sends /compact at the next idle moment instead of asking the seat to prepare again. rig compact --state shows it and --cancel disarms it. (#2698, #2716)
  • The final /compact allows for the preparation's own fresh activity (23 seconds, against 9), so a seat that's already idle gets /compact instead of a refusal. (#2764)
  • A restore stopped at a prompt, such as Claude's resume selection, clears itself once the seat runs the conversation it was restoring. (#2711, #2674)
  • A work notice refused at a prompt no longer goes in right after "Compacted" while the compaction still owes its restore request. (#2666)
  • A Codex helper inside a Claude seat no longer becomes the seat's resume token; a Claude rebuild handover checks its priming packet; restoring activity hooks finds the agent's own source. (#2740, #2650, #2617)
  • on_restore: follow_source on a skill refreshes it from its source when a seat is restored; keep_saved stays the default. (#2626)

Your own coding agent and ACP apps.

  • The openrig plugin, shipped beside openrig-core, lets a person hand work to their local team from their own Claude Code or Codex, follow it, answer the team's questions and read the result. The plugin's README has the steps. VS Code, Copilot CLI and Cursor install it with no seat. Answers are recorded exactly as typed. (#2647, #2683, #2709, #2718, #2657, #2733, #2719)
  • rig acp serve --to <member@rig> runs OpenRig as an agent in ACP apps such as Zed and T3 Code: a prompt becomes a queue task, each task the work reaches shows as a step, the closing resolution is the reply, and the team's questions reach the app while a turn is open. (#2648, #2714, #2651, #2708, #2686, #2712)
  • The @openrig/acp launcher runs the matching @openrig/cli's rig acp serve for the ACP registry's npx launch, released at the same version. (#2655, #2715)

People and connected assistants (experimental, unsupported, off by default).

Read more

OpenRig 0.7.10

Choose a tag to compare

@mvschwarz mvschwarz released this 08 Nov 12:19

OpenRig 0.7.10 is a patch for people running their own agent teams. A step held after a managed compaction now goes in instead of waiting forever. Sends get through a pane in any tmux mode. rig exec runs a queue task on Claude Code or Codex as one finite run. Installs try a user-writable npm prefix first, and spec advisories show at launch. There are fixes across refocus, routing, status and speed, many from people using OpenRig. The OpenShell worker now does real work and exports results, but its cleanup still fails against OpenShell 0.1.6, so don't rely on cleanup or recreate yet.

Before release we tested the exact package: the private and stock content checks and the release Tests; a real upgrade from 0.7.9 on our own servers; the speed and memory baseline (no worse, slightly faster); the OpenShell worker's sign-in, useful work, verified export and finished task (its cleanup still fails, and recreate and restore weren't run); Slack on a real workspace; a Claude first user from the website to a finished result; Codex first-user setup (plain rig in every Codex seat); and 98 selected broader regression cells (57 passed, 8 had other results, 14 were incomplete and 19 weren't run), with no product regression found. A Codex first user didn't reach a finished result in our test: both attempts stopped on errors in our test setup, so that path's end result is untested.

Before you upgrade

npm install -g @openrig/[email protected]
rig daemon stop && rig daemon start
  • There are no migrations.
  • The openrig-core plugin moves from 0.1.25 to 0.1.26. It adds a permission-request hook and changes the refocus hook. Replaced files are kept under $OPENRIG_HOME/backups/managed-refresh/<id>/, so reapply any local edits from there.
  • Run rig agent validate <path>: a single-value uses.<category> now selects that resource, so a member fails to resolve if the pool doesn't hold it.
  • OpenShell users: rebuild the guest image with this release's guest.py (see daemon/assets/openshell/README.md).

What's new and fixed

Finite runs.

  • rig exec run <row> --harness claude|codex runs one turn through the maintained ACP adapter, in a connector that outlives the command.
  • Use --plan, --wait, status and cancel. One run per row, and --again starts another turn.
  • The outcome is the agent's report. Accepting the work stays with you.

(#2597, #2601, #2596)

Compaction, delivery and terminals.

  • After two idle polls that can't read the input box, the held step goes in, and while a later step is still owed, rig compact <seat> --state says the last one went in over a box it couldn't read. (#2576)
  • Delivery leaves every tmux mode, and a refusal says why. (#2594)
  • A stale record naming a reused tmux pane no longer stops a send from leaving the mode. (#2644)
  • Writable views size the pane they show. (#2614)
  • Herdr views kept from 0.7.5 through 0.7.9 keep working after upgrading (Linux Herdr 0.9.5 / protocol 22): when only OpenRig's tile script changed, a viewer stays confirmed and a follow view goes on adding and closing tiles. A kept viewer that's already running keeps its earlier sizing for as long as it runs, its own re-attaches included. With a live Herdr after upgrading from 0.7.9, a kept viewer and a follow view's join worked. Closing a tile when a seat leaves wasn't confirmed. It follows @natefaerber's approach in #2467. (#2634)

Coordination and status.

  • Routing and status:

    • a send to <seat>@<rig>@<this host's ID> stays local;
    • rig broadcast says UNCONFIRMED, not FAILED, for an uncertain recipient;
    • refusals for seats handed over before 0.7.9 say why;
    • rig roster reads conflicting activity as unknown;
    • set-runtime finds pod recaps.

    (#2600, #2572, #2574, #2593)

  • Refocus names a trace gap instead of failing (#2582, #2587).

  • The stuck sweep stops filing informational updates to people as unclaimed work (#2586).

  • rig slack status counts cross-host relays in flight (#2569).

  • rig seat status shows a Claude seat's latest permission request, with suggested rules labelled. Nothing is applied or approved. (#2562)

Install, specs and errors.

  • The rigs skill tries a user-writable npm prefix or a version manager's Node before a project-local install. (#2611)

  • Plain rig works in managed Codex seats however OpenRig was installed, with a Codex that supports allow_login_shell: tool commands now run in a non-login shell, and rig config set launch.codex_login_shell true defers to Codex's own setting. (#2613)

  • Spec advisories show as launch warnings and never stop a launch, and an unknown uses key gets one. (#2606, #2585, #2618)

  • Errors are clearer:

    • a refused terminal token says "Terminal auth failed";
    • the TUI shows the daemon's launch refusal;
    • rig doctor gives up on a silent listener after 2 seconds.

    (#2577, #2556, #2564)

Speed under load.

  • The execution view reads the review registry once per request.
  • Queue listings build one recovery index instead of a scan per listed task.
  • The event drain reads at most 500 rows at a time.
  • On a test fixture, full listings were about 63% faster with the same output. The listing and drain changes are unmeasured on a live install.

(#2578, #2588, #2610)

OpenShell.

  • The guest passes the exec's CA settings to Claude, so API calls stop failing with SELF_SIGNED_CERT_IN_CHAIN. TLS checks stay on. With OpenShell 0.1.6 the guest now authenticates, does useful work, makes a verified export and completes its task. (#2602)
  • Owned-environment deletes read Podman's inventory, and an unconfirmed cleanup stops as environment_cleanup_unconfirmed. The maintained cleanup still fails against OpenShell 0.1.6 (see Known issues). (#2603)

Docs and tests. Codex named profiles (#2604), openrig-core skill loading (#2584), what the runner contract has run (#2592, #2595), telemetry's guarantee beside the separate, untested openrig-telemetry exporter (#2589), and a real-tmux test that waits for the prompt (#2559).

Behaviour that changed

  • A held post-compaction step goes in over an unreadable box, so an unrecognised draft may receive the restore text.
  • Sends leave any tmux mode a person has open.
  • rig up can print advisory warnings.
  • Managed Codex seats run tool commands in a non-login shell, so login- or rc-only setup, shell functions and aliases may be missing, and a model request for login: true gets Codex's refusal.

Known issues

  • OpenShell: maintained cleanup (delete-owned) fails against OpenShell 0.1.6, which doesn't mount a workspace volume, so recreate and restore can't run. Never give the guest the daemon's main API port (normally 7433). After a same-generation reconciled launch, run rig environment connect yourself.
  • rig exec: it was checked with Claude Code and Codex through their ACP adapters. A cancel is acknowledged, not settled, and says nothing about further spend. Cancel with rig exec cancel, not rig acp cancel.
  • A post-compaction step can still hold: when the box reads as typed, under draft-aware delivery or the typing guard, or after a lost /compact. Run rig compact <seat> --cancel, then send a restore request naming the newest restore map, marker and packet. (#2575)
  • Draft-aware delivery to Claude still misses the bare ✔ Update installed · Restart to update banner, and a message held that way isn't replayed. Managed compaction can also stop before sending /compact (target_activity_unknown) on a Claude seat showing that banner; in our test, a freshly launched seat once let it through, which isn't a tested fix. (#2605)
  • Claude rebuild: on Linux, a launcher script that execs the native installer's symlink can still lead to a readiness timeout even though Claude is visible. The launch check also does not recognize --no-chrome. This pre-existing issue is not fixed in 0.7.10. (#2341)
  • Permission requests in seat status: only the latest s...
Read more

OpenRig 0.7.9

Choose a tag to compare

@mvschwarz mvschwarz released this 06 Nov 18:34

OpenRig 0.7.9

OpenRig 0.7.9 follows through on 0.7.8. A person's typed words on a runner seat's permission ask now reach the agent,
each permit OpenRig grants a runner by default is recorded, and a runner can keep a long, quiet turn reading working.
New stream observations go to the queue worker by default. Fresh Pi seats, and fresh Codex seats on Codex 0.164.0 or
later, can keep OpenRig's guidance out of your repository's AGENTS.md. There are fixes across delivery, asks,
handover, install and recovery, many reported or contributed by people using OpenRig.
The OpenShell worker that wasn't usable in 0.7.8 still isn't usable in 0.7.9; read
The OpenShell worker before relying on it.

Before you upgrade

  • Restart the daemon after installing:
    npm install -g @openrig/[email protected]
    rig daemon stop && rig daemon start
    Four migrations (146 to 149) run on the first start.
  • Stream intake is on by default. Each rig stream emit now opens an intake row for the kernel queue worker
    (queue.worker), or adds a note to the one still unclaimed. The row wakes the queue worker like any queue row, and
    earlier stream history isn't replayed. To keep 0.7.8's behaviour, with no intake rows, run this after
    installing: rig config set stream.intake off. (#2321, by @Totopo27)
  • The bundled openrig-core plugin advances from 0.1.24 to 0.1.25: its seat-continuity-and-handover skill
    changed. Managed refresh preserves replaced files under
    $OPENRIG_HOME/backups/managed-refresh/<id>/; reapply local edits you still need from that copy. (#2420, #2554)
  • If you run an OpenShell environment, rebuild its guest image with this release's helper
    (daemon/assets/openshell/README.md). An older helper rejects the new startup step, and the error names the
    rebuild. (#2418)

Runner seats

  • A person's typed words reach the agent, and the ask says what they do. A reply of just yes or no counts as the
    agent's allow or reject. "Any other words choose nothing": OpenRig's default permits the request when the agent
    offered an allow option, and the words come back whole in the read result as said. Section 7 of
    docs/reference/harness-runner-contract.md lets a runner queue them for the agent "as an ordinary prompt" after the
    current turn: "They're never the answer." (#2363, #2561)
  • Each permit OpenRig grants by default is recorded, once, as a stream item from the seat: when no one can be
    asked, and when an ask is closed without a choice (a row passed to an agent seat included). The record names the
    tool call, why no person answered, the option the agent got with its kind, and the request or ask. Read them with
    rig stream list --tag runner-permission-permit. A record has no destination, and one that can't be written doesn't
    change the permit. Stream intake reads past it, so it opens no intake row and wakes no one.
    (#2361, #2563)
  • A working beat keeps a long, quiet turn reading working (section 4); a runner that sends none behaves as before.
    The Pi runner and the dsh example post it, and the conformance check covers it and no longer falsely fails a correct
    runner on a busy machine. (#2370, #2336, #2368, #2375, #2530)

The OpenShell worker

The OpenShell worker still doesn't work in 0.7.9. Don't rely on this path.

0.7.9 repairs the layer that stopped it in 0.7.8: in our release testing the guest's agent now starts and reaches its
first input. Startup reaches the guest through a hash-checked first-input file, and nothing is typed through the host
viewer; the case where the viewer exits wasn't run in our release testing. Readiness checks the guest's own execution,
and a failed owned delete reports the stage that failed.
(#2418, #2404)

Our release testing on 0.7.9 then found two more problems:

  • The worker can't reach its model. The guest's Claude starts, but every API call fails with
    SELF_SIGNED_CERT_IN_CHAIN. The guest launcher builds a clean environment and leaves out the CA settings the
    OpenShell exec supplies (NODE_EXTRA_CA_CERTS, SSL_CERT_FILE, REQUESTS_CA_BUNDLE and CURL_CA_BUNDLE).
  • Deleting an owned environment doesn't run. Its inventory step misreads a "Not Found" reply, so the delete is
    never sent and the owned resources stay. In our test they were removed with the vendor's own cleanup.

Attached resources were kept, as intended, and the worker stopped cleanly. With the four CA settings passed through by
hand, a worker did useful work; a verified export, an exact restore and a finished task weren't shown. Fixes for both
problems are on main (#2602,
#2603). They aren't in 0.7.9 and haven't been run end to end.

Assistants connected through a grant service (experimental)

Experimental and unsupported. Off by default. Use at your own risk. This path needs a grant service that you
supply and run; ordinary use of OpenRig doesn't need one. With rig mcp serve --http --grant-service <url>, a
connected assistant can now claim, update and park the rows addressed to its own seat, and see its team with
rig_team, within the scope its existing tools have. Serving MCP over HTTP behind your own tunnel "is like opening a
port in your firewall." See docs/reference/hosted-members.md. (#2384)

For client authors

New daemon reads, two of them by @dajiaohuang: people and the default person, a person's open updates without Slack,
a rig's messages in one request, and Slack channels and people without the client holding the bot token. An opt-in
decisionRevision lets a client settle exactly the decision its person reviewed.
docs/reference/daemon-http-clients.md covers them. The people, updates and messages reads pass their route tests, but
no real client used them in our release testing. (#2495, #2497, #2496, #2501, #2448, #2490)

Seats, delivery and the TUI

  • Delivery: fewer deliveries held or misdirected on Claude seats (prompt suggestions, wrapped lines, a wake's own
    paste, the Theme picker, quoted permission questions); held messages are announced when a seat starts or changes
    occupant; undelivered reminders retry; a stalled tmux client is ended after 30 seconds.
  • Status and receipts: idle Claude and busy Codex seats read correctly in more layouts; stale window samples
    expire, so a seat whose pane can't be read reads unknown rather than its last verdict; uncertain sends read
    unconfirmed or indeterminate instead of delivered, lost or failed.
  • Guidance and handover: an edited culture or startup file reaches the next start, while your own edit to a managed
    block is kept; shared CLAUDE.md and AGENTS.md files stop growing; handover successors get their guidance and a
    list of their startup files; several Claude rebuild and resume failures are repaired.
  • Asks: in a shared workspace, any registered person can settle another's ask and the first answer wins; a person
    may have no connector binding; Slack records a click on a re-parked ask and marks asks handled.
  • Install and hosts: the upgrade skill backs up without the sqlite3 CLI when Node has node:sqlite; preflight
    warns when a Codex seat's login shell can't find rig; rig host ls reads your ssh config with ssh -G, which
    runs any Match exec command in it; rig doctor no longer hangs on a port held by a listener that never replies;
    a scoped launch on tmux 3.4 keeps its default command.
  • Options and views: specs.builtins_visible: false hides built-in specs; plugin_channels passes a Claude
    member's plugin channels to --channels (by @Aschenbath, carrying on @todie's fork work), warns beside
    claude_mcp: none, and hasn't been run with a real channel plugin; rig context add <url> installs into a new
    nested name; TUI and web UI display fixes.

Every user-facing change, with its pull request, is in the CHANGELOG.

Behaviour that changed

  • Stream intake is on by default (see Before you upgrade).
  • Fresh Pi seats, and fresh Codex seats on 0.164.0 or later, get OpenRig's guidance outside the repository
    AGENTS.md:
    Pi in its own agent folder (unless that file or folder is a link), Codex as launch developer
    instructions. Codex still uses the repository file for a resume, fork, restore or handover successor, an older or
    unknown version, or a config layer that sets developer_instructions or can't be read. If only your shell startup
    sets CODEX_HOME, OpenRig reads ~/.codex, so a developer_instructions in your home is replaced for that
    session; declare the same absolute path as CODEX_HOME in the member's or rig's env: to have it checked.
    (#2432, [#2441](htt...
Read more

OpenRig 0.7.8

Choose a tag to compare

@mvschwarz mvschwarz released this 05 Nov 02:23

OpenRig 0.7.8

OpenRig 0.7.8 lets a person answer a runner seat's permission requests, with a
conformance check and an example runner to build against. It includes 0.7.7's
fixes plus repairs across seats, tmux, Slack and the TUI. It also includes a
reference for running a Claude worker in an NVIDIA OpenShell sandbox, but that
worker isn't usable in this release: see the OpenShell reference.

Before you upgrade

  • Restart the daemon after installing:
    npm install -g @openrig/[email protected]
    rig daemon stop && rig daemon start
    Four migrations (142 to 145) store a Claude seat's MCP opt-out, seat activity
    grants, OpenShell environment bindings and the person chosen to answer a
    seat's permission requests.
    (#2177, #2295, #2296, #2301)
  • The bundled openrig-core plugin advances from 0.1.23 to 0.1.24. One line
    of its seat-continuity skill changed. Managed refresh preserves replaced files
    under $OPENRIG_HOME/backups/managed-refresh/<id>/; reapply local edits you
    still need from that copy. (#2287)
  • The install is larger: in the 5 November clean-install check, 0.7.8
    resolves to 118 npm packages (including OpenRig itself), against 0.7.6's 32.
    The MCP SDK is now a runtime dependency.
    (#2374)

Permissions for runner seats

  • A runner seat's permission requests now reach a person, and the default is
    permit.
    The runner contract's first version refused every request. Section 7
    of docs/reference/harness-runner-contract.md now covers who is asked:

    • With a default person, "They get an ordinary ask in the Feed and on
      Slack. No setup is needed."
    • To choose someone else, run
      rig seat set-permissions-to <seat> --to <person> --reason "…". --clear
      returns to the default.
    • When no one can be asked, the request is "Permitted at once, with the
      agent's own allow option."
    • Refusal is opt-in, with --deny.

    "A person's no is never a grant." An unanswered request "stays pending and
    visible" until the agent's turn ends: "It's never timed out into a grant."
    (#2301)

  • A runner conformance check:
    node docs/reference/runner-conformance/check-runner.mjs --runner '<runner command with {agent}>' --name <harness>.
    It covers the answered path, and needs Node and tmux but no daemon, model,
    credentials or network.
    (#2303, #2306)

  • An example runner for DeepSeek Harness (dsh), with its preset, is under
    docs/reference/community-harness-examples/dsh/. OpenRig doesn't install it.
    (#2305)

  • A seat activity grant lets a runner outside the host's hook setup report
    activity for one seat and launch, without the install-wide hook token. (#2295)

The OpenShell reference isn't usable in 0.7.8

0.7.8 includes rig environment (setup, create, attach) and a reference
for binding a seat to an NVIDIA OpenShell sandbox (daemon/assets/openshell/README.md).
In our release testing the worker never became usable: after the sandbox was
created and the native process started, rig environment connect failed when its
check timed out after 5 seconds, so no team work ran. Don't rely on this path in
0.7.8. The packaged CHANGELOG and What's new describe it as working; this
release body replaces them on that point.
(#2296, #2300, #2378)

Seats, delivery and the TUI

  • Seats:
    • an isolated tmux server per OpenRig home
      (rig config set terminal.tmux_server isolated);
    • claude_mcp: none for a Claude member;
    • resuming with a new token file;
    • first starts on rig launch --seats;
    • an accurate account record and kept effort after rig provider switch;
    • skill copies, activity hooks and startup declarations kept across
      rig down, resumes and exports;
    • clearer stops for handover's fork:<seat>, a missing conversation,
      claude not found, Codex restart refusals and failed unpins.
      (#1260, #2177, #2269, #2342, #2344, #2337, #2338, #2190, #2297, #2287, #2255, #2282, #2330, #2332)
  • tmux:
    • with OPENRIG_TMUX_CONTROL=1, no crash on tmux 3.3a to 3.7c when the
      control client ends while another leaves;
    • a submit key that a read-only client blocks is pasted instead.
      (#2317, #2325, #2345)
  • Wakes:
    • OPENRIG_WAKE_SUSPEND matches destinations with a colon;
    • prompt escalations stay deliverable without a reachable person;
    • reminders stop at a full quota;
    • human@kernel raises no false finding;
    • OpenRig's own Codex hooks are trusted when no choice is recorded;
    • refusals name their fix.
      (#2353, #2343, #2281, #2286, #2294, #2290, #2284, #2280, #2273, #2202)
  • Slack and usage:
    • typed replies to parked decisions are recorded as answers;
    • row bodies render Markdown;
    • resolved decisions stop showing as live asks;
    • OpenRouter charge retries aren't delayed.
      (#2293, #2299, #2316, #2349, #2314)
  • Hosts and setup:
    • rig host edit and rig host remove;
    • a warning when another OS user's daemon holds the port;
    • rig daemon status shows a pending start.
      (#2310, #2346, #2302, #2348)
  • The TUI and views:
    • agent pages show health and recent work;
    • pod, spec and instance-table views read correctly;
    • rig terminal open mission:<id> --follow --provider herdr follows a
      mission.
      (#2263, #2264, #2265, #2266, #2327, #2260, #2289)
  • Also:
    • MCP text is cut between whole characters;
    • an ACP cancel survives a failed note;
    • long transcript lines read faster;
    • there are Pi and kernel dashboard recovery guides.
      (#2268, #2262, #2274, #2186, #2275)

Behaviour that changed

  • A runner following section 7 gets answers or permits, not refusals.
    --deny keeps a seat refusing.
  • On tmux older than 3.7c, OPENRIG_TMUX_CONTROL=1 uses spawned clients
    instead of a control client.

Known limits

Runner seats

  • What we ran end to end: Our Linux release tests exercised dsh-seat 0.3.0 with dsh 0.2.1-rc.2: useful work, a person's allow and deny through the answered path, and cancel. The same dsh-seat session resumed after a managed down/up. The shipped #2305 preset declares no resume; a fresh launch is a new conversation. We did not test another harness end to end under this contract for this release.
  • The dsh example's OPENRIG_DSH and OPENRIG_DSH_HOME aren't accepted in a
    rig spec's env:.
    A preset command wrapper that exports them was the route we
    observed. (Fixed on main, #2414; not in 0.7.8.)
  • Cancel a dsh turn by typing a bare /abort in the pane. A /abort sent
    with rig send is an ordinary prompt.
  • An in-place keep-conversation restart is Codex-only.
  • The answer owner is a registered person. "A colleague's answer is
    followed on this host. If the ask is handed to another host, the request
    waits, shown as needs input, until the agent's turn ends."
  • **allow_always fro...
Read more

OpenRig 0.7.7

Choose a tag to compare

@mvschwarz mvschwarz released this 02 Nov 05:51

OpenRig 0.7.7

OpenRig 0.7.7 is 0.7.6 with three reliability fixes for managed Claude seats: an
idle prompt under Claude's "Update installed" line is recognized again, managed
compaction no longer types into a message you haven't sent, and a Claude seat
launched through a wrapper script can be rebuilt again.

Before you upgrade

  • Restart the daemon after installing so the fixes take effect:
    npm install -g @openrig/[email protected]
    rig daemon stop && rig daemon start
    There are no database migrations. The bundled openrig-core plugin stays at
    0.1.23 with unchanged files.

Fixed

  • A Claude seat under the "Update installed" line reads idle again. After
    Claude installs an update, it prints "✔ Update installed · /restart to apply"
    (or "Restart to apply") below its mode bar. OpenRig didn't recognize that line,
    so a seat at an empty prompt read unknown instead of idle, and managed
    compaction waited. Both spellings are now recognized; lines that only look
    similar still read unknown. (#2311)
  • Managed compaction no longer types into a draft. With the optional typing
    guard off (the default), compaction's preparation prompt could be pasted onto
    a message someone had typed but not sent. Now the preparation prompt,
    /compact and the restore prompts check the input box first: typed or
    unreadable input holds the step with a reason. A held restore prompt goes ahead
    on its own once the box is empty; a manual rig compact says why it stopped,
    to be retried once the box is empty. An empty box or Claude's own suggestion
    goes ahead.
    (#2347)
  • A Claude seat launched through a wrapper script can be rebuilt again. On
    0.7.6, rig seat handover --source rebuild on a seat whose claude is a #!
    script that starts the real Claude without exec stopped after 30 seconds with
    "Waiting to confirm the new Claude process in this pane", though the new Claude
    was running. The readiness check now also accepts the script's own direct child
    when it names this launch's conversation; every other check is unchanged.
    (#2341, #2354)
  • A failed handover no longer moves the seat's resume target to the new,
    unprimed conversation while the seat keeps its previous occupant.
    (#2354)

Known limits

  • The symlink-launch case reported in #2341 is not covered by the wrapper fix.
    When the running Claude's command names a symlink but OpenRig recorded the
    resolved binary, source inspection shows that readiness still rejects that
    combination. The exact reported launch sequence has not been reproduced, and
    why it retains the symlink path is still under investigation. This is not a
    failure of every native-installer launch.
  • Other reasons managed compaction can wait are unchanged.
  • The draft check reads the input box just before pasting. Typing that starts
    in the same moment can still be appended to.
  • A Claude seat whose current occupant generation was never registered, such as
    an adopted Claude carrying another generation, or a managed launch whose tenure
    record failed to write, keeps its first conversation token, but later hooks don't
    move it.
  • The 0.7.6 known limits still apply.

Thanks

OpenRig 0.7.6

Choose a tag to compare

@mvschwarz mvschwarz released this 30 Oct 07:30

OpenRig 0.7.6: follow a slice's work in one terminal workspace, plus steadier daemon start and delivery

OpenRig 0.7.6 lets one terminal workspace follow the agents actually working a slice. As work is handed off and completed, their tiles come and go, while drafts, focus and the agents themselves are kept. It also keeps more seat settings through expansion and restore, reports a dead pane as exited instead of idle, stops a slow-starting daemon from being killed by its own readiness deadline, and repairs several queue and Slack delivery paths.

Before you upgrade

npm install -g @openrig/[email protected]
rig daemon stop && rig daemon start
  • Two database updates record a seat's selected account home and whether a community-harness launch declared a runner.
  • The bundled openrig-core plugin goes to 0.1.23: its Claude activity hook now clears permission marks after a tool batch. Replaced files are preserved under $OPENRIG_HOME/backups/managed-refresh/<id>/; reapply any local edits you still need.
  • On a large database, rig daemon start may now report that startup is still pending instead of failing. Follow the guidance it prints before trying any recovery.

Follow a slice's work

  • rig terminal open slice:<name-or-id> --follow --provider herdr shows the current owners of the slice's open work: pending, in-progress and blocked queue rows tagged with that slice. Each owner appears once, with all its obligations listed. Tag a row with rig queue create --slice <name-or-id>; handoffs keep the tag. (#2259)
  • New slice views start with four automatic tiles; --max-tiles changes that. A known empty slice keeps following and fills again. An incomplete read keeps the previous viewers, and missing or ambiguous slices are named, never shown as an empty team. Pins, drafts, unknown input and focus still protect a departed viewer, and closing a viewer never stops its agent.
  • When a slice's folder name repeats across missions, tag its work with the slice's unique ID (or add --mission). A row tagged only with the shared name can't be placed, so the view reads incomplete until it is. (#2261)
  • An owner whose join was refused before any pane split now joins on a later refresh, and a viewer that hasn't attached yet can carry on. (#2271)
  • Named Herdr sessions use their configured endpoint throughout, and the TUI's terminal action opens the agent, pod or rig in view. (#2205, #2232)
  • Slice following targets Linux Herdr 0.9.5 / protocol 22. Following a whole mission isn't in this release.

Seats, accounts and harnesses

  • rig expand keeps the member settings rig up accepts, including env, effort and startup settings, and a restore keeps a model set with rig seat set-model. (#2250, #2227, #2228)
  • Move a running seat to another account home with rig provider switch --seat <seat> --to-account <name> --account-home <dir> (preview with --dry-run). It starts a fresh conversation with a handover, and the seat keeps its address and work. (#2143)
  • A Claude seat can switch between subscription and API key on the same conversation (--to-account api --api-key-file <file>, back with --to-account plan --token-file <file>). In-flight work is interrupted. The API-key path is not qualified yet, so check the resulting account and conversation. A new Claude member can name its own token file in its spec with claude_token. (#2191, #2246)
  • Managed seats inherit the daemon's SSH agent for git over SSH. (#2222)
  • Community-harness presets can opt into runner: true (with launch_result: true) so the seat's activity follows its runner, and passes_model: true to receive the declared model as OPENRIG_MODEL. That says which model was passed, not which one runs. New draft author contracts describe harness, runner and platform duties, marking what's implemented and what's proposed. (#2239, #2243, #2272)

Delivery, Slack and status

  • A queue wake refused at a selection prompt is retried once the prompt clears. Work sent to a terminal-only seat raises a finding for a person. Cross-host rig queue create --verify reads the destination's receipt. (#2235, #2192, #2193)
  • A Slack button answer now resumes a decision parked on the person asked, which was 0.7.5's known issue. rig slack setup --reactions off stops acknowledgement emoji from waking agents. (#2245, #2241)
  • A verified exited process in a retained pane reads pane_exited, not running and idle, and its work goes to the usual recovery finding. (#2248)
  • Smaller fixes cover inventory reads, UTC snapshot ages, TUI emoji, help text and test fixtures. The changelog lists every change.

Behaviour that changed

  • Startup: when only the readiness deadline passes and the daemon is still starting, rig daemon start exits nonzero with a pending message naming the process, its endpoint and the log. The daemon is left running, and a second start stays blocked. rig daemon stop can't reach that unpublished process; the message gives the manual restart. (#2267)
  • Viewer API: POST /api/terminal/viewer/ensure returns HTTP 400 for view_required and unknown_provider, where it returned 200 with an error body. Keep reading the body's code. (#2259)

Known issues

  • Codex hooks on an older configuration (#17): if your Codex configuration came from an older OpenRig install that never trusted OpenRig's own plugin hooks, after a restart the kernel's Codex seats can stop at Codex's "Hooks need review" prompt. rig status then shows the kernel as partial_ready, and rig ps shows the seats needing attention. No message is sent. This also happens on 0.7.5.
  • An exited viewer isn't restarted: a viewer whose attach already ran and then exited back to a shell isn't restarted automatically, and the whole slice view can hold until that tile is resolved. No tested workaround is offered yet.
  • Later hold notices can show a generic reason; the original failure is in the journal. The changelog's and capability map's statement that hold notices retain the original reason holds for a seat's first notice, not for every later one.
  • A typed reply in the thread of a question parked on its own person resumes the question, but isn't recorded as the answer; the owner receives it as a message instead. Buttons work. The capability map's statement that a typed Slack reply is kept in humanAnswers doesn't hold for such a parked question.
  • Held is not delivered: with a Codex seat's typing guard on, a message OpenRig can't confirm will stay visible is held before it's pasted. That can happen in small tiles, and many wrapped messages are held even when they would have fit. Check rig seat held-messages before resending. A larger pane or a shorter message may help; turning the guard off removes draft protection and isn't a fix.
  • Codex restart refusal (#2200): it's still unresolved. If rig seat restart <seat> --keep-conversation refuses, nothing is stopped; leave the seat running and report it with your CLI and daemon versions.
  • Hosted members remain experimental, unsupported, off by default and at your own risk. Slice following doesn't need them.

Credits

Thank you to @seanmcn, @DeryFerd, @Aschenbath, @Vaishnavi220506, @bradvin, @jay23606, @rudycelekli and @Nikhi00718 for contributions in this release; to @akushonkamen, @jcmurrayii, @KM199 and @pdurlej for changes, reports and reproductions that shaped it; to @appleguy, @al-robertson-cto and @skv-io, whose reports led to fixes and documentation here; and to @bpamiri, whose runner-preset proposal on #43 shaped the runner field.