Claude Code 动态工作流:每个任务都可以有自己的 Harness【译】
1. Claude Code 动态工作流:每个任务都可以有自己的 Harness【译】
今天我们聊聊:如何让 Hermes 替我们观察 X,并把有价值的热点沉淀为可以长期调用的内容资产。
导读章节为实践哥批注。
好文值得读,workflow 可能是自 skill 发明以来,最好的发明。是 goal 的加强版,非常值得学习的一篇文章。深入浅出描写了 workflow 的各种适用场景。
原文作者 Thariq @trq212 是 Anthropic 核心员工,经常分享 Claude Code 技巧。
内容偏长,可以按兴趣跳读。想直观感受它能干什么,看第 1 节;想弄清为什么需要它,看第 3 到第 5 节;想直接照抄落地方案,跳到第 6 节。
- 示例提示词:8 个例子,先直观感受 workflow 能做什么
- workflow 的原理,本质是一段脚本
- 为什么需要 workflow
- dynamic workflows 与 static workflows
- 使用 workflow 时的实用模式:6 种可复用套路
- 应用场景:迁移、研究、排序、排查、分类等九类落地场景
- 何时不该使用 workflow:很费 token,常规编码不必硬上
- 构建 workflow 的技巧:提示词、配合 /goal 和 /loop、token 预算、保存与分享
原文如下:
6 月 3 日
1.1. 示例提示词
下面这些例子展示了 workflow 能做什么。你可以直接向 Claude 提出类似的请求:
- 让多个相互竞争的理论各自尝试,复现时好时坏的 flaky tests。
- 从过往会话中挖掘反复出现的纠正。
- 在 Slack 的事故频道里定位问题根因。
- 为一份商业计划获取多个视角的批评意见。
- 对简历进行排名,并加以验证。
- 用锦标赛式的筛选,为一个 CLI 工具命名。
- 对整个代码库执行重构。
- 对照实际代码,核实博客草稿里的技术论断。
1.2. workflow 的运作方式
workflow 会执行 JavaScript 文件,文件里包含用于生成和协调 subagents 的特殊函数。JSON、Math、Array 这些标准 JavaScript 工具可以用来处理数据。workflow 可以选择 subagents 使用哪个模型,并决定它们是否在隔离的 worktree 里运行。如果运行被中断,恢复后 workflow 可以从中断处继续。
1.3. 为什么需要 workflow
默认的 harness 在单个 context window 内完成规划与执行。这对编码任务很有效,但碰到长时间运行、大规模并行、高度结构化或带对抗性质的任务就会出问题。具体会表现出三种失效模式:
- 智能体偷懒:面对复杂的多部分任务,Claude 会过早停止,只做完一部分就宣布任务完成,比如 50 项安全审查只处理了其中 35 项。
- 自我偏好偏差:当被要求对照 rubric 验证或评判结果时,Claude 会偏袒自己得出的结论。
- 目标漂移:在多轮交互中保真度逐渐流失,每一次总结都会丢掉细节,包括边缘情况的需求和各种约束。
workflow 的对策,是编排一批彼此独立、各自拥有独立 context window、目标聚焦又互相隔离的 subagents。
1.4. dynamic workflows 与 static workflows
此前,用 Claude Agent SDK 或 claude -p 构建的 static workflows,是以通用方式协调多个 Claude Code 实例,这要求你把所有边缘情况都覆盖到。有了 Claude Opus 4.8 和 dynamic workflows,Claude 现在能写出针对具体场景量身定制的 harness。
1.5. 使用 workflow 时的实用模式
你可以直接请求一个 workflow,或在提示里用 ultracode 来确保 Claude Code 创建一个 workflow,从而触发它。常见的组合模式包括:
- 分类并执行:由一个 classifier agent 判断任务类型,据此路由到不同的 agent 或行为;也可以在任务完成时确定输出的分类。
- 扇出并综合:把任务拆成许多更小的步骤,每个步骤跑一个 agent,再综合所有结果。当大量步骤都能从干净、互不干扰的 context window 中受益时,这一模式尤其有用。综合这一步充当一个 barrier,它会等所有扇出的 agent 完成后,再合并它们的结构化输出。
- 对抗式验证:每生成一个 agent,就再跑一个单独的 agent,以对抗的姿态对照 rubric 或判定准则来验证它的输出。
- 生成并筛选:先就某个主题生成多个想法,再按 rubric 或验证来筛选,去重后只留下质量最高、经过检验的那些。
- 锦标赛:让 N 个 agent 用不同方法在同一个任务上互相竞争,而不是把工作分摊下去。由成对评判的 agent 决出胜者,直到只剩一个。
- 循环至完成:对工作量未知的任务,持续生成 agent,直到满足停止条件为止,比如不再有新发现、日志里不再有错误,而不是采用固定的遍数。
1.6. 应用场景
- 迁移与重构:Bun 把 Zig 重写成 Rust 时就用了 workflow。把任务拆成一串串行步骤,比如调用点、失败的测试、模块,为每一处修复在 worktree 里生成 subagents,让 agent 做对抗式审查,然后再合并。要避开资源密集的命令,好让并行度最大化。
- 深度研究:Claude Code 的
/deep-research技能就用了 workflow,它扇出网络搜索、抓取来源、对抗式地验证论断,再综合出一份带引用的报告。这个套路同样适用于非网络类的研究,比如汇编 Slack 上的状态报告,或者探索一个代码库的功能。 - 深度验证:对那种每条事实都要标注出处的报告,可以生成这样的 workflow:一个 agent 负责识别出各项论断,subagents 逐一详细核查,再由 verifier agent 确保来源质量。
- 排序:碰到需要定性衡量的大型条目列表,比如按缺陷严重程度给工单排序,在单个提示里给 1000 多行排名会拉低质量,还会撑爆 context。可以用锦标赛、成对比较的流水线,或者先并行分桶排名再合并;每一次比较都是它自己的一个 agent,context 里只保留当前的排序顺序。
- 记忆与规则遵循:当 Claude 即便把规则写进
CLAUDE.md仍会漏掉某些规则时,可以创建带 rule verifier 的 workflow,一条规则配一个 verifier。再让一个 skeptic 人设来审查这些规则,防止误报。也可以反过来做:从近期会话和代码审查评论里挖掘反复出现的纠正,用并行 agent 聚类,对每个候选规则做对抗式验证,也就是问一句——这条规则真能避免实际发生过的错误吗?再把幸存下来的规则提炼回CLAUDE.md。
- 大规模分类处理:triage workflow 会对条目分类、跟现有跟踪记录去重,然后采取行动。一个有用的模式是 quarantine:读取不受信任公开内容的 agent,被禁止执行高权限操作,这些操作改由负责信息处理的 agent 来做。配合
/loop就能持续运行。
- 探索与品味:在探索不同解法时很有用,尤其是设计或命名这种依赖品味的决策,它们能从 rubric 中受益。可以让 Claude 去探索解法,同时让一个 review agent 依据一套关于好方案的 rubric 来评判,满足审查标准时即告完成。方案可以排序,也可以基于 rubric 用锦标赛选出。
- 评估:可以这样跑轻量级 eval:在 worktree 里生成若干独立 agent,再生成 comparison agent,对照 rubric 给各项输出做比较和打分。比如对照特定标准来评估并改进已经做好的技能。
- 模型与智能路由:创建一个针对任务调校过的 classifier agent,由它决定用哪个模型。当任务涉及大量工具调用时这很有用,已有研究能指出哪个模型最合适。举例来说,解释一个鉴权模块怎么工作,取决于文件数量和代码库的形态;一个 classifier 会先做这项调研,再根据预期复杂度路由到 Sonnet 或 Opus。
1.7. 何时不该使用 workflow
workflow 是新东西,并不是每个任务都需要它,它可能消耗多得多的 token。要有创造性地用它,把 Claude Code 推到常规用法之外。而对常规编码任务,先掂量一下是否真的需要额外算力;大多数传统编码并不需要五个 reviewer。
1.8. 构建 workflow 的技巧
- 提示词:运用上面讲的那些具体技巧、把提示写详细,效果最好。workflow 不只用于大型任务,你也可以提示一个快速 workflow,比如对某个假设做一次快速的对抗式审查。
- 结合
/goal和/loop:对可重复的 workflow,比如分类、研究、验证,用/loop按固定间隔运行,用/goal设一个硬性的完成要求。 - token 用量预算:设一个明确的 token 预算来限制任务用量。在提示里写明上限,例如让它只用
10k token。 - 保存与分享 workflow:在 workflow 菜单里按
s就能保存。把它们签入~/.claude/workflows,或者通过技能来分发。把 JavaScript workflow 文件放进技能文件夹,并在SKILL.md里引用。想更灵活的话,可以提示 Claude 把技能里的 workflow 当成模板,而不是逐字照搬的脚本。