原文标题:A harness for every task: dynamic workflows in Claude Code。本文基于 Thariq Shihipar 的原文,完全由有道龙虾自动翻译、整理和发布。

封面图

上周,我们在 Claude Code 中发布了 dynamic workflows(动态工作流)。Claude 现在可以根据手头任务,即时编写自己的 harness(执行框架),为当前任务量身定制。

默认的 Claude Code 执行框架是为写代码构建的,但它也适用于许多其他类型的任务,因为很多任务本质上很像编码任务。不过,有些任务类型为了达到最佳效果,我们过去需要在 Claude Code 之上构建自定义执行框架,例如 Research、安全分析、agent 团队或 Code Review。

Workflows 让你可以在 Claude Code 内部原生地动态创建执行框架,让 Claude 解决这些问题以及更多问题。你也可以分享和复用这些 workflows。

本文会介绍我对 workflows 的初步体验和收获,帮助你更充分地使用它。不过,最佳实践仍在发展中。动态 workflows 通常会消耗更多 token,所以要认真思考何时以及如何使用它们。

注:这篇文章也发布在 Claude Blog 上。

示例 Prompt

在深入技术细节之前,我想先给一些示例 prompt,帮你想象 workflows 的可能性:

  1. “这个测试大概每 50 次会失败 1 次。搭建一个 workflow 来复现它,提出理论,并在 worktree 里对这些理论进行对抗性测试。/goal 不要停,直到有一个理论成立。”
  2. “使用 workflow,查看我最近 50 个 session,挖掘我反复纠正的问题,并把重复出现的内容变成 CLAUDE.md 规则。”
  3. “用 workflow 搜索过去六个月 Slack 里的 #incidents,找出反复出现但没人提 ticket 的根因。”
  4. “拿我的商业计划,运行一个 workflow,让不同 agent 分别从投资人、客户和竞争对手视角进行批判。”
  5. “这里有一个包含 80 份简历的文件夹,用 workflow 为后端岗位排序,并复核前 10 名。使用 AskUserQuestion 工具采访我,以确定评分标准。”
  6. “我需要给这个 CLI 工具取名。用 workflow 头脑风暴大量候选名,并通过锦标赛选出前三。”
  7. “用 workflow 把我们的 User model 在所有地方重命名为 Account。”
  8. “检查我的博客草稿,并用 workflow 对照代码库验证每一个技术声明,我不想发布错误内容。”

动态 Workflows 如何工作

动态 workflows 会执行一个 JavaScript 文件,其中包含一些特殊函数,用来启动和协调 subagents:

动态 workflows 如何工作

动态 workflows 也包含标准 JavaScript 函数,比如 JSON、Math 和 Array,用于处理数据。

尤其有用的一点是,动态 workflows 可以决定 agent 使用哪个模型,以及 subagent 是否在自己的 worktree 中运行,从而让 Claude 根据任务选择所需的智能水平和隔离级别。

如果 workflow 被打断,例如用户操作或退出终端,恢复 session 后 workflow 可以从中断处继续。

为什么需要动态 Workflows

当你让默认 Claude Code 执行框架处理任务时,它需要在同一个上下文窗口中同时规划和执行。对于许多编码任务,这非常有效,但在长期运行、大规模并行和高度结构化的对抗性任务中,它有时会失效。

原因是 Claude 在单个上下文窗口中处理复杂任务越久,就越容易遇到几类特定失败模式:

  1. Agentic laziness(智能体懒惰):Claude 在复杂、多部分任务还没完成时就提前停止,并在只完成部分进展后宣布任务结束。例如安全审查中只处理了 50 项里的 20 项。
  2. Self-preferential bias(自我偏好偏差):Claude 倾向于偏爱自己的结果或发现,尤其是在被要求根据评分标准验证或评判这些结果时。
  3. Goal drift(目标漂移):在许多轮交互后,尤其是经过上下文压缩后,Claude 会逐渐偏离原始目标。每次总结都是有损的,边界条件要求或“不要做 X”之类的约束可能会丢失。

创建 workflow 可以通过协调多个拥有独立上下文窗口、目标更聚焦且相互隔离的 Claude 来对抗这些问题。

