给 LLM agent 的每次任务装上入口与出口两道门,中间为高价值交付加一场多候选竞争:动手前先侦察,交付前必终检;触发靠 hook,不靠模型自觉。
如果你不写代码,认识这五个词就能读完全文:
- agent:让大语言模型(LLM)自己规划步骤、调用工具、把一件事从头做到尾的工作方式——一个会自己动手的 AI 助手。
- subagent(子代理):主 agent 临时请来的专职同事,在隔离的上下文里只干一件事,干完交报告。本项目的侦察员和质检员都是 subagent。
- hook(钩子):宿主软件在固定时机自动运行的小脚本,比如「用户每发一条消息就执行一次」。它到点必响,不管模型记不记得。
- harness(运行框架):承载 agent 干活的宿主环境(如 Claude Code、Cursor),hook 和 subagent 这些机制层能力都由它提供。
- MoA(Mixture-of-Agents,多代理混合):同一个任务让多个模型各写一份完整答案,再由聚合器合成一份更好的终稿——像编辑部收三份独立初稿,出一篇定稿。
LLM agent 的失误,常常发生在两个时刻。
第一个时刻在入口。agent 拿到任务直接开干,外部事实没查,用户约束没问,上下文(模型当下记在脑子里的信息)缺口被带进执行过程,最后变成方向性返工。
第二个时刻在出口。答案写完就交付,没有独立质检,事实错误、答非所问、选择性遗漏直接流向用户,用户被迫当 QA(质检员)。
把「请你先确认需求」「请你交付前自查」写进提示词,只能算软提醒。上下文一长,提醒会被稀释。要让关键动作稳定触发,就不能只依赖模型记得,而要把它们移到 harness 的机制层。
Dual-Gate-MoA 做的就是这件事:入口一道侦察门,出口一道质检门,两门之间为值得较真的交付备一场多候选竞争。双门本体可以独立安装,MoA 是按需加装的扩展模块(PRD §14);完整形态就是仓库名本身——dual-gate-moa。
一句话:强制在流程层,克制在内容层。
强制,是因为触发由 hook 执行,不依赖 agent 的记忆。入口的 UserPromptSubmit hook(用户每提交一条消息就触发)会 100% 注入「先侦察再执行」规则;出口的 Stop hook(agent 试图结束回合时触发)会检查 QA 表态,没有表态就拦回,连续拦 8 次后系统强制放行,避免死循环。
克制,是因为触发之后做多做少,仍交给智能判断。侦察员发现上下文足够,可以秒退;质检员认为交付物达标,可以一次 PASS;闲聊、纯查询和琐碎机械任务,写一个豁免标记就走零开销路径。
还有一条贯穿始终的模型策略:判断力密集的节点,永远用手里最强的模型。 聚合器 moa-aggregator 与终检员 qa-checker 通过 model: inherit + effort: max 钉在主会话当前可用的最强模型档位——判断力不降级,且随模型迭代自动跟进;三个起草者(proposer)则刻意混布模型档位与解题视角(默认档三发 A/A/B:Sonnet·max ×1 + Opus·xhigh ×2,两个从正面解题、一个专走逆向;另有论文忠实版全顶配可切换),让候选之间的差异来自构造,而不是运气。
门不信任模型的记性,但信任模型的判断。v1.7 之后还多了一条:门也不信任模型一定能跑完。 真实事故取证发现,深思考档位的模型在重任务包上会陷入"思考失控"——整个输出窗口烧在推理上、一个字正文都不出。修法不是祈祷,是工程:后台派生(单点挂死不拖死全局)、看门狗定时自查(不再等用户发现)、尾部对冲(掉队就补发替补,先到先用)——来自 Google《The Tail at Scale》的 hedged request 纪律。
一次任务大致经过四段。
入口。 research-gate.sh 在用户消息提交时注入流程规则,要求主 agent 先委派侦察员 research-scout。它与主上下文隔离,负责补齐四类信息——互联网、本地文件、个人记忆、需要向你收集的——并判断这单任务值不值得启用 MoA。能合理假设的空白先填掉、记入「已采用假设」留你一票否决;绕不开的问题才交还给你。它还内置一道「注意力定价」闸门:打断用户问一句,约等于消耗 30K tokens(token 是模型计量文本的单位)的注意力——能不问,就不问。
对复杂任务,入口还会升级为一场 Grill 追问闭环(PRD §15,借鉴 GitHub 上 Matt Pocock 的 grill-me 哲学):侦察员判定任务复杂度并产出「分级追问计划」,主 agent 据此逐波向你追问——一次一问、每问自带推荐答案让你否决而非填空、按依赖排序、够明确了立即停。简单任务豁免追问,但基础侦察永不豁免——「先常驻触发,再判断豁免」。
执行,必要时升级为一场竞争。 普通任务,主 agent 拿着入口简报直接做。高价值的文本交付物——一份方案、一篇长文、一次评审——则进入 MoA 多候选竞争:三个 proposer 后台并行独立成稿,两个从正面解题,一个专走逆向、专挑毛病;候选先过一次本地相似度体检,防止写得太像、竞争名存实亡;然后由聚合器逐维比较、重写级聚合——不是拼接,不是投票,而是写出一份优于任何单份候选的终稿。做法是 Self-MoA(arXiv:2502.00674,TMLR)的工程化。
v1.8 起,这段 fan-out 由 Workflow 确定性编排脚本执行(moa-fanout.workflow.js 已嵌入 PRD §14.X):并行、收集阶梯、对冲替补、体检全部写成代码、不可跳步——编排从"模型自觉照文字执行"变成确定性控制流;主会话同回合武装看门狗,任何一个 proposer 挂死都能被定时发现、止血、补位,最坏也能带着已到场的候选降级交付并如实声明。(脚本首次真实生产运行的复盘已挂进 PRD §9-7 观测窗——宣称与实测对齐,对自己也不例外。)
出口。 质检员 qa-checker 对照原始需求,从要求符合度、事实性、完整性三个维度终检,首行输出机读判定:PASS、PASS WITH FIXES 或 FAIL。不通过就进入「检、修、复检」闭环,最多三轮;若交付物出自 MoA,必修项会经续聊直达聚合器修订,不重跑 proposer——改的是稿子,不重开比赛。
审计。 subagent-telemetry.sh / .py 把每个 subagent 的真实判定写进 gate-events.jsonl(一份只增不删的事件日志,即遥测)。如果某个 session(一次会话)写了通过标记,日志里却找不到配对的终检判定,「写了标记没真检」就会在对账时露馅——门本身也被门审计。v1.6 起对账不再靠人记性:reconcile.py(随仓库附带)把分析配方代码化,一条命令输出裸放行清单、入口疑似漏派、健康基线当期值与扩展模块观测窗;每周由持久化定时任务自动跑,有新增违规才通知。落地首日它就抓出了真实违规——门审出了自己的漏网,这不是尴尬,是这套机制存在的意义。
另有一道活文档门:prd-sync-gate.sh 盯着机制文件,一有变更就要求同步 PRD(产品需求文档)与 Changelog(变更日志)。dual-gate-replication-prd.md v1.8(2026-07-24)是自包含的——幂等(重复执行也安全)安装、可执行验证、成体系的 ADR(架构决策记录,含每次真实事故的取证与决策留痕)、非 Claude Code 环境的降级矩阵(§11)全在一份文档里,整份交给任何 agent,就能复刻出一套可运行的实例。
用户消息
│
▼ UserPromptSubmit hook ──▶ research-gate.sh:无条件注入〔研究前置·流程门〕规则
│ (软触发:主 agent 据此委派 research-scout)
▼
主 agent ──委派──▶ research-scout(隔离上下文,Triage:够了秒退 / 缺口清单或分级追问计划交回)
│ └─ 复杂任务 → Grill 追问闭环:主 agent 逐波追问,一次一问·带推荐答案·够了即停
▼ 执行任务…(高价值文本交付 → MoA:Workflow 编排 proposer ×3 后台并行 + 看门狗/对冲
│ → 相似度体检 → aggregator 聚合)
│ (期间每个 subagent 结束都触发 SubagentStop)
│ └─▶ subagent-telemetry.sh/.py:识别 qa-checker / research-scout,
│ 从其 transcript 提取真实判定 → 追加 gate-events.jsonl
▼
主 agent 想结束回合
│
▼ Stop hooks(依次全部执行)
├─ qa-gate.sh:最终回复末行有 [QA-PASS]/[QA-EXEMPT: 理由]?
│ ├─ 有 → 放行(遥测记 pass/exempt)
│ └─ 无 → block 拉回:实质交付→先跑 qa-checker(FAIL 则修复复检)→[QA-PASS];
│ 豁免类→[QA-EXEMPT: 理由]。
└─ prd-sync-gate.sh:机制文件 mtime > PRD mtime?
└─ 是 → block 逼同步 PRD + Changelog
| 组件 | 类型 | 干什么 |
|---|---|---|
| research-scout | subagent(侦察员) | 动手前补四类信息(互联网/本地/记忆/需向你收集的)、产出研究简报 + Grill 分级追问计划 + MoA 路由判定 |
| qa-checker | subagent(质检员) | 交付前按要求符合度 / 事实性 / 完整性三维终检,产出 QA VERDICT |
| research-gate.sh | UserPromptSubmit hook | 每条用户消息注入「先侦察再执行」的流程规则 |
| qa-gate.sh | Stop hook | 回合结束前查表态标记([QA-PASS]/[QA-EXEMPT]),没有就拦回 |
| subagent-telemetry.sh / .py | SubagentStop hook | 把两个 subagent 的真实判定写入遥测,防「写了标记没真检」 |
| prd-sync-gate.sh | Stop hook | 活文档门:机制文件比 PRD 新就拦住回合,逼着先同步文档 |
| gate-events.jsonl | 数据文件 | 只增不删的遥测日志,复盘与交叉对账的数据底座 |
| reconcile.py | 离线对账脚本 | §9 分析配方代码化:裸放行清单 / FAIL 抢跑告警 / 入口疑似漏派 / 基线当期值 / 观测窗;随仓库附带,建议每周跑 |
MoA 扩展模块(PRD §14)另含五个 agent 定义——moa-proposer-a(Sonnet·max)、moa-proposer-a-opus 与 moa-proposer-b-opus(Opus·xhigh,默认三发阵容 A/A/B)、moa-proposer-b(备用档)、moa-aggregator——以及编排手册(SKILL.md)、Workflow 确定性编排脚本(moa-fanout.workflow.js)、相似度体检脚本与回归用例。Grill 追问闭环(PRD §15)为入口侧扩展,零新增文件——它是对侦察员与入口注入规则的能力升级。
仓库的核心交付物只有一份文件:自包含的可复刻 PRD——dual-gate-replication-prd.md。机制的全部源文件逐字嵌在里面,带幂等安装步骤和可执行的验收测试。
你不需要会写代码。 只要你在用 Claude Code、Codex、Cursor 这类 AI 编码助手,两步即可:
- 把整份
dual-gate-replication-prd.md发给它; - 对它说一句:
请按这份 PRD 的 §0 指令,在我的环境里复刻这套机制。
剩下的事——读懂设计决策、适配你的环境与工具、写入文件、跑验证——由 agent 自己完成。PRD 是写给 agent 读的,你只负责转发。不跑验证的复刻视为失败(这句话写在 PRD 第 0 节)。
- 工程读者想手动装:按 PRD §7 操作(备份 → 写入 7 个文件 → 合并 settings.json → 合并 CLAUDE.md → 保存 PRD 副本 → 重启会话 → 跑 §8 验证)。
- 不用 Claude Code:PRD §11 把机制拆成五项抽象契约(入口注入、出口拦截、独立质检者、判定遥测、活文档同步),逐项给了其他环境的降级实现路径。
- 想要完整形态(含 MoA 多候选竞争):先装双门本体,再按 PRD §14 加装 MoA 扩展模块。
PRD §8 内置四步可执行验证,复刻后必须跑:
- V1 · qa-gate 场景测试:mock 五个场景(有标记放行 / 无标记拦回 / 句中引述不误放 / 续跑放行)。
- V2 · 遥测解析单测:喂样例 transcript,确认判定行被正确写进遥测。
- V3 · 端到端:真实会话跑一次最小终检,确认判定、遥测、放行三者对齐。
- V4 · 活文档门:touch 机制文件确认拦截,touch PRD 确认放行。
早期四周数据(2026-06-06 至 07-02,829 条事件)曾是这套机制的主要背书:112 次终检 50% 产生实质修改信号、39 个交付 session 零裸放行、30% 的入口侦察拦到输入缺口、约 2/3 回合零开销豁免。
然后它被自己的审计打脸了。 2026-07 中旬一次环境迁移后,一场 MoA 多智能体深度审计(PRD v1.6)发现:这批四周数据的原始遥测未随迁移保留,在新环境不可复现、无法独立验证;更扎心的是,新环境数据线跑起来的头三天,对账就抓出了真实的裸放行案例——与"零裸放行"的历史结论直接冲突。
处理方式写进了 PRD §12 的数据溯源注:旧数字降级为"迁移前环境历史参考,不再作为现状证明";新数据线从零重建基线,reconcile.py 每周自动对账。一套宣称"门本身也被门审计"的机制,最有说服力的证据不是完美数字,而是它真的审出过自己的问题、并把过程原样留在了文档里。 新数据线的稳态读数(截至 2026-07-24):exempt 占比 ~71%(克制层达标)、block 占比降至 ~5%、终检修改信号率 ~39%(历史口径 ~50%,新线样本仍在积累)。
这套机制在开源后的两周里经历了五轮真实迭代,每轮都由生产事件驱动(完整决策链见 PRD Changelog):
- v1.4 · Grill 追问闭环:入口从"一次性缺口清单"升级为"按复杂度分级的多轮追问"——先常驻触发、再判断豁免,追问深度随任务复杂度动态伸缩。
- v1.5 · 思考深度分档:判断力节点钉 max、生成节点按档位分立定义文件(harness 不支持 spawn 时覆盖思考深度,这是工程约束逼出来的设计)。
- v1.6 · 多智能体深度审计:用 MoA 审计 MoA 自己——9 项优化裁决落地(8 项执行、1 项数据先行暂缓),包括对账脚本化(reconcile.py)、宣称与实测对齐、历史数据溯源诚实化。
- v1.7 · 稳定性改版:一次真实的 13 小时任务冻结事故(proposer 思考失控 × 前台阻塞)驱动——全后台派生 + 看门狗 + 尾部对冲 + 错误/挂死分流,效果优先的降级阶梯。
- v1.8 · 确定性编排:fan-out 段交给 Workflow 脚本(代码强制、不可跳步、可断点恢复);周检接上持久化定时任务;遥测结论回流长期记忆。
演进的共同主题:每一层"应该会发生"的自觉,最终都被换成了"必然会发生"的机制。
同类质量门项目大多集中在出口:活干完之后审查、测试、阻断。这很有价值,但它主要回答「做完以后有没有错」。
Dual-Gate-MoA 还回答另一个问题:开工以前有没有走偏。
第一,入口门被放在前排。侦察员不只是查资料,它判断任务是否具备开工条件:哪些空白可以自己承担,哪些问题必须交还用户确认。2026-07 的一次实查里,出口质量门方向已有 71 个相关仓库,执行前的研究侦察门基本空白。
第二,它不是硬拦到底。原则不是每次都走最重流程,而是每次都经过机制判断——四周里约 2/3 的回合零开销豁免,克制不是口号。
第三,它审计的不只是交付物,也审计门本身。gate-events.jsonl 可以交叉对账,抓出「写了标记没真检」这种质量机制自身的漏洞。
第四,它的交付形态是一份自包含 PRD,加一组 hook、subagent、遥测和验证协议。机制文件变化后,活文档门会要求同步 PRD 与 Changelog;整份 PRD 交给任何 agent,即可复刻一套可运行实例。
顺带一提命名:GitHub 上 dual-gate 在 agent / LLM 语义空间零冲突——同名仓库清一色是半导体的双栅晶体管(dual-gate MOSFET)。而双栅晶体管的本义,恰好是「两道栅极控制同一条沟道」,与这套机制天然同构。
自由复刻、改编、分发;转载或改编文档时,请署名 Alf(公众号:数智化之心) 并附本仓库链接。
作者是 Alf(GitHub:Alfred1893),企业数智化从业者 / AI 产品经理。这套机制来自他日常 agent 工作流的质量工程实践。
设计笔记、架构复盘与后续迭代,会在公众号「数智化之心」持续更新。它关注企业数智化战略与架构,slogan 是:在变与不变之间,构建数智化转型之道。 写作者以企业智能架构师的视角,连接业务、技术与组织,帮助企业和个人构建可持续的数智化转型路径;把数智化当作一门落地生花的艺术,信奉系统思考、务实创新。
三个栏目:
- 建设之道:智能原生组织与应用架构;
- 能力进化:AI 产品经理与 B 端产品经理的成长,以及 AI Native 管理者一定要懂的软件工程知识;
- 一线观察:企业服务 GTM(go-to-market,市场进入)认知与数智化产品观察。
如果你是企业数智化战略或架构负责人、中高层管理者、创业者,或者对数智化转型感兴趣,这里谈的是转型的方法与认知、实践案例与落地方案——覆盖数字化营销、智能制造、数据分析等场景里的产品、管理与战略难题。也欢迎关注这一领域的猎头顾问与 HR 朋友交流。
