github code-yeongyu/oh-my-openagent v5.0.0-beta.36

latest release: v5.0.0-beta.37
pre-release6 hours ago

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 UNKNOWN instead of throwing.
  • The watchdog starts without a baseline and keeps running. A slow Get-CimInstance no 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_request dialog channel: input for pasted codes, text, and secrets, select for 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 now monitor leave the model's direct tool list whenever the session has an eval tool. They're called as tool.bash(...), tool.workflow(...), and tool.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.
  • monitor joined the set because 141 of ~225 solo monitor calls over 14 days of local sessions came one turn after an eval call, a two-turn split that collapses into one cell.
  • The wait-as-subscription guidance moved from the presets into the eval tool description, where it can name tool.monitor(...). The preset rule was gated on monitor being directly selectable and would've stopped rendering otherwise.
  • experimental.bashEvalOnly and experimental.workflowEvalOnly are 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-oauth kept a continuity binding whose session id had only been minted locally. The next turn chose reattach, 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/init message 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, and Bun.spawn inherits 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 existing routeWrite only intercepts JS-level process.stdout.write, so native child writes bypassed it.
  • A new worker-shell-capture layer 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: true count as failures even when their subtype is success, 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 -g installs. npm, project-local, and bunx installs stayed on node even with bun on the machine, so the JS eval kernel ran under node and the bundled bun-1-4 skill never surfaced.
  • resolveBunReexec now applies a first-match policy. Stay on the current runtime if already on bun, if OMO_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 --version reports 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 EBUSY because 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 withDatabase helper, and asserted closed before the case ends. No timeout, retry budget, platform skip, or --parallel change 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; --worktree is now optional reuse of a first-phase worktree, and --make-pr drops its worktree-implication clause.
  • One workflow run per phase: dependency-ordered lanes are dispatched as one workflow run per phase, recovered inside that run with retry/amend/send. The next phase is a new run or an amend, 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 while workflow is 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_subgoal widens 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 execute no longer double-bootstraps, duplicated child-handling sections are merged so the directive shrinks, stale dag tool references are gone, and the TUI visual-QA runner switches to bun.

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-compatibility job, now run through .github/scripts/windows-ci-telemetry.ps1, which captures process, timing, filesystem, and exit data. Artifacts upload with continue-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 add on 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

  • 776405e Merge pull request #7684 from code-yeongyu/release/v5.0.0-beta.36-source-state
  • 12637f1 Merge pull request #7682 from code-yeongyu/fix/hooks-state-writer-cleanup
  • 090bd9f docs(evidence): record hooks-state writer cleanup QA
  • e54c7c1 Merge pull request #7681 from code-yeongyu/fix/setup-import-sqlite-handle-leak
  • 4103bea Merge pull request #7680 from code-yeongyu/feat/omo-native-bun-reexec-any-bun
  • e64b424 fix(omo-native): close setup-import database handles deterministically
  • 16f2134 test(script): follow the bun-runtime test split in the command-string allowlist
  • 7c240ca docs(omo-native): document the any-bun runtime policy
  • 32bca47 feat(omo-native): run on bun wherever a bun >= 1.4 exists
  • d2e807d Merge pull request #7674 from code-yeongyu/feat/ultrawork-ideal-state-owner-doctrine
  • e46e3a2 Merge pull request #7675 from code-yeongyu/docs/ulw-execute-phase-worktree
  • 2c6aee5 Merge pull request #7673 from code-yeongyu/docs/ulw-loop-mass-ulw-composition
  • d2632e6 docs(shared-skills): each ulw-execute phase carries its own concrete goal
  • 124e432 docs(shared-skills): give each ulw-execute wave its own goal and route discovered defects through the orchestrator
  • 5291215 docs(shared-skills): tighten the discovered-work checkbox rule in ulw-execute
  • bcae3b3 docs(shared-skills): run web-terminal visual QA with bun in ulw-execute
  • a41c75c docs(shared-skills): ulw-execute registers pre-existing defects as plan checkboxes
  • 4c8385a docs(shared-skills): ulw-execute dispatches each wave as one workflow run
  • 92ccdee docs(shared-skills): ulw-execute runs every phase in its own worktree
  • 130a5c5 Merge pull request #7672 from code-yeongyu/ci/windows-flake-soak
  • 48c7dc2 Merge pull request #7665 from code-yeongyu/fix/windows-ci-telemetry
  • aec9839 Merge pull request #7668 from code-yeongyu/fix/worktree-sweep-windows-budget
  • ba323d2 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

Don't miss a new oh-my-openagent release

NewReleases is sending notifications on new releases.