🩹 The ulw-loop Memory Leak Is Fixed
If a long ultrawork run ever ballooned your RAM or spun up a swarm of stuck bun processes, this release is for you. What looked like one "memory leak" was actually two separate bugs, and both are now gone:
- Fork-bomb stopped. A broken install could make the
omoruntime wrapper call itself in an infinite loop —wrapper → CLI → wrapper → …— spawning thousands of wedged processes until memory ran out. Delegation now carries a one-hop sentinel and refuses to target a generated wrapper, so the chain can never recurse. - Ledger no longer bloats. Every steering entry used to embed the full plan four times, so
.omo/ulw-loop/ledger.jsonlgrew quadratically over a long run. Entries now store a compact snapshot of only the goals that changed — a real 189 KB entry dropped to 7.8 KB (~24× smaller), and reads/dedup stream the file instead of loading it all into memory. - No more stuck child processes. The senpi
ulw-loop statusspawn no longer wedges on a full stderr pipe; it runs detached with a 30-second hard timeout.
🛠️ Release Pipeline Hardening
This version also repairs the publish pipeline itself: npm is pinned off a broken npm@12.0.0 (which crashed provenance publishing), and the release process now keeps the omo-senpi package version in lockstep with the root on every bump.
Plus the accumulated fixes since 4.16.0 — Bun runtime regression (#3824), planner correctness (#5481), pinned-version mismatch warnings (#4734), and more (see below).
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.
- Install and publish workflow hardening, including safer release sequencing and package/install fixes.
Commit Summary
- 9036899 fix(codex): show version in hook statuses
- c754cab fix(codex): limit git bash hooks to windows
- a4e29f5 Merge pull request #5993 from code-yeongyu/ci/pin-npm-sigstore
- 8289997 ci(publish): pin npm to 11.18.0 to fix provenance sigstore crash
- 06c8a71 Merge pull request #5990 from code-yeongyu/release/v4.16.1-source-state
- f4b0dad Merge pull request #5989 from code-yeongyu/fix/ulw-loop-memory-fork-bomb
- 0cbb0a5 fix(codex): guard ulw-loop delegation against fork bomb recursion
- f7ea729 fix(codex): compact ulw-loop steering ledger to end quadratic growth
- 7421e1b Merge pull request #5980 from code-yeongyu/code-yeongyu/fix-3824-bun-runtime-regression
- 997d802 test(omo-opencode): audit raw bun module imports
- 216301f Merge pull request #5979 from code-yeongyu/feature/xterm-tui-qa-harness
- e3082fd fix(opencode): route Bun runtime calls through shims
- 0806e41 docs(qa): route TUI visual evidence to the xterm.js web terminal, forbid tmux
- 406ccdf feat(qa): render TUI evidence through real xterm.js + node-pty, not tmux
- 8fe6674 Merge pull request #5974 from code-yeongyu/code-yeongyu/frontend-skill-research-contract
- 0526d7c fix(shared-skills): scope the non-negotiable line to the design-system gate and tighten contract pins
- 6aa29c7 fix(shared-skills): align stale 7-section pointers and unify the designpowers load condition
- 8ec538b feat(shared-skills): promote the primitive-showcase gate and wire ui-ux-db sanity checks
- 59748e6 feat(shared-skills): fold designpowers lane-c and a11y/debt schema into the default frontend flow
- f21aff7 feat(shared-skills): make frontend greenfield research a logged deliverable contract
- fa8e5bf Merge pull request #5965 from MoerAI/fix/lazycodex-ulw-planner-result
- f39cc5b Merge pull request #5930 from MoerAI/fix/pretooluse-bash-command-cwd
- baf722b Merge pull request #5783 from MoerAI/fix/version-check-warn-pinned-mismatch
- 25ba306 Merge pull request #5755 from MoerAI/fix/ulw-loop-require-session-id-value
- 8082b51 Merge pull request #5570 from MoerAI/fix/start-work-atlas-label
- 66e826d Merge pull request #5357 from BenjaminHalko/fix/model-fallback
- c4dfcde docs(omo-json): add a $schema-bearing example so the freshness gate validates it
- 9537092 fix(codex): mirror planner barrier into ulw-loop (fixes #5481)
- 8ad8a4f fix(codex): keep planner liveness guidance (fixes #5481)
- bd99a5e fix(codex): preserve parallel planner waves (fixes #5481)
- a70e667 fix(codex): prevent planning from outrunning spawned agents
- 2fbc4b0 feat(omo-config-core): generated omo.schema.json artifact with freshness gate
- 05288db Preserve Bash hook validation in the active worktree
- d857891 Merge remote-tracking branch 'upstream/dev' into fix/model-fallback
- 5684dc8 fix(runtime-fallback): clear internallyAbortedSessions on session teardown
- ff5ee46 Merge remote-tracking branch 'origin/dev' into fix/start-work-atlas-label
- 4bdb2a7 fix(cli): warn when a pinned plugin version differs from the running version (fixes #4734)
- f2ed3b1 fix(ulw-loop): require a value for explicit --session-id (fixes #5752)
- 4e1a4d7 Merge remote-tracking branch 'origin/dev' into fix/start-work-atlas-label
- e7f5002 fix(start-work): name Atlas (not Sisyphus) in /start-work template and labels (fixes #5499)
- 4e788f6 fix(runtime-fallback): stop subagent stall on provider auto-retry signal
Thank you to 2 community contributors:
- @BenjaminHalko:
- fix(runtime-fallback): stop subagent stall on provider auto-retry signal
- fix(runtime-fallback): clear internallyAbortedSessions on session teardown
- Merge remote-tracking branch 'upstream/dev' into fix/model-fallback
- @MoerAI:
- fix(start-work): name Atlas (not Sisyphus) in /start-work template and labels (fixes #5499)
- Merge remote-tracking branch 'origin/dev' into fix/start-work-atlas-label
- fix(ulw-loop): require a value for explicit --session-id (fixes #5752)
- fix(cli): warn when a pinned plugin version differs from the running version (fixes #4734)
- Merge remote-tracking branch 'origin/dev' into fix/start-work-atlas-label
- Preserve Bash hook validation in the active worktree
- fix(codex): prevent planning from outrunning spawned agents
- fix(codex): preserve parallel planner waves (fixes #5481)
- fix(codex): keep planner liveness guidance (fixes #5481)
- fix(codex): mirror planner barrier into ulw-loop (fixes #5481)
- Merge pull request #5357 from BenjaminHalko/fix/model-fallback
- Merge pull request #5570 from MoerAI/fix/start-work-atlas-label
- Merge pull request #5755 from MoerAI/fix/ulw-loop-require-session-id-value
- Merge pull request #5783 from MoerAI/fix/version-check-warn-pinned-mismatch
- Merge pull request #5930 from MoerAI/fix/pretooluse-bash-command-cwd
- Merge pull request #5965 from MoerAI/fix/lazycodex-ulw-planner-result