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
- c5b6d59 Merge pull request #3227 from code-yeongyu/fix/installer-and-auto-update
- d781b75 Merge pull request #3226 from code-yeongyu/fix/plan-progress-and-trust
- bdf6e41 Merge pull request #3225 from code-yeongyu/fix/agent-name-safety
- c37e440 Merge pull request #3224 from code-yeongyu/fix/oauth-wiring
- e1cbbed Merge pull request #3223 from code-yeongyu/fix/core-runtime-bugs
- 5abab08 test(tmux): add missing tmux exports to zombie-pane mock module
- 7f8ed7b test(tmux): add missing tmux exports to zombie-pane mock module
- 600d68d test(tmux): add missing tmux exports to zombie-pane mock module
- d53be83 test(tmux): add missing tmux exports to zombie-pane mock module
- 4c0225a test(tmux): add missing tmux exports to zombie-pane mock module
- 2f4bd48 fix(ci): isolate mock.module tests per-file to prevent cross-contamination
- 9fb7cfb fix(ci): isolate mock.module tests per-file to prevent cross-contamination
- 28b9f77 fix(ci): isolate mock.module tests per-file to prevent cross-contamination
- dc1546c fix(ci): isolate mock.module tests per-file to prevent cross-contamination
- 70955b2 fix(ci): isolate mock.module tests per-file to prevent cross-contamination
- 85fa939 test(skill-mcp): fix connection env var tests after oauth-handler import changes
- 119c233 test(background): fix variant propagation test to match parent-context resolution
- 6d8d82d fix(installer): enforce minimum OpenCode version check during install
- 389b194 fix(installer): actually upgrade pinned plugin version instead of preserving old entry
- bbbbf68 fix(ralph-loop): update template to reflect 500 iteration cap
- 0cb938e fix(boulder): count only top-level checkboxes in simple-mode plan progress
- aa0de17 fix(start-work): preserve non-ASCII characters in plan name normalization
- 001d29e fix(skill-mcp): treat opencode-project and local scopes as untrusted for env var access
- 15e3b14 fix(auto-update): match both canonical and legacy plugin names in entry finder
- 359f741 fix(delegate-task): strip ZWSP from agent names on background launch path
- 917ae4d fix(keyword-detector): narrow ULW auto-start to leading keyword position only
- 0479693 fix(oauth): wire post-request 401/403 handler into skill-mcp withOperationRetry
- 63ba16b fix(oauth): wire refresh mutex into provider.refresh() for concurrent deduplication
- 80c74c8 fix(background): prevent double-decrement of descendant quota in processKey error cleanup
- 1cf4119 fix(background): use parent session variant in notifyParentSession instead of child task variant
- ed16dc0 fix(chat-params): complete maxOutputTokens migration in session prompt params
- 06b825d fix(start-work): reuse registered opencode agent names
- 2462964 fix(start-work): use canonical display name for command routing
- 8925ec3 fix(start-work): align command routing with exported agent keys
- 4394129 fix(compaction): harden continuation directive markers
- cd95172 fix(start-work): keep native command agents on config keys
- aa1a18c Merge pull request #3218 from code-yeongyu/fix/3216-plugin-scope-filter
- b285672 fix(plugin-loader): filter project-scoped plugins by cwd
- c2816e7 @dhruvkej9 has signed the CLA in #3217
- d22c3f2 test(plugin-interface): fix Atlas display name expectation
- 2c6a161 test(runtime-fallback): fix OpenAI auto-retry test expectations
- 902b2f9 test(ci): update workflow test to match actual CI command
- 4d9652c test(start-work): update display name expectations for ZWSP fix
- 94449e0 test(delegate-task): update isPlanAgent test for exact match fix
- 1a04a6e test(ralph-loop): update iteration cap expectation to 500
- ab0e1e3 fix(oauth): refresh-once handler for 401/403 responses
- 7ba41d3 fix(oauth): atomic storage writes for token safety
- 7be285e feat(oauth): add per-server refresh mutex
- cdd6e88 fix(installer): add upgrade path safety checks
- 01f7d5e feat(installer): export version compatibility and backup utilities
- 2f86a17 feat(installer): add config backup utility for safe upgrades
- 7022a7e feat(installer): add version compatibility checking utilities
- a09b905 fix(installer): add installedVersion to DetectedConfig type
- d490b4d fix(ralph-loop): harden Oracle VERIFIED detection
- 0bf5dc2 fix(token-limit): normalize detection across providers
- c3fe0ae fix(background): propagate variant in parent notifications
- 14f4390 fix(ultrawork): add iteration cap to prevent infinite loops
- 8090ee6 fix(compaction): persist recovery cap across cycles
- f2fac9b test(runtime-fallback): update tests for quota STOP classification
- 8169dbe docs: update for v3.16.0 release
- b7d9521 feat(installer): add opencode v1.4.0 minimum version check
- 35f778d test(skill-mcp): add scope field to test fixtures
- fa140b0 fix(skill-loader): propagate scope to MCP connections
- 5e0bd87 test(runtime-fallback): add provider matrix quota tests
- 05efb20 feat(skill-mcp): add scope field to connection types
- b81fdef fix(skill-mcp): redact sensitive data from connection errors
- 7751402 fix(runtime-fallback): classify quota exhaustion as STOP not retryable
- a419857 fix(delegate-task): use exact match for isPlanFamily to allow Metis/Momus
- 78e6d78 fix(plugin): verify event hook compatibility with v1.4.0
- e52dd34 fix(plugin): migrate chat.params to maxOutputTokens for v1.4.0
- e8d83b5 fix(zwsp): strip zero-width chars in delegate-task tools
- 317e2c6 fix(zwsp): strip zero-width chars in start-work-hook
- 3724093 fix(zwsp): strip zero-width chars from agent headers in command-config-handler
- 130e67a fix(zwsp): strip zero-width chars in boulder-continuation-injector
- 5188df9 fix(types): revert task-tool type inference workarounds
- 18771c8 fix(schema): restore z.toJSONSchema native v4 API
- f4eabf9 chore(deps): upgrade @opencode-ai/{plugin,sdk} to 1.4.0 and restore zod v4
- 9a9b5be @teneburu has signed the CLA in #3203
- 8f129eb fix(test): update plugin tests to use getAgentListDisplayName for agent assertions
- 0452343 fix(start-work): use getAgentListDisplayName for Atlas agent selection
- 557c2db feat(start-work): add plan name normalization and quote stripping
- 83a80e2 fix(ci): add skipLibCheck to script tsconfig to avoid bun-types/@types/node conflicts
- a00fe13 fix(test): update normalizeAgentForPrompt expectations to dash format
- dcecf04 Merge pull request #3189 from code-yeongyu/fix/issue-3146
- 6eb527c fix: remove ZWSP from agent display names (#3146)
- b269f11 Merge pull request #3181 from code-yeongyu/fix/issue-3144
- 2f19cd2 Merge pull request #3178 from code-yeongyu/fix/issue-3164
- b77c256 fix(jsonc): strip BOM before parsing (#3164)
- bb1bad8 fix(cli): include fallback_models when writing agent model config (#3144)
- e8c8376 fix(boulder): support both structured and simple plan formats in getPlanProgress
- cf04f51 Merge pull request #3185 from code-yeongyu/fix/issue-2462
- 62cc74b Merge pull request #3187 from code-yeongyu/fix/issue-2687
- 4e6e761 Merge pull request #3186 from code-yeongyu/fix/issue-2689
- 505c7ef Merge pull request #3184 from code-yeongyu/fix/issue-3163
- aade99e Merge pull request #3183 from code-yeongyu/fix/issue-2932
- d64cd66 Merge pull request #3182 from code-yeongyu/fix/issue-2964
- 2465205 fix: propagate project skills to background task sessions (#2687)
- fc009ca fix: register custom user agents in delegate-task resolver (#2689)
- a9c7398 fix: detect token-limit errors in todo-continuation to prevent infinite loop (#2462)
- ee8410c fix: allow variant override even with agent model config (#3163)
- 5622d15 fix: prevent background agent race condition in session prompt (#2932)
- b2e7ddf fix: inject agent identity into system prompt for built-in agents (#2964)
- be56290 Merge pull request #3179 from code-yeongyu/fix/issue-3066
- b4b9aea Merge pull request #3177 from code-yeongyu/fix/issue-3168
- 062b8cd Merge pull request #3169 from code-yeongyu/fix/sisyphus-junior-model
- 6ebe1bf Merge pull request #3176 from code-yeongyu/fix/issue-3113
- 5b53f6f Merge pull request #3175 from code-yeongyu/fix/issue-3129
- 5db6bfd Merge pull request #3174 from code-yeongyu/fix/issue-3033
- b4baec7 Merge pull request #3173 from code-yeongyu/fix/issue-3081
- 0ab2370 fix(start-work): add CHECKED_CHECKBOX_PATTERN for plan progress tracking (#3066)
- 73d407f fix(mcp): bypass env var allowlist for trusted skill MCP configs (#3168)
- 717c976 fix(keyword-detector): start ralph-loop when ulw keyword detected (#3113)
- eb8d719 fix(auto-update): align PACKAGE_NAME with published package name (#3129)
- b1c536d fix(look-at): make multimodal-looker prompt conditional on Read availability (#3033)
- aa528e4 fix: propagate variant field in all promptAsync continuation paths (#3081)
- bf2c104 Merge pull request #3172 from code-yeongyu/fix/bom-strip-jsonc
- daae6ed fix(jsonc-parser): strip UTF-8 BOM before parsing to fix Windows "InvalidSymbol at offset 0" errors
- 889294a fix(model-fallback): respect user model override for sisyphus-junior category sessions (#2941)
- 12106ff Merge pull request #3167 from code-yeongyu/fix/agent-header-validation
- f8c6260 fix(agent-names): use HTTP-header-safe display names and config keys for API calls (#3138)
- ebfd4a4 Merge pull request #3166 from code-yeongyu/fix/delegate-description-optional
- bd37e66 fix(delegate-task): make description optional with auto-generation from prompt (#3162)
- 10eb8b9 @Melivo has signed the CLA in #3160
- 3e8fd5f fix(start-work): always hand off to atlas regardless of current session agent (#3155)
- 23180c6 fix(schema): use zodToJsonSchema instead of z.toJSONSchema for zod v3 compat
- b7c8a00 fix(tests): isolate atlas background launch client setup
- 1928097 fix(tests): stabilize prometheus md-only state
- 41af547 fix(schema): use Zod native JSON schema output
- 0340993 fix(tests): inject plugin loader dependencies
- 320dc02 fix(tests): inject create-managers dependencies
- 0de7453 fix(tests): fix globalThis.fetch pollution between test files
- e62d5d7 fix(agents): strip ZWSP ordering prefixes in session state, config lookups, and override protection
- 178b635 feat(agents): add ZWSP stable-sort prefixes for core agent list ordering
- 88280d0 fix(agents): keep prometheus and atlas in canonical core order
- 0c1202e fix(tests): resolve CI test isolation failures in OAuth refresh and ralph-loop
- 61083d4 fix(oauth+errors): OAuth silent refresh, quota STOP patterns, compaction loop cap
- 6c4e0b6 fix(agents): enforce Sisyphus->Hephaestus->Prometheus->Atlas assembly order
- 56f2a9d fix(ralph-loop): detect oracle VERIFIED tool results in session messages
- 137c245 fix(prompt): prevent immediate BackgroundOutput polling after background task launch
- 5ad011d fix(compaction): cap recovery attempts to prevent infinite compaction loop (#3127)
- f69234a fix(error-classifier): quota/billing errors are non-retryable STOP (fixes #3126)
- 9438c89 Merge pull request #3148 from MoerAI/fix/remove-installer-subscription-upsell
- bd723b5 fix(tests): repair test regressions from zod v3 downgrade
- 4659f14 fix(tests): update model-fallback snapshots after installer fallback chain fix
- 213cee2 fix(types): resolve zod v3 type inference differences in task tools
- 2052694 fix(deps): downgrade zod to v3 for opencode compatibility (#3151)
- 22d0895 Merge pull request #3136 from andrescera/fix/atlas-zwsp-header-leak
- f69bb45 fix(cli): dedupe generated installer fallback models
- 57b1529 fix(cli): preserve installer fallback chains in generated config (#3144)
- 2f10ff4 fix(cli): replace subscription upsell with informational note (fixes #3069)
- b482e6c fix: remove ZWSP sort prefix from Atlas agent name
Thank you to 2 community contributors:
- @andrescera:
- fix: remove ZWSP sort prefix from Atlas agent name
- @MoerAI:
- fix(cli): replace subscription upsell with informational note (fixes #3069)