Agent Leader
一、业务理解
业务定义
Agent Leader 是一个跑在开发者本机的多 Agent 开发和交付平台。 它接入原生的 Codex CLI、Claude Code CLI、Qwen、Kimi Code CLI,把这些 Coding Agent CLI 纳入到以 Coding Agent 为生产主体的软件工程流程中, 并实现流程内交付的可信任、可审批、可回溯、可回滚。
服务用户
同时用多个 Coding Agent CLI 的开发者。
为什么会混用:实际工作里,不同任务对模型能力的要求差别很大。做架构设计、产品方案时,需要推理能力最强的模型; 改复杂 bug 时,需要上下文窗口大、对项目理解深的模型;而大量模式固定的重复性工作,让便宜的模型严格按写好的规范执行就够了。 所以团队里一定是多个 Coding CLI 混着用。
用户痛点
业务主流程
主流程分两个层次:可变的流程(workflow)编排,和不变的 Stage 生命周期。以一个 Workflow 为例:
-
用户半自由式交互提交 query
用户通过 CLI / TUI / Dashboard / API 四种入口中的任意一种,按交互提示输入命令(如
muxdev dev / fix / design)或一句自然语言任务描述。 守护进程收到后建立一条 Run 记录,写入 SQLite,并返回run_id。 -
规则引擎映射编排决策
编排器依据三样东西做判断:可正则解析的交互指令、任务文本里风险词(认证、支付、迁移)的命中、以及仓库特征(测试目录、语言、项目标记)。
按规则从规则集中选取本次的
workflow.yaml:划分 Stage、设定依赖、标出只读阶段和人工关卡、设定修复循环上限。 路由器再查 Provider(Agent)评分卡为每个 Stage 分配 Agent——编码 Agent 与评审 Agent 强制来自不同 provider。 -
worktree 分支隔离
执行引擎为本次 Run 建立 git worktree(独立分支
agent-leader/<run_id>)。后续所有改动只发生在这个副本里,主工作区不受影响; 非 git 仓库时退化为复制目录并补一个基线提交,保证 diff 和回滚照常可用。 -
调用 Agent 逐阶段执行
执行引擎按
workflow.yaml的依赖顺序推进 Stage,每个 Stage 都走同一套流程: 写上下文包 → 记快照 → 调用 provider 完成对应开发任务 → 解析输出 → 再记快照 → 写证据。 执行中有三种分支:- 碰到审批点(plan / write / shell / merge)→ 暂停,等人 approve / deny。审批绑定被审内容的 hash,内容一变,旧审批作废,重新挂起。
- 外部 CLI 卡住(要登录、被限流、在等 yes/no)→ 记一条 ProviderAction,等人到对应 CLI 里处理完,回来点「已处理」后继续。
- review 有阻塞 → 回到 fix 修复,最多 1~2 轮;仍不通过则标记 blocked,等人介入。
-
判定器收尾
判定器读取整条证据事件流,依次完成证据评估(ready / reviewable / risky / blocked)、交付门禁、盲评审,
产出
final_report.md、diff.patch,以及每个阶段的回滚快照。 - 最终交付 开发者看完报告后决定:合并——再走一次 merge 审批,通过后把 worktree 的改动应用回主工作区; 回滚——回退到指定阶段的快照;继续——处理完待办后,从断点阶段接着跑。
关键业务拆解:可信交付的功能性要求
-
Agent 自报和事实不一致时,系统要拦截。
- 汇报改动某某文件,实际没改;
- 自述测试了,实际没有测试;
- 自述测试成功,实际没有成功;
- 为了让测试成功,自己修改或跳过了测试。
-
Agent 越权时,系统要识别并拦截。
- 只读阶段(评审、设计)偷偷改代码;
- 开发阶段自己把测试写了;
- 开发阶段把 Spec 文档或开发计划改了;
- 接到另一个 Agent 的交接文档时把交接文档改了;
- 把记忆改了。
- 正常任务的交付结论能事后复核。
- 出问题能回滚到任意阶段之前。
二、技术理解
准则与重心
步步落库,步步校验,关键信息人工介入。
业务主要重心是可信交付,其它业务功能都必须为此让步。
可信交付怎么实现
它不是单点功能,而是一整套系统化机制,由六个层面协同实现:编排、证明、持久化、权限、隔离、运行时行为,最后由评测驱动迭代。
技术闭环
编排决定谁在什么时候做什么;隔离和权限限制 Agent 能动哪些东西;运行时由判定层亲自取证,形成证据; 持久化保证证据和代码状态不丢失、可回滚;评测从证据中统计每个 Agent 和每种流程的表现,再反过来调整规则引擎的映射集的调整和编排。
2.1 多 Agent 编排协作
可选方案有两大类:
- 去中心化:多个 Agent 各自提出方案,互相讨论,最终商定一个。
- 中心化:由一个中心编排器决定 Agent 怎么工作。又分三种做法——静态规则引擎、动态 Agent 调度、混合式(由 Agent 规划 workflow,其余部分按 workflow 调度)。
选择中心化的静态规则引擎。动态 Agent 调度难以审计,同样的任务可能走出不同的调度路径,出了问题没法定位到是哪个 Agent 的责任; 由 Agent 规划 workflow 有同样的毛病,同一任务每次生成的 workflow 不同,难以复现。
代价灵活性差。规则覆盖不到的任务只能落到默认模板,规则集需要持续维护。
2.2 证据体系
- SLSA:供应链安全标准。v1.0 定义了 Build 轨道的 L0~L3,等级越高,对构建来源证明(provenance)和构建平台的要求越严格。
- in-toto:由项目负责人签名的布局文件定义供应链步骤;每一步由执行者用自己的密钥签名记录输入和输出;验证时检查签名、步骤顺序和产物哈希。
这两者都是为 CI/CD 构建流水线设计的,依赖密钥分发和签名基础设施,对「本地跑一次 Agent 任务」来说太重。
选择借用它们的思想——每一步留下证明、产物用哈希串联——实现得更轻:
- 每一步的事实写入 append-only 的事件流,每条事件带上一条的哈希,形成哈希链;
- 每个可写阶段结束后提交一次 git commit,代码状态由 git 固化;
- 交付结论由确定性规则从事件流推导,不采用 Agent 的自述。
局限哈希链没有签名时,只能发现局部篡改,有写权限的人可以整条重写。改进方向是对链尾签名,并把哈希写入 git notes。
2.3 持久化
- Temporal:把执行过程记录为 Event History,worker 崩溃后通过重放恢复到断点。生产部署需要独立服务端;开发模式可以单进程跑、用 SQLite 落盘,但官方说明不用于生产。
- DBOS:库形态,默认使用 SQLite,不需要独立服务。
- LangGraph checkpointer:按线程保存图的状态,有内存、SQLite、Postgres 等实现。
选择SQLite 记录 Run 和 Stage 的状态与事件,每个可写阶段结束提交 git commit,恢复粒度定在 Stage。 原因是 Stage 内部是一次外部 CLI 进程调用,本身无法重放,失败了只能整阶段重跑;在这个粒度上,记录每个 Stage 的完成状态和 commit 就足够, 不需要引入重放语义,也不需要额外部署服务。
2.4 权限机制
参考对象是 Claude Code 的权限规则:分 allow / ask / deny 三类,按 deny → ask → allow 的顺序判定;也可以通过 PreToolUse hook 在工具调用前加入检查。 在此基础上做了三件事:
- 审批绑定内容哈希:审批对象是 spec、patch 等内容的哈希,内容一变,旧审批作废。防的是「先拿一个无害的方案通过审批,再换成别的内容执行」。
- 受保护路径:spec、开发计划、已提交的测试和测试配置、交接文档、记忆文件都列为受保护路径。每个阶段结束后,判定层检查 diff 是否触及受保护路径,触及即判越权——对应上面第二条要求里列出的越权行为。
- 外部阻塞单独建模:外部 CLI 的登录、限流、确认提示记为 ProviderAction,不和平台审批混在一起,平台也不替用户回答。这是同时管理多个 CLI 才会遇到的问题,单个 CLI 工具没有这一层。
2.5 隔离机制
- Docker 容器:进程、文件系统、网络都能隔离,强度最高。但需要安装 Docker,Windows 上还依赖 WSL2 或 Hyper-V,启动也慢。
- OS 级沙箱:Claude Code 自带的 Bash 沙箱支持 macOS、Linux、WSL2,原生 Windows 上不可用。
- git worktree:git 自带,创建快(小仓库实测约 10 ms),天然支持分支、diff 和回滚。
选择默认使用 git worktree:每个 Run 一个独立分支,主工作区不受影响; 只读阶段使用用完即删的副本,并比对阶段前后的 tree id,有改动即判违规。
边界worktree 隔离的是「改动」,不是安全沙箱,Agent 进程仍以用户身份运行。所以它要配合 provider 自带的权限模式使用,高风险任务可以切换到容器执行。
2.6 评测
SWE-bench 把补丁应用到真实仓库中运行测试,要求原本失败的测试变为通过(FAIL_TO_PASS),原本通过的测试不能变坏(PASS_TO_PASS), 最终给出一个通过 / 不通过的结果。我们和它一样,以真实执行结果为准,不看模型自述。 但单一的通过 / 不通过结果存在「蒙对也算过」的问题,所以评测除了完成度,还统计过程指标。
做法同一批任务用三种方式运行——直接调用 CLI、muxdev 单 Agent 编排、muxdev 多 Agent 编排—— 对比完成度、质量、证据完整度、可靠性、人工介入次数、成本和耗时。总分中确定性指标占 80%,LLM 评委占 20%,评委可以关闭。
| 指标 | 直接调用 CLI | muxdev 编排 |
|---|---|---|
| 总分 | 0.83 | 0.999 |
| 证据置信度 | 0.49 | 1.0 |
| 缺失证据 | 3 项 | 0 项 |
在 mock provider 上跑 3 个任务的结果。
怎么看这组数它说明的是机制能区分「有证据」和「没证据」的交付。 另外,过程分对编排模式设了 0.55 的下限,对直接调用 CLI 只有 0.25,总分差距里有一部分是这个设定带来的—— 看结论时应以证据置信度和缺失证据数为主。