# 聊天 Goal

Goal 让目标跨普通聊天轮次保持有效。当前 agent 使用会话的工具、模型、权限和历史执行任务。一次聊天成功结束后，runtime 为仍 active 的 Goal 发起下一轮普通聊天。完成候选使用独立的只读验收轮次；普通工作轮次不会每轮运行 judge。聊天模式不嵌套工作 agent。

## 开始与规划

输入 `/goal <目标>`，或使用 **Programs → Workflow → goal → Use**。表单启动聊天 Goal，不执行 Python Workflow。也可以明确要求 agent 创建 Goal。

agent 使用 `todo_create`、`todo_update` 和 `todo_list` 维护多步骤工作计划。Goal 工作期间创建的 todo 关联目标及其 revision。todo 修改成功后，Goal 详情刷新计划进度，回合结束时再次核对。进度通知失败不会撤销已经保存的 todo。目标独立于计划保存：全部勾选不能单独证明目标已完成。

agent 调用 `update_goal(status="complete")` 前，必须用当前实际证据核实每项要求。这个短操作只提交候选，不直接把 Goal 标记为已完成。关联 todo 尚未完成时拒绝提交；全部完成的 todo 计划也会触发一次验收，同一计划不会反复自动触发。简单目标不必为了形式创建 todo。

标记显示“验收中”时，独立的普通聊天轮次逐项检查原目标和 todo 要求。仅提供受信的内置检查工具，并继续遵循原有权限。shell、写操作和 Goal 修改工具不会提供给验收轮次。需要执行测试或查询外部系统时，验收返回缺少的证据，由工作 agent 在正常权限和预算下补充。

验收必须返回逐项判断和已记录的证据引用。成功读取保存文件内容摘要，会话证据和验收回复也保存摘要。标记已完成前，runtime 重新检查目标要求、用户控制版本、todo、未结束执行、未知效果及引用证据。暂停、编辑、取消、新用户要求和证据变化都会阻止过期成功。缺证据时返回普通工作，执行失败则保留可恢复状态。语义验收仍是独立模型判断，不保证绝对正确；完成描述核实时的结果，不会自动开始持续监控。

## 控制执行

页面重载后，Goal 详情保留目标、状态、用量和进度。没有 todo 时，标记和详情省略待办进度，不显示占位文字，保留 Goal 状态。通过普通聊天输入补充要求，遵循已有排队或插入当前执行的选择。

- `/goal`：读取当前状态。
- `/goal pause`：保存暂停状态，并请求取消当前执行。
- `/goal resume`：恢复暂停目标，继续累计用量。
- `/goal verify`：对最近已结束的工作独立验收，不直接标记目标已完成。
- `/goal edit <目标>`：保存新 revision 并暂停，准备好后显式恢复。
- `/goal clear`：取消目标。
- `/goal budget max_turns=10 max_tokens=10000`：修改上限，零表示移除对应上限。

Goal 默认不限制执行轮数。只有显式设置正数 `goal.max_turns` 或启动时轮数预算才有上限；达到上限不表示完成。进度标记显示 todo 完成情况，不显示执行轮数。已有 Goal 保留保存的预算，可用 `/goal budget max_turns=0` 移除旧轮数上限，不重置工作或用量。显式 token、active-time 和成本限制按累计用量计算。预算耗尽后必须先增加或移除上限才能恢复。等待时间不计入执行时间。自动续轮不会扩大工具权限。

执行失败或取消后停止自动续轮。worker 重启本身不再暂停聊天 Goal：兼容的检查点按自动恢复策略继续，停机时已成功结束的轮次保留持久续轮通知。普通聊天的执行者退出后，即使有未知外部结果，也可以使用独立的受限轮次继续，而不重放旧工具调用。用户暂停、取消、预算耗尽和显式恢复限制仍然阻止自动工作。旧的可恢复暂停状态及缺少已保存恢复来源的 Goal 仍需显式 Resume。通用外部事件唤醒仍是恢复限制。等待或尚未结束的执行不代表目标完成。

`create_goal`、`get_goal` 和 `update_goal` 是短时间的状态操作，不负责执行任务。只有同一个已核实阻塞连续出现至少三轮，且没有独立工作可做时，agent 才能标记 `blocked`。runtime 校验最低轮数；是否为同一个阻塞由 agent 根据证据判断。

## 恢复与计量

内部验收轮次不作为助手回复显示。开始、执行、暂停和验收过程中不增加聊天卡片。Goal 结束时，仅在对应位置保留一个小卡片；点击复用原有 Goal 详情窗口，查看该目标保存的结果、进度和用量。历史详情只读，新目标不会覆盖旧卡片的记录。正常 agent 回复和原始证据保持不变。

