oh-my-codex 0.18.17 补丁发布深度解析:Ultragoal 空目标恢复、MSYS 团队启动路径与运行时可靠性加固
2026/9/10 10:13:12 网站建设 项目流程

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,发布头提交为a0c834522fix: 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.mdgoals.jsonledger.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 completionrecords unavailable get_goal DB/schema errors as non-terminal blocked audit checkpoints(见 src/ultragoal/tests/artifacts.test.ts)。

配套保障:写权限守卫与聚合目标迁移

本次补丁还依赖 Ultragoal 已有的两套防竞态机制(非本次新增,但构成该修复生效的前提):

  1. 写生命周期权威检查(writable lifecycle authority)assertUltragoalWritableLifecycleAuthority在进入变更锁前、以及获取锁后各执行一次点对点检查,若等待锁期间 session 指针发生漂移则拒绝变更(src/ultragoal/artifacts.ts)。
  2. 聚合目标迁移(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 中把stopabort$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 buildnpm 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.jsralplan/runtime.test.jscli/team.test.jsralph-goal-mode-contract.test.jsultragoal/artifacts.test.js共 616 个测试通过。
  • npm pack --dry-run:产物oh-my-codex-0.18.17.tgz,包大小 4.2 MB,解包后 26.9 MB,共 3133 个文件。

版本元数据同步范围覆盖根package.jsonpackage-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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询