Skip to content

为每个任务打造 harness:Claude Code 中的动态 workflow

原文: A harness for every task: dynamic workflows in Claude Code

作者: Thariq Shihipar 和 Sid Bidasaria,Anthropic 技术团队成员,从事 Claude Code 开发

日期: 2026年6月2日


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

默认的 Claude Code harness 是为编码而构建的,但它对许多其他类型的任务同样有用,因为事实证明,许多任务与编码任务类似。然而,对于某些特定类别的任务,我们不得不在 Claude Code 之上构建自定义 harness 以达到最佳性能,例如 Research(研究)、安全分析、agent 团队(多智能体协作)或 Code Review(代码审查)。

Workflow 允许你动态创建构建在 Claude Code 之上的 harness,使 Claude 能够更原生地解决所有这些问题。你还可以与他人共享和复用这些 workflow。

在本文中,我将分享我最初使用 workflow 的经验和学习心得,帮助你充分利用它。请记住,最佳实践仍在不断发展:动态 workflow 通常会消耗更多 token,最适合复杂的、高价值的任务。

示例 prompt

在深入技术细节之前,我想先提供几个示例 prompt,帮助你思考 workflow 的可能性:

  1. "This test fails maybe 1 in 50 runs. Set up a workflow to reproduce it. Form competing theories about the race, and don't stop until one theory survives the evidence." (这个测试大约50次运行会失败1次。建立一个 workflow 来复现它。形成多个竞争性假说,直到一个假说经得起所有证据的考验才停下来。)

  2. "Using a workflow, go through my last 50 sessions and mine them for corrections I keep making and turn the recurring ones into CLAUDE.md rules" (使用 workflow,查看我最近50个会话,挖掘我反复做出的修正,将反复出现的转化为 CLAUDE.md 规则。)

  3. "Use a workflow to dig through #incidents in Slack for the past six months and find recurring root causes where nobody has filed a ticket." (使用 workflow,翻阅 Slack 中 #incidents 过去六个月的内容,找到没有人提交工单的反复出现的根因。)

  4. "Take my business plan and run a workflow where different agents tear it apart from an investor's, a customer's, and a competitor's perspective." (拿我的商业计划书,运行一个 workflow,让不同的 agent 分别从投资者、客户和竞争对手的角度来挑毛病。)

  5. "Here's a folder of 80 resumes, use a workflow to rank them for the backend role and double-check the top ten. Interview me using the AskUserQuestion tool for a rubric." (这里有一个包含80份简历的文件夹,使用 workflow 为后端岗位对它们进行排名,并复核前10名。用 AskUserQuestion 工具面试我来制定评分标准。)

  6. "I need a name for this CLI tool. Use a workflow to brainstorm a bunch of options and run a tournament to pick the top 3." (我需要为这个 CLI 工具命名。使用 workflow 头脑风暴一堆选项,然后举办锦标赛选出前3名。)

  7. "Use a workflow to rename our User model to Account everywhere." (使用 workflow 将我们的 User 模型到处改名为 Account。)

  8. "Go through my blog post draft and verify every technical claim against the codebase using a workflow, I don't want to ship anything wrong." (查看我的博客文章草稿,使用 workflow 对照代码库验证每一个技术声明,我不想发布任何错误内容。)

动态 workflow 的工作原理

动态 workflow 执行一个 JavaScript 文件,其中包含一些用于生成和协调 subagent(子智能体)的特殊函数。

动态 workflow 还包含标准 JavaScript 函数,如 JSONMathArray,以帮助处理数据。

特别值得一提的是,动态 workflow 可以决定 agent 使用哪个模型,以及 subagent 是否在自己的 worktree(工作树)中运行,从而使 Claude 能够选择所需的智能级别和隔离程度。

如果 workflow 被中断(例如,由于用户操作或退出终端),恢复会话后 workflow 将从上次中断的地方继续执行。

为什么需要动态 workflow

当你要求默认的 Claude Code harness 执行任务时,它需要在同一个 context window(上下文窗口)中同时进行规划和执行。对于许多编码任务来说,这非常高效,但在长时间运行、大规模并行、高度结构化和/或对抗性任务中,可能会出现问题。

这是因为 Claude 在单个 context window 中处理复杂任务的时间越长,就越容易受到以下几种特定失败模式的影响:

  • Agentic laziness(智能体惰性) 指 Claude 在完成一个特别复杂的多部分任务之前就停下来,并在取得部分进展后宣布任务完成,例如在安全审查中只处理了 50 项中的 35 项。

  • Self-preferential bias(自我偏好偏差) 指 Claude 倾向于偏爱自己的结果或发现,尤其是在被要求根据 rubric(评分标准)对其进行验证或评判时。

  • Goal drift(目标漂移) 指在多轮交互中逐渐偏离原始目标的保真度,尤其是在 compaction(上下文压缩)之后。每次 summarization(摘要化)步骤都是有损的,诸如边缘情况要求或"不要做 X"之类的约束细节可能会丢失。

创建 workflow 有助于应对这些问题,通过协调独立的 Claude subagent,每个 subagent 拥有自己的 context window 和专注、隔离的目标。

动态 workflow 与静态 workflow

你可能之前使用 Claude Agent SDK 或 claude -p 创建过静态 workflow,来协调多个 Claude Code 实例。

但由于静态 workflow 需要适用于所有边缘情况,它们通常更加通用。借助 Claude Opus 4.8 和动态 workflow,Claude 现在足够智能,可以为你的用例量身定制 harness。

使用动态 workflow 的实用模式

你可以直接要求 Claude 创建一个 workflow 来开始使用动态 workflow,或者使用触发词 "ultracode" 来确保 Claude Code 创建一个 workflow。

但建立对动态 workflow 工作原理的心智模型,将帮助你理解何时使用它们以及如何通过 prompt 引导 Claude。

Claude 在构建 workflow 时可能会使用和组合以下几种常见模式:

分类-执行(Classify-and-act)

使用一个分类器 agent 来决定任务类型,然后根据任务路由到不同的 agent 或行为。或者,在最后使用一个分类器来确定输出。

扇出-综合(Fan-out-and-synthesize)

将任务拆分为许多更小的步骤,对每个步骤运行一个 agent,然后综合这些结果。当存在大量较小的步骤时,或者当每个步骤受益于自己干净的 context window 以避免相互干扰或交叉污染时,这特别有用。综合步骤是一个 barrier(屏障)——它等待所有 fan-out(扇出)agent 完成,然后将它们的结构化输出合并为一个结果。

对抗性验证(Adversarial verification)

对于每个生成的 agent,运行一个独立的 agent 来根据 rubric 或标准对其输出进行对抗性验证。

生成-过滤(Generate-and-filter)

就某个主题生成若干想法,然后根据 rubric 或验证对其进行过滤,去重并仅返回经过测试的最高质量想法。

锦标赛(Tournament)

与其分配工作,不如让 agent 互相竞争。生成 N 个 agent,每个 agent 使用不同方法尝试同一任务。然后,prompt 或模型使用评判 agent 以成对方式评判结果,直到产生赢家。

循环直到完成(Loop until done)

对于工作量未知的任务,循环生成 agent 直到满足停止条件(没有新发现,或日志中没有更多错误),而不是固定数量的遍数。

使用场景

发挥创造力,思考何时以及如何让 Claude Code 创建动态 workflow。我发现 workflow 有时对非技术工作甚至更有用。

迁移和重构

Bun 使用 workflow 从 Zig 重写为 Rust。你可以在 Jarred 的 X 帖子中了解更多相关信息。

关键是将任务分解为一系列需要操作的步骤,例如调用点(callsites)、失败的测试、模块等。为 worktree 中的每个修复启动一个 subagent 进行修复,然后让另一个 agent 进行对抗性审查并合并它们。考虑告诉 agent 不要使用资源密集型命令,以便你可以在不耗尽机器资源的情况下实现最大并行化。

深度研究

我们在 Claude Code 中发布了一个深度研究 skill(/deep-research),它使用动态 workflow。具体来说,它会 fan-out 网络搜索,获取来源,对抗性验证其声明,并综合生成一份带有引用的报告。

但你可能不仅仅对网络搜索进行这类研究。例如,让 Claude 从 Slack 中的上下文编制状态报告,或通过深入探索代码库来研究某个功能的工作原理。

深度验证

另一方面,如果你有一份报告,想要检查并溯源它引用的每个事实性声明,你可能需要生成一个 workflow,其中一个 agent 识别所有事实性声明,然后启动 subagent 逐一详细检查每个声明。你还可以让一个验证 agent 检查来源 subagent,以确保其来源质量可靠。

排序

你可能有一个项目列表,希望按照你认为 Claude Code 擅长评估的某种定性指标进行排序,例如:按 bug 严重程度排序支持工单。但如果你尝试在一个 prompt 中对 1000+ 行进行排序,质量会下降,而且无法放入 context。相反,运行一个锦标赛、一个成对比较 agent 的 pipeline(比较判断比绝对评分更可靠),或并行进行桶排序再合并。每次比较都是独立的 agent,因此确定性循环持有赛程,只有运行顺序保留在 context 中。

记忆和规则遵从

如果你有一组特定的规则,发现 Claude 总是遗漏或难以遵守,即使放在 CLAUDE.md 中也是如此,可以创建一个 workflow,其中包含一组必须由验证者 agent 检查的规则——每条规则一个验证者。创建一个怀疑者角色的 subagent 来审查规则,确保规则本身是合理的,这将有助于避免过多的误报。

反向操作也同样有效:挖掘你最近的会话和代码审查评论,找出你反复做出的修正,用并行 agent 对它们进行聚类,对抗性验证每个候选规则(这条规则是否本可以防止一个真实的错误?),然后将幸存者提炼回 CLAUDE.md。

根因调查

调试在提出多个独立假设并加以测试时效果最好,但如果只使用一个 context window,Claude 可能会遇到 self-preferential bias。

Workflow 可以通过启动 agent 从不相交的证据中生成假设来从结构上防止这种情况。例如,分别为日志、文件和数据启动独立的 agent。然后每个假设都要面对一个由验证者和反驳者组成的小组。

这不仅适用于代码。Workflow 可用于销售(为什么三月份销售额下降了?)、数据工程(为什么这个 pipeline 失败了?)或任何事后分析(post-mortem)活动。

大规模分流

每个团队都有支持队列、bug 报告或其他人类无法完全处理的积压工作。

分流 workflow 对每个项目进行分类,与已跟踪的内容进行去重,并采取行动。这可能意味着尝试修复或升级给人类用户。

分流 workflow 的一个有用模式是 quarantine(隔离)。这涉及禁止读取不受信任的公共内容的 agent 执行高权限操作,这些操作由负责根据信息采取行动的 agent 来完成。

将分流 workflow 与 /loop 配对使用,让 Claude 持续执行此操作。

探索和品味

Workflow 在探索不同的解决方案方法时非常有用,尤其是在基于品味的情况下,如设计或命名,并且会受益于 rubric。

尝试让 Claude 探索一系列解决方案,并为审查 agent 提供一个好方案应该是什么样的 rubric。当审查 agent 认为已满足标准时,任务即完成。解决方案也可以根据 rubric 通过锦标赛进行排序或选择。

评估(Evals)

你可以通过在 worktree 中启动独立的 agent,然后启动比较 agent 来根据 rubric 比较和评定特定输出,从而运行针对特定任务的轻量级 evals。例如,根据特定标准评估和完善你创建的 skill。

模型和智能路由

创建一个针对你的任务调优的分类器 agent,决定使用哪个模型。当你的任务涉及大量工具调用时,这会很有帮助,在执行之前进行研究可以确定最适合该任务的模型。

例如,"解释 auth 模块如何工作" 这个任务的最佳模型取决于 auth 模块中有多少文件以及代码库的结构。分类器 agent 可以进行这项研究,然后根据任务的预期复杂度路由到 Sonnet 或 Opus。

何时不使用动态 workflow

Workflow 是一项新功能。虽然有许多使用场景可以产生显著效果,但并非每个任务都需要它们,使用它们可能会消耗显著更多的 token。

最好创造性地使用 workflow,将 Claude Code 推向你之前未曾尝试的方向。对于常规编码任务,试着问自己:它真的需要更多计算吗?例如,大多数传统编码任务不需要一个 5 人审查小组。

构建动态 workflow 的技巧

Prompt 工程

详细的 prompt 工程,结合上述具体技术,能为动态 workflow 创造最佳结果。

Workflow 不仅适用于大型任务。你可以 prompt 模型使用 "quick workflow"(快速工作流)。例如,你可以创建一个快速的对抗性审查来验证某个假设。

结合 /goal 和 /loop

使用可以重复的 workflow 时(例如分流、研究或验证),将它们与 /loop 配对以定期运行,并使用 /goal 设置硬性完成要求。

Token 使用预算

你可以为动态 workflow 设置明确的 token 使用预算,以限制任务使用的 token 数量。你可以使用类似 "use 10k tokens" 的预算来 prompt,这将设置上限。

保存和共享动态 workflow

你可以通过在 workflow 菜单中按 "s" 来保存 workflow。你可以将它们检入 ~/.claude/workflows 或通过 skill 分发。

要通过 skill 共享,将你的 JavaScript workflow 文件放在 skill 文件夹中,并在 SKILL.MD 中引用它们。为了获得更大的灵活性,你可能需要 prompt Claude 将 skill 中的 workflow 视为模板,而不是需要逐字运行的脚本。

一个新的探索起点

Workflow 是扩展 Claude Code 的一种有用的新方式。我鼓励你将它们视为一个起点,去探索使用 Claude 帮助完成任务的新方法。关于如何最好地使用它们,还有许多待发现之处。请告诉我你的发现。


本文由 Thariq Shihipar 和 Sid Bidasaria 撰写,他们是 Anthropic 技术团队成员,从事 Claude Code 开发。

MIT