oh-my-codex 0.18.17 补丁发布深度解析:Ultragoal 空目标恢复、MSYS 团队启动路径与运行时可靠性加固
【免费下载链接】oh-my-codexOmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more.项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-codex
导读
0.18.17是 oh-my-codex 在0.18.16之后的"可靠性列车"(reliability train)补丁版本,聚焦修复一批直接影响日常使用的运行时问题:Ultragoal 在 Codexget_goal返回空值时陷入死循环的恢复机制、MSYS 环境下 Team worker 启动脚本路径错误、Ralplan 终端会话状态持久化、planning-gate 状态写入守卫收紧、Windows psmux 问答渲染器修复,以及 profile mention 回退与 stop-keyword 路径误报的修复。本文以 docs/release-notes-0.18.17.md 为骨架,结合仓库源码与 QA 文档,逐一拆解每个修复点的技术原理、涉及文件与可复现验证方式,帮助读者理解这轮补丁为什么值得升级。
发布背景与范围
根据 docs/qa/release-readiness-0.18.17.md 的记录,本版本紧接v0.18.16,候选分支为dev,发布头提交为a0c834522(fix: recover ultragoal null get_goal loops (#3020))。整个比较区间内的提交清单(git log --oneline v0.18.16..origin/dev)包括:
a0c834522— 修复 ultragoal nullget_goal循环(#3020)f0d3d6167— 修复 MSYS team worker 启动脚本路径(#3017)10aa1b0d8— 修复 ralplan 终端会话状态(#3015)437030a15— 收紧 planning gate 状态写入守卫(#3004)8131a2579— 修复 Windows psmux 问答渲染器(#3014)f8f847da0/4ce08fcc4— 依赖升级(biome 2.5.1、@types/node 26.0.1)92e2152ab— 修复 profile Discord mention 环境变量回退(#3009)b0ca6d97b— 修复 stop keyword 路径误报(#3008)40db45c75— 修复 ralplan gate fail(#3006)- 以及 #2979 到 #3003 之间的 planning/exact-role/runtime 守卫系列提交
注意:发布时处于 blocked/draft 状态的 #3018 与 #3010 未纳入本候选版本。
兼容性方面,官方声明没有破坏性的 CLI、包或插件布局变更,因此从0.18.16升级属于低风险的补丁升级。
Ultragoal 空get_goal恢复:终止死循环的关键修复
问题本质:get_goal返回空值导致的重复完成循环
Ultragoal 是 oh-my-codex 的持久化目标执行系统,它在.omx/ultragoal/下维护brief.md、goals.json与ledger.jsonl三个核心工件(见 src/ultragoal/artifacts.ts)。其完成路径依赖 Codex 原生的get_goal/create_goal/update_goal快照来执行"严格完成对账"(strict completion reconciliation)。
死循环的场景是:当get_goal返回null或 Codex 目标数据库/模式出错(例如no such table: thread_goals)时,模型可能反复尝试--status complete完成检查点,但每次都因拿不到有效快照而被拒,从而陷入"完成→被拒→再完成"的无限循环。
修复策略:将"不可用"引导为可审计的非终态阻塞
源码在 src/ultragoal/artifacts.ts 的checkpointUltragoal阻塞分支中,对parseCodexGoalSnapshot返回的unavailableReason === 'db_schema_context_error'情况做了专门处理:不再抛错拒绝,而是记录一个goal_blocked事件,failureReason写入证据,并在 ledger 中写入消息:
"Codex get_goal was unavailable due to a DB/schema/context error; strict completion reconciliation is deferred until get_goal works."
同时,构建给模型的两条恢复指引被明确写入代码(src/ultragoal/artifacts.ts):
- 不同已完成遗留目标:若
get_goal返回的是另一个已完成的遗留/线程目标,则不要在本线程重复--status complete,而是用omx ultragoal checkpoint --goal-id <id> --status blocked --evidence "<...>" --codex-goal-json "<get_goal JSON 或路径>"记录非终态阻塞,再切换到无冲突目标上下文中创建目标。 get_goal本身不可用(Codex DB/schema/context 错误):同样不要重复 complete 或从 shell 状态标记完成,而是记录可审计的非终态阻塞,待get_goal恢复可用的上下文后再继续。
这两条指引同时出现在 per-story 与 aggregate 两种模式的指令模板中(src/ultragoal/artifacts.ts 与 src/ultragoal/artifacts.ts),并配套了专门测试:guides unavailable get_goal DB/schema errors to auditable blocked recovery instead of completion与records unavailable get_goal DB/schema errors as non-terminal blocked audit checkpoints(见 src/ultragoal/tests/artifacts.test.ts)。
配套保障:写权限守卫与聚合目标迁移
本次补丁还依赖 Ultragoal 已有的两套防竞态机制(非本次新增,但构成该修复生效的前提):
- 写生命周期权威检查(writable lifecycle authority):
assertUltragoalWritableLifecycleAuthority在进入变更锁前、以及获取锁后各执行一次点对点检查,若等待锁期间 session 指针发生漂移则拒绝变更(src/ultragoal/artifacts.ts)。 - 聚合目标迁移(aggregate objective migration):
migrateAggregateObjectiveUnderLock将旧的"枚举式"聚合 Codex 目标迁移为稳定的指针式目标,并把旧目标放入codexObjectiveAliases以便对账(src/ultragoal/artifacts.ts),这保证了get_goal快照与期望目标可比对。
MSYS Team worker 启动路径修复
问题:MSYS/Git-Bash 环境下的 worker 启动脚本路径失效
Team 模式的 worker 在启动时需要从多个候选路径加载 worker skill,并组合 AGENTS.md 覆盖层。在 Windows 的 MSYS/Git-Bash 环境下,路径分隔符与脚本路径拼接方式会导致 worker 无法找到 skill 或初始化指令文件,进而 ACK 握手失败。
修复要点:路径组合与 Git 值读取的跨平台加固
核心实现位于 src/team/worker-bootstrap.ts:
- worker skill 候选路径:按
$CODEX_HOME/skills/worker/SKILL.md→<leader_cwd>/.codex/skills/worker/SKILL.md→<leader_cwd>/skills/worker/SKILL.md(repo 回退)的顺序加载(src/team/worker-bootstrap.ts)。 - Git 内部路径解析:
tryReadGitValue使用git rev-parse --git-path获取info/exclude与备份文件路径,并显式传入windowsHide: true以避免 Windows 控制台窗口闪烁(src/team/worker-bootstrap.ts)。 - AGENTS.md 写入与恢复:
writeWorkerWorktreeRootAgentsFile对跟踪文件设置skip-worktree,未跟踪文件写入info/exclude,并把原始内容备份到root-agents-backup.json;运行结束时removeWorkerWorktreeRootAgentsFile还原(src/team/worker-bootstrap.ts)。
相关回归测试集中在 src/team/tests/worker-bootstrap.test.ts,QA 阶段亦通过dist/cli/__tests__/team.test.js等定向测试验证(616 个测试全部通过)。
Ralplan 终端会话状态加固
Ralplan 是 Planner → Architect → Critic 的共识规划模式。本轮补丁(#3015、#3006)修复了终端会话状态在多轮咨询切换、取消场景下的错误持久化。
源码层面,src/ralplan/runtime.ts 中:
- 整个 run 只固定一次可写会话:
options.sessionId ?? (await resolveWritableStateScope(cwd)).sessionId,后续所有状态读写都使用该固定的runtimeSessionId,避免会话指针漂移导致状态写错位置(src/ralplan/runtime.ts)。 - 取消咨询使用
terminalizeCancelledAdvisory将已取消的 advisory 状态显式终结(src/ralplan/runtime.ts),确保取消不会留下悬挂的 in-progress 状态。
Planning-gate 状态写入守卫收紧
规划闸门(planning gate)用于控制批准的执行生命周期与启动提示(launch hint)的传递。本轮将状态写入守卫收紧(#3004/#3003 train),确保只有满足前置条件的状态才被允许写入 ralph/team 规划状态文件。
相关状态矩阵在 src/planning/tests/approved-execution-lifecycle-matrix.test.ts 与 src/planning/tests/approved-launch-hint-lineage-matrix.test.ts 中被穷举验证——这些测试枚举了hidden / ready / ambiguous等状态并逐项断言写入是否被允许,从测试结构可以推断:收紧方向是"非法/未授权状态跳转一律拒绝写入",避免下游依赖不存在的启动提示。
Windows psmux 问答渲染器修复
问题:Windows psmux 环境下问答 UI 无法弹出
问答(question)模块负责向用户弹出交互式问题。在原生 Windows psmux(一个类 tmux 的 pane 管理器)会话中,旧的渲染策略可能回退到 detached Windows console,导致问答 UI 不可见或命令注入失败。
修复要点:识别 psmux 会话并打开可见 shell pane
src/question/renderer.ts 中:
- 策略枚举新增
windows-psmux-shell-pane(src/question/renderer.ts)。 - 判定逻辑:
tmux.includes('psmux') || isPaneId(tmuxPane),并结合hasNativeWindowsPsmuxBridge检测 psmux 可执行文件(如C:/Program Files/psmux/psmux.exe),命中即选择该策略(src/question/renderer.ts)。 - 创建 pane 后校验其存活:
paneId缺失或 pane 启动后立即消失都会抛出明确错误(src/question/renderer.ts),并把问答 UI 命令以字面形式注入新开的 shell pane(src/question/renderer.ts)。
配套测试在 src/question/tests/renderer.test.ts:验证 psmux 会话选择windows-psmux-shell-pane策略、打开可见 shell pane 并注入命令,同时保持非 psmux 返回桥走 detached Windows console 路径。
Profile mention 回退与 stop-keyword 误报修复
Profile Discord mention 环境变量回退(#3009)
通知模块的 Discord 配置支持OMX_DISCORD_MENTION等环境变量(见 src/notifications/tests/config.test.ts)。修复前,profile 中的 mention 在环境变量未设置时可能解析失败或覆盖显式配置。修复后,环境变量OMX_DISCORD_MENTION仅在没有显式 profile/事件 mention时作为回退应用(测试applies env Discord mention without overriding explicit profile or event mentions,见 src/notifications/tests/profiles.test.ts)。
stop-keyword 路径误报(#3008)
关键字检测模块在 src/hooks/keyword-registry.ts 中把stop、abort、$cancel注册为cancelskill 的触发词。误报场景是:用户在普通对话或文件名中"恰好提到"这些词(如"stop the server"),被错误路由到取消流程。修复方向(#3008)是对触发路径的上下文判定收紧,回归测试见 src/hooks/tests/keyword-detector.test.ts,测试覆盖stop关键字在多种上下文中的命中判定。
版本同步与发布验证
发布前执行了完整的本地验证链(见 docs/qa/release-readiness-0.18.17.md 的 Local validation 一节):
node src/scripts/check-version-sync.ts --tag v0.18.17:确认package=0.18.17 workspace=0.18.17 tag=v0.18.17三者同步。npm run build、npm run verify:native-agents(22 个可安装原生 agent、37 个 setup prompt 资产)、npm run sync:plugin(29 个 canonical skill 目录同步)、npm run verify:plugin-bundle全部通过。node dist/scripts/generate-catalog-docs.js --check:catalog 检查通过。- 定向跨平台回归:
codex-native-hook.test.js、ralplan/runtime.test.js、cli/team.test.js、ralph-goal-mode-contract.test.js、ultragoal/artifacts.test.js共 616 个测试通过。 npm pack --dry-run:产物oh-my-codex-0.18.17.tgz,包大小 4.2 MB,解包后 26.9 MB,共 3133 个文件。
版本元数据同步范围覆盖根package.json、package-lock.json、根Cargo.toml/Cargo.lock工作区包版本,以及plugins/oh-my-codex/.codex-plugin/plugin.json。
升级建议与适用前提
- 若你正在使用 Ultragoal 且遇到过
get_goal返回空/异常导致的完成循环,本版本的阻塞恢复路径是直接受益点; - 若你在 Windows MSYS/Git-Bash 下运行 Team 模式,建议立即升级以修复 worker 启动路径;
- 若你在 Windows 上使用 psmux 且问答 UI 无法弹出,本版本已修复渲染策略选择;
- 本版本无破坏性 CLI/包/插件布局变更,
0.18.16用户可平滑升级。
需要进一步了解本轮补丁的完整清单与验证细节,可阅读 docs/qa/release-readiness-0.18.17.md 与 CHANGELOG.md;Ultragoal 的完整状态机与工件格式可参考 docs/STATE_MODEL.md。
【免费下载链接】oh-my-codexOmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more.项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-codex
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考