Claude Code Dynamic Workflow 实操指南

什么场景能用它 · 能做什么 · 怎么用 · 四个具体例子 · 使用注意事项
权威来源:官方文档 code.claude.com/docs/en/workflows + Workflow 工具规范(一手) · 生成于 2026-06-16 · 面向已在用 Claude Code 的开发者
目录
  1. 它到底是什么(一句话 + 心智模型)
  2. 什么场景该用 / 不该用
  3. 能做什么(四种核心能力)
  4. 怎么用(三种触发方式 + 脚本骨架)
  5. 脚本 API 速查(agent / pipeline / parallel)
  6. 四个具体例子 case
  7. 使用注意事项(踩坑清单)
  8. 给你的下一步

1它到底是什么

Dynamic workflow 是一段 Claude 编写、运行时在后台执行的 JavaScript 脚本,用来确定性地编排大量子代理(subagent)

关键拆解三个词:

心智模型:它是"编排层",不是"又一个 agent"

普通对话里,主 Claude 自己一步步做事;复杂时它可以用 Agent 工具派几个子 agent。但当任务需要对几十上百个条目做同样的多阶段处理,靠主 Claude 即兴调度既慢又容易漏。Dynamic workflow 把"调度逻辑"固化成代码:你想象成一个 map/reduce 框架,只不过每个 worker 是一个完整的 Claude。

主 Claude 写脚本 后台运行时执行 扇出 N 个子 agent 每个 agent 返回结构化结果 脚本汇总 / 验证 / 再扇出 返回最终结果给主 Claude
版本要求 需要 Claude Code v2.1.154+。注意触发关键词在 v2.1.160workflow 改成了 ultracode(见第 4 节)。

2什么场景该用 / 不该用

官方给 workflow 的定位是三类价值:要全面(分解后并行覆盖)、要可信(独立视角 + 对抗式核查后再下结论)、要扛规模(单个上下文装不下的迁移、审计、大范围扫描)。对照这三点判断:

✅ 适合用 workflow❌ 不要用 workflow
多个条目做同样的多阶段处理(N 个文件、N 个 PR、N 个章节) 单个事实查找——你已知文件/符号/值,直接搜更快
需要独立多视角再下结论(对抗式验证、评审打分、方案对比) 一个简单的两三步线性任务,主 Claude 直接做就行
规模超出单上下文(全仓库审计、批量迁移、广覆盖调研) 需要你逐步盯着改、强交互的探索性编码
想要确定性的扇出/循环而非模型即兴调度 琐碎的机械单文件编辑——Edit 一下就完了
成本意识(很重要) 一个 workflow 可能拉起几十个子 agent,消耗大量 token。它只在"显式选择加入"时才会跑——这是工具的硬性约束(见第 4、7 节)。不要为了一件主 Claude 能直接做的事拉起 workflow。

判断口诀

"我是不是要对一批东西同一套多步处理,或者需要多个独立视角核对才放心?" —— 是 → workflow;否 → 直接做或派几个普通 Agent

3能做什么(四种核心能力)

① 扇出并行(parallel)

同时派 N 个 agent 做互不依赖的事,全部完成后一起拿结果。典型:一篇任务从 5 个不同角度并行搜索 / 审查一个 diff 的多个维度。这是一个屏障(barrier)——等所有人都回来。

② 流水线(pipeline)— 默认首选

让每个条目独立穿过多个阶段,阶段之间没有屏障:条目 A 已经在第 3 阶段,条目 B 还在第 1 阶段。墙钟时间 = 最慢的单条链路,而不是"每阶段最慢之和"。绝大多数多阶段工作都该用它。

③ 结构化输出(schema)

agent() 传一个 JSON Schema,子 agent 会被强制调用 StructuredOutput 工具返回校验过的对象——你直接拿到干净数据,不用解析文本。校验在工具层做,不匹配会让模型自动重试。

④ 对抗式验证 / 循环到收敛

