diff --git a/4 - Resources/Claude-Code/Claude Code Dynamic Workflows 最佳实践与实例.md b/4 - Resources/Claude-Code/Claude Code Dynamic Workflows 最佳实践与实例.md new file mode 100644 index 0000000..825692f --- /dev/null +++ b/4 - Resources/Claude-Code/Claude Code Dynamic Workflows 最佳实践与实例.md @@ -0,0 +1,190 @@ +--- +created: "2026-06-18" +type: resource +tags: [resource, claude-code, dynamic-workflows, orchestration, multi-agent, pipeline, best-practices, anthropic] +source: "https://code.claude.com/docs/en/workflows" +--- + +# Claude Code Dynamic Workflows 最佳实践与实例 + +> Dynamic workflow = **Claude 自己写、运行时后台执行、你可读可重跑的一段 JS 脚本**,用来编排几十到几百个并行子 agent。需 Claude Code v2.1.154+,付费计划/API/Bedrock/Vertex/Foundry 可用,Pro 在 `/config` 打开。 +> +> 上层选型见 [[Claude Code 官方多Agent编排最佳实践 (2026)]];ECC 自建编排见 [[ECC orch- 编排家族与 v2.0 团队编排]]、[[ECC 编排实战手册]]。 + +--- + +## 一、何时用(vs subagents / agent teams) + +核心区别:**计划掌握在谁手里**。Workflow 把计划搬进**代码**,中间结果留在脚本变量里,Claude 上下文只拿最终答案。 + +只在这两种情况用: +- **一个会话协调不过来**:几十~几百 agent 的全库审计、500+ 文件迁移、广度研究。 +- **想把编排固化成可复用、可重跑的资产**:每个分支都跑的同一套审查/研究。 + +不值得用:一两轮能做完的、紧耦合顺序任务、单文件改动。 + +> Workflow 的真正价值不是"多跑几个 agent",而是能施加**可重复的质量模式**——独立 agent 对抗式互审、多角度起草再权衡,比单遍更可信。 + +--- + +## 二、编程模型:三个原语 + meta + +每个脚本必须以 `export const meta` 开头(**纯字面量**,不能有变量/函数/插值),phase 标题要和 `phase()` 调用一致。 + +```javascript +export const meta = { + name: 'vue-newsletter', + description: 'Research Vue/Nuxt ecosystem sources in parallel for a given week', + phases: [ + { title: 'Research', detail: 'one agent per source' }, + { title: 'Curate', detail: 'dedupe + rank items by impact' }, + { title: 'Write', detail: 'synthesize the final newsletter' }, + ], +} +``` + +| 原语 | 语义 | 何时用 | +|------|------|--------| +| `agent(prompt, opts?)` | 起一个子 agent;给 `schema` 则强制结构化输出(工具层校验+重试,直接返回已验证对象) | 单个委派 | +| `pipeline(items, s1, s2…)` | 每个 item 独立穿过所有 stage,**stage 间无屏障** | **多 stage 默认** | +| `parallel(thunks)` | **屏障**:等齐所有结果;失败项变 `null` 不 reject | 仅当 stage N 需要 N-1 全部结果 | +| `workflow(name, args?)` | 内联调另一个 workflow | 组合复用 | + +`agent` 关键 opts:`schema`(强制 JSON)、`phase`(进度分组)、`label`(显示名)、`model`/`effort`(成本路由)、`isolation:'worktree'`(并行写文件防冲突,贵,仅必要时)。 + +**黄金规则:默认 `pipeline()`,屏障只在真需要时用。** 嗅探:若写成 `parallel → 普通 map/filter/flatten → parallel`,中间那步不需要屏障,改成 pipeline 内的一个 stage。`pipeline` 墙钟 = 最慢单条链,不是各 stage 最慢之和。 + +--- + +## 三、实例(真实脚本结构) + +### 例 1:Vue 新闻信 —— fan-out → reduce → synthesize(经典三段式) + +**Phase 1 并行扇出**(9 个源各一个 agent,schema 强制结构化): +```javascript +const raw = await parallel( + SOURCES.map((s) => () => + agent(s.prompt, { label: `research:${s.key}`, schema: ITEM_SCHEMA, + agentType: 'general-purpose' }) + ) +) +``` +**Phase 2 纯 JS 归约**(去重/扁平**不**再起 agent): +```javascript +const flatItems = collected.flatMap((c) => + (c.items || []).map((it) => ({ ...it, source: c.source }))) +``` +**Phase 3 顺序综合**: +```javascript +const curated = await agent(curatePrompt, { phase: 'Curate', schema: CURATED_SCHEMA }) +const newsletter = await agent(writePrompt, { phase: 'Write' }) +``` +> 要点:**归约用普通代码,不用 agent**。扁平/去重/过滤这类无跨 item 依赖的操作放进 stage 里或纯 JS,别为它开屏障。 + +### 例 2:`/deep-research`(内置 workflow,5 阶段) + +1. **Scope**(1 agent):把问题拆成 5 个不同搜索角度 +2. **Search**(5 并行 agent):各自独立 web 搜索 +3. **Fetch**(顺序):URL 去重,抽 ~15 个源 +4. **Verify**(每条 claim 并行):**三票制,怀疑者尝试证伪** +5. **Synthesize**(1 agent):只用存活的 claim 生成带引用报告 + +> **没survive 的 claim 永远进不了报告**——这就是把质量门写进编排的范例。 + +### 例 3:Bun 移植(Zig→Rust,真实大规模) + +Jarred Sumner 用 workflows 把 Bun 从 Zig 移植到 Rust:**~75 万行、99.8% 测试通过、11 天合并**。四阶段: +1. **Mapping**:一个 workflow 为 Zig 里每个 struct 字段推断对应 Rust lifetime +2. **Translation**:**几百个并行 agent**逐个 `.zig`→`.rs`,**每文件配 2 个 reviewer** +3. **Fix loop**:自动迭代 build+test 直到通过 +4. **Optimization**:**通宵** workflow 消除多余拷贝,**每项生成单独 PR** 供人审 + +> 模式提炼:**map(推断约束) → 并行翻译(每单元配双评审) → 自动修复循环 → 优化并拆成可审 PR**。能力上限极高,但 token 成本对应也高。 + +--- + +## 四、质量模式(workflow 的精髓) + +```javascript +// 对抗式 / 多镜头验证:每个发现配不同视角的独立评判者(不是 N 个相同怀疑者) +const judged = await parallel(fresh.map((b) => () => + parallel(['correctness', 'security', 'repro'].map((lens) => () => + agent(`Judge "${b.desc}" via the ${lens} lens — real?`, { schema: VERDICT }) + )) +)) +``` + +- **对抗式验证**:每个发现 spawn N 个独立怀疑者,prompt 去**证伪**,多数证伪即杀——挡住"看似合理但错"的发现。 +- **视角多样**:一个发现能多种方式失败时,给每验证者不同镜头(正确性/安全/性能/能否复现),比冗余的相同怀疑者更能抓失败模式。 +- **判官面板**:多角度生成 N 方案 → 并行打分 → 从胜者综合 + 嫁接亚军亮点。 +- **loop-until-dry**:未知数量的发现持续 spawn 直到连续 K 轮无新增。**去重对 `seen` 集合,不是对 `confirmed`**,否则被判官否掉的发现每轮重现、永不收敛。 +- **completeness critic**:最后一个 agent 专问"还缺什么——没跑的模态/没验证的断言/没读的源",产出下一轮工作。 + +--- + +## 五、成本 / 资源 / 确定性 + +- **先小切片试跑**:一个目录而非整库、一个窄问题而非宽问题,看 `/workflows` 里每 agent 的 token 再全量。 +- **硬上限**:并发 ≤16 agent,单次 ≤1000 agent;脚本本身**不能读写文件/跑 shell**(由它编排的 agent 做)。 +- **模型路由**:每 agent 默认会话模型;机械 stage 显式降级 `{model:'haiku', effort:'low'}`,只给最难的 verify/judge 升级。大跑前查 `/model`。 +- **budget 驱动**:`while (budget.total && budget.remaining() > 50_000) {…}` 或静态 `FLEET = floor(total/100k)`。 +- **资源约束**:prompt 里让 agent 避开重资源命令,以便并行更多。 +- **无声截断要 `log()`**:凡设了 top-N / 不重试 / 采样,都要 log,否则读起来像全覆盖。 +- **确定性禁令**:脚本内 `Date.now()` / `Math.random()` / 无参 `new Date()` 都会 **throw**(为了 journaling 可恢复)。时间戳用 `args` 传入;要随机就**按 index 变 prompt/label**,不要真随机。 + +--- + +## 六、运维 / 协作 + +- 后台跑、会话不阻塞;`/workflows` 看分阶段进度,可暂停/停某 agent/重启。 +- **同会话内可恢复**:停了再起,已完成 agent 返回缓存结果;`resumeFromRunId` 对相同脚本 100% 命中。退出 Claude Code 则下次从头。 +- **保存复用**:满意的 run 按 `s` 存成 `/` 命令(项目 `.claude/workflows/` 或个人 `~/.claude/workflows/`,同名项目优先)。 +- **`args` 传参**:存好的 workflow 接收结构化 `args`(研究问题/路径列表/配置),脚本直接当数组/对象用。 +- **审批**:首跑展示 phase + token 警告;子 agent 一律 `acceptEdits`,但非白名单的 shell/web/MCP 仍会中途提示——长跑前先加白名单。 +- **没有中途人工输入**:要分阶段签字,把每个 stage 拆成独立 workflow。 +- 触发:prompt 含 `ultracode` 关键词跑单次;`/effort ultracode` 让整会话每个实质任务都自动编排成 workflow。 + +--- + +## 七、Use case 目录(官方/社区) + +- **全库 bug 扫描** + 独立验证发现 +- **安全审计 / 加固**(认证检查、输入校验)、profiler 引导的优化审计、死代码识别(Klarna 实践) +- **大规模现代化**:框架替换、API 弃用迁移、语言移植(数千文件) +- **高风险关键工作**:错误代价高时,用独立尝试 + 对抗测试再交付 +- **广度研究**:多角度搜索 → 取源 → 逐条 claim 交叉验证 → 带引用综合 + +--- + +## 八、反模式 + +- 紧耦合/顺序任务硬塞 workflow(屏障空等、token 白烧)。 +- 全程一个 `parallel()` 屏障到底(慢 agent 拖死快 agent)。 +- 归约/扁平也用 agent 而非纯 JS。 +- loop 对 `confirmed` 去重而非 `seen`(永不收敛)。 +- 不试切片直接全量大跑;该升/该降的 stage 模型用反。 +- 脚本里用 `Date.now()`/`Math.random()`(直接 throw)。 + +--- + +## 来源 + +- [Orchestrate subagents at scale with dynamic workflows — Claude Code Docs](https://code.claude.com/docs/en/workflows)(原语、16/1000 上限、保存/args/恢复、审批) +- [Introducing dynamic workflows in Claude Code — Anthropic](https://claude.com/blog/introducing-dynamic-workflows-in-claude-code)(Bun 移植四阶段、use case 分类) +- [Deterministic Multi-Agent Orchestration — alexop.dev](https://alexop.dev/posts/claude-code-workflows-deterministic-orchestration/)(Vue 新闻信完整脚本、对抗验证、确定性约束) +- [A Thousand Agents, One Script — trilogyai](https://trilogyai.substack.com/p/claude-codes-dynamic-workflows-a) +- [Claude Code Adds Dynamic Workflows — InfoQ](https://www.infoq.com/news/2026/06/dynamic-workflows-claude-code/) + +--- + +## Related + +### Resources +- [[Claude Code 官方多Agent编排最佳实践 (2026)]] +- [[ECC orch- 编排家族与 v2.0 团队编排]] +- [[ECC 编排实战手册]] +- [[Autonomous Loops 自主循环模式]] + +### Zettelkasten +- [[20260618073140 编排即排序门控与委派]] +- [[Plans as Prompts设计模式]]