oh-my-codex v0.21.31
0.21.31 is a patch release for setup symlink safety and dispatch reliability improvements (14 files, +761/−79; PR #3881 and #3886).
Highlights
-
Setup symlink destination refusal (#3881): The
omx setupcommand now detects and rejects symlinked managed destinations (including dangling links) before reading, backing up, or writing. This prevents scenarios where a committed.gitignoreor prompt path symlink could causeensureBackupto overwrite files outside the repository. The check validates every path component without following symlinks, not just the leaf destination, preventing writes through symlinked ancestor directories. The check is applied to all write paths:.gitignore, native agent TOMLs and manifest, HUD config, and skill receipt. This is a behavioral change: setup now fails closed on symlinked managed destinations. -
Dispatch message reliability (#3886): Fixed mailbox dispatch enqueue-barrier sequencing to guarantee message ordering under concurrent worker acknowledgements. Dispatch now re-validates monitor state inside the barrier to prevent stale wakes, and correctly acknowledges notifications to prevent repeated reschedules. The fix applies to all dispatch paths that interact with the mailbox monitor.
Compatibility
- No breaking API changes; setup security and dispatch reliability improvements only.
- Existing sessions remain unaffected unless they have symlinked managed destinations (which will now be rejected with a clear error message and workarounds).
- Setup now fails fast on symlinked destinations instead of silently writing through them.
- Dispatch reliability is transparent to callers; no changes needed to session code.
Known Gaps (tracked for v0.21.32)
Three setup.ts findings require path canonicalization improvements:
-
P1: CODEX_HOME authority root: When user-scope setup uses a supported
CODEX_HOMEoutside the OS home directory, validation incorrectly anchors tohomedir()instead of the configured Codex home. This is fixed in PR #3890 (fix/setup-scope-realpath-0.21.32). -
P2: Symlinked parent paths: When an ancestor of the scope root is a symlink, the destination is not canonicalized before comparison, causing rejection in valid symlinked-parent environments. This is fixed in PR #3890.
-
P2: OMX_ROOT override validation: When
OMX_ROOTorOMX_STATE_ROOTpoints outside the repository, runtime directory validation incorrectly usesprojectRootas the authority. This is fixed in PR #3890.
Validation
- Pinned release candidate passed latest-per-name release CI with all required checks green (verified at 19:57Z on 2026-10-22).
- Release branch CI passed with all required checks green.
- All Codex code review findings documented above for v0.21.32 follow-up.
- Local gates pass: build, typecheck, and lint.
Merged PR inventory
| PR | Author | Title |
|---|---|---|
| #3881 | @shenyankm | fix(setup): refuse symlinked managed destinations |
| #3886 | @Yeachan-Heo | fix(team): dispatch message ordering and stale wake prevention |
Contributors
Thanks to @shenyankm, @Yeachan-Heo, and @claude Code for contributing to this release.
Full Changelog: v0.21.30...v0.21.31
—
[repo owner's gaebal-gajae (clawdbot) 🦞]