对每个发现派 N 个"唱反调"的 agent 去反驳它,多数反驳成功就枪毙——过滤掉"看似合理实则错误"的结论。也可以"循环到连续 K 轮没有新发现"来处理未知规模的搜索。你刚跑的 deep-research 就是这套(3 票对抗、2/3 反驳才 kill)。

4怎么用

方式 A:直接跑内置 workflow(最快上手)

最快看到效果的方式——你刚刚已经用过了:

/deep-research 调研一下 XXX

它在后台执行,结束返回带引用的报告。用 /workflows 看实时进度。

方式 B:让 Claude 给某个任务现写一个 workflow

两种触发:

为什么必须显式触发 Workflow 工具只在以下情形才会被调用:① prompt 含 ultracode;② 会话开了 ultracode;③ 你用自己的话明确要求"用工作流";④ 某个 skill 指示要用。"这个任务看起来很适合并行"并不构成触发条件——必须是你主动要求那个规模。

方式 C:理解脚本骨架(知其所以然)

每个脚本必须以 export const meta = {...} 开头(纯字面量,不能有变量/函数调用),然后是脚本体。最小骨架:

export const meta = {
  name: 'find-flaky-tests',
  description: 'Find flaky tests and propose fixes',  // 权限弹窗里显示这一行
  phases: [
    { title: 'Scan', detail: 'grep test logs for retries' },
    { title: 'Fix',  detail: 'one agent per flaky test' },
  ],
}
// —— 脚本体从这里开始 ——
phase('Scan')
const flaky = await agent('grep CI logs for retry markers', { schema: FLAKY_SCHEMA })

phase('Fix')
await parallel(flaky.tests.map(t => () =>
  agent(`Fix flaky test: ${t.name}`, { schema: FIX_SCHEMA })))
实操要点几乎不需要自己写脚本——让 Claude 写。脚本会自动存到会话目录下的 .js 文件,工具返回里给你路径。要迭代就编辑那个文件,再用 {scriptPath: "..."} 重新调用,而不是重发整段脚本。

5脚本 API 速查

钩子作用关键点
agent(prompt, opts?)派一个子 agent无 schema 返回文本;有 schema 返回校验过的对象。死掉/跳过返回 null(用 .filter(Boolean) 兜)
pipeline(items, s1, s2, …)每个条目独立穿过所有阶段默认首选,阶段间无屏障;某阶段抛错该条目掉为 null
parallel(thunks)并发跑一批,全部完成才返回屏障;只在"真的需要所有结果一起"时用。抛错的 thunk 变 null
phase(title)开一个进度分组后续 agent() 归到这个分组(/workflows 里显示)
log(msg)给用户发进度行显示在进度树上方
args调用时传入的参数用来参数化命名 workflow
budget本轮 token 目标budget.remaining() 做动态循环;无目标时为 Infinity
pipeline vs parallel:最容易搞错的地方 默认用 pipeline。只有当"第 N 阶段需要第 N-1 阶段全部结果的跨条目上下文"时才用 parallel 做屏障(例如:在昂贵的下游处理前对全集去重 / 总数为 0 就早退)。"我需要先 flatten/map/filter"不是用屏障的理由——把转换放进 pipeline 的某个阶段里即可。

脚本语言限制(踩坑预防)

6四个具体例子 case

以下脚本均为标准 workflow 写法示例,可直接交给 Claude 让它据此现写并运行。结合了你 CLAUDE.md / memory 里出现过的真实场景。

CASE 1 · 代码类

并行审查一个 diff 的多个维度,每条发现都对抗式验证

这是官方的"金标准"多阶段模式:按维度审查(pipeline),每个发现一出来就立刻派独立 skeptic 去验证(无需等其他维度审完)。

