oh-my-codex 0.18.10 发布解析:Stop Hook 可靠性、Team HUD 所有权与 Autopilot 守卫的加固实践
oh-my-codex 0.18.10 发布解析Stop Hook 可靠性、Team HUD 所有权与 Autopilot 守卫的加固实践【免费下载链接】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-codexoh-my-codex 0.18.10 是紧随 0.18.9 之后的补丁版本聚焦于 Stop hook 可靠性、tmux/team HUD 所有权、Ultragoal/ralplan 守卫、auth 默认值以及精简后的生成式 AGENTS 指引。本文以 release-notes-0.18.10.md 为主干结合仓库源码与测试用例逐条拆解这次可靠性加固列车的技术细节你将看到 EAGAIN 修复、HUD 所有权去重、fail-closed 守卫的具体实现位置与验证方式以及这套补丁版本完整的发布验证流程。版本定位无破坏性变更的可靠性补丁0.18.10 明确保留了既有 CLI 与 npm 包契约与 0.18.9 保持兼容。从发布说明看它没有引入新的用户可见命令或配置格式而是收紧失败处理native hook、worker 启动、以及面向维护者的发布/运行时表面。因此升级路径是平滑的——现有 runtime state、hook plugin、team worker、Autopilot、Ultragoal 与生成式 AGENTS 契约均保持兼容。值得注意的两个边界说明Open PR #2737 是外部草稿 PR未包含在本版本中发布说明明确列出无未关闭 issue的结论closed issue 的覆盖由合并 PR 清单代表。Stop Hook 可靠性从 stdin 到设备重定向的四重修复1. Hook 插件 runner 的 stdin EAGAIN 处理PR #2722 修复了 hook 插件 runner 在读取 stdin 时遇到的EAGAIN资源暂时不可用问题。核心实现在 plugin-runner-stdin.tsexport async function readStdin(input: AsyncIterablestring | Buffer | Uint8Array process.stdin): Promisestring { const decoder new TextDecoder(utf-8); let raw ; for await (const chunk of input) { if (typeof chunk string) { raw decoder.decode(); raw chunk; continue; } raw decoder.decode(chunk, { stream: true }); } raw decoder.decode(); return raw.trim(); }关键设计是通过异步流迭代读取 stdin完全不触碰底层 fd。配套测试 plugin-runner.test.ts 构造了一个fdgetter 主动抛出EAGAIN的流对象验证readStdin依然能完整拼接出{hello:world}这样的分块 JSON 输入——即 runner 不再因 fd 层面的瞬时错误而崩溃。在 plugin-runner.ts 中stdin 读取结果为空时返回empty_requestJSON 解析失败时返回invalid_json都通过__OMX_PLUGIN_RESULT__前缀结构化结果与 exit code 1 上报保证失败是可诊断的失败而非静默挂起。2. Stop 时畸形 stdin 的恢复PR #2731 针对 native Stop 处理路径当 hook 收到畸形malformedstdin 时不再让整条处理链陷入未定义状态而是走恢复逻辑。这与readStdin的空/非法输入分支一脉相承——从源码结构看native hook 侧同样采用异步流逐块累积读取见 codex-native-hook.ts 的readStdinJson含总字节数与 oversized 防护畸形输入的兜底是显式失败返回而不是错误地继续执行 hook 副作用。3. Planning hook 的 null-device 重定向回归修复PR #2730 修复了 planning hook 对 null-device/dev/null重定向的回归。发布说明强调避免 null-device redirect regressions即某些平台/场景下错误地恢复了对/dev/null的旧式重定向行为。这一项与 Stop 处理的stdin 恢复共同构成 Stop hook 失败面收窄的两翼输入端stdin与输出端重定向目标都不允许出现回归性错误。4. Side-conversation Stop hook 隔离PR #2743 修复侧边会话side conversation中 Stop hook 的隔离问题。核心诉求是不同会话的 Stop hook 处理互不干扰——一个侧边会话触发的 Stop 动作不能污染主会话或其他会话的 hook 状态。从插件 runner 的架构看每次 runner 都以独立进程 独立 stdin 请求运行RunnerRequest携带cwd、pluginId、event、stateRoot等隔离上下文这正是隔离性的实现基础。Team/HUD 所有权tmux 面板归属的收紧重复 tmux HUD 所有权的修复PR #2738 修复了 team worker 场景下重复 tmux HUD 所有权的问题。HUD 的所有权机制体现在 authority.ts 的租约lease设计中测试 authority.test.ts 验证runHudAuthorityTick会先写入.omx/state/notify-fallback-authority-owner.json租约含owner: hud、pid、cwd、heartbeat_at再执行 tick竞争者即使先拿到锁也会在观察到限流cooldown后放弃 spawn见同文件第 256 行起的用例。重复所有权的根因在于多个 worker 同时尝试认领同一面板本次修复让租约写入成为唯一的所有权判定点。Worker 启动脚本不再认领 HUD 面板PR #2739 规定 team worker 的 startup 脚本不得认领 HUD 面板。这从归属源头杜绝了启动即抢占HUD 面板所有权只应属于 HUD 权威 tick 路径worker 启动脚本只负责拉起自身运行时两者职责分离。Worker Stop nudge 路由为 team steeringPR #2719 将 worker 的 Stop nudge提醒/轻推从错误的运行时通道改道为 team steering 通道。发布说明指出此前存在泄漏到错误的运行时 lane的问题——即 worker 停止提醒被误路由到独立运行时的控制面现在统一收敛到 team 编排面避免跨 lane 干扰。Autopilot / Ultragoal / ralplan更严格的守卫Autopilot 执行契约基础PR #27200.18.10 为 Autopilot 建立了执行契约的基础设施。从源码看契约落地在两层阶段机FSM层fsm.ts定义AUTOPILOT_CHILD_PHASES——deep-interview → ralplan → ultragoal → rework / team / ralph → code-review → ultraqa外加waiting-for-user、complete、failed三个运行时阶段。normalizePhaseText会把completed归一为complete、planning/replan归一为ralplan、fix/review-fix/implementation-fix归一为rework兼容不同写入方的阶段命名变体。完成闸门Completion Gate层completion-gate.tsvalidateAutopilotCompletionTransition是载波不变式carrier invariant的扼制点——注释明确说明六个评审代次各自发现了不同的 writer 在闸门运行前洗白畸形handoff_artifacts载波因此本函数对所有状态转移统一强制执行assertValidHandoffCarriersIn无论哪个 writer 产生畸形载波都必须 fail-closed。闸门还校验deep-interview → ralplan 必须有持久化的访谈完成证据与 handoff artifactspecs/、context/、interviews/前缀内的规范路径ralplan → ultragoal 必须有plans/内的持久化计划产物、Architect/Critic 顺序审批sequence_index 1、2以及绑定到同一 session/cycle 的执行 handoff实现类阶段ultragoal/rework/team/ralph不得绕过 code-review 直接进 ultraqaultraqa 结束必须携带干净的 code-review 与 ultraqa verdict 证据。assertNoForgedRalplanHandoffEvidence第 171-221 行进一步区分缺席与伪造缺失字段走 advisory 路径而提供了但结构错误数组/标量冒充对象、整数要求处出现字符串、非 ISO-8601 时间戳一律判定为伪造证据并抛出异常——absent stays advisorysupplied-and-malformed is corruption是这条防伪逻辑的核心原则。测试 completion-gate-advisory.test.ts 对多种畸形载波逐一断言其 fail-closed 行为并验证三条传输通道mode transport、state-operation transport、keyword transport全部保持作用域与身份守卫。显式 Ultragoal team 上下文 fail-closedPR #2736PR #2736 规定当 Ultragoal 被显式要求运行在 team 上下文中时必须 fail-closed。这与 cli/ultragoal.ts 的 Codex goal 快照对账逻辑互补——当 Codex goal DB/schema/context 不可用时codex_goal_reconciliation_unavailable会明确降级为artifact-backed Ultragoal status remains available但严格对账被推迟而不是伪造成功。整体方向是信息不完整的路径显式失败或显式降级绝不静默通过。ralplan native subagent leader 闸门修复PR #2735PR #2735 修复了 ralplan 原生子代理native subagent的 leader 闸门。源码侧的证据是 subagent 追踪文件subagent-tracking.json的结构见 advisory.test.ts每个 session 记录leader_thread_idarchitect/critic 线程必须携带provenance_kind: native_subagent、direct_child_root_id与direct_child_parent_id绑定到根线程。测试第 201-219 行验证删除provenance_kind、篡改direct_child_parent_id、替换leader_thread_id、改变scope或时间顺序等任何变更都会被拒绝——即子代理必须严格证明自己是绑定到 leader 根线程的直接子代任何间接嵌套或外部归属都会被闸门拦下。Auth 与生成式 Agent 指引的清理订阅版 Codex 默认值预置PR #2725PR #2725 为订阅subscription场景预置 Codex 默认值属于 auth 模块的默认行为修正——用户首次使用订阅登录时即可获得合理的默认配置无需手工补齐。这延续了仓库 auth 子系统的既有设计auth 目录涵盖 config、rotation、sessions、quota-detector 等本次改动聚焦默认值播种不改变既有会话与密钥轮换契约。ultrawork 文档路由澄清PR #2717PR #2717 澄清了 ultrawork 相关文档的路由与保证。从仓库结构看ultrawork 技能位于 skills/ultrawork含 references 子目录本次改动确保文档指引指向正确的技能入口与职责边界避免使用者在 team/ultragoal/ultrawork 三个相邻概念间走错路。生成式 AGENTS bootstrap 去膨胀PR #2741PR #2741 精简了生成的 AGENTS bootstrap 输出——debloated while preserving required contracts。即生成的 AGENTS.md 模板在砍掉冗余引导内容的同时保留了所有必需契约如插件清单、catalog manifest、prompt guidance 等依赖项这从模板源文件与 catalog-manifest.json 的同步校验中可以得到印证。依赖与发布卫生Biome 升级与证据提交PR #2715 将biomejs/biome从 2.4.15 升级到 2.4.16仓库根目录的 biome.json 定义了 lint 与格式化规则基线对比范围compare range内纳入了 4 个无 PR 的内部提交作为发布卫生1bc3f9d00.18.9 Fulcio 故障期间的临时 npm 回退、f2efc145记录 0.18.9 发布回退证据、75bc9f97在发布说明中命名 native manifest、73935230准备 0.18.9 最终 CI 证据闸门。这体现了该项目的发布纪律即使补丁版本发布过程的证据链也要完整归档。发布验证从本地闸门到远程发布的证据链发布就绪证据记录在 release-readiness-0.18.10.md0.18.10 的发布闸门包括版本同步根package.json、package-lock.json、Cargo.toml、Cargo.lock与plugins/oh-my-codex/.codex-plugin/plugin.json全部同步到 0.18.10本地验证全绿npm ci151 个包、npm run build、node dist/scripts/check-version-sync.js --tag v0.18.10、npm run lint、npm run check:no-unused、npm run verify:native-agents、npm run sync:plugin:check、npm run verify:plugin-bundle、node dist/scripts/generate-catalog-docs.js --check定向测试套件test:recent-bug-regressions:compiledruntime 子套件约 139 秒全通过、test:team:worker-runtime-identity:compiled、test:plugin-boundaries:compiled、test:explicit-terminal-contract:compiled打包验证npm pack --dry-runoh-my-codex-0.18.10.tgz打包 3.9 MB / 解包 24.3 MB / 3045 个文件与npm run smoke:packed-install收尾检查git diff --check随后是分支 CI、main 晋升、tag 触发 release workflow、GitHub release proof 与 npm proof 等远程发布闸门。完整变更对比见v0.18.9...v0.18.10发布说明末尾的 Full Changelog 对比链接。小结0.18.10 的工程启示从这次补丁版本可以看到三个可复用的工程模式失败要显式而非静默无论 stdin EAGAIN、畸形 JSON、伪造的 handoff 证据还是不可用的 Codex goal DB系统都选择显式失败、显式降级或 fail-closed杜绝静默通过对应源码plugin-runner-stdin.ts、completion-gate.ts、ultragoal.ts所有权与归属要单一化HUD 面板所有权收敛到权威租约路径worker 启动脚本不再认领面板ralplan 子代理必须证明自己是 leader 根线程的直接后代对应源码hud/authority.ts、subagent-tracking.json 校验发布即证据版本同步、定向测试、dry-run 与 smoke 全部留痕连 0.18.9 的发布回退事件也以证据提交形式纳入对比范围对应文档docs/qa/release-readiness-0.18.10.md。如果你正在维护自己的 hooks 或团队编排层0.18.10 这份补丁清单本身就是一份高质量的可靠性加固 checklist。【免费下载链接】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),仅供参考