用途与实际影响
这项功能怎样使用
为什么需要它
长任务中断后重新开一个对话可能重复改文件或执行命令。只有找回原任务身份和真实进度,才能知道是接着做,还是必须明说重新开始。
举个实际例子
“刚才那项长任务中断了,先查它做到了哪里,别重新交一遍。”用原任务记录核对进度和结果;能接续才继续,目标、模型或输入改变时明确说明,不用旧结果冒充本次任务。
最后我会得到什么
拿到原任务编号、已公开的进度和完成或停止状态。取消请求被收到还不等于进程和显卡已释放,须看真实清理结果。
正常时
原任务身份和工作条件一致、继续与清理都核对后报告完成。
发现问题时
额度或暂时故障时保留原任务,符合条件才有界续作,不重复已发生的动作。
入口不可用或证据不足时
身份变化、记录损坏、本人取消或清理无法确认时停下,不把新任务说成旧任务恢复。
从哪里开始
用 aicli run start 发起程序化任务并保存 run id;中断后先用同一 run 记录检查能否恢复。
需要准备什么
- 原 run id
- 原项目、模型和输入
- 中断原因
从开始到拿到结果
- 1
建立可追踪运行
从标准输入交任务,后台控制器记录身份与公开进度。
- 2
中断先判原任务
检查额度、暂时故障、输入和进程状态,只有同一线程身份仍成立才接续。
- 3
报告终态
交回结果与进程清理证据;身份变化或硬失败时明确停止,不新开任务冒充断点恢复。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
Codex 可恢复控制面、权限回读与故障回归已实现关键规则与设计选择
所有 Codex machine run 固定 danger-full-access + approvalPolicy=never,不是只读沙箱。
非 Codex run 只是一性执行:默认 read-only,可选 workspace-write,不支持后台 exact resume。
受管 public_web_search 默认启用;--no-web-search 只关闭搜索,不改变完全访问。
本模块用到的名词
- thread/session(线程/会话身份)
- app-server 返回的原生对话执行身份;resume 必须仍是同一个。
- hard budget(硬执行上限)
- 达到墙钟、行动步数、工具次数或输出上限会实际终止进程树,不只是提示。
- event projection(公开事件投影)
- 只保留可给观察器看的进度、工具类别、上下文和终态;隐藏推理与工具载荷丢弃。
专业定义
恢复的是原任务身份对应的执行,不是把旧摘要重新发给一个新对话。
解决什么
防止中断后重复执行、身份悄悄变化、预算只写在文档里或隐藏思考被当成公共进度。
当前怎样实现
- RecoveryService 为每个 run 保存 stateHash、前向 journal、不可变 attempt 事件与回执;正文不持久化。
- CodexAppServerBridge 使用 thread/start、turn/start 与 thread/resume,逐条绑定 thread/turn/item 生命周期。
- CommandRouter 硬限制 timeout(等待超时)、steps、tool calls、output chars 与最多三次 resume,并让 background 只用于 Codex start/resume。
- PublicWebSearch 只访问固定 HTTPS Bing RSS,拒绝重定向、Cookie、任意 URL/Header/Key;公开事件不含 query/result。
- 桥接器结束时必须确认 app-server 与后代进程树清理,失败不会被成功正文覆盖。
- run --control-file <绝对路径>在模型执行前产生aicli.run-control.v1,绑定确切run/profile/model/workspace;不接受已有文件覆盖、未知重解析点或非Codex入口。上层用同一已验证AICLI入口发送run abort,不从文件读取任意命令。
- Windows Job Object(进程树约束)和Broker(代理服务)租约共同证明取消完成。模型身份产生前的取消保留not_observed_cancelled与null身份;它可以证明清理,但不能通过模型验收或作为已认证会话恢复。
执行流程
- 1
任务正文从 stdin 进入。
- 2
创建持久 run 与独占 CODEX_HOME。
- 3
后台控制器返回 run id。
- 4
观察公开进度、工具、搜索与上下文事件。
- 5
中断时分类额度、瞬态或硬失败。
- 6
符合条件时 thread/resume;否则停止。
- 7
终态写回执并确认进程树清理。
边界
- 恢复账本不是通用聊天历史。
- AICLI 不判断低级模型是否胜任,也不自动换到更强模型。
- 旧版本文件任务、当前零写入诊断和桌面后台子会话是不同证据。缺少当前程序化运行身份或清理证明时明确Unknown(未验证),不用另一条路线的成功补齐。
失败与恢复
- 控制器或 app-server 中断
- 等待 writer 关闭并对账;只有明确瞬态且身份闭合才最多恢复三次。
- 恢复返回新 thread 或权限变化
- resumeSupported=false,要求新工作区全量重跑。
- 事件写入失败但模型已完成
- 标记观察层 degraded,不自动重跑造成重复副作用。
真实入口
E:\Projects\Tools\ai-cli-profile-manager\src\AiCliProfileManager\Private\RecoveryService.ps1run 状态、分段证据与恢复
E:\Projects\Tools\ai-cli-profile-manager\src\AiCliProfileManager\Support\CodexAppServerBridge.ps1app-server 协议、身份、预算与事件
E:\Projects\Tools\ai-cli-profile-manager\src\AiCliProfileManager\Support\PublicWebSearch.ps1固定公共搜索工具
E:\Projects\Tools\ai-cli-profile-manager\docs\user\MACHINE-RUN.md用户可读机器运行合同
如何验证
- 恢复、事件生命周期、权限、预算、用量和清理均在 385 项回归中有覆盖。
- 历史 0.3.12 Qwen3.8-27B Agent Live 证明过正常文件任务;本轮没有把它晋升为 0.154.0-alpha.6.2 当前 Live。
- 本轮未创建一个新的模型 run。
与其他模块的关系
本模块承载程序化 Codex 任务;Doctor/Agent 验收消费它,本地模型与代理模块提供部分运行目标。