export const meta = {
  name: 'review-changes',
  description: 'Review changed files across dimensions, verify each finding',
  phases: [{ title: 'Review' }, { title: 'Verify' }],
}
const DIMENSIONS = [
  { key: 'bugs', prompt: '审查 diff 里的正确性 bug' },
  { key: 'perf', prompt: '审查 diff 里的性能问题' },
  { key: 'sec',  prompt: '审查 diff 里的安全问题' },
]
const results = await pipeline(
  DIMENSIONS,
  d => agent(d.prompt, { label: `review:${d.key}`, phase: 'Review', schema: FINDINGS_SCHEMA }),
  review => parallel(review.findings.map(f => () =>
    agent(`对抗式验证这条发现是否真实:${f.title}`, { phase: 'Verify', schema: VERDICT_SCHEMA })
      .then(v => ({ ...f, verdict: v }))))
)
const confirmed = results.flat().filter(Boolean).filter(f => f.verdict?.isReal)
return { confirmed }

这种"维度 bugs 的发现在验证时,维度 perf 还在审查"的交错,正是 pipeline 省墙钟时间的地方。你日常其实有现成的 /code-review ultra 走的就是云端多 agent 审查。

CASE 2 · 调研类

多源调研 + 对抗式核查(你刚跑过的 deep-research)

分解问题 → 并行多角度搜索 → 抓取去重 → 每条声明 3 票对抗验证(2/3 反驳才枪毙)→ 引用合成。循环到收敛的模式骨架:

// 循环到"连续 2 轮没有新发现"——处理未知规模的搜索
const seen = new Set(), confirmed = []
let dry = 0
while (dry < 2) {
  const found = (await parallel(FINDERS.map(f => () =>
    agent(f.prompt, { phase: 'Find', schema: ITEMS }))))
    .filter(Boolean).flatMap(r => r.items)
  const fresh = found.filter(b => !seen.has(key(b)))   // 对 seen 去重,纯代码不用 agent
  if (!fresh.length) { dry++; continue }
  dry = 0; fresh.forEach(b => seen.add(key(b)))
  // …对 fresh 做多视角验证,通过的进 confirmed…
}
收敛陷阱 去重要对 seen(所有见过的),不是confirmed(验证通过的)——否则被判否的发现每轮都重现,永远不收敛。
CASE 3 · 内容生产类

评审团:多方案生成 → 并行打分 → 取胜者合成

适合"解空间很宽"的内容/方案任务:从不同角度生成 N 个独立草稿,并行打分,从赢家合成、同时嫁接亚军的好点子。比"一稿改到死"更好。可直接套用在你的 /doc-writer / /proposal-maker 这类产出上。

export const meta = {
  name: 'draft-panel',
  description: 'Generate N drafts from different angles, judge, synthesize winner',
  phases: [{ title: 'Draft' }, { title: 'Judge' }, { title: 'Synthesize' }],
}
const ANGLES = ['MVP 优先', '风险优先', '用户体验优先']
phase('Draft')
const drafts = await parallel(ANGLES.map((a, i) => () =>
  agent(`以「${a}」的角度写一版方案草稿(变体 ${i})`, { schema: DRAFT })))
phase('Judge')
const scores = await parallel(drafts.filter(Boolean).map(d => () =>
  agent(`给这版草稿打分并说明优缺点:${d.summary}`, { schema: SCORE })))
phase('Synthesize')
return await agent('以最高分草稿为主体,嫁接其他草稿的最佳点子,合成终稿', { schema: FINAL })
CASE 4 · 你的真实场景

批量审计 NaviKit / agent-sync 配置一致性

结合你 memory 里的真实项目。比如:你的 ~/.config/agents/ 是 canonical 源,软链到多个 agent 入口。要审计每个 agent 入口是否和 canonical 一致 + 软链是否健康,这正好是"对一批条目做同套检查"的扇出场景:

export const meta = {
  name: 'audit-agent-sync',
  description: '审计每个 agent 入口与 canonical 配置的一致性',
  phases: [{ title: 'Discover' }, { title: 'Audit' }],
}
phase('Discover')
// 先在主 Claude 侧 scout 出 manifest 里的 agent 列表,作为 args 传入(发现工作清单)
const targets = args.agents   // 例:['claude-code','codex','trae','gemini',...]

