🪞 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
- 881e990 fix(test/session-recovery): replace mock.calls[0][0] with typed accessor
- 9ddf131 fix(test/runtime-fallback): add git_master to config fixture
- 394567a fix(ci): initialize submodules in publish-main checkout
- ae278eb fix(mcp): always register lsp server
- bf96794 chore(web): move site under packages
- 5e9a26c chore(packages): align platform package dirs
- 3e3beef fix(mcp): point CI lsp submodule path at packages
- e906173 fix(ralph-loop): guard verification retry ownership
- 9c19bd8 fix(ralph-loop): defer during fresh user prompts
- cf901d4 chore(workspace): drop stale root plans
- 7187db6 chore(mcp): move lsp submodule under packages
- bcbab05 fix(todo-continuation-enforcer): preserve countdown across compaction
- f898116 test(todo-continuation-enforcer): lock compaction countdown state
- ca3ea0b fix(messages-transform): narrow assistant-tail recovery trigger
- 44ee5e6 test(messages-transform): lock assistant-tail continuation guard
- f20294a fix(unstable-agent-babysitter): normalize reminder agent names
- 0ee45aa fix(unstable-agent-babysitter): respect active sessions
- af1ad4d fix(background-agent): coalesce parent wake races
- c712b71 test(tmux): isolate pane close logic tests
- 3b54d58 Merge pull request #4132 from code-yeongyu/fix/3446-atlas-runaway-loop
- 6dc31b2 fix(atlas): scope no-tool-progress counter to active plan path before stall
- ed5a3f9 Merge pull request #4142 from code-yeongyu/fix/prompt-dispatch-gate
- 428a18c test(prompt-gate): tighten dispatch route regressions
- e1554c0 fix(ralph-loop): preserve prompt dispatch holds through activity
- 66cb72b fix(prompt-gate): bind session messages receiver
- 1a66b96 docs: note Atlas stalled continuation fix
- d3b4c02 fix(atlas): stop stalled boulder continuations
- fff99ae fix(atlas): track no-tool-progress state
- 0994c10 fix(atlas): require blocked plan checkbox edits
- d44cd1c fix(background-agent): preserve parent agent on retry wakes
- 3b50b7c Merge pull request #4143 from code-yeongyu/fix/shell-env-csh-support
- 82b0672 fix(git-master): emit csh-compatible setenv syntax for csh/tcsh shells
- b296140 test(shell-env): add csh/tcsh detection and buildEnvPrefix coverage
- bc2ed01 Merge pull request #4141 from code-yeongyu/fix/3396-config-skills-paths-discovery
- b0f432d Merge pull request #4136 from code-yeongyu/fix/4059-blocker4-reland
- c8c06d6 Merge pull request #4020 from scw1109/fix/default-agent-sort-order
- c37725b Merge pull request #4139 from code-yeongyu/fix/3450-anthropic-context-limit-revisited
- ecb8760 fix: wire host config.skills.paths into command skill discovery
- 971be27 docs(known-issues): mark blocker-4 resolved
- d5b1d36 docs(changelog): add 4.2.1 blocker-4 entry
- 1412795 fix: wire host config.skills.paths into agent skill discovery
- 043e84b fix: add adaptHostSkillConfig utility for host config.skills.paths
- f5e063b fix: only call setDefaultAgentForSort when user explicitly sets default_agent
- f17623d test(shared): isolate logger module in full suite
- 0f8fc54 fix(runtime-fallback): consume delegated bootstrap retry payload
- f0f798d Merge pull request #4138 from code-yeongyu/fix/3207-git-master-shell-detect-reland
- fdf7ba2 Merge pull request #4129 from code-yeongyu/feature/stage-c-lsp-mcp
- 6251a63 Merge pull request #4135 from code-yeongyu/fix/3893-team-mode-fresh-install
- 2387f1e Merge pull request #4134 from code-yeongyu/ulw/rule-comment-baseline-20260518
- 35df911 test(hooks): update preemptive-compaction token thresholds for GA 1M context
- b9a8ffe fix(shared): return GA 1M context limit for Anthropic 4.6/4.7 models without cached entry
- 161813c test(doctor): remove unstable unavailable-binary assertion
- a0b0155 Merge pull request #4137 from code-yeongyu/fix/3763-exa-bearer-auth-reland
- d7caeb0 fix(git-master): use shared shell detection for cross-platform env prefix (fix #3207)
- 00e6c82 Merge pull request #4117 from ririnto/fix/plan-subagent-hidden-registry
- 50ae2e1 perf(rules-injector): cache match decisions
- a4cd745 test(doctor): force unavailable lsp binary branch in CI
- 5ae0db0 fix(websearch): use Bearer auth for Exa MCP
- 364c7fe docs: note team mode fresh install fix
- 3640927 docs: add team mode fresh install note
- 03f04ca test(shared): isolate logger test overrides
- 21b782d test(plugin): cover fresh install team mode tools
- 9bae873 fix(plugin): log team tool registry state
- e5653f1 fix(config): log resolved team mode state
- 9560e93 docs: correct tool directory counts and lsp alias wording
- 7e777b0 chore(mcp): ship vendored lsp cli in npm artifacts
- 69371b7 test(mcp): stabilize lsp builtin and doctor checks
- f7b60e3 fix(mcp): harden lsp cli resolution and doctor disable checks
- 5555dbf Merge pull request #4133 from code-yeongyu/fix/3816-frozen-output-args
- b20e2c9 fix: refactor 5 additional aliased output.args mutations + strengthen audit test
- 61890f0 fix(rules-injector): bound parsed rule cache
- 46b965b fix(rules-injector): bound matcher cache
- 1ab1b54 perf(rules-injector): cache compiled glob matchers
- a7e5a65 Merge pull request #4131 from code-yeongyu/fix/3563-effort-max-pre-set-clamp
- 3a63a8b test(shared): add audit test forbidding direct output.args mutation + fix 9th site
- 13d8857 refactor(hooks): replace direct output.args mutation with replaceToolArgs (question/webfetch/null-byte)
- af66b8d refactor(hooks): replace direct output.args mutation with replaceToolArgs (env + prompt injectors)
- 63a3021 test(anthropic-effort): cover pre-set effort=max clamping for constrained providers (#3563)
- 96767b5 fix(anthropic-effort): clamp pre-set effort=max for constrained providers regardless of variant
- f72bb3f refactor(hooks): replace direct output.args mutation with replaceToolArgs (claude-code-hooks)
- 6bffb2c feat(shared): add replaceToolArgs helper for safe tool-args mutation
- b149ce5 docs: update AGENTS docs for MCP-backed LSP architecture
- 54eb396 chore(ci): init and build vendor lsp submodule in CI
- 8716ef4 refactor(plugin): drop lspManager lifecycle wiring
- ca51f61 refactor(tools): remove native LSP tool registry wiring
- c2c078f feat(mcp): register lsp tier-1 stdio MCP server
- 34e6af1 docs: update AGENTS guidance
- c4dd21e Merge pull request #4127 from code-yeongyu/fix/3997-notification-crash
- baa0470 Merge pull request #3870 from cvqluu/fix/3772-log-bloat-and-epipe-suppression
- 6037b91 Merge pull request #4122 from mguttmann/fix-4120
- 442cdeb docs: add Deepgram to sponsor list in README files
- 755f380 docs: update AGENTS.md metadata for v4.2.0 release
- 397ed10 fix(hooks): guard session-notification against missing ctx.$ (refs #3997)
- 4713a90 fix(shared): cap log file growth via size-based rotation
- 3294128 fix(background-agent): defer parent-wake when a user message just arrived (fixes #4120)
- 7285163 @ririnto has signed the CLA in #4117
- 19aaf5d fix(prompts): point planning guidance at plan subagent
- a163068 fix(delegate-task): restore hidden plan delegation
- e0d88ff Merge pull request #3713 from deopa0402/fix/stale-plugin-specifier-cache
- 9758168 test(auto-update): isolate cached version resolution
- 37d9d61 fix(auto-update): clean stale OMO cache roots
- babee92 Merge pull request #4109 from code-yeongyu/code-yeongyu/unify-prompt-async-routes
- 7a3a0a0 test(tmux): ignore unrelated pane runner mock calls
- 0f92d2c test(prompt-gate): narrow audit binding detection
- 98df0a4 docs(prompt-gate): document unified dispatch invariant
- 6768dec fix(session-recovery): fallback when stored unavailable-tool parts are absent
- 12bd658 refactor(prompt-async-gate): remove deprecated dispatch wrappers
- 1bbe065 refactor(prompt-callers): migrate shared and cli dispatch
- 989ab71 refactor(hooks): use unified internal prompt dispatch
- dd3feca refactor(plugin): use unified internal prompt dispatch
- fee515c refactor(prompt-callers): migrate team and call_omo_agent dispatch
- df198d8 refactor(background-agent): use unified internal prompt dispatch
- a42f894 refactor(prompt-async-gate): collapse dispatch into mode-based entrypoint
- b5d2461 test(prompt-async-gate): pin unified internal prompt dispatch contract
- f1a0ba2 Merge pull request #4108 from code-yeongyu/code-yeongyu/fix-idle-recovery-fanout
- 8bc4977 fix(slash-command): skip already tagged command output
- 55312cc fix(session-recovery): preflight idle recovery fanout
- 1fea761 Merge pull request #4106 from code-yeongyu/code-yeongyu/fix-stale-tool-hang
- a7b7ace fix(prompt-gate): block prompts into pending tool turns
- 6eb88a0 fix(session-recovery): prefer valid tool use ids
- 4d417a3 fix(process-cleanup): stop force-exiting opencode on transient unhandled errors
- f43effb fix(session-recovery): recover interrupted idle tool turns
- fbec112 fix(background-output): bound session.messages fetch to stop forever-hang during /init-deep
- 24261da Merge pull request #4103 from code-yeongyu/code-yeongyu/fix-prompt-hang-race
- f4f1efc fix(call-omo-agent): fail fast on lost prompts
- 7522314 Merge pull request #4096 from code-yeongyu/kimi-k2.6
- 412ac04 docs: add debugging journal for prompt hang investigation
- d8f365b test(guard): add merge-conflict guard to prevent unresolved git conflicts in source files
- 38702f6 Merge pull request #4094 from code-yeongyu/fix/opus-4.7
- c142066 Merge pull request #4093 from code-yeongyu/k2p6-turbo
- 67ead7b fix(dynamic-truncator): bound session.messages fetch to stop forever-hang on Read (#4086)
- fcd0011 test(atlas): track active timers instead of scheduled delays in setTimeout mock
- 2613de5 fix(prompt-async-gate): timeout isSessionActive to prevent infinite hang on stale SDK status
- 169e61f test(audit): allowlist build-team-idle-wake-hint-client.ts in prompt route audit
- a43215f fix(plugin/event): bind team-idle-wake-hint client methods to SDK Session
- 271878b perf(rules-injector): cache full candidates and memoize ancestor scans
- c25f752 perf(rules-injector): cache project root for visited ancestors
- f843f57 Merge pull request #4088 from code-yeongyu/fix/session-agent-map-cleanup
- 2b8782d fix(claude-code-session-state): clear session-agent map on delete and sync cleanup
- 25d8054 Merge pull request #4074 from code-yeongyu/fix/delegate-task-spawn
- c9ec11d bump comment-checker to 0.7.1
- d331861 fix(background-agent): clean child session-agent state on pre-start abort and normalize stored agent
- cc97a02 test(agents): drop unsafe AgentFactory cast and add typed empty skills
- 791fbf3 refactor(delegate-task): share buildSyncPromptTools between bootstrap and prompt dispatch
- ea5f6dd fix(call-omo-agent): register bootstrap and session agent before sync prompt dispatch
- 097d7dc fix(background-agent): keep delegated skill, permission, and child agent across retries
- ba64868 fix(runtime-fallback): carry delegated system and tools through bootstrap retry
- 761f682 refactor(delegated-bootstrap): accept optional system and tools
- 4f98138 feat: add ci test runner, session routing, bash parser, and test fixtures
- 166e5de @pizzav-xyz has signed the CLA in #4084
- 80fa177 Merge pull request #4075 from code-yeongyu/feature/migrate-sisyphus-to-omo
- 6573bd9 chore(workspace): move test discipline rule to omo
- 5a2c3bb fix(workspace): match omo guard paths cross-platform
- b5992b1 test(shared): stabilize port utility interface check
- cdac0d6 fix(workspace): report only the active notepad change
- 240a4a1 fix(workspace): harden omo migration review issues
- fbc5768 Merge pull request #3971 from MoerAI/fix/task-examples-add-run-in-background
- 82ec099 fix(atlas): match omo as a path segment
- 63519ec docs(workspace): document omo workspace paths
- f10f796 fix(workspace): keep omo and legacy rules compatible
- 36e373c feat(workspace): point planning guardrails at omo
- a86221b feat(workspace): store runtime state under omo
- 5dca1a5 feat(workspace): migrate legacy sisyphus state to omo
- 7c2e2fe fix(background-agent): redact task registry views
- 982fa81 fix(delegate-task): start child prompts reliably
- 76e573a Merge pull request #4073 from code-yeongyu/fix/team-create-permission-inline-spec
- d974cd3 test(hooks): repair stale retry harnesses
- cf7bf9d fix(team-mode): accept legacy inline specs
- a205405 Merge pull request #4068 from code-yeongyu/feat/pre-publish-fix-v420
- 3f3a63c docs(changelog): v4.2.0 entry with known issues and supersession history
- eba1744 test(mock-module-audit): require lifecycle cleanup for mock.module
- aaa215c docs(release-process): add post-fix repro verification policy
- 3435c9b docs(adr): write prompt-async-gate ADR
- 102d067 fix(model-suggestion-retry): release reservation on async error path
- 5a8bd05 test(prompt-async-gate): replace timer waits with deterministic sync (BLOCKER-3)
- 9dd52a0 docs(changelog): v4.2.0 entry covering BLOCKER + HIGH + KNOWN ISSUES
- 7dbb34c refactor(background-agent): wire ParentWakeNotifier into BackgroundManager
- 41ff7bc fix(background-agent): release prompt gate before agent fallback retry
- 209063e docs(known-issues): document delegate-task early-failure-fallback deferral
- 0f8902c docs(changelog): v4.2.0 entry
- 4848017 test(mock-module-audit): require lifecycle cleanup for mock.module
- 845d862 test(prompt-async-gate): replace setTimeout sleeps with deterministic sync
- f8d6f2a docs(known-issues): document delegate-task PR #3825 revert deferral
- c096a59 test(mock-module-audit): require lifecycle cleanup for mock.module
- 8914dab docs(known-issues): reference delegate fallback tracking issue
- 1590085 docs(release-process): add post-fix repro verification policy
- 0c27ecb docs(adr): write prompt-async-gate ADR
- 38732b4 docs(known-issues): document delegate-task empty-history fallback (BLOCKER-4)
- 0941ffe docs(release-process): add post-fix repro verification policy
- ee6bc67 docs(adr): write prompt-async-gate ADR
- d706587 docs(known-issues): document delegate-task early-failure-fallback deferral
- ff1b15d fix(model-suggestion-retry): release reservation before retry attempt
- c1ccf8d refactor(background-agent): introduce ParentWakeNotifier module
- 8c4cc09 test(prompt-async-route-audit): migrate to TypeScript AST walker
- f93d729 test(prompt-async-gate): cover dispatch timeout and post-dispatch error hold
- b333a52 fix(prompt-async-gate): add dispatch timeout, shared runner, harden prefix release
- a19c1bf chore(release): bump version to 4.2.0
- c067b0f refactor(plugin-entry): move createPluginModule to testing module
- 1723a8b Merge pull request #3500 from Disaster-Terminator/fix/tmux-defer-attach-until-focus
- e63c5b9 fix(tmux): require explicit active isolated window
- 1ff59f4 test(tmux): align pane-state runner format
- d02cca4 test(tmux): align pane replace placeholder expectations
- 54a7256 test(tmux): align placeholder command expectations
- 91f1cf5 fix(tmux): pin pane commands to /bin/sh
- 8c5ca73 fix(tmux): sweep suffixed stale isolated sessions
- 0c8e546 fix(tmux): support manager-scoped isolated session names
- 4e3684e fix(tmux): gate isolated pane activation on visible client focus
- c63108d fix(tmux): track placeholder panes before attach readiness
- 688bb55 fix(tmux): defer subagent attach until pane focus
- 6e5a127 Merge pull request #3840 from EnochLi15/codex/fix-tool-execute-after-boundary
- d116139 fix tool execute after hook boundary
- ad10450 Merge pull request #3841 from Momentum96/fix/background-manager-tmux-ordering
- df64f32 @boris-gorbylev has signed the CLA in #4057
- be25109 fix(continuation): skip internal user turns
- c580b8f fix(session): ignore internal synthetic turns
- e8de8b7 fix(team-mode): skip pending mailbox reinjection
- e90ff80 fix(tmux): treat busy sessions as attachable
- efb862c fix(tmux): prefer real tmux when session env exists
- 5238dd4 fix(background-agent): start promptAsync before blocking tmux callback
- a9a0032 Merge pull request #3497 from Disaster-Terminator/fix/reminder-hooks-preserve-state-across-compaction
- 291b1f7 test(reminder-hooks): clean up compaction regressions
- 672f5d6 fix(keyword-detector): skip synthetic turns
- 196f651 fix(team-mode): defer live mailbox acks
- 392c20e test(reminder-hooks): make delete reset regression diagnostic
- 29e7e97 test(reminder-hooks): cover delegated sessions across compaction
- 3db1da1 fix(reminder-hooks): preserve suppression state across compaction
- ae7ff3b Merge pull request #3891 from wjiuxing/feat/chinese-error-patterns
- 3e9b125 test(runtime-fallback): cover localized provider errors
- c206b16 feat: add Chinese error patterns to model-error-classifier
- 149a83d feat: add Chinese quota patterns to classifyErrorType
- adfa8be feat: add Chinese error patterns to RETRYABLE_ERROR_PATTERNS
- e24e495 Merge pull request #3322 from RaviTharuma/fix/runtime-fallback-equivalent-skip
- d9033d7 fix(runtime-fallback): keep variant in equivalence
- f501c47 fix(runtime-fallback): skip equivalent claude aliases
- f54888b Merge pull request #3576 from Disaster-Terminator/fix/background-busy-stall-detection
- 27788b4 fix(session-recovery): audit raw prompt aliases
- 4a1c260 test(todo-continuation): cover peer-message reservation holds
- 39fef20 fix(background-agent): resolve parent wake agent aliases
- 2bd4944 fix(prompt-gate): scope reservation releases
- b6caa5d fix(background-agent): correct stall timeout guidance
- 189af23 fix(background-agent): detect stalled active sessions
- 2eec0d9 Merge pull request #3319 from EZotoff/fix/remove-activity-stagnation-bypass
- 65c1283 fix(todo-continuation): clean up idle event diagnostics
- 68e9d54 fix(todo-continuation): remove activity-based stagnation bypass
- fe66c96 Merge pull request #4053 from code-yeongyu/supersede/3866-tool-result-schema
- b504fb1 fix(tool-pair-validator): emit schema-compatible synthetic tool results
- 24f7e56 Merge pull request #4051 from code-yeongyu/supersede/3952-first-prompt-watchdog
- 3199bd3 fix(runtime-fallback): broaden watchdog progress detection + harden test timing
- a130fa7 fix(runtime-fallback): add first-prompt watchdog for stuck subagents
- bda0452 Merge pull request #4029 from sandikodev/fix/json-error-recovery-exclude-todowrite
- f835244 Merge pull request #4047 from PeterPonyu/fix/3894-skip-tmux-layout-when-server-unreachable
- e66d60f Merge pull request #3773 from cailgarrisk-collab/fix/glm-rate-limit-fallback-statuscode
- 5cda8b8 Merge pull request #3330 from codeg-dev/fix/isplan-display-name-getAgentConfigKey
- a328343 Merge pull request #3299 from kilhyeonjun/fix/claude-code-settings-hooks-not-executed
- 0036c20 Merge pull request #3934 from Qihao0v0/fix/unifyllm-quota-classifier
- c6054af Merge pull request #3872 from x-x-gpu/dev
- 7da4423 Merge pull request #4049 from code-yeongyu/supersede/3790-session-firstmessage-no-clear
- 9f6b681 fix(hooks): do not clear sessionFirstMessageProcessed on session.idle
- bd3928e fix(team-mode): skip tmux layout when opencode server unreachable
- ac66a43 Merge pull request #4046 from code-yeongyu/fix/3494-strip-zwsp-before-promptasync
- 7caf74a fix(atlas,todo-continuation): strip ZWSP sort prefix before promptAsync agent
- 2b43147 Merge pull request #4045 from code-yeongyu/supersede/3901-call-omo-agent-display-name
- 10f721d fix(call-omo-agent): translate config-key subagent_type to display name before SDK dispatch
- 437a8ed Merge pull request #4007 from PeterPonyu/feat/runtime-fallback-internal-abort
- 5e7ee94 Merge pull request #3982 from jas32096/fix/category-fallback-ignored-when-primary-set
- 83ab000 Merge pull request #3972 from MoerAI/fix/circuit-breaker-tool-input-fallback
- e2b8e49 Merge pull request #4044 from code-yeongyu/revert/3825-delegated-bootstrap
- 3c7d129 Revert "Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback"
- cd33f3a Merge pull request #3825 from tw-yshuang/fix/delegated-child-session-early-failure-fallback
- 521c99c Merge pull request #3950 from ismetanin/fix/surface-subagent-quota-error
- f00a693 Merge pull request #3947 from MoerAI/fix/process-cleanup-opt-out-env
- c3319c7 Merge pull request #3470 from omer-koren/fix/thinking-block-modified-recovery
- 984b8c1 Merge pull request #4032 from PeterPonyu/fix/3996-tool-pair-validator-background-sessions
- 15b0a41 Merge pull request #4043 from code-yeongyu/fix/session-recovery-stale-error-dedupe
- 8e9dea9 fix(session-recovery): persist dedupe across stale repeated session.error
- cb87385 test(ci): isolate runtime and rules dependencies
- a02686e test(ci): remove suite-order mock coupling
- f1fb1e0 fix(ralph-loop): send registered agent display name on continue
- b3b2da8 test(ci): avoid global module mock leaks
- 8dcbccf fix(tmux): inject pane action dependencies
- 7a94cc7 fix(background-agent): stabilize parent wakes
- c0544a7 fix(background-agent): defer retry notifications
- 462b55e Merge pull request #4040 from code-yeongyu/cleanup/typescript-ai-slop-20260515
- a9886cc refactor(plugin): remove metadata assertions
- 0a3d187 refactor(tools): narrow optional values
- d92e78c refactor(sdk): narrow response fallbacks
- 4785767 refactor(interactive-bash): reuse tmux parser
- 150ccef fix(delegate-task): allow hidden plan task
- c25cb8d fix(background-task): clarify task id contracts
- 15e7330 fix(team-mode): gate status injection by keyword
- 1e7a7a2 Merge pull request #4037 from code-yeongyu/fix/internal-initiator-dedupe
- cd1c1a5 fix(background-agent): avoid branched parent wakes
- 9f6d0d2 docs(agents-md): refresh hierarchical knowledge base for v4.1.2
- 3dd8a5c chore(rules): forbid flaky tests, time sleeps, and prompt pinning
- 53a7406 no prompt async
- ced722e Merge pull request #4034 from code-yeongyu/fix/promptasync-duplicate-output
- c2aa180 fix(prompt-gate): pin duplicate prompt dispatches
- 0518970 fix(prompt-gate): hold reservations after dispatch
- c6e3b7e docs(agents-md): warn on prompt injection
- edf3e53 fix(hooks): gate sync injected prompts
- 0b48f80 fix(call-omo-agent): gate reused sync prompts
- 439e728 fix(runtime-fallback): gate retry prompts
- 30adce9 fix(prompt-gate): share message reservations
- dd6271b fix(babysitter): gate reminder prompts
- a524754 fix(todo-continuation): gate idle prompts
- b0b6118 fix(ralph-loop): gate continuation prompts
- 960baf3 fix(atlas): gate boulder continuation prompts
- b0a484b fix(session-recovery): gate resume prompts
- db28a32 fix(recovery): gate compaction prompts
- c75f548 fix(fallback): gate model retry prompts
- f1a62a9 fix(team-mode): gate member wake prompts
- 174cbd0 fix(background-agent): gate parent wake prompts
- b2fdd72 fix(prompt-async): add session idle gate
- 2567415 Merge pull request #4033 from code-yeongyu/perf/ci-test-build-time-20260515
- 7ae8207 Merge pull request #4030 from code-yeongyu/fix/promptasync-concurrency-20260515
- 23dfe7e fix(fallback): skip duplicate fallback re-arms
- 53de295 perf(ci): add sharded test runner phases
- b7482ea test(fallback): type chat output assertions
- 26bb623 fix(fallback): preserve provider-specific fallback retries
- 005d16d fix(fallback): dedupe providerless fallback errors
- da33920 fix(fallback): dedupe overlapping fallback continuations
- 17030b9 Prevent subagent repair from corrupting background sessions
- c6c7a10 Merge pull request #4015 from code-yeongyu/fix/background-output-bg-id-20260514
- 8f90c1e fix(background-task): log missing output retry
- d035559 @sandikodev has signed the CLA in #4029
- c76ac27 fix(json-error-recovery): add todowrite/todoread to JSON_ERROR_TOOL_EXCLUDE_LIST
- bd2f105 @scw1109 has signed the CLA in #4020
- ec7168e fix: respect default_agent in sort shim ordering (#3900)
- d865286 Merge remote-tracking branch 'origin/dev' into fix/background-output-bg-id-20260514
- ca178f4 Merge pull request #4016 from code-yeongyu/fix-bg-noti-coalesce
- 9b279d2 chore(deps): sync lockfile metadata
- 268c89c fix(background-agent): coalesce rapid-fire idle parent notifications
- 1ea192b fix(background-task): retry transient missing output tasks
- b9beea1 feat(team-mode): drive immediate teardown and recreate-to-reshape loop
- 5b99a87 fix(runtime-fallback): preserve attemptCount when our own abort is the cause (closes #4006)
- 711b753 fix(delegate-task): honor user fallback_models when category primary is unreachable
- 83c3379 Merge branch 'dev' into fix/surface-subagent-quota-error
- 12f5233 merge(dev): resolve latest manager and runtime-fallback conflicts
- 5cd95cf fix(background-agent): fall back to partInfo.input when state.input is unavailable for circuit breaker (fixes #3962)
- c4e88d6 fix(agents): add run_in_background to category task() examples in prompts (fixes #3960)
- 1e1f574 merge(dev): resolve latest sync-task conflict for delegated fallback PR
- ecb92c1 fix(runtime-fallback): abort stuck subagent on quota error with no fallback
- dd68f32 fix(background-agent): add OMO_DISABLE_PROCESS_CLEANUP env opt-out for global handlers (fixes #3856)
- 583fa24 fix(runtime-fallback): classify localized balance failures
- 74171b9 merge(dev): resolve background-agent delegated fallback conflicts
- 291eeed fix(delegate-task): preserve late background session wiring on abort
- 0b9cc80 fix: pass resolved model to session.create so sub-agent sessions use the correct model
- fac90d6 fix(delegate-task): harden child-session fallback bootstrap and cleanup
- 61d2f11 fix(model-fallback): add HTTP statusCode check for GLM rate limit fallback
- b6ad494 fix(session-recovery): detect and recover from 'thinking block modified' errors
- 23d1257 fix(delegate-task): apply getAgentConfigKey normalization to isPlanAgent
- fe1cfd8 fix: preserve accumulated modifiedInput and common fields on deny/ask from exit code paths
- 5d8bd99 fix: accumulate modifiedInput and common fields from allow hooks
- e0d611a revert: remove incorrect claudeCodeHooks override in createHooks, add pre-tool-use tests
- 5aeb568 fix: don't early-return on 'allow' in executePreToolUseHooks
- 3b5745a 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