v4.5.0 — Publish Safety & Internal Refactor
This release hardens runtime safety (fallback loops, parent-wake stalls, publish payload) and lands the long-running prompts-core refactor that splits every agent/mode prompt into versioned markdown.
🛡️ Publish Safety Hardening
Three guard rails that close production-impact pre-publish gaps:
- runtime-fallback no longer trusts
isRetryable: trueon 4xx errors. If a provider mis-tagged a 401/403/404 as retryable, every configured fallback model would burn in an infinite loop. The signal is now gated to absent status codes, 5xx, the configuredretry_on_errorslist, and{408, 425, 429}. - parent-wake escapes a second stuck state. When the assistant's text stream died mid-message with no pending tool call, parent-wake deferred forever and background-agent completions never reached the parent. A bounded escape path now dispatches after
toolCallDeferMaxMs. - npm payload blocks internal-only assets. Nested
.npmignoreper published dot-directory + a newscript/package-layout-exclusion.test.tspermanent guard. Drop a__draft-foo/SKILL.mdinto.opencode/skills/and CI fails before it ships to npm.
🔁 Ralph-Loop Liveness
Three independent stuck-state escapes for ralph-loop:
- Oracle dispatch wait is now time-bounded (30-minute hard ceiling); previously a crashed/OOM-killed oracle session would freeze the loop forever.
- Loop auto-stops when the latest assistant turn made zero model progress (both token counts at zero AND no assistant content).
- The double-fire race fix no longer ignores in-flight oracle dispatches that never complete.
📞 Background-Agent Delivery
Four fixes converge on one outcome — completion alerts get through:
- Debounced active parent wake flushes (no more thundering herd on burst completion).
- Completion wakes deliver during active parent turns instead of being silently dropped.
- Dispatched parent wake failures are isolated so one failure does not cascade.
- Atlas subagents retry on provider usage-limit errors (no more dead-end runs).
👥 Team-Mode UX
- Leaders now wake on unread mailbox messages (#4464). Idle leads no longer sleep through worker pings.
- Model overrides preserved across team-mode boundaries.
- Lead closes teams on its own initiative — no more lingering teams burning session / mailbox / member-turn budget.
🧠 Prompts-Core Migration (50+ commits, zero user-facing API change)
Every agent and mode prompt now lives in versioned markdown under packages/prompts-core/:
- Atlas: 5 variants (default / GPT / Gemini / Kimi / Opus-4.7)
- Prometheus: full prompt + variant table
- Ultrawork: 4 variants (default / GPT / Gemini / planner)
- Mode prompts: search / analyze / team / hyperplan
Companion dist-bundle test scans the built bundle for unique prompt signatures; a future Bun upgrade that silently regresses markdown inlining will fail CI loudly instead of breaking installs at first agent load.
🔧 Continuation + Validators
fix(continuation): resolves registered agent names before dispatching prompts (#4417) — fixes the empty-string bug when display names like"Atlas - Plan Executor"were used.fix(prompt-async-gate): retry object-form path on runtime type errors (#4417).fix(thinking-block-validator): avoid duplicate thinking prepends (#4374) — kills the dual-thinking-streams race.
🩺 Doctor + Help JSON Schemas
oh-my-opencode doctor, sandbox, status, and acp now expose JSON schemas for their help output — enables shell completion, structured CLI introspection, and --help consistency.
🏗️ Internal Package Layering
Workspace split into 9 published packages: utils / model-core / prompts-core / rules-engine / agents-md-core / ast-grep-core / comment-checker-core / hashline-core / boulder-state. Internal cleanup — no breaking changes to the plugin API.
🌐 Web
- Marketing site canonical domain migrated to omo.dev.
- README translations refreshed for ja / ko / ru / zh-cn.
🙏 Reviewer Note
This release was gated by a publish-debate-vortex hyperultradebate — 6 hostile category-member agents (quick / unspecified-low / unspecified-high / deep / ultrabrain / artistry) cross-attacked the 103-commit changeset across 3 rounds. The 3 must-fix blockers it identified — runtime-fallback boolean guard, parent-wake stuck escape, npm payload exclusion — all landed in this release.
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-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
- 52ba125 Merge branch 'fix/pre-publish-blockers-v4.5.0'
- 8e28e29 fix(package): block internal-only assets from publish payload
- 5c0cc0d @Hungdoan565 has signed the CLA in #4492
- ec552bc fix(ralph-loop): stop loop when latest assistant turn made no model progress
- 9810bad docs(publish-skill): pin Jobdori bot ID in Discord release commands
- 91aa915 @fcmfcm01 has signed the CLA in #4482
- be2ed2b Merge pull request #4479 from code-yeongyu/fix-4470-momus-cancels-main
- 3b421c6 fix(background-agent): isolate dispatched parent wake failures
- b03e08b Merge pull request #4478 from code-yeongyu/fix-4164-bg-reminder-timing
- e1fde71 Merge pull request #4477 from code-yeongyu/fix-4374-dual-thinking-streams
- ec7ce51 fix(background-agent): debounce active parent wake flushes
- 6a56144 fix(background-agent): deliver completion wakes during active parent turns
- e443e86 fix(thinking-block-validator): avoid duplicate thinking prepends
- 037d017 Merge pull request #4476 from code-yeongyu/fix-4464-team-leader-wake
- 3e09910 @2wndrhs has signed the CLA in #4475
- 58025f9 fix(team-mode): wake leaders on unread mailbox messages (#4464)
- 759b566 Merge pull request #4474 from code-yeongyu/fix-4441-omo-evidence-ignore
- 3e11594 chore(repo): untrack .omo/evidence and .omo/notepads per .gitignore
- dc05074 @hanakokoizumi has signed the CLA in #4467
- 939f2b8 @SoShymKing has signed the CLA in #4469
- 03eb9ff Merge pull request #4465 from code-yeongyu/fix-4417-atlas-path-and-start-work
- 28efc4e fix(continuation): resolve registered agent name before dispatching prompt (#4417)
- a5cee76 fix(prompt-async-gate): retry object-form path on runtime type error (#4417)
- c25c338 Merge pull request #4454 from code-yeongyu/fix-4448-npm-pack-dot-dirs
- 94d9d93 Merge pull request #4453 from code-yeongyu/fix-4419-atlas-subagent-fallback
- 0d0be43 Merge pull request #4452 from code-yeongyu/fix-4449-tool-execute-after-stall
- 9c56bf2 test(script): typecheck package layout regression
- 72119b3 fix(package): ship dot-directory command assets
- f57532c fix(tool-execute-after): narrow metadata warning tools
- dc845a8 chore(web): migrate canonical domain to omo.dev
- 6551f38 fix(background-agent): retry Atlas subagents on usage limits
- 767f5a6 fix(model-core): retry OpenAI usage_limit_reached fallbacks
- 6343feb Merge pull request #4450 from code-yeongyu/fix-4447-subagent-task-deny
- 4a68db0 fix(tool-execute-after): gate metadata recovery warnings
- 75d1ff4 fix(plugin-handlers): deny task for read-only subagents
- 9be97de Merge pull request #4435 from code-yeongyu/fix/issue-4429-team-mode-model-override
- 9fd52cb feat(help): #689 acp help JSON schema
- eed88e4 feat(help): #689 acp help JSON schema
- bab9caa feat(help): #688 sandbox help JSON schema
- 1fdb88a feat(help): #688 sandbox help JSON schema
- 2c6c42f feat(help): #687 status help JSON schema
- 36e394a feat(help): #687 status help JSON schema
- a73e4db feat(help): #686 doctor help JSON schema
- 21713dc fix(agents): preserve model overrides with team mode
- 776da68 feat(help): #686 doctor help JSON schema
- ce4b11b fix(cli): add explicit helpOption configuration for consistent help-flag ordering
- 3e0a975 test(dist-bundle): assert inlined prompt content survives bundling
- 14b3523 fix(ralph-loop): time-bound oracle dispatch wait to prevent stall
- 69c955f fix(parent-wake): bound assistant-text defer to escape stuck sessions
- f05e0cb fix(runtime-fallback): gate retryable signal on status-code allowlist
- 222adeb fix(runtime-fallback): honor retryable signal
- de7f1d8 Merge pull request #4400 from code-yeongyu/refactor/prompts-core-oracle-cleanup
- 8f09c02 docs: scrub remaining references to migrated files
- d18cadb test(ultrawork): add byte-exact characterization test
- e0b37b4 test(prometheus): add byte-exact characterization test
- 9d20425 docs(keyword-detector): rewrite AGENTS.md for prompts-core migration
- 87e28d2 docs(prometheus): rewrite AGENTS.md for thin-loader structure
- 640d7f7 Merge pull request #4396 from code-yeongyu/fix/session-scoped-internal-wake
- 3d0b4c4 fix(parent-wake): block unfinished assistant wakes
- 2ea7c49 Merge pull request #4390 from code-yeongyu/refactor/prometheus-to-prompts-core
- 1f32b88 refactor(prometheus): remove migrated section TypeScript files
- 8fc429a refactor(prometheus): load prompt variants from prompts-core
- 3806d93 feat(prompts-core): wire Prometheus variant table
- fa0500e feat(prompts-core): add Prometheus prompt markdown variants
- 4749eab Merge pull request #4389 from code-yeongyu/refactor/mode-prompts-to-prompts-core
- 803f030 Merge remote-tracking branch 'origin/dev' into refactor/mode-prompts-to-prompts-core
- 528f083 Merge pull request #4388 from code-yeongyu/refactor/atlas-to-prompts-core
- 63ef72d docs(agents): document prompts-core mode prompts
- 80361c0 chore(prompts-core): wire markdown prompt packaging
- 2c8e2da refactor(mode-prompts): migrate hyperplan prompt
- e79baf5 refactor(mode-prompts): migrate team prompt
- 3b7f51d refactor(mode-prompts): migrate analyze prompt
- 5cefbdb refactor(mode-prompts): migrate search prompt
- c187dba test(keyword-detector): capture mode prompt baselines
- 8451ecd docs(atlas): document prompts-core prompt ownership
- 582c768 refactor(atlas): remove migrated TypeScript prompts
- 4975c35 refactor(atlas): load prompt variants from prompts-core
- 96a9365 build(prompts-core): bundle markdown prompt variants
- 91351d7 feat(prompts-core): support bundled prompt sources
- b77fed2 feat(prompts-core): add Atlas Opus 4.7 prompt markdown
- 2adcec8 feat(prompts-core): add Atlas Kimi prompt markdown
- d5995b3 feat(prompts-core): add Atlas Gemini prompt markdown
- 1923761 feat(prompts-core): add Atlas GPT prompt markdown
- 565d099 feat(prompts-core): add Atlas default prompt markdown
- a92e25a test(atlas): add prompt byte preservation baselines
- 6644524 Merge pull request #4386 from code-yeongyu/refactor/ultrawork-to-prompts-core
- 79beeee docs: document ultrawork prompt markdown location
- d217efc build(prompts): inline markdown prompt imports
- e772c46 refactor(ultrawork): move planner prompt to prompts-core
- e51acd0 refactor(ultrawork): move gemini prompt to prompts-core
- a818bbd refactor(ultrawork): move gpt prompt to prompts-core
- 9c366cc refactor(ultrawork): move default prompt to prompts-core
- 39b3cbc chore(ultrawork): capture prompt baseline hashes
- 46ad6bf Merge pull request #4385 from code-yeongyu/refactor/prompts-core-foundation
- 436c618 fix(prompts-core): block prompt path traversal
- 74d5f70 chore(prompts-core): wire package typecheck
- da0fa83 test(prompts-core): audit opencode coupling
- c44a6bd feat(prompts-core): add prompt loader
- 6301bcf feat(prompts-core): add variant resolver
- 4338ddb feat(prompts-core): add package skeleton
- 87de056 refactor(model-core): move model family detectors
- e1e9f34 Merge pull request #4382 from code-yeongyu/feat/ultrawork-prompt-tdd-evidence-tightening
- d073bf1 feat(ultrawork): enforce TDD, scenario contract, durable notepad, reviewer gate
- 39a549a Merge pull request #4381 from code-yeongyu/fix/team-mode-closure-prompts
- 5f1fb0c fix(team-mode): make lead close teams on its own initiative
- a4dcbb6 docs(publish): use Jobdori bot for releases
- 1473f93 Merge pull request #4380 from code-yeongyu/fix/ralph-loop-oracle-double-fire-race
- 9a1dd75 fix(ralph-loop): skip handleFailedVerification when oracle dispatch is in flight (#4256)
- 3523dab @niStee has signed the CLA in #4378