OMO v5.0.0-beta.36 + senpi v2026.9.3-2
This is the first omo release that carries senpi's fix for the Windows shared RPC host dying about a minute after every start (code-yeongyu/senpi#1307, fixed in senpi 2026.9.3 and shipped in omo for the first time here). It also carries the RPC interactive-login fix (code-yeongyu/senpi#1316), so Anthropic Claude Pro/Max logins through the desktop app finish instead of landing on a dead callback port. The engine moves to senpi 2026.9.3-2, which makes eval-only tool routing the default and fixes several Claude SDK OAuth failure loops. If you use OmO desktop or omo on Windows, upgrade now. Everyone else gets the engine changes and a set of ultrawork doctrine updates.
🪟 Windows: the shared RPC host stays alive
The host no longer dies on its own liveness probe. The shared RPC supervisor identifies the host process it is watching by reading a process baseline through PowerShell (Get-CimInstance Win32_Process). On Windows that read can take more than a second, and the supervisor's 1 s probe treated the overrun as fatal, so the host crashed within about a minute of every start. The OmO desktop app kept reconnecting to a host that had just killed itself.
- The baseline identity read is now guarded. When the probe runs past its budget, the baseline degrades to
UNKNOWNinstead of throwing. - The watchdog starts without a baseline and keeps running. A slow
Get-CimInstanceno longer decides whether the host lives. - The fix landed in senpi 2026.9.3 (code-yeongyu/senpi#1307). beta.36 is the first omo build that pins a senpi with it, along with the rest of the 2026.9.3 shared RPC supervisor lifecycle fixes.
🔐 OAuth logins that need a pasted code now work over RPC
Anthropic Claude Pro/Max login through the desktop app completes. Over RPC, startLogin wired the provider's onPrompt/onSelect callbacks to a function that threw Interactive login input is not supported over RPC. For Anthropic that failure was misleading: loginAnthropic races a local browser-callback listener against a manual_code prompt right after it emits auth_login_url, so the instant rejection set manualError, cancelled the wait, and closed the listener about 150 ms after the URL went out. Your browser opened, you approved the login, and the redirect landed on connection refused.
- Interactive callbacks now ride the existing
extension_ui_requestdialog channel:inputfor pasted codes, text, and secrets,selectfor account choices. Any RPC client that already renders extension dialogs can answer them. - An unanswered dialog never blocks the browser callback path. When the login settles through the browser, the pending dialog is released instead of holding the flow open.
- Cancelling the dialog maps to
Login cancelled, the same result a terminal user gets from Escape. - Fixes code-yeongyu/senpi#1316 via PR code-yeongyu/senpi#1319. Other prompt-driven OAuth providers get the same path.
⚙️ Engine: senpi 2026.9.3-2
Eval-only tool routing is the default (code-yeongyu/senpi#1314).
bash,powershell,workflow, and nowmonitorleave the model's direct tool list whenever the session has anevaltool. They're called astool.bash(...),tool.workflow(...), andtool.monitor(...)inside a cell; hooks and permission checks still apply.- A direct call returns a hint naming the eval form. A session without
eval(codemode disabled, or a child agent whose allowlist omits it) keeps all four directly callable. monitorjoined the set because 141 of ~225 solomonitorcalls over 14 days of local sessions came one turn after anevalcall, a two-turn split that collapses into one cell.- The wait-as-subscription guidance moved from the presets into the
evaltool description, where it can nametool.monitor(...). The preset rule was gated onmonitorbeing directly selectable and would've stopped rendering otherwise. experimental.bashEvalOnlyandexperimental.workflowEvalOnlyare removed. Existing entries in a settings file are ignored.
Claude SDK OAuth stops looping on No conversation found with session ID (code-yeongyu/senpi#1318, fixes oh-my-openagent#7562).
- After a failed cold seed,
claude-sdk-oauthkept a continuity binding whose session id had only been minted locally. The next turn chosereattach, Claude Code answered that the session didn't exist, and every later turn repeated the cycle with zero usage. - A session id is now resumable only once Claude Code acknowledged it, through a
system/initmessage or the replay echo that claims the turn. Entries created from a resume start confirmed; locally minted ids start unconfirmed. - An id Claude Code reports missing is dropped rather than retried.
Codemode keeps Bun child-process output inside the eval cell (code-yeongyu/senpi#1317).
Bun.$streams command output to fd 1/2 unless.quiet()is applied or a.text()-style reader is used, andBun.spawninherits stderr by default. Inside the JS eval kernel worker those fds are the interactive TUI's terminal.- A cell like
$`vibe-notion page get <id> --pretty`dumped a Notion page's pretty-printed block JSON straight into the editor, where it got pasted into the next prompt. The existingrouteWriteonly intercepts JS-levelprocess.stdout.write, so native child writes bypassed it. - A new
worker-shell-capturelayer installs beside the console/stdout routing while a cell is active and is restored with the rest of the worker state, so child output lands in the cell result like everything else.
Prompt presets: Kimi K3, Claude Opus, GLM (code-yeongyu/senpi#1315).
- The K3 core was written through the K2.6 lens (an overthinker that needs act-bias). Moonshot's own K3 notes describe the opposite failure, "excessive proactiveness," and the old core stated act-bias in four places against one reflect-then-ask clause, so the trained prior won. The session corpus showed K3 writing more test files than any other model.
- The K3 core is rebuilt on the Fable 5.1 skeleton with each failure mode given one home: a Scope section makes the request the deliverable (pre-existing problems become follow-ups, tests only where the task or repo calls for them), the ambiguity gate does the answer-independent work first and then asks one question, a failure cap stops improvisation after three failed approaches, and delegation propagates a stop condition to subagents. The result is 11 fewer Kimi K3 tokens than before.
- Opus 5 is rebuilt on the same skeleton with the guide's outcome-first final-summary shape. Opus 4.7/4.8 keep only their documented deltas and gain same-turn subagent fan-out; Opus 4.6 drops tuning text the core now carries.
- GLM 5.2/5.3 share one builder, gain the eval/monitor execution-tooling stance, and lose the lineage preamble, undefined-mode reference, and unconditional todo procedure. The shared core gains a conditional delegation rule and explains the auto-compaction mechanism behind the context-limits rule.
Claude SDK OAuth errors are real errors (code-yeongyu/senpi#1312).
- Failures now surface the SDK's actual assistant/result text, including API and version-floor errors, instead of
unknown. Version-floor and model-not-found failures come with actionable guidance. - Results marked
is_error: truecount as failures even when their subtype issuccess, which lets model fallback and multi-account failover kick in for session limits and API errors. - Token-refresh transport outages are classified as transient server errors rather than permanent auth blocks. The handling applies to ambient streams, managed failover, resident session pumps, and turn-success bookkeeping alike.
Also from the 2026.9.3 line, first pinned by omo in this beta: the universal fallback system prompt rewrite, muted-monitor footer labels, bounded multi-session close_session teardown (SENPI_RPC_CLOSE_GRACE_MS), and the /reload fs.watch stall fix.
🧩 omo
omo-native runs on bun wherever a bun >= 1.4 exists (#7680).
- The launcher used to re-exec under bun only for
bun add -ginstalls. npm, project-local, andbunxinstalls stayed on node even with bun on the machine, so the JS eval kernel ran under node and the bundledbun-1-4skill never surfaced. resolveBunReexecnow applies a first-match policy. Stay on the current runtime if already on bun, ifOMO_RUNTIME=node, or if no bun binary is found in$BUN_INSTALL/bin,~/.bun/bin, or PATH.- Re-exec with no version floor when
OMO_RUNTIME=bun. Re-exec without a probe when the script sits in bun's global tree (trust the bun that installed it). - For any other install, re-exec when
bun --versionreports 1.4.0 or newer. An older bun or a failed probe stays on node.
setup-import closes its SQLite handles deterministically (#7681).
- Windows teardown timed out on
win32 EBUSYbecause handles opened by the pinned.omp,.gjc, and unknown-schema fixtures weren't proven closed before the temp root was removed. Per-file process exit had hidden this until Windows shard 2 stopped running with--parallel. - Every handle is now recorded, closed through the existing
withDatabasehelper, and asserted closed before the case ends. No timeout, retry budget, platform skip, or--parallelchange was added.
ultrawork, ulw-execute, ulw-loop, and mass-ulw doctrine (#7673, #7674, #7675).
- Per-phase worktrees: every plan phase runs in its own task-owned worktree that lands on the integration base before the next phase branches. ulw-execute used to require a worktree only for PR/branch work;
--worktreeis now optional reuse of a first-phase worktree, and--make-prdrops its worktree-implication clause. - One workflow run per phase: dependency-ordered lanes are dispatched as one
workflowrun per phase, recovered inside that run withretry/amend/send. The next phase is a new run or anamend, never one graph for the whole plan. mass-ulw's header now states this unit of use instead of "in one call," and ulw-loop owns goals, criteria, evidence, and checkpoints whileworkflowis the per-phase dispatch surface. - Ideal end state and pre-existing defects: the ultrawork directive's discovery wave now produces the current problem, evidence-backed decision points, and the ideal end state the goal objective names. "Smallest correct change. No drive-by refactors." is replaced by an owner doctrine: defects met mid-run, pre-existing ones included, become registered work in this run (subgoal, plan checkbox, or workflow node) and are fixed to the ideal state, while delegated-unit scope stays hard.
- Discovered defects route through the orchestrator:
add_subgoalwidens so they become stories rather than follow-up notes, and the poll/wait()-default framing is replaced with completion wakes. - Housekeeping: the bootstrap carve-out widens to the ulw-execute contract so
ulw executeno longer double-bootstraps, duplicated child-handling sections are merged so the directive shrinks, staledagtool references are gone, and the TUI visual-QA runner switches tobun.
Windows CI (#7672, #7665, #7668).
- A
workflow_dispatch-only soak workflow repeats one of 11 allowlisted focused test targets up to 50 times with per-iteration telemetry, stops at the first failure, always uploads artifacts, and writes a job summary. Each target maps to hardcoded test arguments, so the dispatch input never reaches the shell. Normal CI is untouched. - All four Windows Bun invocations, including the previously uncovered
senpi-compatibilityjob, now run through.github/scripts/windows-ci-telemetry.ps1, which captures process, timing, filesystem, and exit data. Artifacts upload withcontinue-on-error, and the Bun exit code stays authoritative. - The heaviest worktree-sweep test (seven worktrees) was the only one left on Bun's 5000 ms default and timed out mid
git worktree addon the slower Windows runner. It now runs under the same 30 s budget as its siblings, and git setup failures name the stalled phase and elapsed time, e.g.creating external worktree failed after 37ms.
Install
npm i -g omo-ai@beta # omo native CLI (5.0.0-0.beta.36, engine senpi 2026.9.3-2)
bun i -g oh-my-openagent@5.0.0-beta.36
npx -y lazycodex-ai@5.0.0-beta.36 install # Codex plugin
Commits
- 776405ec0 Merge pull request #7684 from code-yeongyu/release/v5.0.0-beta.36-source-state
- 12637f1b3 Merge pull request #7682 from code-yeongyu/fix/hooks-state-writer-cleanup
- 090bd9fcd docs(evidence): record hooks-state writer cleanup QA
- e54c7c18c Merge pull request #7681 from code-yeongyu/fix/setup-import-sqlite-handle-leak
- 4103bea93 Merge pull request #7680 from code-yeongyu/feat/omo-native-bun-reexec-any-bun
- e64b424a8 fix(omo-native): close setup-import database handles deterministically
- 16f213443 test(script): follow the bun-runtime test split in the command-string allowlist
- 7c240ca65 docs(omo-native): document the any-bun runtime policy
- 32bca4739 feat(omo-native): run on bun wherever a bun >= 1.4 exists
- d2e807dfa Merge pull request #7674 from code-yeongyu/feat/ultrawork-ideal-state-owner-doctrine
- e46e3a29f Merge pull request #7675 from code-yeongyu/docs/ulw-execute-phase-worktree
- 2c6aee570 Merge pull request #7673 from code-yeongyu/docs/ulw-loop-mass-ulw-composition
- d2632e623 docs(shared-skills): each ulw-execute phase carries its own concrete goal
- 124e43294 docs(shared-skills): give each ulw-execute wave its own goal and route discovered defects through the orchestrator
- 529121594 docs(shared-skills): tighten the discovered-work checkbox rule in ulw-execute
- bcae3b346 docs(shared-skills): run web-terminal visual QA with bun in ulw-execute
- a41c75cbb docs(shared-skills): ulw-execute registers pre-existing defects as plan checkboxes
- 4c8385a93 docs(shared-skills): ulw-execute dispatches each wave as one workflow run
- 92ccdeefd docs(shared-skills): ulw-execute runs every phase in its own worktree
- 130a5c516 Merge pull request #7672 from code-yeongyu/ci/windows-flake-soak
- 48c7dc21c Merge pull request #7665 from code-yeongyu/fix/windows-ci-telemetry
- aec983957 Merge pull request #7668 from code-yeongyu/fix/worktree-sweep-windows-budget
- ba323d227 test(omo-opencode): diagnose worktree sweep setup timeouts
Thank you to 2 community contributors:
- @MoerAI:
- test(omo-opencode): diagnose worktree sweep setup timeouts
- Merge pull request #7668 from code-yeongyu/fix/worktree-sweep-windows-budget
- Merge pull request #7665 from code-yeongyu/fix/windows-ci-telemetry
- Merge pull request #7672 from code-yeongyu/ci/windows-flake-soak
- fix(omo-native): close setup-import database handles deterministically
- Merge pull request #7681 from code-yeongyu/fix/setup-import-sqlite-handle-leak
- docs(evidence): record hooks-state writer cleanup QA
- Merge pull request #7682 from code-yeongyu/fix/hooks-state-writer-cleanup
- Merge pull request #7685 from code-yeongyu/test/reconciliation-lock-determinism
- @sisyphus-dev-ai:
- Merge pull request #7684 from code-yeongyu/release/v5.0.0-beta.36-source-state