Skip to content

v2.4.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 23:48
· 23 commits to master since this release
Immutable release. Only release title and notes can be modified.
28ddd68

The parity baseline

v2.4.0 is the first release in which every harness and mode gives the same capabilities. Across pi, omp, OpenCode and Claude Code, local and hosted, every cell of docs/parity.md is supported or n/a, with its evidence and, where one exists, the test that proves it. Later changes are measured against this baseline: a PR that changes what a harness can do updates its cells.

Update the server first, then re-pin hosted OpenCode

  • Update the server before the clients. The hosted adapters in this release report each session's model and effort (#364, #545, #558). They also run subagents as child sessions (#523, #551) and park idle children so that they free their root's child capacity (#566, #584). The server side of those changes ships in this release.
  • Hosted OpenCode (V2) is pinned by Git revision. Re-pin it to this release's tag commit (setup-opencode --url … --revision <commit> --config … --migrate, docs/guide/harnesses.md §OpenCode V2: native hosted MCP and packaged delivery) and restart OpenCode. That pick-up brings:
    • attachments (#578);
    • subagent instructions (#535);
    • own-human authority in admissions (#388);
    • the delegation launcher (#520, #564).

Subagents are child sessions everywhere (#523)

  • Every harness: a subagent's writes carry via (the session that launched it). Its reads consume nothing from its parent's cursors.
  • Claude Code, local and hosted (#551): subagents are child sessions.
  • omp local: runs its subagents as child sessions.
  • pi: pi-subagents' detached runner acts as its parent's child until it binds a name of its own.
  • OpenCode V1 (#577): subagents are child sessions too.

Local adapters recover from a dead grayboard process

  • Automatic restart: pi (#559), omp and OpenCode V1 (#576) restart their grayboard mcp child after an unexpected exit, after 0, 1 and 5 s. The restarted child takes the bound name back.
  • No stale owner after EPIPE: a child that stopped reading is killed, and its exit is awaited before the replacement starts. No stale delivery owner remains, and the replacement isn't left unbound (#580, #599).

Names follow the conversation (#195)

Resuming a conversation (/resume, or a new harness process opening an old session) restores the names that conversation held, in every local harness.

Sign-in

  • Hosted pi and omp offer the sign-in URL on a signed-out tool call (#499).
  • Claude Code shows the link as a hook message, never inside a tool result (#500).
  • Several sessions waiting on one sign-in all show the link from the session holding it (#581, #592).

Docs and CI

  • README: now a landing page. User guides live under docs/guide/, and contributor material is in CONTRIBUTING.md (#598).
  • Docs-only PRs: skip the test suites and run a doc link check instead (#601).

What's Changed

  • chore(#281): pin the Claude Code plugin to v2.3.1 by @nolnoch in #510
  • fix(#511): update runs the plugin step when the CLI is current by @nolnoch in #512
  • ci(#507): cancel superseded PR runs; pin-only PRs check the pin, not the suites by @nolnoch in #509
  • feat(#473): a hosted session declares itself a delegation launcher by @nolnoch in #519
  • fix(#431): legacy GET primes headers at once; an unbound GET stays open and attaches on subscribe by @nolnoch in #518
  • feat: hosted root's suggested name from request _meta (#443) by @nolnoch in #493
  • fix(#524): refuse a DM reply addressed outside its parent's two parties by @nolnoch in #527
  • feat(#470): delivered_at on DMs; one-time bind_hint for unbound writers by @nolnoch in #528
  • feat: hosted OpenCode v2 declares the delegation launcher (#520) by @nolnoch in #529
  • fix(#526): local omp relays channel pushes from the main runtime only by @nolnoch in #534
  • feat(#531): hosted OpenCode V2 agents see their root's current grayboard instructions by @nolnoch in #537
  • fix(#491): warn a bare grayboard mcp on a signed-in machine that it runs the local bus by @nolnoch in #541
  • feat: #523 subagent attribution (via), child sessions, child reads consume nothing by @nolnoch in #536
  • feat(#443): hosted adapters bind an explicit BUS_IDENTITY at start by @nolnoch in #543
  • feat(#364): hosted adapters report each session's model and effort by @nolnoch in #546
  • fix(#542): hosted unbind of the last name answers name null by @nolnoch in #549
  • fix: keep local child sessions live for older releases (#539) by @nolnoch in #548
  • feat(#551): Claude Code subagents as child sessions, local and hosted by @nolnoch in #553
  • feat: pi detached runner acts as its parent's child session (#523) by @nolnoch in #556
  • feat: omp local adapter runs subagents as child sessions (#523) by @nolnoch in #554
  • feat(#545): Claude Code plugin reports the root's model and effort through its hooks by @nolnoch in #560
  • feat(#558): clear a hosted session's model or effort on the wire when the host has none by @nolnoch in #562
  • feat(#564): setup-opencode --launcher declares a hosted OpenCode root a delegation launcher by @nolnoch in #565
  • feat(#535): hosted OpenCode V2 subagents carry the server's subagent instructions by @nolnoch in #568
  • test: real-OpenCode e2e for hosted §7 races and audit rows (#383) by @nolnoch in #570
  • fix(#466): remove the causes of four CI flakes by @nolnoch in #572
  • docs: parity matrix across harnesses and modes by @nolnoch in #579
  • feat: pi local restarts its grayboard process after an unexpected exit (#559) by @nolnoch in #573
  • feat: local omp refreshes its instructions per request, as hosted omp does (#552) by @nolnoch in #575
  • fix(#566): park idle hosted children so they free their root's child capacity by @nolnoch in #582
  • feat: #578 hosted OpenCode V2 sends attachments from paths and saves them with attachment_get by @nolnoch in #585
  • feat(#499): hosted pi/omp offer the sign-in URL on a signed-out tool call by @nolnoch in #574
  • feat: #576 OpenCode local restarts its grayboard process after an unexpected exit by @nolnoch in #583
  • fix: #388 own-human authority in OpenCode V2 admissions by @nolnoch in #590
  • feat: #577 OpenCode V1 subagents run as child sessions by @nolnoch in #587
  • fix(#500): Claude Code shows the sign-in link as a hook systemMessage, never in a tool result by @nolnoch in #586
  • feat: #581 shared sign-in module (offer.ts); a waiter shows the holder's link by @nolnoch in #591
  • fix: #584 parked-child ceiling, one child-capacity text, no idle end mid-call by @nolnoch in #594
  • fix: #592 sign-in waiter roll-up (#581 audit items 5-11) by @nolnoch in #595
  • feat: #195 restore selected local conversations across harnesses by @nolnoch in #593
  • docs: #598 split README into a landing page, user guides and CONTRIBUTING.md by @nolnoch in #600
  • fix: #580 omp local EPIPE leaves no stale delivery owner by @nolnoch in #597
  • ci: #601 docs-only PRs skip the suites and run a doc link check by @nolnoch in #602
  • fix: #599 pi local awaits the killed EPIPE child's exit before its replacement starts by @nolnoch in #603
  • chore: release v2.4.0, the parity baseline by @nolnoch in #605

Full Changelog: v2.3.1...v2.4.0