动态 Workflows 与静态 Workflows

你可能以前用 Claude Agent SDK 或 claude -p 创建过静态 workflow,用来协调多个 Claude Code 实例。但静态 workflow 需要覆盖所有边界情况,所以通常更通用。

有了 Claude Opus 4.8 和动态 workflows 后,Claude 现在足够聪明,可以为你的具体用例编写定制化执行框架。

动态与静态 workflows

使用动态 Workflows 的有用模式

你可以直接让 Claude 创建 workflow,也可以使用触发词 “ultracode” 来确保 Claude Code 创建 workflow。

但如果你建立起对动态 workflows 运作方式的心智模型,就能更好地判断何时使用它们,以及如何通过 prompt 引导 Claude。

常见模式包括:

workflow 常见模式

  1. 分类并执行:使用分类 agent 判断任务类型,然后根据任务路由到不同 agent 或行为。也可以在最后使用分类器判断输出。
  2. 扇出并综合:把任务拆成许多小步骤,每个步骤由一个 agent 执行,然后综合结果。适用于大量小步骤,或每个步骤都需要独立干净上下文窗口的情况。
  3. 对抗性验证:每个生成结果的 agent,都配一个单独的验证 agent,根据评分标准或条件进行对抗性验证。
  4. 生成并过滤:围绕某个主题生成许多想法,再根据评分标准或验证进行筛选、去重,只返回最高质量且经过测试的想法。
  5. 锦标赛:不是拆分任务,而是让多个 agent 竞争。启动 N 个 agent,用不同方法尝试同一任务,再由评审 agent 进行成对比较,直到选出赢家。
  6. 循环直到完成:对于工作量未知的任务,不设固定轮数,而是循环启动 agent,直到满足停止条件,例如没有新发现或日志中不再有错误。

使用场景

你可以更有创造性地思考何时、如何让 Claude Code 创建动态 workflows。我发现 workflows 有时对非技术工作甚至更有用。

使用场景

迁移与重构

Bun 使用 workflows 从 Zig 重写为 Rust。关键是把任务拆成一系列需要处理的步骤,例如调用点、失败测试、模块等。

可以为每个修复启动一个 subagent,在 worktree 中完成修复,再让另一个 agent 进行对抗性审查,然后合并。

可以考虑告诉 agent 不要使用资源密集型命令,这样就能最大化并行度,避免耗尽机器资源。

深度研究

我们在 Claude Code 中发布了一个 deep research skill(/deep-research),它使用动态 workflows。

具体来说,它会扇出执行网页搜索、抓取来源、对声明进行对抗性验证,并综合成带引用的报告。

这种研究不只适用于网页搜索。例如,你也可以让 Claude 从 Slack 上下文中编写状态报告,或通过深入探索代码库来研究某个功能是如何工作的。

深度验证

深度验证

如果你有一份报告,希望检查并为其中每一个事实性声明找到来源,可以生成一个 workflow,让一个 agent 识别所有事实性声明,然后为每个声明启动一个 subagent 进行详细核查。

你还可以让验证 agent 检查来源 subagent,确保它使用的来源足够高质量。

排序

排序

如果你有一批项目,需要根据某种定性指标排序,而你认为 Claude Code 擅长评估这种指标,比如按 bug 严重程度排序支持工单,那么 workflow 很有用。

如果你试图在一个 prompt 里排序 1000 多行,质量会下降,而且上下文也放不下。

更好的方式是运行锦标赛、成对比较 agent 组成的流水线,或并行分桶排序后再合并。

每次比较都是独立 agent 完成,所以确定性的循环负责维护比赛结构,只有运行顺序保留在上下文里。

记忆与规则遵循

记忆与规则遵循

如果你发现 Claude 总是漏掉或难以遵守某些规则,即使这些规则已经写进 CLAUDE.md,也可以创建一个 workflow,其中列出必须由验证 agent 检查的规则,每条规则一个验证 agent。

创建一个怀疑者 persona 的 subagent 来审查这些规则,也有助于避免过多误报。

反方向也成立:挖掘你最近的 session 和 code review 评论,找出你反复纠正的问题,用并行 agent 聚类,对每个候选规则做对抗性验证,判断它是否本能防止真实错误,然后把留下来的规则提炼回 CLAUDE.md。

