活动与控制
Activity 在首次加载、重连或游标重新同步期间不显示错误提示。只有当前会话已经确认的请求失败才显示错误;切换会话不会显示上一会话的错误。真实读取失败时保留已取得的记录并自动重试。
这里说明三件事:统计什么、什么时候需要你处理、暂停或停止后会发生什么。
Activity 按会话分支统计。在同一分支继续发消息,不会多出一条 History。
恢复时只处理仍对应当前执行检查点的已结束等待。旧问题的答案不能恢复、取消或结束后续的新等待;重复恢复不会重复执行。回归覆盖第一个等待已回答、第二个等待未回答或已回答两种情况。本恢复修正已通过规格与质量审查,受控测试覆盖连续等待及重复启动恢复。
恢复同一轮运行
恢复 Agent 时重新绑定原会话、轮次、回复、运行环境和工具配置,并在完成、暂停或错误时释放绑定。浏览器页面凭据仍属于原来的调用方,不接受其他调用方的凭据。浏览器拒绝作为明确的工具错误返回,保留原原因。达到配置的迭代上限时记录为未成功完成,保留此前文字和操作记录。
只有权威执行更新确认消息属于当前会话和当前执行时,才在该助手消息旁显示等待审批;审批操作仍在原输入区域进行。重连或恢复待回答问题时请求现有执行快照,依据快照中的消息归属恢复状态,并兼容旧事件格式。缺少归属证据时,不将其他运行的审批显示在该消息上。
验收覆盖暂停后恢复、使用新取得的页面凭据观察原页面、异常时释放绑定、拒绝其他调用方凭据、迭代上限,以及审批在消息和会话之间的隔离。实现状态:规格与质量审查通过。受控回归验证恢复后的页面凭据归属、明确的浏览器错误、绑定释放、迭代耗尽时的失败状态,以及审批提示的消息归属。默认 App 实机验收作为独立发布检查。
重启恢复期限
关闭视图不停止后台任务。worker 关闭时先停止调度并请求协作暂停;新实例按持久化的中断时刻计算恢复期限,execution.auto_resume_window_seconds 默认 -1(不限时间),0 时禁用,正整数设置显式期限;无限期限保存为 null,升级前已保存的有限期限保持不变。普通可恢复 Agent 在模型和工具完成处保存 checkpoint;无未确认效果的失去所有权任务恢复为暂停,通过原有 continue 命令继续。过期、用户暂停、取消、审批等待及不兼容契约保持可核对状态。期限和恢复命令身份保存在 canonical execution events 中,不另设数据库或调度器。
恢复时保存新 attempt 使用的 checkpoint 身份;在新效果产生前再次中断仍可使用该 checkpoint。关闭请求遇到 checkpoint 版本竞争时,仅对同一 attempt 最多尝试三次,保留原期限。Job 在准入时保存自身稳定的用户消息与回复 ID,恢复继续校验同一消息关系。暂停释放资源时,使用 Job waiter 保存的 attempt 和资源租约身份,不从已清除的 execution ownership 中读取。
启动时先核对失去所有权的任务,由初始化后的 runner 统一执行有期限的恢复策略。仅模型请求中断或尚未激活的会话可从不可变输入继续,期限从原活动时刻计算。未知外部工具结果保持待核对状态,不虚构未执行回执。没有重启意图的旧暂停记录需要手动继续。
自更新后的任务继续使用同一时限设置,从已结束更新的最后持久化活动时刻计算。固定期限和过期状态保存在现有更新目录中,继续执行、契约变化后的重新规划和原会话唤醒均受此约束。仍在持续执行的更新不会仅因超过恢复时限而停止。
1. 先分清三个对象
| 对象 | 含义 | 显示在哪里 |
|---|---|---|
| 会话分支 | 一条连续的对话路径。真正分叉时,才产生另一条路径。 | Activity 中的一项。 |
| 一次执行 | 一次任务运行,例如回答一条消息。 | 放在分支详情中。暂停、继续、取消等操作用它的 ID 确定目标。 |
| 受管理的进程 | 工具启动的一条命令,例如运行脚本。 | 归属于启动它的那次执行,可单独查看输出或停止。 |
2. 分支怎样计数
| 例子 | 计数 | 详情 |
|---|---|---|
| 发一条消息,再说“继续”。 | 1 | 两次执行仍属于同一个分支。 |
| 从前面的某个位置创建另一条回复。 | 2 | 原分支和新分支各显示一项。 |
| 同一分支后面的一次执行失败。 | 1 | 失败保留在详情中,不会因此创建分支。 |
| 两个分支有相同的早期消息。 | 2 | 共同的早期执行可出现在两边的详情中,但不会额外计数。 |
History 统计已结束的分支。需要处理或仍在运行的分支,显示在对应区域。
3. 应该显示什么状态?
| 情况 | 所在区域 | 含义 |
|---|---|---|
| 等待审批、回答、暂停处理,或工具结果尚未查明。 | Needs attention | 打开详情查看实际请求。发新消息不会自动撤销它。 |
| 执行、子任务或所属进程仍在运行。 | In progress | Agent 回答完了,不代表后台进程也停止了。 |
| 分支已结束,没有运行中的工作或待处理请求。 | History | 失败记录和输出仍可在详情中查看。 |
| 执行者已结束,只缺模型响应记录;也没有实际等待或待处理的非取消操作。 | History | 显示“已结束 · 响应记录不完整”。遗留的取消请求不会使它变成待确认事项。只有子任务仍在运行时才保留 Cancel。这不表示任务成功。 |
分支的一般状态取最新一次执行,同时检查真实等待、子任务和所属进程。无法关联的记录会单独保留,不猜测它属于哪个分支。
4. 每个操作会做什么?
| 操作 | 结果 | 限制 |
|---|---|---|
| Pause | 请求在下一个安全位置暂停。 | 当前动作可能先完成,不是停在任意一行代码上。 |
| Continue | 从已保存的进度继续同一次执行。 | 必须有有效的保存状态,且该执行支持继续。 |
| Step | 执行一个已定义的步骤,再次暂停。 | 步骤可以是一次工具动作,不等于一行代码。 |
| Steer | 补充后续工作要遵守的指令。 | 不改写已经完成的工作。 |
| Cancel | 结束选中的执行及其下属执行。 | 不能撤销已经完成的外部操作。受管理的进程另有独立控制。 |
| Fork / Retry | 从允许的保存位置创建独立的后续执行。 | 原历史保留。聊天 Agent 的新执行先暂停,需点击 Continue;其他类型遵循各自调度规则。 |
界面只提供该执行支持的操作。“已接收”表示请求已保存;“已生效”才表示操作完成。
5. 重启后保留什么?
| 记录 | 简单解释 | 作用 |
|---|---|---|
| 检查点 | 在规定位置保存的执行进度。 | 继续时从这里开始,不恢复被冻结的线程。 |
| 操作结果记录 | 模型或工具请求是否结束,以及已确认的结果。 | 不盲目重复已确认的操作;外部动作结果不明时先核对。 |
| 本次运行的所有权 | 当前哪个 worker 有权更新这次执行。 | 旧 worker 不能覆盖接替它的新 worker 的状态。 |
命令完成与终态同步并发时保持幂等:比较并交换发生冲突后,服务只接受属于同一执行、结果版本相同且已应用的命令,保留持久化回执,继续报告其他冲突。验收通过公开取消入口的观察器确定性插入终态同步,并确认拒绝或版本不匹配的结果仍然报错。
工程参考:标识和安全规则
| 标识 | 用途 |
|---|---|
session_id | 确定会话范围和访问权限,不能直接作为执行控制目标。 |
run_id | 关联原执行及其分叉、重试执行。 |
execution_id | 精确控制目标。暂停、继续保留它;分叉或重试创建新 ID。 |
attempt_id | worker 的一次实际运行;恢复时可创建新的 attempt。 |
revision_id | 程序及其运行规则的不可变版本。 |
command_id + expected_version | 防止重复操作,并拒绝基于旧状态发出的命令。 |
- 各入口使用同一个命令服务。先保存请求,再由执行者处理;界面状态不能代替权限检查。
- 取消优先于暂停、单步、继续和补充指令。只有当前执行者可提交进度或最终状态。
- 已返回的模型错误和中止会登记响应。工具结果未知时仍需核对,History 标签不会清除它。
- 分叉前验证保存位置、程序版本和权限。修改程序、模型或工具规则,仍需独立审批。
- Agent 和后台 Job 使用同一套执行管理。Job 的 job_id 等于 execution_id。资源分配与执行状态分开管理。
- 分支归属取自已有会话图和消息 ID。压缩上下文后仍保留早期关联;加载项目会话时读取最新保存位置。
- 读取和控制限制在有权访问的会话内。重连使用已保存的版本和事件位置,不重复创建任务。
- 受管理进程保留 ID、归属和有上限的输出。重启后检查监督进程,不能只凭保存的 PID 发送终止信号。
6. 实现与验证
| 部分 | 已有实现 | 怎样验收 |
|---|---|---|
| 分支统计 | 按真实会话分支显示,每次执行保留在详情中。 | 连续会话 → History 1;确有三个分支的会话 → History 3。 |
| 待处理状态 | 区分单纯缺模型记录、真实等待和工具结果不明。 | 真实审批仍显示;已结束的模型请求不会单独要求确认。 |
| 执行控制 | 已有统一命令、检查点和版本控制;不同执行支持的能力不同。 | 只验证该执行声明支持的操作;强制工具、spawn 和 merge 路径仍有限制。 |
| 进程与恢复 | 默认 macOS App 已验收进程归属、独立停止、输出保留和刷新。 | 这些验收不能证明 Windows 或 Linux 的实际运行结果。 |
限制:不恢复任意线程栈,不自动撤销操作,也不补造从未保存的进程记录。普通函数内部提问仍需预先声明交互边界;等待的最长时间和 Job 的运行预算,尚未统一接入资源管理。
参考与相关设计
| 参考 | 采用的思路 |
|---|---|
| 调试适配器协议 | 把查看和控制分开,明确支持哪些操作。 |
| Temporal 工作流执行 | 持久保存执行状态。 |
| Temporal 工作流暂停 | 暂停不会撤销已经开始的工作。 |
| LangGraph 持久化 | 在检查点保存进度。 |
| LangGraph 中断 | 在规定位置等待输入,再恢复。 |
| LangGraph 历史状态回溯 | 创建其他执行方案时保留原历史。 |
| Kubernetes Pod 生命周期 | 先请求终止,再确认执行者退出。 |
运行中会话自动继续
正常执行时在已有记录中保存每次模型决策、工具结果和下一步位置,不增加退出前保存流程。启动后使用原执行、会话和回复身份继续之前运行中的 Agent;手动暂停、取消和已完成任务不自动运行。已完成工具不重复执行,结果不确定的外部操作先核对。首个模型响应尚未完成时使用已有输入继续。
界面重连保留已有聊天内容,后台退出不写入错误回复,不增加重启或恢复 loading。真实错误保持原有显示。验收使用隔离数据库和受控执行入口,不重启正在使用的 App 复现问题。
实现状态:已实现,规格与质量审查均通过。受控验证覆盖重复启动、原回复身份、完整模型上下文、已完成工具操作与独立会话控制;完整非浏览器、非外部服务 Python 测试及 Web、Desktop、文档和静态检查均通过。
函数版本与断点继续
先由用户设置代码变化时继续原版本或切换最新版本,全局默认继续原版本,单个执行可覆盖。判断当前函数及相关依赖是否改变,不以仓库其他文件变化代替。策略调整通过带版本校验的执行命令保存。
手动调用和聊天中的函数调用共用恢复机制,但保留不同结果去向:前者更新原函数记录,后者将结果返回原工具调用位置,再继续聊天。函数与外层聊天分别保存代码版本和恢复身份;结果已保存但未交付时,只补交结果。
持久化保存原代码及依赖身份、输入、已完成步骤与结果、下一安全位置、中间状态及未确认操作。原版本必须实际可加载。切换新版本时保留旧结果来源,核对步骤对应关系及状态兼容性;需要转换时显式处理,无法兼容时暂停。原代码缺失、依赖不可用、状态不可序列化或执行边界不受支持时,不能擅自从头运行。
已完成操作不重复执行;正在执行且结果未知的步骤先核对。嵌套调用保留父子关系,并行分支分别保存进度,重复恢复和再次中断不得重复已接受的操作。两小时自动恢复期限、用户取消、手动暂停、审批、权限和资源准入继续生效。选择新版本后不兼容时,不自动改回旧版本。
持久化步骤检查边界后、注册操作或准入派发前收到暂停时,通过既有待应用 Pause 命令挂起函数。只有真实暂停命令仍待应用,才能将 admission_closed 冲突转换为挂起;其他冲突、失效执行者和终态准入失败保留原错误。同一执行者已登记但从未派发的 planned intent,在发布暂停前保存 not_started 回执。取消优先。成功派发的操作不能标记为未开始;已完成结果保留,未知结果仍须核对。显式 Continue 保留函数调用位置并复用已提交步骤。此边界处理不自动继续用户暂停的执行。
实现使用同步 step、嵌套 workflow 和命名 parallel 边界,从已保存结果重建局部 JSON 状态。执行事件、状态对象、检查点和外部操作记录共同保存进度,不另建调度器或数据库。Continue 命令保存版本策略;新版本通过已有进度检查并执行剩余工作后,成为后续重启所保留的版本。Python 辅助函数源码递归保存;辅助函数内部导入及非标准库模块、类对象依赖会在外部步骤前被拒绝。原生调用栈、异步编排和活动句柄不属于该恢复约定。
实现状态
验收要求包括独立规格与质量审查、手动与聊天恢复的受控检查,以及完整发布检查。该约定仅适用于显式声明的同步可恢复函数;现有 Agent 重启恢复不等同于任意 Python 函数已支持这些能力。
Workflow 提问
运行中的 Python Workflow 在原进程中等待回答。执行器绑定精确 execution、attempt、generation 和进程实例,使用现有问题存储与问题卡片,不保存 Workflow 检查点。回答后原调用继续,刷新浏览器后可重新显示待答问题。
只有有效运行中的执行者可以创建与接收回答。取消、进程退出或执行者失效会取消问题;重启 worker 不重放 Workflow。预声明 Agent 问题保留原有持久化恢复行为。意外的提问错误必须传播,不能变成用户未回答。
验收包含实际显示问题、回答后原调用继续、刷新、归属隔离、重复回答和取消。
对话输出中的用户决定
待处理用户确认在所属会话输入框上方显示;题号、选项行与 Back/Next/Submit 流程依照用户提供的 Claude 截图。切题、折叠保留草稿且不发送命令,最后提交沿用现有命令确认语义;Skip 拒绝整组问题。终态回执留在对话中,批准范围、讨论、会话归属、普通草稿和焦点沿用现有规则。
提问、确认、表单和权限批准作为当前会话中的独立输出卡片显示。每张卡片拥有自己的回答字段、提交按钮和送达状态。普通输入框保留草稿、附件、函数表单、焦点及正常发送或排队语义。新问题不占用输入框,不转移焦点。
点击提交后立即显示实际提交的回答与提交中状态。命令确认成功后显示回答回执;送达未知时保留同一命令及答案供重试。拒绝或过期不能显示为批准。并发问题按标识分别显示,并绑定原会话与执行,分屏同样适用。现有批准范围和讨论行为保持一致。
复用问题事件与执行命令。会话内回执不是 Workflow 检查点;刷新恢复待回答问题,本次不新增历史回执持久化。回答后原进程继续,不新增执行栈保存或重启续跑。验收覆盖输入框隔离、即时反馈、首次回答成功、未确认重试不重复执行以及原生界面。
实现状态
输出卡片复用问题渲染器与规范命令回执。验证范围包括输入框隔离、回答反馈、会话归属、重试标识与原生验收。