v5.0.0-beta.14
Pre-releaseOMO 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
/btwopens a picker with three sections: Main conversation, retained sides listed oldest-first asBTW #1,BTW #2with 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 Escreturns to Main without deleting the side (closing BTW used to delete it),Ctrl+Cfrom an empty composer deletes only the visible side, andCtrl+/opens the picker from any related view, now also recognized on terminals that encode it asCtrl+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_conflictas "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/EACCESon 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-oauthlane with the real reason, instead of hanging ~90 seconds into the watchdog and re-billing the conversation on retry. monitorprompting 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/tospacexai/, and opencode delisteddeepseek-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
turnEndedis 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, andmethnow trigger it alongside the existing spellings; the guard that keepsulw-planfrom 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_forjoined 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 theupdatecommand, fixesboulderand--codex-autonomousclaims, 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 --recursivefix, 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)