Skip to content

补齐多开实例停止回执与终态恢复闭环 - #2784

Open
130040167 wants to merge 12 commits into
BigPizzaV3:mainfrom
130040167:codex/instance-lifecycle-receipts-20261030
Open

130040167 wants to merge 12 commits into
BigPizzaV3:mainfrom
130040167:codex/instance-lifecycle-receipts-20261030

Conversation

@130040167

@130040167 130040167 commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

依赖 #2735 的进程停止边界。该 PR 使用其分支作为祖先,上游合入 #2735 前,GitHub 对 main 的差异会同时显示祖先改动;生命周期改动从 c55f53b 之后开始。本 PR 请求独立审核,合入时需要先处理 #2735 的依赖,并核验下述 macOS 运行行为边界。

现象与原因

多开实例正常关闭或执行结束操作后,启动回执仍可能停在 ready。若列表只依赖停止回执判断终态,已关闭的实例会一直显示为 unknown;仅增加读取端校准无法解决问题。旧回执或迟到的 ready 写入也可能覆盖新一代实例或已完成清理的状态。

实现

  • worker 自然退出与管理器停止均写同代 stopped / cleanup_failed 回执;只有核验受管进程、同数据目录进程及相关端口已释放后,才确认 stopped。
  • 新代清单和回执写入通过每实例 lifecycle.lock 串行化,并核对 generation、完整身份、路径与端口;拒绝旧代或身份改变的写入,终态不被迟到 ready 降级。
  • 读取端仅在同代 stopped 回执与重复缺席核验均通过后,持久化 stopped 并清空 worker PID / birth id;列表隐藏已停止项,页面重载后仍保持终态。
  • unknown 与 cleanup_failed 继续可见并可显式重试。旧清单缺少身份时,必须确认相关进程与端口均已释放后才能清理记录,不能通过旧 PID 强制结束进程。
  • 清理失败保留失败回执与诊断,不能把退出或端口暂不可读当作成功。管理器自身退出策略保持现有行为,本 PR 不增加退出时同步清理全部子实例的步骤。
  • macOS 使用原始 argv 与进程出生身份核验,并检查同 user-data 与两类端口;Windows 复用 修复 Windows 多开进程的安全停止边界 #2735 的安全进程树停止。不会按程序名批量结束 Codex、终端、MCP 或用户工具。
  • 平台专用进程调用使用就近 cfg,停止辅助函数仅在 Windows、macOS 或测试下编译。

验证

  • 当前 head 的 GitHub Actions Windows artifacts 与 macOS DMG (universal) 均通过,Windows 包含 Rust tests、release 构建、安装包与产物上传。
  • Windows manager 的 multi_instance、stopped_receipt、multi_launch_result 三组测试分别 16、4、2 项通过;core multi_worker 20 项通过,1 项 fixture 入口按设计忽略;前端状态测试 5 项通过。
  • 当前 head 的 manager 库测试 multi_ 19 项、stopped_receipt 4 项及 core multi_worker 20 项通过,1 项 fixture 入口按设计忽略;TypeScript、前端生产构建、管理器 debug 构建及 git diff --check 通过。
  • 当前 head 构建的隔离管理器启动就绪,欢迎引导正常关闭,测试进程与端口清理完成,原有实例身份未变。该项是启动检查。
  • 生命周期实现提交 3b34289b 构建的隔离桌面程序实测:多开页点击结束后产生同代 stopped 回执、清空 PID、隐藏列表项,页面重载后不复现。该场景的受管进程与端口收尾通过,原有实例身份未变。当前 head 相对此提交仅调整平台 cfg。
  • 同一生命周期实现构建的原生 Codex 正常退出场景通过:直接写入同代 stopped、清空 PID、隐藏列表项,页面重载后不复现;受管进程与端口收尾通过,原有实例身份未变。另一次运行因退出期间资源未完全释放而写入 cleanup_failed,随后通过显式结束操作恢复 stopped。不会把失败回执误作已完成清理,失败报告保留。
  • 隔离实测不使用真实登录凭据,不发送生成请求。自然退出的资源释放时序仍需跨平台补充验证。

macOS 特有进程核验、完整桌面重启与管理器更新续接尚未实机验证。合成记录与单元测试不替代这些验证。

@130040167

130040167 commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

Windows 检查失败已定位到 windows_console_spawn:ps 调用位于 macOS 专用函数内,但函数级 cfg 距调用点超出静态检查器的回看范围。已在调用点增加就近的 macOS cfg,保持平台行为并满足 Windows 启动契约;同时限定两个停止辅助函数的编译平台。

当前提交的 Windows artifacts 与 macOS DMG (universal) CI 均已通过,本 PR 已进入正式审核。合入仍依赖 #2735 的停止安全边界;macOS 进程核验与自然退出资源释放时序尚需实机验证,完整桌面重启和管理器更新续接不作为已验证结论。

当前提交 manager 库测试 multi_ 19 项、stopped_receipt 4 项及 core multi_worker 20 项通过,1 项 fixture 按设计忽略。TypeScript、生产前端及管理器 debug 构建通过。当前提交构建的隔离管理器启动就绪,测试进程与端口清理完成,原有实例身份未变;此项是启动检查,不替代生命周期行为验收。

@130040167
130040167 marked this pull request as ready for review October 29, 2026 20:40

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant