# Goals

> Goal 让 Qwen Code 跨轮次持续工作，直到满足指定条件。使用 /goal 设置一个 Goal，会话便会自行持续运行。当模型提出目标已完成或受阻时，一个独立的验证器根据 Goal 记录的最近部分来判定该提案。

- 网址：https://funcoding.ai/agents/qwen-code/users/features/goals/
- 来源：Qwen Code 官方文档原文（中文），Apache-2.0 许可，同步于 2026-10-11
- 官方原文：https://qwenlm.github.io/qwen-code-docs/zh/users/features/goals

---
Goal 让 Qwen Code 跨轮次持续工作，直到满足指定条件。使用 `/goal <objective>` 设置一个 Goal，会话便会自行持续运行。当模型提出目标已完成或受阻时，一个独立的验证器根据 Goal 记录的最近部分来判定该提案。当验证器接受，或者 Goal 被暂停、清除或因限制而停止时，会话结束。

## 命令

| 命令                     | 行为                                                      |
| ------------------------ | --------------------------------------------------------- |
| `/goal`                  | 显示当前 Goal 及其状态。                                  |
| `/goal <objective>`      | 创建 Goal，或替换当前活动的 Goal。                        |
| `/goal set <objective>`  | 与上面相同，显式形式。                                    |
| `/goal edit <objective>` | 修改活动 Goal 的措辞，无需从头开始。                      |
| `/goal pause` / `resume` | 停止或继续循环，不会丢失 Goal。                           |
| `/goal clear`            | 移除 Goal。                                               |
| `/goal-draft <intent>`   | 在设置之前让系统帮你编写目标（见下文）。                   |