Goal 详情使用后端当前返回的操作条件。Resume 或 Verify 不可用时显示未满足的条件；刷新状态可重试读取，保留目标和未保存草稿。旧操作结果未知时，End 仍可结束 Goal 意图。未确认操作显示已保存的 ID、工具名、时间和状态；查看执行详情会打开该条执行及其待答审批或问题，不跳到无关的活动选择。

Verify 使用自动完成候选所用的独立普通验收轮次，需要已有结束的工作、关联待办完成、预算可用且没有未确认的相关工作。属于此 Goal 的后台进程仍在运行或结果未知时不能验收，无关资源不会阻止验收。暂停、取消、版本变化和重复请求不能绕过这些条件。

执行时间保留重启前已观察到的工作，不计入离线时段。worker 突然退出时，最后一次持久心跳提供时间下限，之后无法观察的时段显示为未知，不按零处理。迟到用量回执不会重新启动暂停目标的计时。用户显式设置执行时间上限时，未知时段导致无法核实上限便停止新工作；移除该可选上限后可以继续，不增加默认时间或轮数上限。

Goal 区分“旧执行已结束”和“允许开始新聊天”。普通聊天已无执行者、活动子任务和待回答问题时，Resume 可以结束旧的中断轮次，并开始受限的检查轮次。未知效果仍保持未知；Resume 和此前未确认的停止都不声称外部操作已取消。新轮次使用持久身份，避免在创建执行与保存 Goal 之间崩溃后重复创建轮次。检查点不兼容时开始新聊天；临时启动错误或凭据错误不会触发该处理。仅模型请求中断的后台 Job 保留原始输入和资源授权。子任务有未知效果时仍需要检查，不自动重放。Todo 完成不代表目标通过验收。

Provider 请求会修复不完整的工具调用历史，不改写已保存记录。缺失的结果以明确的“结果未知”错误占位补齐，包括历史末尾的调用。已有真实输出优先于占位，重复输出合并并与原调用配对；中断回复的文字保留并明确标注中断。无法配对的工具结果协议项仍保留在历史中，但不发送给 provider。此修复不证明操作失败、不授权重试，也不解除执行恢复限制。

已失去执行者的中断执行仍有外部结果未知时，同一会话的新操作需要针对本次操作的单次审批，bypass 模式和既有 allow 规则也不能免除。真正的内置文件核查工具（`read`、`grep`、`glob`、`list`）可按原有权限读取状态；自定义工具仅使用相同名称不会获得只读信任。审批列出此前结果未知的操作及新操作；未知操作集合改变后必须重新审批。批准不把旧操作标为成功或失败，非交互任务不能批准新副作用。此权限检查同样适用于重启后的新聊天轮次。

聊天 provider 请求在发出前固定 Goal 身份、revision 和价格。最终用量回执即使在暂停或编辑后返回，也计入原 Goal；创建新 Goal 不会把旧请求费用转给新目标。重复回执不重复计费。已发出但缺少用量回执的请求保留为未知，不视为免费。详情同时显示已知小计和未知请求数量。重启后可从账本重建统计，不重新发送 provider 请求。

旧游标统计在下一次归属明确的请求前保留为历史小计，不猜测历史请求的 Goal 身份。计量失败显示未知而不是零。流式部分计数是累计下限，不是额外费用；重复快照不相加，最终回执替换部分小计。

活动 Goal 创建的后台 Job 持久保存其归属，包括后续子任务和跨会话调用。目标会话中无关的 Goal 不承担费用；没有保存归属的存量 Job 保持未归属。Goal 和 Job 的预留额度在同一个计量事务中开始和结算；重启后可以使用已保存回执完成结算，不重复请求。token 或价格信息缺失时，分别保留对应的预留额度。

预算仍是可选设置。显式 token 或费用限额在取凭据、调用 provider 前预留保守额度，并发请求共享同一 Goal 限额，发送前再次检查。token 限额可以降低 provider 的输出上限。请求无法可靠估算、价格未知或服务档位未定价时，不能绕过硬限额；Goal 暂停或显示预算耗尽。尚未发送的预留过期后不能再发送；已经发送的请求不会因时间经过而被视为免费。这些约束要求经过审计的 provider 适配器，不承诺控制未经审计的外部计费行为。

## Python Workflow 兼容

聊天表单保留显式的轮数、token、活跃时间和费用限额；独立 Workflow 角色参数和隔离上下文会明确报错，聊天工作应通过会话设置配置。Rich REPL 的 `/goal` 启动普通 canonical chat，并显示 execution ID。

直接 Python 调用和组合 Workflow 中的 `goal()` 保留已有 work/refinement/judge 合同。这个兼容路径与聊天 Goal 分开，仍接受 `context_mode`、work/judge 模型设置和执行上限。聊天模式使用会话工作模型，不使用单独角色设置。

迁移及实现证据见[工程设计](../reference/design/runtime/goal-and-recovery.zh.html)。