phase('Audit')
const reports = await parallel(targets.map(name => () =>
  agent(`检查 agent「${name}」的入口软链是否指向 ~/.config/agents 下的 canonical 文件,
列出:断链 / 内容漂移 / 缺失的 rule。只报问题,无问题返回空列表。`,
    { label: `audit:${name}`, schema: AUDIT_SCHEMA })))
const problems = reports.filter(Boolean).flatMap(r => r.issues)
log(`审计完成,发现 ${problems.length} 处问题`)
return { problems }
混合模式(官方推荐) 注意 Discover 阶段是在主 Claude 侧先 scout(列出 agent 清单)再把清单作为 args 喂给 workflow。你不需要在任务开始前就知道全貌,只需要在编排步骤开始前知道清单——先内联探查发现工作清单,再用 workflow 流水线处理。同理可用于:批量把 Obsidian 笔记的 Mermaid 同步到飞书、批量给 NaviKit 多个模块跑一致性检查。

7使用注意事项(踩坑清单)

① 成本是真实的,只在显式要求时跑 几十个子 agent × 大量 token。我(主 Claude)不会替你擅自拉起 workflow——必须你说 ultracode / "用工作流",或开了 ultracode 会话。对一件能直接做的事别上 workflow。
② 默认 pipeline,屏障要有正当理由 误用 parallel 做屏障会浪费墙钟时间(快的 finder 干等慢的)。只有"跨条目去重 / 早退 / 需要引用全集对比"才用屏障。"代码更整洁"不是理由。
③ 脚本是 JS 不是 TS;禁用时间/随机 API 类型标注会解析失败;Date.now()/Math.random()/无参 new Date() 会抛错(破坏 resume)。时间戳从 args 传,随机用 index
④ 子 agent 会失败,要 null-safe agent() 在用户跳过 / 子 agent 终态报错时返回 null;parallel/pipeline 里抛错的条目也变 null用前先 .filter(Boolean),否则后续 .map 炸。
⑤ 并发有上限,但条目数不限 同时最多 ~16 个 agent 在跑,多的排队;单次 parallel/pipeline 最多 4096 条目,一次运行总 agent 数上限 1000(防失控)。传 100 条没问题,只是分批跑。
⑥ 别静默截断 如果你限制了覆盖范围(top-N、不重试、采样),要 log() 出来你丢了什么——否则"看起来全覆盖了"其实没有。
⑦ 后台执行 + 可恢复 Workflow 在后台跑,完成时通知你;用 /workflows 看实时进度。脚本和 runId 会保存——改脚本后用 {scriptPath, resumeFromRunId} 重跑,未改动的 agent 调用秒回缓存结果,只有改动处及之后才重跑。同脚本同 args = 100% 缓存命中。
⑧ 子 agent 返回的是数据,不是给人看的话 子 agent 被告知"你的最终文本就是返回值"。所以用 schema 拿结构化对象最稳——校验在工具层做,不匹配自动重试,你拿到的是干净数据。

8给你的下一步

按"最小成本验证"的顺序:

  1. 已经做过:跑 /deep-research —— 你已经体验过一个完整 workflow 了。
  2. 下一步建议:挑一个你真实的批量任务,对我说"用工作流帮我做 XXX",看我现写的脚本长什么样,用 /workflows 观察扇出。CASE 4 的 audit-agent-sync 就是个低风险又实用的起点。
  3. 进阶:重型会话开 /effort ultracode,让我对每个实质任务默认编排 workflow。
想动手? 告诉我你想拿哪个真实任务试(审计 agent-sync 配置 / 批量同步 Obsidian 笔记 / NaviKit 多模块检查 / 别的),我直接用工作流帮你跑一遍,你就能看到从脚本到结果的完整链路。

权威来源:① Claude Code 官方文档 code.claude.com/docs/en/workflows(dynamic workflow 定义、触发方式、版本要求);② Workflow 工具规范(脚本 API、pipeline/parallel 语义、并发与 agent 上限、JS 限制、resume 机制、质量模式)。本指南所有技术主张均来自上述一手来源,例子脚本为标准写法演绎。