This release includes breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+9 more
Summary
AI summaryFixes duplicate assistant responses caused by race conditions in prompt handling and adds a gate to prevent them.
Full changelog
🪞 The Reliability Foundation — Massive Stability Release
OpenCode's session.prompt / session.promptAsync APIs are fire-and-forget and racy. They can resolve before the prompt is durably accepted, and a late session.error can still arrive after dispatch looks done. Combined with 13+ internal hook callers in this plugin (background parent wakes, runtime fallback retries, model suggestion retries, team mailbox live delivery, session recovery continuations, todo continuation, Ralph Loop, Atlas boulder, CLI run resumes, Claude Code hook injections, sync + background subagent prompts), it was way too easy for the same single user message to spawn two completely separate assistant responses — two model invocations, two streams, two bills. People noticed. Repeatedly.
We can't fix OpenCode's API from a plugin. But we can hack around it from the plugin side. v4.2.0 ships exactly that hack:
🚪 The prompt-async-gate
src/shared/prompt-async-gate.ts — the single production owner of every raw session.prompt / promptAsync call in the plugin.
- Reservation map keyed by
sessionID— only one source wins per session per dispatch window - 30-second dispatch timeout via
Promise.race. A hung gate is no longer a gate - 250 ms post-dispatch hold — covers the "returns before durably accepted" hazard regardless of throw vs resolve
- TypeScript AST audit (
prompt-async-route-audit.test.ts) fails CI if any new code touches raw prompt APIs outside the gate. Catches destructuring, bracket access, optional chaining, type-cast aliasing
🛡️ Plus the messages-transform synthetic-turn duplicate path
While stress-testing the gate, we found one more duplicate-response path: messages-transform.ts was unconditionally appending a synthetic [internal] Continue from the previous assistant state. user turn whenever the message history ended with an assistant. The model saw that as "user said: continue" and generated an extra response. Now gated on metadata.compaction_continue === true — only fires in legitimate post-compaction recovery, never in normal post-assistant flow.
If you've been seeing OMO/OpenCode randomly produce a duplicate streaming response after your message: this release is the fix.
🤖 Every continuation hook, audited & locked
Once the gate landed we went and audited every continuation hook the plugin ships:
todo-continuation-enforcer—session.compactedwas killing the active todo countdown, so after a compaction OMO forgot to wake the agent to finish its todos. Fixed: countdown survives compaction, the guard only arms nowunstable-agent-babysitter— respects active sessions (no nudge while you're typing), normalizes display names (no more reminders to the wrong agent)ralph-loop— defers continuation when a fresh user prompt arrived, guards verification-retry ownership so overlapping verifications can't both claim the loopbackground-agentparent-wake — coalesces rapid-fire parent wake racesatlasboulder — hard-stalls after K=3 no-progress turns. Blocked tasks must edit the plan file (text-only blocker reports rejected)
🔌 Rest of v4.2.0
- LSP → Tier-1 MCP: Native
src/tools/lsp/removed. LSP now ships as a built-in stdio MCP server backed by the vendoredlsp-tools-mcpsubmodule. All 6 existinglsp_*tool names preserved through OpenCode's MCP namespacing. New:lsp_statustool. Plusfix(mcp): always register lsp serverso it never gets accidentally disabled - Workspace migration
.sisyphus/→.omo/: Auto-migrates on plugin bootstrap. Legacy paths still recognized during transition - Repo layout cleanup:
web/moved underpackages/web/. Platform binary directories renamed frompackages/{platform}/topackages/oh-my-opencode-{platform}/for consistency - Anthropic GA 1M context unlocked: Claude Opus 4.6/4.7 and Sonnet 4.6 now return 1M context limit when no cache entry exists. Previously stuck at 200K, leaving 800K on the table
- OpenCode 1.14+ compatibility: Fixes the
frozen output.argscrash that hit every user runningbashwith agitcommand. 9 OMO hook sites refactored to use newreplaceToolArgshelper. Audit test prevents regression - Localized provider errors: Chinese (Zhipu/GLM) and Volcano Engine quota/rate-limit patterns now correctly classified for fallback
- Shell + platform compat: csh/tcsh
setenvsyntax in git-master env prefix. Windows ComSpec respected. Config migration usesr+mode for fsync on Windows - Exa MCP Bearer auth: SSE redirects were dropping
?exaApiKey=query param. Now usesAuthorization: Bearerheader anthropic-effortclamp: Pre-seteffort=maxno longer crashes Opus + GitHub Copilot / Anthropic-OAuth users- 50 MB log rotation:
oh-my-opencode.log→.1→.2. No more unbounded disk growth config.skills.pathsdiscovery: Host config's custom skills directory now wired into OMO's command + agent loaders
🧹 Quality housekeeping
- Zero LSP warnings across
src/— every test mock now uses real typed fixtures, noas any/ no@ts-ignore/ noas unknown asescape hatches. Production regex control-character warning fixed submodules: recursiveadded to thepublish-mainCI checkout so the vendoredlsp-tools-mcpactually builds on the CI runner
📊 Release stats
- 357+ commits since v4.1.2 (272 non-merge + 85 merged PRs)
- 560+ files changed, +23,000 insertions / −7,900 deletions
- 11 community contributors shipped 28 PRs into this release (full thank-you list below)
- 7,155 tests pass / 0 fail at v4.2.0 HEAD
- 3 new static guards preventing regression: prompt-async-route audit, mock.module lifecycle audit, merge-conflict guard
⚠️ Known issue (deferred to v4.2.1)
Delegate-task early-failure fallback — when a delegated child session fails on its very first promptAsync call before any history is persisted, it may not advance to the configured fallback models. Tracking issue #4059.
Minor Compatibility and Stability Release
This release carries compatibility-facing behavior changes and operational hardening. Read the summary below before upgrading or publishing.
- Rename transition updates across package detection, plugin/config compatibility, and install surfaces.
- Task and tool behavior updates, including delegate-task contract and runtime registration behavior.
- Task-system default behavior alignment so omitted configuration behaves consistently across runtime paths.
- Install and publish workflow hardening, including safer release sequencing and package/install fixes.
Commit Summary
- 881e990c fix(test/session-recovery): replace mock.calls[0][0] with typed accessor
- 9ddf1310 fix(test/runtime-fallback): add git_master to config fixture
- 394567a6 fix(ci): initialize submodules in publish-main checkout
- ae278eb9 fix(mcp): always register lsp server
- bf967945 chore(web): move site under packages
- 5e9a26c1 chore(packages): align platform package dirs
- 3e3beef2 fix(mcp): point CI lsp submodule path at packages
- e9061731 fix(ralph-loop): guard verification retry ownership
- 9c19bd8c fix(ralph-loop): defer during fresh user prompts
- cf901d4b chore(workspace): drop stale root plans
- 7187db6e chore(mcp): move lsp submodule under packages
- bcbab055 fix(todo-continuation-enforcer): preserve countdown across compaction
- f898116b test(todo-continuation-enforcer): lock compaction countdown state
- ca3ea0bb fix(messages-transform): narrow assistant-tail recovery trigger
- 44ee5e6a test(messages-transform): lock assistant-tail continuation guard
- f20294a7 fix(unstable-agent-babysitter): normalize reminder agent names
- 0ee45aa6 fix(unstable-agent-babysitter): respect active sessions
- af1ad4d0 fix(background-agent): coalesce parent wake races
- c712b71d test(tmux): isolate pane close logic tests
- 3b54d587 Merge pull request #4132 from code-yeongyu/fix/3446-atlas-runaway-loop
- 6dc31b2c fix(atlas): scope no-tool-progress counter to active plan path before stall
- ed5a3f90 Merge pull request #4142 from code-yeongyu/fix/prompt-dispatch-gate
- 428a18c7 test(prompt-gate): tighten dispatch route regressions
- e1554c08 fix(ralph-loop): preserve prompt dispatch holds through activity
- 66cb72b8 fix(prompt-gate): bind session messages receiver
- 1a66b96b docs: note Atlas stalled continuation fix
- d3b4c022 fix(atlas): stop stalled boulder continuations
- fff99aeb fix(atlas): track no-tool-progress state
- 0994c107 fix(atlas): require blocked plan checkbox edits
- d44cd1c1 fix(background-agent): preserve parent agent on retry wakes
- 3b50b7c8 Merge pull request #4143 from code-yeongyu/fix/shell-env-csh-support
- 82b0672c fix(git-master): emit csh-compatible setenv syntax for csh/tcsh shells
- b2961409 test(shell-env): add csh/tcsh detection and buildEnvPrefix coverage
- bc2ed016 Merge pull request #4141 from code-yeongyu/fix/3396-config-skills-paths-discovery
- b0f432db Merge pull request #4136 from code-yeongyu/fix/4059-blocker4-reland
- c8c06d60 Merge pull request #4020 from scw1109/fix/default-agent-sort-order
- c37725bb Merge pull request #4139 from code-yeongyu/fix/3450-anthropic-context-limit-revisited
- ecb87608 fix: wire host config.skills.paths into command skill discovery
- 971be27b docs(known-issues): mark blocker-4 resolved
- d5b1d361 docs(changelog): add 4.2.1 blocker-4 entry
- 14127958 fix: wire host config.skills.paths into agent skill discovery
- 043e84be fix: add adaptHostSkillConfig utility for host config.skills.paths
- f5e063b0 fix: only call setDefaultAgentForSort when user explicitly sets default_agent
- f17623d4 test(shared): isolate logger module in full suite
- 0f8fc548 fix(runtime-fallback): consume delegated bootstrap retry payload
- f0f798d1 Merge pull request #4138 from code-yeongyu/fix/3207-git-master-shell-detect-reland
- fdf7ba2e Merge pull request #4129 from code-yeongyu/feature/stage-c-lsp-mcp
- 6251a632 Merge pull request #4135 from code-yeongyu/fix/3893-team-mode-fresh-install
- 2387f1e7 Merge pull request #4134 from code-yeongyu/ulw/rule-comment-baseline-20260518
- 35df9119 test(hooks): update preemptive-compaction token thresholds for GA 1M context
- b9a8ffec fix(shared): return GA 1M context limit for Anthropic 4.6/4.7 models without cached entry
- 161813c1 test(doctor): remove unstable unavailable-binary assertion
- a0b01550 Merge pull request #4137 from code-yeongyu/fix/3763-exa-bearer-auth-reland
- d7caeb01 fix(git-master): use shared shell detection for cross-platform env prefix (fix #3207)
- 00e6c824 Merge pull request #4117 from ririnto/fix/plan-subagent-hidden-registry
- 50ae2e11 perf(rules-injector): cache match decisions
- a4cd7457 test(doctor): force unavailable lsp binary branch in CI
- 5ae0db04 fix(websearch): use Bearer auth for Exa MCP
- 364c7fee docs: note team mode fresh install fix
- 36409270 docs: add team mode fresh install note
- 03f04ca3 test(shared): isolate logger test overrides
- 21b782de test(plugin): cover fresh install team mode tools
- 9bae8733 fix(plugin): log team tool registry state
- e5653f16 fix(config): log resolved team mode state
- 9560e932 docs: correct tool directory counts and lsp alias wording
- 7e777b0c chore(mcp): ship vendored lsp cli in npm artifacts
- 69371b78 test(mcp): stabilize lsp builtin and doctor checks
- f7b60e36 fix(mcp): harden lsp cli resolution and doctor disable checks
- 5555dbfc Merge pull request #4133 from code-yeongyu/fix/3816-frozen-output-args
- b20e2c9c fix: refactor 5 additional aliased output.args mutations + strengthen audit test
- 61890f08 fix(rules-injector): bound parsed rule cache
- 46b965b9 fix(rules-injector): bound matcher cache
- 1ab1b54c perf(rules-injector): cache compiled glob matchers
- a7e5a657 Merge pull request #4131 from code-yeongyu/fix/3563-effort-max-pre-set-clamp
- 3a63a8b2 test(shared): add audit test forbidding direct output.args mutation + fix 9th site
- 13d88574 refactor(hooks): replace direct output.args mutation with replaceToolArgs (question/webfetch/null-byte)
- af66b8de refactor(hooks): replace direct output.args mutation with replaceToolArgs (env + prompt injectors)
- 63a30210 test(anthropic-effort): cover pre-set effort=max clamping for constrained providers (#3563)
- 96767b5d fix(anthropic-effort): clamp pre-set effort=max for constrained providers regardless of variant
- f72bb3fe refactor(hooks): replace direct output.args mutation with replaceToolArgs (claude-code-hooks)
- 6bffb2c4 feat(shared): add replaceToolArgs helper for safe tool-args mutation
- b149ce53 docs: update AGENTS docs for MCP-backed LSP architecture
- 54eb3963 chore(ci): init and build vendor lsp submodule in CI
- 8716ef45 refactor(plugin): drop lspManager lifecycle wiring
- ca51f613 refactor(tools): remove native LSP tool registry wiring
- c2c078fe feat(mcp): register lsp tier-1 stdio MCP server
- 34e6af1a docs: update AGENTS guidance
- c4dd21e1 Merge pull request #4127 from code-yeongyu/fix/3997-notification-crash
- baa0470e Merge pull request #3870 from cvqluu/fix/3772-log-bloat-and-epipe-suppression
- 6037b917 Merge pull request #4122 from mguttmann/fix-4120
- 442cdebc docs: add Deepgram to sponsor list in README files
- 755f380a docs: update AGENTS.md metadata for v4.2.0 release
- 397ed104 fix(hooks): guard session-notification against missing ctx.$ (refs #3997)
- 4713a908 fix(shared): cap log file growth via size-based rotation
- 32941282 fix(background-agent): defer parent-wake when a user message just arrived (fixes #4120)
- 7285163c @ririnto has signed the CLA in code-yeongyu/oh-my-openagent#4117
- 19aaf5d3 fix(prompts): point planning guidance at plan subagent
- a1630685 fix(delegate-task): restore hidden plan delegation
- e0d88ff2 Merge pull request #3713 from deopa0402/fix/stale-plugin-specifier-cache
- 97581686 test(auto-update): isolate cached version resolution
- 37d9d613 fix(auto-update): clean stale OMO cache roots
- babee921 Merge pull request #4109 from code-yeongyu/code-yeongyu/unify-prompt-async-routes
- 7a3a0a03 test(tmux): ignore unrelated pane runner mock calls
- 0f92d2c9 test(prompt-gate): narrow audit binding detection
- 98df0a43 docs(prompt-gate): document unified dispatch invariant
- 6768decd fix(session-recovery): fallback when stored unavailable-tool parts are absent
- 12bd6580 refactor(prompt-async-gate): remove deprecated dispatch wrappers
- 1bbe065c refactor(prompt-callers): migrate shared and cli dispatch
- 989ab717 refactor(hooks): use unified internal prompt dispatch
- dd3fecaf refactor(plugin): use unified internal prompt dispatch
- fee515c5 refactor(prompt-callers): migrate team and call_omo_agent dispatch
- df198d8b refactor(background-agent): use unified internal prompt dispatch
- a42f894f refactor(prompt-async-gate): collapse dispatch into mode-based entrypoint
- b5d24619 test(prompt-async-gate): pin unified internal prompt dispatch contract
- f1a0ba20 Merge pull request #4108 from code-yeongyu/code-yeongyu/fix-idle-recovery-fanout
- 8bc49775 fix(slash-command): skip already tagged command output
- 55312cc4 fix(session-recovery): preflight idle recovery fanout
- 1fea761c Merge pull request #4106 from code-yeongyu/code-yeongyu/fix-stale-tool-hang
- a7b7ace7 fix(prompt-gate): block prompts into pending tool turns
- 6eb88a05 fix(session-recovery): prefer valid tool use ids
- 4d417a33 fix(process-cleanup): stop force-exiting opencode on transient unhandled errors
- f43effb8 fix(session-recovery): recover interrupted idle tool turns
- fbec112b fix(background-output): bound session.messages fetch to stop forever-hang during /init-deep
- 24261da8 Merge pull request #4103 from code-yeongyu/code-yeongyu/fix-prompt-hang-race
- f4f1efcb fix(call-omo-agent): fail fast on lost prompts
- 75223149 Merge pull request #4096 from code-yeongyu/kimi-k2.6
- 412ac045 docs: add debugging journal for prompt hang investigation
- d8f365bf test(guard): add merge-conflict guard to prevent unresolved git conflicts in source files
- 38702f6e Merge pull request #4094 from code-yeongyu/fix/opus-4.7
- c142066f Merge pull request #4093 from code-yeongyu/k2p6-turbo
- 67ead7bf fix(dynamic-truncator): bound session.messages fetch to stop forever-hang on Read (#4086)
- fcd0011a test(atlas): track active timers instead of scheduled delays in setTimeout mock
- 2613de52 fix(prompt-async-gate): timeout isSessionActive to prevent infinite hang on stale SDK status
- 169e61f7 test(audit): allowlist build-team-idle-wake-hint-client.ts in prompt route audit
- a43215f2 fix(plugin/event): bind team-idle-wake-hint client methods to SDK Session
- 271878bc perf(rules-injector): cache full candidates and memoize ancestor scans
- c25f7529 perf(rules-injector): cache project root for visited ancestors
- f843f57c Merge pull request #4088 from code-yeongyu/fix/session-agent-map-cleanup
- 2b8782de fix(claude-code-session-state): clear session-agent map on delete and sync cleanup
- 25d80541 Merge pull request #4074 from code-yeongyu/fix/delegate-task-spawn
- c9ec11dd bump comment-checker to 0.7.1
- d3318617 fix(background-agent): clean child session-agent state on pre-start abort and normalize stored agent
- cc97a023 test(agents): drop unsafe AgentFactory cast and add typed empty skills
- 791fbf3e refactor(delegate-task): share buildSyncPromptTools between bootstrap and prompt dispatch
- ea5f6ddf fix(call-omo-agent): register bootstrap and session agent before sync prompt dispatch
- 097d7dc5 fix(background-agent): keep delegated skill, permission, and child agent across retries
- ba648685 fix(runtime-fallback): carry delegated system and tools through bootstrap retry
- 761f682a refactor(delegated-bootstrap): accept optional system and tools
- 4f981384 feat: add ci test runner, session routing, bash parser, and test fixtures
- 166e5de0 @pizzav-xyz has signed the CLA in code-yeongyu/oh-my-openagent#4084
- 80fa177b Merge pull request #4075 from code-yeongyu/feature/migrate-sisyphus-to-omo
- 6573bd94 chore(workspace): move test discipline rule to omo
- 5a2c3bbb fix(workspace): match omo guard paths cross-platform
- b5992b13 test(shared): stabilize port utility interface check
- cdac0d69 fix(workspace): report only the active notepad change
- 240a4a17 fix(workspace): harden omo migration review issues
- fbc5768f Merge pull request #3971 from MoerAI/fix/task-examples-add-run-in-background
- 82ec099c fix(atlas): match omo as a path segment
- 63519ec5 docs(workspace): document omo workspace paths
- f10f7963 fix(workspace): keep omo and legacy rules compatible
- 36e373cd feat(workspace): point planning guardrails at omo
- a86221b1 feat(workspace): store runtime state under omo
- 5dca1a57 feat(workspace): migrate legacy sisyphus state to omo
- 7c2e2fe1 fix(background-agent): redact task registry views
- 982fa813 fix(delegate-task): start child prompts reliably
- 76e573a9 Merge pull request #4073 from code-yeongyu/fix/team-create-permission-inline-spec
- d974cd3d test(hooks): repair stale retry harnesses
- cf7bf9d0 fix(team-mode): accept legacy inline specs
- a2054057 Merge pull request #4068 from code-yeongyu/feat/pre-publish-fix-v420
- 3f3a63c5 docs(changelog): v4.2.0 entry with known issues and supersession history
- eba17441 test(mock-module-audit): require lifecycle cleanup for mock.module
- aaa215c5 docs(release-process): add post-fix repro verification policy
- 3435c9be docs(adr): write prompt-async-gate ADR
- 102d0670 fix(model-suggestion-retry): release reservation on async error path
- 5a8bd05d test(prompt-async-gate): replace timer waits with deterministic sync (BLOCKER-3)
- 9dd52a04 docs(changelog): v4.2.0 entry covering BLOCKER + HIGH + KNOWN ISSUES
- 7dbb34cd refactor(background-agent): wire ParentWakeNotifier into BackgroundManager
- 41ff7bca fix(background-agent): release prompt gate before agent fallback retry
- 209063e8 docs(known-issues): document delegate-task early-failure-fallback deferral
- 0f8902c4 docs(changelog): v4.2.0 entry
- 48480172 test(mock-module-audit): require lifecycle cleanup for mock.module
- 845d862b test(prompt-async-gate): replace setTimeout sleeps with deterministic sync
- f8d6f2a2 docs(known-issues): document delegate-task PR #3825 revert deferral
- c096a596 test(mock-module-audit): require lifecycle cleanup for mock.module
- 8914dab4 docs(known-issues): reference delegate fallback tracking issue
- 1590085f docs(release-process): add post-fix repro verification policy
- 0c27ecb1 docs(adr): write prompt-async-gate ADR
- 38732b42 docs(known-issues): document delegate-task empty-history fallback (BLOCKER-4)
- 0941ffe7 docs(release-process): add post-fix repro verification policy
- ee6bc67c docs(adr): write prompt-async-gate ADR
- d706587e docs(known-issues): document delegate-task early-failure-fallback deferral
- ff1b15d5 fix(model-suggestion-retry): release reservation before retry attempt
- c1ccf8d0 refactor(background-agent): introduce ParentWakeNotifier module
- 8c4cc09d test(prompt-async-route-audit): migrate to TypeScript AST walker
- f93d7297 test(prompt-async-gate): cover dispatch timeout and post-dispatch error hold
- b333a528 fix(prompt-async-gate): add dispatch timeout, shared runner, harden prefix release
- a19c1bfc chore(release): bump version to 4.2.0
- c067b0fc refactor(plugin-entry): move createPluginModule to testing module
- 1723a8b7 Merge pull request #3500 from Disaster-Terminator/fix/tmux-defer-attach-until-focus
- e63c5b9a fix(tmux): require explicit active isolated window
- 1ff59f44 test(tmux): align pane-state runner format
- d02cca44 test(tmux): align pane replace placeholder expectations
- 54a7256a test(tmux): align placeholder command expectations
- 91f1cf5f fix(tmux): pin pane commands to /bin/sh
- 8c5ca736 fix(tmux): sweep suffixed stale isolated sessions
- 0c8e546c fix(tmux): support manager-scoped isolated session names
- 4e3684eb fix(tmux): gate isolated pane activation on visible client focus
- c63108d5 fix(tmux): track placeholder panes before attach readiness
- 688bb551 fix(tmux): defer subagent attach until pane focus
- 6e5a127f Merge pull request #3840 from EnochLi15/codex/fix-tool-execute-after-boundary
- d1161399 fix tool execute after hook boundary
- ad10450b Merge pull request #3841 from Momentum96/fix/background-manager-tmux-ordering
- df64f325 @boris-gorbylev has signed the CLA in code-yeongyu/oh-my-openagent#4057
- be25109f fix(continuation): skip internal user turns
- c580b8f2 fix(session): ignore internal synthetic turns
- e8de8b79 fix(team-mode): skip pending mailbox reinjection
- e90ff805 fix(tmux): treat busy sessions as attachable
- efb862ce fix(tmux): prefer real tmux when session env exists
- 5238dd48 fix(background-agent): start promptAsync before blocking tmux callback
- a9a00325 Merge pull request #3497 from Disaster-Terminator/fix/reminder-hooks-preserve-state-across-compaction
- 291b1f7b test(reminder-hooks): clean up compaction regressions
- 672f5d6e fix(keyword-detector): skip synthetic turns
- 196f6512 fix(team-mode): defer live mailbox acks
- 392c20e5 test(reminder-hooks): make delete reset regression diagnostic
- 29e7e97d test(reminder-hooks): cover delegated sessions across compaction
- 3db1da1e fix(reminder-hooks): preserve suppression state across compaction
- ae7ff3bb Merge pull request #3891 from wjiuxing/feat/chinese-error-patterns
- 3e9b125f test(runtime-fallback): cover localized provider errors
- c206b168 feat: add Chinese error patterns to model-error-classifier
- 149a83d7 feat: add Chinese quota patterns to classifyErrorType
- adfa8bef feat: add Chinese error patterns to RETRYABLE_ERROR_PATTERNS
- e24e495a Merge pull request #3322 from RaviTharuma/fix/runtime-fallback-equivalent-skip
- d9033d73 fix(runtime-fallback): keep variant in equivalence
- f501c47c fix(runtime-fallback): skip equivalent claude aliases
- f54888b2 Merge pull request #3576 from Disaster-Terminator/fix/background-busy-stall-detection
- 27788b4a fix(session-recovery): audit raw prompt aliases
- 4a1c260d test(todo-continuation): cover peer-message reservation holds
- 39fef204 fix(background-agent): resolve parent wake agent aliases
- 2bd4944b fix(prompt-gate): scope reservation releases
- b6caa5d3 fix(background-agent): correct stall timeout guidance
- 189af23e fix(background-agent): detect stalled active sessions
- 2eec0d96 Merge pull request #3319 from EZotoff/fix/remove-activity-stagnation-bypass
- 65c12833 fix(todo-continuation): clean up idle event diagnostics
- 68e9d54f fix(todo-continuation): remove activity-based stagnation bypass
- fe66c962 Merge pull request #4053 from code-yeongyu/supersede/3866-tool-result-schema
- b504fb1d fix(tool-pair-validator): emit schema-compatible synthetic tool results
- 24f7e560 Merge pull request #4051 from code-yeongyu/supersede/3952-first-prompt-watchdog
- 3199bd3d fix(runtime-fallback): broaden watchdog progress detection + harden test timing
- a130fa70 fix(runtime-fallback): add first-prompt watchdog for stuck subagents
- bda0452b Merge pull request #4029 from sandikodev/fix/json-error-recovery-exclude-todowrite
- f835244d Merge pull request #4047 from PeterPonyu/fix/3894-skip-tmux-layout-when-server-unreachable
- e66d60f4 Merge pull request #3773 from cailgarrisk-collab/fix/glm-rate-limit-fallback-statuscode
- 5cda8b8f Merge pull request #3330 from codeg-dev/fix/isplan-display-name-getAgentConfigKey
- a3283436 Merge pull request #3299 from kilhyeonjun/fix/claude-code-settings-hooks-not-executed
- 0036c203 Merge pull request #3934 from Qihao0v0/fix/unifyllm-quota-classifier
- c6054af9 Merge pull request #3872 from x-x-gpu/dev
- 7da44232 Merge pull request #4049 from code-yeongyu/supersede/3790-session-firstmessage-no-clear
- 9f6b6811 fix(hooks): do not clear sessionFirstMessageProcessed on session.idle
- bd3928e1 fix(team-mode): skip tmux layout when opencode server unreachable
- ac66a43e Merge pull request #4046 from code-yeongyu/fix/3494-strip-zwsp-before-promptasync
- 7caf74a9 fix(atlas,todo-continuation): strip ZWSP sort prefix before promptAsync agent
- 2b43147c Merge pull request #4045 from code-yeongyu/supersede/3901-call-omo-agent-display-name
- 10f721de fix(call-omo-agent): translate config-key subagent_type to display name before SDK dispatch
- 437a8edb Merge pull request #4007 from PeterPonyu/feat/runtime-fallback-internal-abort
- 5e7ee941 Merge pull request #3982 from jas32096/fix/category-fallback-ignored-when-primary-set
- 83ab0009 Merge pull request #3972 from MoerAI/fix/circuit-breaker-tool-input-fallback
- e2b8e49e Merge pull request #4044 from code-yeongyu/revert/3825-delegated-bootstrap
- 3c7d1299 Revert "Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback"
- cd33f3a3 Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback
- 521c99cf Merge pull request #3950 from ismetanin/fix/surface-subagent-quota-error
- f00a6939 Merge pull request #3947 from MoerAI/fix/process-cleanup-opt-out-env
- c3319c75 Merge pull request #3470 from omer-koren/fix/thinking-block-modified-recovery
- 984b8c1a Merge pull request #4032 from PeterPonyu/fix/3996-tool-pair-validator-background-sessions
- 15b0a41f Merge pull request #4043 from code-yeongyu/fix/session-recovery-stale-error-dedupe
- 8e9dea94 fix(session-recovery): persist dedupe across stale repeated session.error
- cb873850 test(ci): isolate runtime and rules dependencies
- a02686e7 test(ci): remove suite-order mock coupling
- f1fb1e08 fix(ralph-loop): send registered agent display name on continue
- b3b2da89 test(ci): avoid global module mock leaks
- 8dcbccf0 fix(tmux): inject pane action dependencies
- 7a94cc72 fix(background-agent): stabilize parent wakes
- c0544a70 fix(background-agent): defer retry notifications
- 462b55ef Merge pull request #4040 from code-yeongyu/cleanup/typescript-ai-slop-20260515
- a9886ccb refactor(plugin): remove metadata assertions
- 0a3d1875 refactor(tools): narrow optional values
- d92e78c9 refactor(sdk): narrow response fallbacks
- 4785767a refactor(interactive-bash): reuse tmux parser
- 150ccefa fix(delegate-task): allow hidden plan task
- c25cb8dc fix(background-task): clarify task id contracts
- 15e7330f fix(team-mode): gate status injection by keyword
- 1e7a7a22 Merge pull request #4037 from code-yeongyu/fix/internal-initiator-dedupe
- cd1c1a59 fix(background-agent): avoid branched parent wakes
- 9f6d0d22 docs(agents-md): refresh hierarchical knowledge base for v4.1.2
- 3dd8a5ca chore(rules): forbid flaky tests, time sleeps, and prompt pinning
- 53a74063 no prompt async
- ced722e2 Merge pull request #4034 from code-yeongyu/fix/promptasync-duplicate-output
- c2aa180e fix(prompt-gate): pin duplicate prompt dispatches
- 05189700 fix(prompt-gate): hold reservations after dispatch
- c6e3b7e1 docs(agents-md): warn on prompt injection
- edf3e530 fix(hooks): gate sync injected prompts
- 0b48f805 fix(call-omo-agent): gate reused sync prompts
- 439e7283 fix(runtime-fallback): gate retry prompts
- 30adce9c fix(prompt-gate): share message reservations
- dd6271bb fix(babysitter): gate reminder prompts
- a524754e fix(todo-continuation): gate idle prompts
- b0b61182 fix(ralph-loop): gate continuation prompts
- 960baf39 fix(atlas): gate boulder continuation prompts
- b0a484b4 fix(session-recovery): gate resume prompts
- db28a32c fix(recovery): gate compaction prompts
- c75f5488 fix(fallback): gate model retry prompts
- f1a62a9c fix(team-mode): gate member wake prompts
- 174cbd0f fix(background-agent): gate parent wake prompts
- b2fdd728 fix(prompt-async): add session idle gate
- 2567415a Merge pull request #4033 from code-yeongyu/perf/ci-test-build-time-20260515
- 7ae8207a Merge pull request #4030 from code-yeongyu/fix/promptasync-concurrency-20260515
- 23dfe7ee fix(fallback): skip duplicate fallback re-arms
- 53de295b perf(ci): add sharded test runner phases
- b7482ea7 test(fallback): type chat output assertions
- 26bb6231 fix(fallback): preserve provider-specific fallback retries
- 005d16dd fix(fallback): dedupe providerless fallback errors
- da339204 fix(fallback): dedupe overlapping fallback continuations
- 17030b9a Prevent subagent repair from corrupting background sessions
- c6c7a103 Merge pull request #4015 from code-yeongyu/fix/background-output-bg-id-20260514
- 8f90c1e9 fix(background-task): log missing output retry
- d0355590 @sandikodev has signed the CLA in code-yeongyu/oh-my-openagent#4029
- c76ac27e fix(json-error-recovery): add todowrite/todoread to JSON_ERROR_TOOL_EXCLUDE_LIST
- bd2f1055 @scw1109 has signed the CLA in code-yeongyu/oh-my-openagent#4020
- ec7168eb fix: respect default_agent in sort shim ordering (#3900)
- d8652863 Merge remote-tracking branch 'origin/dev' into fix/background-output-bg-id-20260514
- ca178f41 Merge pull request #4016 from code-yeongyu/fix-bg-noti-coalesce
- 9b279d2f chore(deps): sync lockfile metadata
- 268c89c9 fix(background-agent): coalesce rapid-fire idle parent notifications
- 1ea192b3 fix(background-task): retry transient missing output tasks
- b9beea10 feat(team-mode): drive immediate teardown and recreate-to-reshape loop
- 5b99a87c fix(runtime-fallback): preserve attemptCount when our own abort is the cause (closes #4006)
- 711b7534 fix(delegate-task): honor user fallback_models when category primary is unreachable
- 83c3379b Merge branch 'dev' into fix/surface-subagent-quota-error
- 12f52338 merge(dev): resolve latest manager and runtime-fallback conflicts
- 5cd95cf5 fix(background-agent): fall back to partInfo.input when state.input is unavailable for circuit breaker (fixes #3962)
- c4e88d63 fix(agents): add run_in_background to category task() examples in prompts (fixes #3960)
- 1e1f574b merge(dev): resolve latest sync-task conflict for delegated fallback PR
- ecb92c1e fix(runtime-fallback): abort stuck subagent on quota error with no fallback
- dd68f324 fix(background-agent): add OMO_DISABLE_PROCESS_CLEANUP env opt-out for global handlers (fixes #3856)
- 583fa242 fix(runtime-fallback): classify localized balance failures
- 74171b91 merge(dev): resolve background-agent delegated fallback conflicts
- 291eeed8 fix(delegate-task): preserve late background session wiring on abort
- 0b9cc80e fix: pass resolved model to session.create so sub-agent sessions use the correct model
- fac90d69 fix(delegate-task): harden child-session fallback bootstrap and cleanup
- 61d2f119 fix(model-fallback): add HTTP statusCode check for GLM rate limit fallback
- b6ad494f fix(session-recovery): detect and recover from 'thinking block modified' errors
- 23d12575 fix(delegate-task): apply getAgentConfigKey normalization to isPlanAgent
- fe1cfd88 fix: preserve accumulated modifiedInput and common fields on deny/ask from exit code paths
- 5d8bd99f fix: accumulate modifiedInput and common fields from allow hooks
- e0d611ae revert: remove incorrect claudeCodeHooks override in createHooks, add pre-tool-use tests
- 5aeb5688 fix: don't early-return on 'allow' in executePreToolUseHooks
- 3b5745a6 fix: wire claudeCodeHooks into createHooks() to enable .claude/settings.json hooks
Thank you to 11 community contributors:
- @rshks:
- fix(tool-pair-validator): emit schema-compatible synthetic tool results
- @EZotoff:
- fix(todo-continuation): remove activity-based stagnation bypass
- @Disaster-Terminator:
- fix(background-agent): detect stalled active sessions
- fix(background-agent): correct stall timeout guidance
- fix(reminder-hooks): preserve suppression state across compaction
- test(reminder-hooks): cover delegated sessions across compaction
- test(reminder-hooks): make delete reset regression diagnostic
- fix(tmux): defer subagent attach until pane focus
- fix(tmux): track placeholder panes before attach readiness
- fix(tmux): gate isolated pane activation on visible client focus
- fix(tmux): support manager-scoped isolated session names
- fix(tmux): sweep suffixed stale isolated sessions
- fix(tmux): pin pane commands to /bin/sh
- @RaviTharuma:
- fix(runtime-fallback): skip equivalent claude aliases
- fix(runtime-fallback): keep variant in equivalence
- @wjiuxing:
- feat: add Chinese error patterns to RETRYABLE_ERROR_PATTERNS
- feat: add Chinese quota patterns to classifyErrorType
- feat: add Chinese error patterns to model-error-classifier
- @Momentum96:
- fix(background-agent): start promptAsync before blocking tmux callback
- fix(tmux): prefer real tmux when session env exists
- fix(tmux): treat busy sessions as attachable
- @EnochLi15:
- fix tool execute after hook boundary
- @deopa0402:
- fix(auto-update): clean stale OMO cache roots
- test(auto-update): isolate cached version resolution
- @minpeter:
- Merge pull request #3713 from deopa0402/fix/stale-plugin-specifier-cache
- @ririnto:
- fix(delegate-task): restore hidden plan delegation
- fix(prompts): point planning guidance at plan subagent
- @cvqluu:
- fix(shared): cap log file growth via size-based rotation
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Related tools
Earlier breaking changes
Beta — feedback welcome: [email protected]