- 前端构建
- 构建工具
- 开发工具
【免费下载链接】farm
Extremely fast Vite-compatible web build tool written in Rust
导读
在 Farm 这样的大型 Rust + TypeScript 混合 monorepo 中,一次重构或一轮 CI 失败往往同时出现多个相互独立的问题——不同测试文件、不同子系统、不同根因。逐个串行排查既消耗大量上下文窗口,也让整体修复周期被线性拉长。本篇文章基于仓库内.agents/skills/dispatching-parallel-agents/SKILL.md技能文档,系统讲解"按独立问题域并行分发 Agent"的排障方法论:如何识别独立域、如何构造自包含的聚焦任务、如何分发与整合,并结合 Farm 仓库内真实的并行执行实现(E2E 多进程调度、Rust 侧 rayon 线程池)给出源码级佐证。读完本文,你将掌握一套可复用的并行排障工作流,能够在多故障场景下把"3 个问题"压缩到"1 个问题"的时间窗口内解决。
核心原则:每个独立问题域一个 Agent
技能文档开篇即给出该工作流的基本盘:你将任务委派给拥有隔离上下文的专职 Agent。通过精确构造它们的指令与上下文,确保每个 Agent 都聚焦在自己的任务上并成功完成。
要点有三:
- 隔离上下文(Isolated Context):子 Agent 绝不继承主会话的上下文与历史,而是由调度者(Controller)精确构造它所需的全部信息。这不仅保证子 Agent 专注,也保住了调度者自身的上下文用于协调工作。
- 并发执行(Concurrent Execution):当存在多个互不相关的失败(不同测试文件、不同子系统、不同 Bug)时,串行调查是纯浪费时间——每个调查彼此独立,完全可以并行。
- 一域一 Agent(One Agent per Problem Domain):核心原则是"按独立问题域各分发一个 Agent,让它们并发工作"。
这一原则在 Farm 仓库中并非纸上谈兵。仓库的 E2E 编排器 scripts/test-e2e.mjs 正是"一域一执行者、并发推进"的工程化体现:它把examples/下的全部示例按轮询方式(round-robin)分配到 N 个 worker 进程,每个 worker 拥有独立的 Node.js 进程与浏览器实例(见 scripts/test-e2e.mjs 的分组逻辑与 scripts/test-e2e-worker.mjs 的 fork 实现)。这从侧面印证了"并行分发 + 隔离执行"在大型仓库工程流程中的现实价值。
何时使用与何时不用
技能文档用一张决策流程图界定了该模式的适用边界:
应该使用
- 3 个及以上测试文件失败,且各自根因不同;
- 多个子系统独立损坏,彼此互不影响;
- 每个问题都能在不依赖其他问题上下文的情况下独立理解;
- 各调查之间不存在共享状态。
不该使用
- 失败彼此相关(修复一个可能连带修复其他);
- 需要理解完整系统状态才能下手;
- Agent 之间会相互干扰(比如编辑同一文件、争用同一资源)。
四步工作模式:从识别到整合
1. 识别独立问题域
按"坏在哪里"对失败进行分组。例如文档中的分组方式:
- 文件 A 的测试:工具审批流程(tool approval flow);
- 文件 B 的测试:批量完成行为(batch completion behavior);
- 文件 C 的测试:中止功能(abort functionality)。
每个域都相互独立——修复工具审批不会影响中止相关的测试。这一步是整个流程正确性的根基:分组错了,后续的并行就失去了意义。
2. 创建聚焦的 Agent 任务
每个 Agent 拿到四要素:
- 明确范围(Specific scope):一个测试文件或一个子系统;
- 清晰目标(Clear goal):让这些测试通过;
- 约束(Constraints):不要改动其他代码;
- 预期产出(Expected output):你所发现与修复内容的摘要。
3. 并行分发
文档给出了在 Claude Code / AI 环境下的分发示例:
// In Claude Code / AI environment Task("Fix agent-tool-abort.test.ts failures") Task("Fix batch-completion-behavior.test.ts failures") Task("Fix tool-approval-race-conditions.test.ts failures") // All three run concurrently三个任务同时发起、并发执行。调度者只负责分发,不在中间等待某个任务完成才启动下一个。
4. 审查与整合
Agent 返回后,调度者必须完成闭环:
- 阅读每份摘要;
- 验证各修复之间不冲突;
- 运行完整测试套件;
- 整合全部变更。
Farm 仓库的 E2E 编排器在"审查与整合"环节同样有工程化对应物:worker 通过 IPC 把结果回传后,编排器在 scripts/test-e2e.mjs 用Promise.all汇总所有 worker 的结果,再调用 e2e/runner.mjs 的printSummary输出"passed / failed / skipped"汇总,并以失败数决定进程退出码——先验证、后判定,与"审查摘要 → 跑全量 → 整合"的节奏一致。
Agent 提示词结构:聚焦、自包含、明确产出
好的 Agent 提示词有三个特征:
- 聚焦(Focused)——只有一个清晰的问题域;
- 自包含(Self-contained)——理解问题所需的全部上下文都在提示词里;
- 产出明确(Specific about output)——明确说明 Agent 要返回什么。
文档给出的完整示例提示词如下(注意其中的约束与反约束):
Fix the 3 failing tests in src/agents/agent-tool-abort.test.ts: 1. "should abort tool with partial output capture" - expects 'interrupted at' in message 2. "should handle mixed completed and aborted tools" - fast tool aborted instead of completed 3. "should properly track pendingToolCount" - expects 3 results but gets 0 These are timing/race condition issues. Your task: 1. Read the test file and understand what each test verifies 2. Identify root cause - timing issues or actual bugs? 3. Fix by: - Replacing arbitrary timeouts with event-based waiting - Fixing bugs in abort implementation if found - Adjusting test expectations if testing changed behavior Do NOT just increase timeouts - find the real issue. Return: Summary of what you found and what you fixed.拆解这份提示词,可以提炼出可复用的模板要素:
- 列清单:把 3 个失败测试的名称与预期行为逐一列出,让 Agent 不靠猜;
- 给方向:明确指出这是"时序/竞态问题",缩小排查范围;
- 给方法:给出候选修复方向(事件化等待、修中止实现、调整预期),但保留判断空间;
- 设红线:
Do NOT just increase timeouts——防止 Agent 走"加超时"的偷懒路径; - 要产出:
Return: Summary of what you found and what you fixed——保证调度者拿到可审查的结果。
常见错误对照表
技能文档用正反例对照的方式给出了四个最典型的错误模式:
| 错误(❌) | 问题 | 正确做法(✅) |
|---|---|---|
| "Fix all the tests" | 范围太宽,Agent 会迷失 | "Fix agent-tool-abort.test.ts"——聚焦范围 |
| "Fix the race condition" | 没有上下文,Agent 不知从何入手 | 粘贴错误信息与测试名 |
| 无约束 | Agent 可能顺手重构一切 | 明确 "Do NOT change production code" 或 "Fix tests only" |
| "Fix it" | 产出含糊,调度者不知改了什么 | "Return summary of root cause and changes"——明确产出 |
这些反例共同指向同一结论:并行分发的成败不取决于模型能力,而取决于提示词把"边界"划得多清楚。
何时不该用:四个典型反例
文档专门列出四种"即使失败很多也不要并行"的情形:
- 相关失败(Related failures):修复一个可能连带修复其他——应先合并调查;
- 需要完整上下文(Need full context):理解问题需要看到整个系统;
- 探索式调试(Exploratory debugging):你还不知道哪里坏了,谈不上分组;
- 共享状态(Shared state):Agent 会互相干扰(编辑同一文件、使用同一资源)。
判断的标准始终是"独立性":只有当问题域之间的耦合度足够低时,并行才是正解;否则强行并行只会带来合并冲突与重复劳动。
真实会话案例:一次重构后的 6 个失败
技能文档记录了一次真实的调试会话,完整走了一遍这套流程:
场景:重大重构后,3 个文件共出现 6 个测试失败。
失败清单:
agent-tool-abort.test.ts:3 个失败(时序问题);batch-completion-behavior.test.ts:2 个失败(工具未执行);tool-approval-race-conditions.test.ts:1 个失败(执行计数 = 0)。
决策:三个域相互独立——中止逻辑、批量完成逻辑、竞态条件是三个互不关联的子系统,因此并行分发:
Agent 1 → Fix agent-tool-abort.test.ts Agent 2 → Fix batch-completion-behavior.test.ts Agent 3 → Fix tool-approval-race-conditions.test.ts结果:
- Agent 1:用事件化等待替换了任意超时(timeouts → event-based waiting);
- Agent 2:修复了事件结构缺陷(
threadId放错位置); - Agent 3:补上了对异步工具执行完成的等待。
整合:三个修复互不冲突,全量测试套件转绿。
时间收益:3 个问题并行解决 vs 串行解决——这正是该模式的直接价值。
收益、验证与真实影响
四大收益
- 并行化(Parallelization):多个调查同时进行;
- 聚焦(Focus):每个 Agent 范围窄,需要跟踪的上下文更少;
- 独立性(Independence):Agent 之间互不干扰;
- 速度(Speed):文档原话——"3 problems solved in time of 1"(3 个问题在一个问题的时间内解决)。
收尾验证四步
Agent 返回后不可直接合并,必须走验证闭环:
- 审查每份摘要——理解发生了什么变更;
- 检查冲突——Agent 是否编辑了同一段代码;
- 跑全量套件——验证所有修复协同工作;
- 抽查——Agent 也可能犯系统性错误,不能盲信。
真实影响
据文档记录(调试会话日期 2025-10-03):6 个分布在 3 个文件中的失败,3 个 Agent 并行分发,全部调查并发完成,全部修复成功整合,Agent 变更之间零冲突。
仓库内并行执行的源码佐证
该技能文档所倡导的"并行 + 隔离"心智模型,在 Farm 仓库的多层实现中都有真实对应,可以相互印证:
工程层:E2E 多进程调度
- scripts/test-e2e.mjs 的
runWorker通过child_process.fork()派生 worker,并监听results/skip/error/done/fatal五种 IPC 消息类型;每个 worker 通过FARM_E2E_WORKER_INDEX环境变量获得身份标识。 - 并发度可调:默认并发在 CI 下为
min(2, cpus().length),本地为min(4, cpus().length)(见 scripts/test-e2e.mjs),也可用--concurrency/-j参数或FARM_E2E_CONCURRENCY环境变量覆盖(scripts/test-e2e.mjs)。 - worker 侧(scripts/test-e2e-worker.mjs)每个进程只启动一个浏览器实例(chromium headless),为每个示例创建全新 context,并把
Error序列化为errorMessage/errorStack后再走 IPC,避免结构化克隆丢失错误信息。 - 为防止僵尸进程污染并行调度,e2e/process-cleanup.mjs 会在运行前/后清理"陈旧 E2E 进程组",通过
ps采集进程树、识别 Farm E2E 相关进程、按进程组发送SIGTERM/SIGKILL——这与"Agent 不得互相干扰"的独立性要求异曲同工。
编译核心层:Rust 线程池并行构建
Farm 编译器本身就是一个并行执行系统的实例。Rust 侧大量使用 rayon 线程池把模块构建并行化:
- crates/compiler/src/build/mod.rs 中
thread_pool.spawn(...)用于并行提交构建任务; - crates/core/src/cache/mod.rs 中
rayon::ThreadPoolBuilder::new()构建缓存线程池,并以rayon::join并行推进(crates/core/src/cache/mod.rs); - 模块图收尾与资源块渲染分别使用
par_iter_mut()(crates/compiler/src/build/finalize_module_graph.rs)与into_par_iter()(crates/compiler/src/generate/render_resource_pots.rs)。
这些实现说明:"把互不依赖的工作并行化、用调度层负责整合"在 Farm 的工程文化中是一以贯之的原则——既体现在编译内核的 rayon 线程池,也体现在 Agent 工作流的并行排障方法论,还体现在 CI 脚本(scripts/ready.mjs 中cargo test -j max(cpu/4, 1)的并行测试)里。
在 Farm 仓库中使用该技能
该技能文档位于仓库的 Agent 工具链目录.agents/skills/dispatching-parallel-agents/,属于"工作区本地、随 Agent 工具链分发的技能"。根据 AGENTS.md 的说明,仓库中的技能分为三个层级:顶层skills/(项目知识库)、.github/skills/(团队共享工作流)、.agents/skills/(Agent 工具技能)。所有技能均为 YAML frontmatter + 正文的SKILL.md结构,frontmatter 中的name必须与目录名一致,description则是发现入口。
与其他技能配套使用时效果最佳:同目录下的 .agents/skills/subagent-driven-development/SKILL.md 提供了"每任务全新子 Agent + 规格审查与代码质量审查两阶段评审"的串行执行变体;而本技能专注于"多独立域并行分发"。当并行分发返回后,可配合仓库内的全量验证通道(pnpm run ready或pnpm run test-e2e)完成第四步"审查与整合"的闭环。
- 前端构建
- 构建工具
- 开发工具
【免费下载链接】farm
Extremely fast Vite-compatible web build tool written in Rust
相关推荐
superpowers-zh 并行分派智能体(dispatching-parallel-agents):多 Agent 并发排查独立故障的实战指南
superpowers zh 并行分派智能体(dispatching parallel agents):多 Agent 并发排查独立故障的实战指南 导读 本文围
AI 技能AI 插件人工智能开发工具LikeC4 智能体工作流技能:并行 Agent 调度(Dispatching Parallel Agents)模式详解
LikeC4 智能体工作流技能:并行 Agent 调度(Dispatching Parallel Agents)模式详解 本篇技术文章以 LikeC4 仓库中的
开发工具数据可视化CLI前端MCP 服务LiveKit 完整指南:三步搞定 Safari 的 AV1 编解码兼容,让跨浏览器实时音视频更稳
LiveKit 完整指南:三步搞定 Safari 的 AV1 编解码兼容,让跨浏览器实时音视频更稳 LiveKit 是一个端到端实时通信栈,专为连接人类与 AI
后端音视频即时通讯AI Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考