Skip to content

v5.0.0-beta.14

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Aug 10:45
· 3 commits to dev since this release
af32e1c

OMO 5.0.0-beta.14 — Retained Side Sessions, OpenGateway, and a Snappier Senpi 2026.8.21-2

The center of gravity: /btw grows into a retained multi-session picker, a new credential-gated OpenGateway provider ships 60 tool-capable models, commit attribution becomes configurable, and the bundled Senpi 2026.8.21-2 engine kills two CPU-spin freezes, paints your messages instantly, and stops Cursor turns from hanging for five minutes.

💬 /btw keeps every side conversation (#7086, #7087)

Side sessions now persist until you delete them, and a picker lets you hold several at once. Contributed by @TotoKr:

  • /btw <question> creates another side instead of reusing the last one; starting BTW while viewing a side creates a sibling under the same main conversation.
  • Bare /btw opens a picker with three sections: Main conversation, retained sides listed oldest-first as BTW #1, BTW #2 with question summaries, and a New BTW action. The current destination is preselected, and the picker and long transcripts scroll with the mouse wheel.
  • Key semantics changed, retrain your fingers: Esc Esc returns to Main without deleting the side (closing BTW used to delete it), Ctrl+C from an empty composer deletes only the visible side, and Ctrl+/ opens the picker from any related view, now also recognized on terminals that encode it as Ctrl+7.
  • The 64-message / 64 KiB read-only context inheritance and the guarantee that side traffic never touches the main transcript are unchanged.

Follow-up review fixes in #7087 (also @TotoKr) guard BTW creation when no parent prompt exists, preserve promptless picker access, and revalidate the parent prompt at selection time so a stale boundary is never reused. Guide: docs/guide/btw.md.

🌐 OpenGateway provider, gated on your key (#7078)

Set OPENGATEWAY_API_KEY (or add an opengateway entry to opencode's auth.json) and 60 tool-capable models appear with correct context windows and pricing. OpenGateway's /v1/models serves bare ids with no metadata, so a new generator enriches them from the owning provider's models.dev catalog with OpenRouter as fallback, and excludes models without tool capability. The injection is credential-gated on purpose: without a key you see nothing new instead of dead models. User config wins at every level, and repo-retired GPT models were screened out of the catalog (62 to 60 entries).

✍️ Commit attribution is yours to configure (#7092)

The omo commit footer and the sisyphus-dev-ai co-author trailer can now be turned off. A new git_master section in omo.jsonc carries commit_footer (true for the builtin footer, a string to replace it, false to disable) and include_co_authored_by (default true). Both default to today's behavior, the settings flow into delegated children, and the schema, docs/reference/omo-json.md, and docs/reference/configuration.md document the whole block.

📊 Delegation telemetry, honestly scoped (#7091)

Two new anonymous native event families measure how delegation actually performs: delegation_completed and category_config. The projection is an explicit scalar allowlist, so prompts, responses, names, paths, and error text are excluded by construction, with an exact-key-set test making sure a new field can never ride along silently. User category, agent, provider, and model names mask to custom; only counts leave the machine. Data quality is reported rather than guessed: a missing cost is never a zero cost, token and duration fields carry status flags, and reconciled or crashed rows are marked so they cannot bias aggregates. The model vocabulary now covers every rung a builtin category can route to, fixing 126 provider/model pairs that previously exported as custom/custom. PostHog also derives an approximate country server-side now; the app still never authors or stores an IP, and docs/legal/privacy-policy.md discloses all of it.

🧭 ulw-plan adapts to how you answer (#7089)

The planner calibrates question delivery to your planning stance instead of interrogating everyone the same way. Three renderers over the same surviving forks: batch, one-by-one, and examples-first for users who answer better by critiquing concrete options than by facing a blank page. The opening stance is derived from planning-style episodes in projected memory, override phrases like "you decide" pass three gates and never silently authorize an irreversible or spend decision, and the profile is an append-only episode log with no scores or cached persona. Onboarding can seed a hypothesis from other harnesses' session history, always at low confidence, style-only, never content.

🖨️ Paged output becomes a first-class deliverable (#7099, #7098)

PDF reports and print pipelines get a real authoring reference and a real verification doctrine. The frontend skill gains a print-paged-media.md design reference covering the page box, break control, and the keep-together side effect that strands a callout alone on a near-empty page; visual-qa now admits paginated documents, evidenced by every page rendered to an image, with extracted text explicitly ruled out as evidence. The mass-ULW verification wave learns the same lesson: a paginated deliverable is verified by rendering and inspecting every page, sampling is a failure. ulw-research also activates on combined "mass ulw research" invocations so the delivery gates load from either path.

🕸️ DAG runs get harder to fool and harder to break

  • Revived nodes stay in the run (#7106). A node you revive mid-flight is now tracked by the scheduler itself; a run can no longer declare itself finished while your revived node is still working, and it fails loudly if it ever could.
  • Parent-side verification directive (#7080). DAG completion payloads now tell the orchestrating parent to treat the claim as false until proven: read the artifacts, run the commands, and send corrective instructions back to the exact node until its own verification passes. Non-DAG completions are byte-identical.
  • Real errors, surfaced (#7105). The eval SDK used to swallow non-start DAG errors as successes and report a definition_conflict as "no run_id". Every response now routes through a choke point that rethrows the tool's own code and message.
  • Windows lock contention (#7107). Filesystems that refuse hard links (EPERM/EACCES on NTFS ACLs, ReFS, network shares) no longer crash the losing racer; the lock falls back to an equally atomic exclusive open and the loser waits as designed.

🪟 Windows: the console flashes are gone

Nineteen spawn sites across three PRs stop popping black console windows on the desktop. @sanguneo diagnosed the root cause in #7082: the detached memory reflection supervisor runs console-less, so its children allocated fresh visible consoles on every deadline or cleanup, and pinned the whole launch chain with a source-level windowsHide audit. @grim-susemi covered 11 recurring detached and background sites in #6991 (lsp-daemon, MCP OAuth, codegraph, comment checkers, ulw-loop status). #7102 finished the sweep on the last three sites (spawnNode, memory people-ask, model preflight). No-op off Windows.

🔁 ulw-loop respects session boundaries (#6914, #7112, #7103)

Two omo sessions in the same repo no longer stomp on each other's ULW plan. @feelsodev scoped every ulw-loop write to a per-session ledger in #6914, complete with a cross-session isolation probe and Windows fixture hardening. #7112 (co-authored with Altair Li and @feelsodev) closed the read side: the status probe now resolves the host session id from the event context and passes it explicitly, failing closed when none is available instead of adopting repo-global state. And #7103 makes every steering submit in a repo with no active plan ~36ms faster by skipping the status spawn entirely when no ledger directory exists.

🧰 Bun 1.4.0 and the dependency wave (#7079, #7075)

CI, publishing, and every committed bundle now run on Bun 1.4.0, after #7075 briefly rolled back to 1.3.14 while the Windows tail was finished. Floors moved with it: OpenCode plugin ABI 1.15.13 to 1.18.19, OpenTUI 0.2.16 to 0.5.6, commander 15, js-yaml 5. Anyone pinning an older OpenCode host needs to move.


⚙️ Bundled Senpi 2026.8.21-2 — the engine wave (#7094, #7111)

The host pin moves from the previous beta's engine to 2026.8.21 and then 2026.8.21-2. What you feel:

2026.8.21

  • Your message paints instantly. Enter now renders an optimistic pending bubble at once instead of waiting for the provider round-trip; the canonical message replaces it in place, and rejected or command-handled inputs remove it.
  • The TUI stops pegging a core under provider-error storms. Contended settings-lock waiters used to busy-spin on the main thread and freeze the render loop; they now sleep through Atomics.wait, fallback-chain canonicalization is memoized per error burst, and OAuth-lane settings loads are cached by mtime and size.
  • Settings reads are lock-free. Writers publish atomically via temp file plus rename, so reads never join a lock convoy and never observe a torn write.
  • Claude policy refusals fail immediately on the claude-sdk-oauth lane with the real reason, instead of hanging ~90 seconds into the watchdog and re-billing the conversation on retry.
  • monitor prompting matches the real PTY contract, with worked recipes so the agent waits the way the tool actually behaves.
  • Provider catalogs refreshed: the vercel-ai-gateway Grok vendor slug moved xai/ to spacexai/, and opencode delisted deepseek-v4-flash-free.

2026.8.21-2

  • The auth store gets the same lock-spin fix, so multi-session OAuth-refresh contention can no longer burn a core.
  • The model picker releases before the auth round trip. Choosing a subscription-OAuth model like Cursor no longer freezes a frame of the previous model on screen while the network call resolves.
  • Cursor turns end when the server says they ended. A decoded turnEnded is definitive completion with a 5s drain, and silent streams fail in 30s (90s if heartbeat-only) instead of sitting out the 5-minute idle timeout.
  • JavaScript eval cells accept local:// paths like every other kernel.

Full engine changelogs: senpi v2026.8.21 and v2026.8.21-2.


🧹 Roundup

  • mass-ULW answers to more names (#7076): ulw mass, ulwmass, mulw, and meth now trigger it alongside the existing spellings; the guard that keeps ulw-plan from matching is intact.
  • Background completion notifications reach the right project (#7077): the live server route now carries its registered directory into the SDK client instead of defaulting to the server's.
  • The ultrawork build fails loudly on stale tokens (#7081): wait_for joined the forbidden-token list, so a directive can never again tell the model to call a tool that does not exist. #7085 briefly dropped the goal-registration mandate and #7088 restored it verbatim, netting to no change in the shipped directive.
  • Docs caught up with the code (#7093): a 22-file sweep corrects config migrate, documents the update command, fixes boulder and --codex-autonomous claims, and describes the telemetry identifier and cleanup scope accurately.
  • Provenance gate diagnoses partial clones (#7101): an uninitialized submodule now reports itself, with the exact git submodule update --init --recursive fix, instead of raising a false license-pin alarm.

Thank you to the community contributors in this release:

  • @TotoKr: the multi-session BTW picker (#7086) and its review follow-ups (#7087)
  • @feelsodev: ulw-loop session isolation (#6914) and co-authorship on the status-probe fix (#7112)
  • @sanguneo: the win32 memory reflection worker console fix with its windowsHide audit (#7082)
  • @grim-susemi: windowsHide across 11 detached and background spawn sites (#6991)
  • Altair Li: co-author on the ulw-loop status-probe session scoping (#7112)