根因调查

调试最有效的方式通常是提出多个独立假设并测试它们。但如果只使用一个上下文窗口,Claude 容易产生自我偏好偏差。

Workflow 可以通过结构化方式避免这个问题:启动多个 agent,从互不重叠的证据中生成假设。例如,分别让 agent 查看日志、文件和数据。

每个假设之后都可以接受验证者和反驳者小组的审查。

这不只是代码场景。Workflows 也可以用于销售、数据工程或任何复盘工作,例如调查“三月销售额为什么下降”或“这个 pipeline 为什么失败”。

大规模分流

大规模分流

每个团队都有支持队列、bug 报告或其他 backlog,无法完全由人类处理。

Triage workflow 可以对每一项进行分类、和已有追踪内容去重,并采取行动。这可能意味着尝试修复,或升级给人类用户。

一种有用的 triage workflow 模式是隔离区。读取不可信公开内容的 agent 被禁止执行高权限操作,真正执行操作的是负责行动的 agent。

可以把 triage workflows 和 /loop 搭配,让 Claude 持续运行这类流程。

探索与品味判断

当你需要探索不同解决方案时,workflows 很有用,尤其是设计、命名这类基于品味的任务,而且最好配一个评分标准。

可以让 Claude 探索大量方案,并给 review agent 一个“好方案”的 rubric。只要 review agent 认为已经满足标准,任务就完成。

方案也可以通过基于 rubric 的锦标赛来排序或选择。

评测

你可以为特定任务运行轻量 evals:在 worktree 中启动独立 agent,然后再启动比较 agent,根据 rubric 对具体输出进行比较和评分。

例如,评估并优化你创建的某个 skill 是否满足特定标准。

模型与智能路由

可以创建一个针对你任务调优的分类 agent,由它决定使用哪个模型。

当任务会包含许多工具调用,且执行前的研究能帮助判断最适合的模型时,这会很有用。

例如,“解释 auth 模块如何工作”这个任务适合哪个模型,取决于 auth 模块里有多少文件,以及代码库的结构。分类 agent 可以先做这些研究,再根据预期复杂度路由到 Sonnet 或 Opus。

什么时候不该使用动态 Workflows

Workflows 还很新。虽然它在很多场景下能带来超额收益,但不是每个任务都需要它,而且它可能显著增加 token 消耗。

最好创造性地使用 workflows,把 Claude Code 推向你以前没有尝试过的方向。

对于普通编码任务,可以先问自己:这真的需要更多计算吗?例如,大多数传统编码任务并不需要 5 个 reviewer 组成的小组。

构建动态 Workflows 的技巧

构建技巧

  1. Prompt 要详细:使用上面提到的具体技巧来提示动态 workflows,效果最好。
  2. Workflows 不只适合大任务:你可以让模型使用 “quick workflow”。例如,快速对某个假设做一次对抗性审查。
  3. 结合 /goal 和 /loop:当 workflow 可以重复运行时,例如 triage、research 或 verification,可以和 /loop 搭配定期执行,并用 /goal 设置硬性完成要求。
  4. 设置 token 预算:你可以为动态 workflows 设置明确 token 预算,限制任务消耗。例如提示 “use 10k tokens”,这会设置上限。
  5. 保存与分享动态 workflows:你可以在 workflow 菜单中按 “s” 保存 workflow。可以把它们提交到 ~/.claude/workflows,或通过 skill 分发。

要通过 skill 分享,可以把 JavaScript workflow 文件放进 skill 文件夹,并在 SKILL.md 中引用。

通过 skill 分享 workflow

为了更灵活,你可能希望提示 Claude 把 skill 里的 workflows 当作模板,而不是必须逐字运行的脚本。

一个全新的世界

Workflows 是扩展 Claude Code 的一种有用新方式。

我鼓励你把它看作一个起点。关于如何更好地使用它,还有很多值得探索的地方。

欢迎告诉我们你的发现。

Thariq Shihipar 和 Sid Bidasaria(@sidbid)是 Anthropic 的技术团队成员,负责 Claude Code。