创建、编辑或恢复 Goal 需要 trusted workspace（`/trust`）。在 Goal 状态被记录到日志之前（2026-07-29 之前的 Qwen Code 版本）录制的会话恢复时不会带有 Goal：其历史记录中的 `/goal` 卡片会作为历史记录显示，`/goal` 会报告未设置 Goal，而 `/goal set` 会重新启动它。在 Web Shell 和其他守护进程客户端中，重放历史记录后的尾部卡片会说明旧 Goal 未被驱动。无头模式用法请参阅[无头模式](https://funcoding.ai/agents/qwen-code/users/features/headless/#run-a-persistent-goal)。

一旦 Goal 计费了一个轮次，底部药丸和每个状态卡片都会显示它在允许窗口内的花费，格式为 `1.2k/30.0m`。该数字统计的是 Goal 自己的轮次中的模型调用、其直接前台子代理及其验证器检查。嵌套和后台子代理、无关的侧查询、cron 轮次和通知轮次被排除。返回无可用结果的失败检查不计入。恢复已记录的使用量不会重复计数。窗口由 [`model.goalTokenBudget`](https://funcoding.ai/agents/qwen-code/users/configuration/settings/) 设置；恢复一个已耗尽窗口的 Goal 会在已花费的基础上再授予一个窗口，因此数字显示为 `30.0m/60.0m` 而非从头开始。没有预算的 Goal 仅显示已花费的量。尚未计费任何轮次的 Goal 不显示任何数字。

当配置了轮次或活跃时间预算时，状态卡片还会显示相应的使用量与其预算的对比，例如 `3/20 turns` 和 `12m 3s/30m`。无头模式文本将其拼写为 `3 of 20 turns` 和 `12m 3s of 30m active`。零使用量保持隐藏，暂停或停止的 Goal 保留这些数字。

还有两个窗口可用，默认关闭：[`model.goalMaxTurns`](https://funcoding.ai/agents/qwen-code/users/configuration/settings/) 限制 Goal 可完成的轮次数，包括用户驱动的 Goal 轮次；[`model.goalMaxActiveMinutes`](https://funcoding.ai/agents/qwen-code/users/configuration/settings/) 限制其在运行进程中保持活动状态的墙钟时间，包括轮次之间的等待和空闲时间。Goal 处于暂停、阻塞或停止状态时的时间不计入第二个窗口，重启期间的停机时间也不计入；仅被挂起的进程仍会计费。无论哪个窗口先耗尽，Goal 都会获得同一个收尾轮次进行交接，然后停止直到你恢复它，恢复会在已使用量的基础上再授权一个窗口。只有耗尽的窗口会移动；其他窗口保持不变，`-1` 退出选项同样只对一个已耗尽它的 Goal 取消上限。时间窗口在轮次之间读取，而非通过计时器强制执行，因此 Goal 可能在超过窗口后仍继续运行一段时间才停止：已在运行的轮次不会被中断，在没有轮次运行时耗尽的窗口要等到下一个轮次结束才会被注意到。活动时间在记录的转换之间计算，因此被重启中断的轮次中的时间不计费。对任一设置的更改在重启后生效。两个窗口仅对在更改后创建的 Goal 生效，因此限制已记录在案的 Goal 意味着使用 `/goal set` 替换它——一个处于修订版 1 的新 Goal，其轮次、token 和活动时间计量器重置，其证据窗口从替换处开始，因此旧 Goal 记录的证据不再可引用——或者清除它并重新开始。恢复或编辑永远不会添加创建时未启用的上限。

会话自行采取的每个轮次都会报告 Goal 迄今为止的花费、已完成的轮次数，以及——除非 Goal 无限制运行——其被允许的窗口。除最终的收尾交接外，每个这样的轮次还携带常驻指令：重新检查工作区而非信任先前轮次的报告，朝着目标所要求的终态推进，当上一轮没有任何改变时做不同的事（从第二轮开始，在有上一轮可供判断之后），并在提出 Goal 已完成之前根据可引用的证据检查每一项要求。

Goal 不再将已记录证据压缩为轮次间的检查点声明：验证器直接读取记录，因此没有检查点可以供给的内容，并且曾经在长轮次末尾运行的 side-model 检查及其停滞限制也不再运行。`model.goalCheckpointTimeoutSeconds` 设置已退役：该键仍被接受以便现有设置文件可以加载，但其值会被忽略。底部药丸、状态卡片、无头 `/goal` 输出、Web Shell 状态栏和 Goals 对话框以及 `get_goal` 不再显示检查点行或停滞计数，包括对于仍运行检查点的版本录制的会话；该 Goal 的停止原因仍会说明其停止原因。

## 中断 Goal

取消 Goal 的轮次会暂停该 Goal。在模型回答时或其工具仍在运行时按 Esc，轮次停止，Goal 移至 `paused`，卡片和 `/goal` 都会说明停止原因。在你运行 `/goal resume` 之前，不会有任何继续。

在 Goal 处于活动状态时输入消息不会暂停它。你的消息会作为下一个 Goal 轮次运行，因此可以用它来引导工作；使用 `/goal pause` 或 `/goal clear` 来停止。

每次暂停都会说明原因：是你中断了它，是你运行了 `/goal pause`，是会话 token 限制阻止了下一个模型请求，还是轮次失败了，还是连续三个轮次都没有记录验证器可判定的内容且没有提案——Goal 簿记读取（`get_goal`、`update_goal`）不算作进度。因限制而停止的 Goal 保留该限制的原因。

## Goal 如何判定

验证器不会自行运行命令或读取文件。它只能看到记录中已有的内容：这个 Goal 的记录，从最近的记录开始往回读取，直到请求被填满（256 000 字节，任何单条记录超过 8 000 字节时会在中间被截断）。一个简短的收尾轮次会为之前的轮次留出空间；一个很长的轮次会独自填满请求，验证器会被告知有多少条较旧的记录被省略，并会拒绝那些证明可能藏在被省略记录中的提案：

- 可见的助手输出、工具结果和你自己的消息算作证据。目标文本和模型的隐藏推理不算。在完成被提出之前很久就运行的检查可能已经不在视野中，需要重新运行。
- 打印的文本只能证明文本被打印了。关于测试通过、文件已更改或远程已更新的声明需要记录中有相应的工具结果。
- 关于你确认、选择或批准了某事的声明需要来自你的真实消息；验证器会拒绝假设已确认的提案。
- 当证据缺失时，判定结果为"尚未完成"，而非"已完成"。没有人能提供证据的条件会让循环持续运行，直到限制将其停止。

因此，目标必须让代理在提出完成时产出证据：运行指定的检查并展示决定性的输出。

## 编写一个好的目标

按以下顺序将这些部分写入目标：

| 部分         | 要写的内容                                                                                                                     |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| `Outcome:`   | 一句话：完成时什么是成立的。                                                                                                     |
| `Done when:` | 编号的二进制检查。至少一项要指定命令及其预期退出码或输出行，并要求粘贴该行。                                                      |
| `Must not:`  | 不要触碰的文件、不要弱化的测试或阈值、不要采取的不可逆操作（push、delete、publish）。                                             |
| `Budget:`    | 关于何时放弃的建议性模型指令，例如 "stop as blocked after 20 turns"。要强制执行限制，请在设置中设置 `model.goalMaxTurns` 或 `model.goalMaxActiveMinutes`，而非在此处。                                                                            |
| `On block:`  | 受阻时报告什么，以及人类必须做出什么决定。                                                                                        |
| `Context:`   | 仅包含代理无法在工作区中找到的事实：分支、环境、早期决策。                                                                        |

保持一个目标。`/goal set` 和 `/goal edit` 接受任意长度，但大致不超过 1,200 个字符：目标会在每个 Goal 轮次重新发送。模型通过 `propose_goal` 提出的目标上限为 1,500 个字符。两个命令都会将换行折叠为空格，因此请对条目编号，而不要依赖换行。

`Budget` 是给模型的指令，告诉它何时停止并报告阻塞；模型可能会也可能不会遵守它。要使运行时本身在轮次数或时长处停止，请设置 [`model.goalMaxTurns`](https://funcoding.ai/agents/qwen-code/users/configuration/settings/) 或 [`model.goalMaxActiveMinutes`](https://funcoding.ai/agents/qwen-code/users/configuration/settings/)。在目标中写入这两者不会配置它们，也不会更改 Goal 的 token 预算。

| 弱目标                     | 失败原因                                                | 更强的目标                                                                                                                                                                                                                                |
| -------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| make checkout faster       | 没有阈值，没有检查。                                    | `Outcome: checkout p95 is below 250 ms. Done when: 1) npm run bench:checkout exits 0 and prints p95 < 250 (paste the line); 2) npm test exits 0. Must not: change the benchmark or skip tests. Budget: as model guidance, stop as blocked after 20 turns. On block: report the measured p95 and what blocks it.` |
| clean up the auth module   | "Clean"没有可观测的证据。                               | 思考什么是可观测的：`src/auth` 中零 lint 警告、覆盖率阈值、文件数量。                                                                                                                                                                      |
| ship the release           | 不可逆，且需要人类决定。                                | 缩小为可检查的预发布状态（tag 存在、`npm run release:dry-run` 退出码为 0），并将"do not publish"写入 `Must not`。                                                                                                                           |
| after I confirm the design | 验证器无法看到从未发生过的确认。                        | 将其移至 `On block:` 作为人类必须做出的决定。                                                                                                                                                                                              |

## 让 `/goal-draft` 帮你编写

`/goal-draft <what you want done>` 是一个内置 skill，可以帮你完成上述工作。它只读取工作区中足以确定范围和真实验证命令的内容，不会运行测试、构建、安装依赖或启动服务。当关键选择不明确时，它最多询问一轮问题，然后编写一个紧凑的目标，通常包含 3–5 个完成检查（足够时更少）。显式需求会被保留；它不会为了凑数而添加检查。

对于审计，完成意味着覆盖约定的场景并报告证据，包括已确认缺陷的复现步骤。未发现缺陷也是有效结果。草稿不应发明最少的场景数、证据文件数、探索轮数或缺陷数。

如果无法确定成功标准、命令、输入路径或关键决策，该 skill 会返回一个标记为 "Needs clarification" 的草稿，其中包含 `` 项。它不会提供该草稿供批准，也不会打印可运行的 `/goal set` 或 `/goal edit` 命令。非必要的默认值标记为 `[ASSUMPTION]`；它们不能替代缺失的成功标准。

目标准备好后，交互式终端或 Web Shell 会话可以显示下文所述的 `propose_goal` 审批对话框。不支持 Goal 提议的客户端、无头运行、工具被禁用的会话以及已有活动 Goal 的会话会收到一个手动运行的命令。交接说明会指出草稿尚未应用。该 skill 永远不会自行开始工作，未经你的批准不会设置任何内容。

传入现有目标以使其更严谨：`/goal-draft all tests pass and the lint is clean`。对于活动的 Goal，明确的收紧请求会生成 `/goal edit`；替换则使用 `/goal set`。如果预期操作不明确，该 skill 会在其单轮问题中包含该选择。

### 批准模型提议的 Goal

在交互式终端或带有附加客户端的 Web Shell 轮次中，模型拥有一个 `propose_goal` 工具。当 `/goal-draft` 完成时，或者当你请求一个跨多个轮次的结果时，它可以提议目标，而不是打印一行 `/goal set …` 让你复制。提议以审批对话框的形式出现，显示完整的目标。批准它会像 `/goal set` 一样设置 Goal，在当前轮次结束时生效（模型确认并停止；第一个 Goal 轮次随后自动开始），拒绝则不设置任何内容——模型仅看到工具调用未被允许，其指令告诉它不要询问原因，也不要再次提议相同的目标。审批绑定到发起请求的轮次：如果该轮次被取消或以其他方式未到达结束，审批将被丢弃，而不会在后续消息或自动轮次下生效。任何权限规则或审批模式（包括 YOLO）都不会跳过此对话框，且该工具在另一个 Goal 处于活动状态、计划模式以及不受信任的文件夹中时会拒绝执行；子代理永远不会被提供此工具。Web Shell 使用其现有的允许/拒绝权限面板。已停止的 Goal 仅在其仍与审批时显示的版本匹配时才能被替换；更改它会使提议失效。无头运行、Web Shell 通道交付和自动轮次，以及缺少所需审批和轮次生命周期支持的 ACP 客户端保留打印的 `/goal set` 交接方式。

通过在用户设置中使用 `goals.modelProposed: "disabled"` 来关闭它。由于该设置决定模型是否可以请求启动自主循环，因此仅从用户和系统作用域遵守；工作区 `.qwen/settings.json` 值会被忽略并给出警告。

该 skill 被指示为只读，且只有其非变更工具会被自动批准（`get_goal`、`read_file`、`glob`、`grep_search`）。`ask_user_question` 故意不被自动批准，因此其问题对话框会在 skill 根据你的答案起草之前显示。与其他内置 skill 一样，名为 `goal-draft` 的项目或个人 skill 会覆盖它，`skills.disabled` 可以将其关闭。请参阅 [Skills](https://funcoding.ai/agents/qwen-code/users/features/skills/) 了解内置 skill 的发现方式。

## 遥测

Goal 转换通过两个独立的设置报告：[telemetry](https://funcoding.ai/agents/qwen-code/developers/development/telemetry/) 启用 OpenTelemetry 事件和指标，而 `privacy.usageStatisticsEnabled` 控制使用统计并默认开启。OpenTelemetry 事件命名为 `qwen-code.goal_state`；使用统计报告相同的转换数据但不包含 Goal id。

报告的转换包括：set、replace、edit、pause、resume、clear、验证器拒绝、完成、阻塞和使用限制。事件携带轮次计数、token 花费、活跃时间和任何配置的预算。`clear` 事件仅标识被移除的 Goal 及其修订版，不含使用量数字。`replace` 事件描述新 Goal，而非被移除 Goal 的最终花费。用户暂停和自动无进度暂停共享相同的 `pause` 原因；事件在可用时包含原始的无进度连续计数。只有完成、阻塞和使用限制贡献到结果直方图。恢复的会话不会重新报告其 Goal 恢复自的转换。恢复期间提交的新停止会正常报告。

Goal 事件本身不包含目标文本或停止原因，仅包含目标的代码点长度。其他遥测可能包含该文本：工具调用遥测记录 `propose_goal` 和 `update_goal` 的参数，包括目标或模型编写的原因，即使 `telemetry.logPrompts` 关闭也是如此。
