文档大纲

google/elephant-goldfish-model:Google 开源的设计先行技能包

如果你用 AI 写代码时反复遇到同一类问题——它写得很顺,却总在"我以为你之前说过"的地方出错——那多半不是模型不够聪明,而是它太清楚你们此前聊过什么。Google 开源的一套技能包 google/elephant-goldfish-model 专门处理这件事:写代码之前先把规格写清楚,并且让一个拿不到此前对话的审阅者去找毛病。

值得一看的理由很具体:Google 内部工程师在用,而且它把"做不到就停下来"写成了硬规则——这是大多数 AI 协作工具不会做的一步。

一、它是什么:把"写规格"和"审规格"拆给两个角色

这个项目是一套给编码智能体用的技能包(skill pack),装进你已有的编码助手里。它的核心命题只有一个:写代码之前先把设计想清楚,但起草的和挑毛病的必须是两个不同的上下文。

仓库自己的描述是"用于和 AI 智能体一起做设计与评审的开源技能"。这里的几个词对新手容易绕,逐个解释:

  • 智能体(agent):能自己读文件、跑命令、给结论的 AI 助手,而不只是聊天窗口里回话的机器人。
  • 编码助手 / harness:AI 编码工具的"外壳",比如 Claude Code、Codex、Antigravity。技能包装在外壳里,外壳负责跑命令、调模型、起子会话。
  • 子智能体(subagent):由主会话临时开出来的、上下文干净的独立会话。EGM 的全部效果都建立在这件事上。
  • 规格(spec):一份写下来的设计说明,含要做什么、不做什么、边界在哪。

EGM 的角色表非常干净,三方各司其职:

角色能看到什么负责什么
大象(Elephant)你的项目、需求和此前的全部决策探索问题、起草规格
金鱼(Goldfish)只有那份文档及其引用的源码,拿不到此前的对话找出未言明的假设、含糊的需求和实现风险
你(Human)目标和约束裁决取舍、批准设计、决定做什么

1.1 关键不在"提示它去质疑",而在"金鱼被刻意剥夺上下文"

这是整个项目最容易被读漏的设计。多数"让 AI 自我审查"的做法,是在一段对话里追加一句"请严格审查你的方案"。但这样得到的审阅者继承了前文的全部假设,它会顺着写稿人的思路往下走——这也是大模型在长对话里最常见的失败模式。

EGM 的做法相反:审阅者根本看不到此前的对话。README 里描述金鱼的角色是"作为一个刚加入项目的、朴素的新成员或全新读者"。也就是说,独立性不靠语气指令制造,而靠信息不对称制造。

1.2 灵感来自一篇文章,仓库把它列进了参考文献

这套思路的出处是 Dave Rensin 的《Elephants, Goldfish, and the New Golden Age of Software Engineering》。项目 README 明确列出了这篇文章作为设计依据——读原文能帮理解为什么作者坚持用"上下文隔离"而不是"更强的提示词"。

1.3 适用边界写得很克制:小改动别用它

README 里有一句很诚实的话:功能需要先做设计决策时才用它;一个小而明确的 bug 修复,走你平常的编码流程就好。这条边界比多数工具的"全流程智能化"宣传更值得信。

二、安装:六种编码环境,同一套技能

EGM 以插件(plugin)形式分发,安装命令很短。

2.1 Claude Code

claude plugin marketplace add google/elephant-goldfish-model
claude plugin install egm@egm

2.2 Codex

codex plugin marketplace add google/elephant-goldfish-model
codex plugin add egm@egm

2.3 Antigravity CLI 与 IDE 扩展

agy plugin install https://github.com/google/elephant-goldfish-model

Antigravity App 和 Antigravity 的 VS Code 扩展需要额外执行一次 /plugin,或按仓库里的 harness 文档操作。

2.4 Claude Cowork 与 ChatGPT Work

这两种环境走单独的 setup guide,README 里给了链接。

2.5 装完之后:命令名有个坑

命令默认不带前缀,在 Antigravity(agy CLI)和 Claude Code 里要加 /egm: 前缀,例如 /egm:egm-brainstorm。仓库里记了一个细节:agy CLI 1.4.10 会把不带前缀的名字补全成带前缀的命令,而 1.4.8 不会(分别对应 issue #220 和 #196),所以保持写前缀更稳。

在 Codex 里不用记命令名,直接在 skill 选择器里挑对应的 EGM 技能。

2.6 一个硬前提:你的助手必须能开新会话

README 写得很清楚:头脑风暴和评审需要能够创建全新子智能体的会话。也就是说,如果没有子会话能力,EGM 的核心流程根本跑不起来——这也是第五章那条"停下来"规则的由来。

三、大象负责起草:把一个想法变成可评审的规格

装好后打开项目,选一个"需要先做设计决策"的功能,跑第一条命令。

/egm-brainstorm Add webhook delivery to this project.

3.1 命令背后做的事

大象这一侧会拿到项目上下文、需求和历史决策,负责探索问题、起草规格。它不是直接写代码,而是先产出可以被人审阅的设计说明。

3.2 一个反直觉的节奏:每写完一节就停下来

README 里的写稿流程不是一口气生成整篇,而是每写完一节就停下等反馈。产出链条是概念简报(concepts_brief.md)到设计草稿(design_draft.md),再进入评审,最后人工批准后归档到 docs/designs/ 目录。

这个节奏比"一键生成"慢,但换来的是规格真的被看过——而不是被生成完就扔进仓库。

3.3 举个具体例子:加一个 webhook 投递功能

README 给的示例问题是"一次投递失败了怎么办""同一个事件被投递两次怎么办"。这类问题没有唯一正确答案,必须先定语义:要不要幂等、要不要重试、重试窗口多长、失败事件存哪里。用一句话让 AI 直接写代码,多半会在这几处埋雷;先写成规格,边界就清楚了。

四、金鱼负责挑刺:用信息不对称换审查的独立性

审阅阶段由金鱼接手。它拿到的只有那份规格文档和文档里引用的源码,看不到你们此前讨论过什么、也没被告知"作者为什么这么设计"。

4.1 审阅者看到的东西越少,独立性越强

这是理解 EGM 的关键。它不是给审阅者加强语气,而是把审阅者放进一个"信息更少"的位置——一个刚进项目的新人只能看到文档本身,于是文档里没写清楚的地方就自然暴露出来。

4.2 它找的是四类东西

未言明的假设、含糊的需求、实现上的风险,以及看起来合理但经不起追问的结论。对照自己团队的文档,这几类恰好是最常见的事故来源。

4.3 人始终在中间,不是被替代

审阅结束后,还是由你做架构取舍、批准规格,再决定要不要动手实现。EGM 没有试图让智能体替你拍板,它把"拍板"这一步单独留给了人。

五、最硬的一条:做不到就停,不许降级

这条规则值得单独讲,因为它是整个仓库里最反常规的设计。

EGM 的评审技能里写着这样一句原话:

If your harness has no subagent tool, stop and tell the user: a review in the same context is not a Goldfish review.

意思是:如果你的工具没法创建子智能体,就停下来告诉用户——在同一个上下文里做的审阅,不算金鱼审阅。

5.1 为什么这条比听起来更重要

AI 工具链里最危险的不是报错,而是"假装做完了"。一个降级运行、悄悄用弱模型顶替、或者在同一个上下文里自我表扬的流程,看上去一切正常,实际上什么都没验证过。EGM 的做法相当于在技能层直接写死一句"我做不到,所以我不做"。

5.2 降级路径只有一条,而且仍然要求新上下文

技能里也给了替代方案:如果工具不能嵌套子智能体,就改成直接派发子任务,而不是用同一个会话里的合成器代替。但前提不变——仍然要另起一个干净上下文。只有在彻底没有子智能体能力时,才拒绝执行并告知用户。

5.3 对使用者的实际意义

装了 EGM 之后,如果哪天它告诉你"你的环境不支持金鱼审阅",那不是 bug,是它在守住自己的质量承诺。真遇到这种情况,正确反应是换环境,而不是想办法绕过它。

六、五阶段评审流水线,以及最容易被跳过的那一阶段

评审不是一次性的问答,而是一条五段流水线:

  1. 初次全局审视(Initial Zoom Out Review)
  2. 理解度审查(Comprehension Review)
  3. 设计批判(Design Critique)
  4. 中期全局审视(Intermediate Zoom Out Review)
  5. 实现就绪度(Implementation Readiness)

6.1 五个阶段各自对应一个独立角色

仓库的 agents 目录下有 9 个角色:bootstrap_orchestrator、codebase_details、comprehension、design_critic、implementation_readiness、structural、style、synthesizer、zoom_out。每个阶段由其中一个角色主导,所以"谁来挑什么毛病"是写死在结构里的,不是靠一句提示词。

6.2 理解度审查:判据只有一句话

理解度审查的判据是——一个刚进组的新人能不能读懂这份文档。这不是文风检查,是可读性验收:新人读不懂,说明文档缺了关键上下文。

6.3 把它翻译成日常语言

大多数团队的评审在查"对不对""有没有漏",很少有一环专门查"这份文档说清楚了没有"。给一个功能写需求文档时最典型的症状是:所有在场的人都懂,但新人拿着它寸步难行。理解度审查专门治这一类。

6.4 两次全局审视分别管开头和中间

初次全局审视在写完规格后立刻做,负责看整体方向;中期全局审视插在设计批判之后,负责看改过一轮之后的文档是不是又长偏了。中间插一次审视是有必要的,因为设计批判往往会要求大量改写,改写本身容易引入新的不一致。

七、反谄媚:把"别讨好我"写成了可检查的规则

大模型有一个广为人知的倾向:倾向于同意用户、倾向于用赞美性措辞。EGM 的评审执行约束里有十条硬规则,其中多条专门针对这一点。

7.1 先找最薄弱的地方

Default to Stress-Testing 是第一条:永远不要默认同意,首要指令是先找最薄弱点、边界情况和盲区。

7.2 不许把话说得好听

No Glazing(消除谄媚)和 Banned Adjectives(禁用验证性形容词)直接列了禁用词:brilliant、great、smart、correct、perfect、excellent、spot-on。

7.3 即使想法很强,也要先讲问题

Critique First:先讲哪里有问题、缺什么、有风险,然后再谈优点。

7.4 不许把用户的话原样复述回来再认可

Reject Echo-Chamber Framing:禁止把用户的措辞原样复述回来再认可。

7.5 每个方案都必须配反方论据

Generate Counter-Arguments:对每个方案主动列出"用户可能没看到什么"和"最强的反方论据是什么"。

7.6 同意要靠挣来

Earn Your Agreement:只有在扛住严格审视之后才同意。

7.7 禁用无依据的褒义词

Plain-English Standard:禁用 seamless、robust、blazingly fast 这类没有依据的褒义副词和装饰性形容词。

7.8 为什么"可检查"比"请客观一点"值钱

这些规则的价值在于它们是字符串匹配就能校验的硬约束,而不是一句无法验证的软要求。把它们移植到自己的评审清单里,评审质量就不再取决于评审者的临场状态。

八、Artifact-First:大方案不进聊天窗口

EGM 的第一条执行约束是强制级别的:

You are STRICTLY FORBIDDEN from presenting large proposals, drafts, summaries, or plans directly in the chat pane. You MUST write them to the working directory … and then tell the user in chat the file path and ask for review.

8.1 一句话解释

大段草稿、方案、总结、计划,不许直接摊在聊天窗口里,必须写到工作目录,然后在聊天里只给文件路径并请求审阅。

8.2 理由很实际

大段内容塞进对话窗口会污染后面每一轮对话的上下文。聊天越往后越挤,模型能"看见"的有效信息越少,决策质量也随之下降。把产物落到文件里,聊天只承担"索引 + 决策"两件事。

8.3 落地形态

产出链条是:概念简报 → 设计草稿 → 评审报告 → 人工批准 → docs/designs/ 归档。每一步都有对应的文件,而不是一串聊天消息。

8.4 写完一节停一次

写稿阶段每写完一节就停下来等反馈,不是"一口气生成整篇再让你看"。这条节奏让规格在成型过程中就被校正,而不是等成型后返工。

九、活文档与漂移报告:让文档追得上代码

规格写完之后,代码会继续变,文档不会自己跟上。EGM 有两个专门对抗这件事的技能。

9.1 egm-bootstrap:为存量代码库生成或更新文档

这是让一个已有仓库能被 EGM 接管的必要前提——先有能读懂现状的文档,后面的评审才有依据。

9.2 egm-drift-report:拿已入库文档和当前源码做对比

它把"文档里写的"和"代码里现在的"逐条比对,把漂移报告出来。这比"定期让人回头看看文档还准不准"可靠得多。

9.3 架构文档里的五阶段生命周期

仓库的 docs/designs/architecture.md 把全流程定义为五段:上游构思与多视角击落(大象)→ 规格撰写 → 隔离验证(金鱼)→ 人工评审 → 实现与漂移监控。最后一段就是闭环的关键。

9.4 漂移监控为什么是闭环的关键

规格定下来之后,代码会演进,规格不会自己跟着演进。没有漂移监控,设计文档会慢慢变成"考古材料",而基于它做的决策会悄悄失去依据。

十、技能也带测试用例

EGM 的每个技能目录里,除了 SKILL.md,还带 TEST.md 和 test_scenarios.yaml。全仓有 16 个技能文档、29 个文件包含 review 相关内容。

10.1 为什么这件事值得单独说

技能是提示词,提示词同样会回归。改了一句 SKILL.md,行为到底变没变?如果没有可复现的场景文件,只能靠人肉对比前后输出——这正是很多团队技能库长期悄悄退化的原因。

10.2 可以直接借用的做法

给高频使用的技能先补三个场景夹具(输入 + 期望行为),改完技能跑一遍就知道行为有没有漂。成本不高,对提示词工程来说,这是从"写作"变成"工程"的分界线。

十一、多环境单源打包:内容不分叉,适配层分叉

同一套技能被打包成四份分发物:Claude 插件目录、Codex 插件目录、通用 agents 插件市场清单、以及 distributions 下的 claude 目录。

11.1 技能源码只有一份

真正的技能源码放在 skills/ 一份,各环境的适配层单独维护。README 给出六种环境的安装方式:Antigravity CLI、Antigravity 的两个 IDE 形态、Claude Code、Codex、Claude Cowork、ChatGPT Work。

11.2 这个结构省掉的问题

多环境分发的常见坑是内容分叉:改了一处,另一处忘了改,最后两边行为不一致且没人发现。单一源码 + 适配层分叉,把这类事故从结构上消掉。

11.3 对多工具并用的人的意义

如果你同时用 Claude Code 和 Codex,这套东西值得注意的地方是:两个工具里的 EGM 是同一份内容,不会出现"一边升级了一边没升级"的情况。

十二、跟别的方式比一比

12.1 对比一:让同一个会话里的 AI 自己审查

这是最省事的做法,也是最容易失效的。同一个上下文里的自我审查天然继承前文的假设,很难发现自己的盲区。EGM 付出的成本是开一个新会话,换来的是信息不对称。

12.2 对比二:请同事评审

同事评审的价值和 EGM 一样在于"没有作者包袱",而且判断力更强。差别在覆盖面:同事要开会、要时间、有时碍于情面;金鱼审阅可以随时跑、不受人情影响、可复现。两者其实是互补关系——先让金鱼过一遍,再带去问人,效率通常更高。

12.3 对比三:自己搭多智能体编排

市面上也有把多个智能体编成团队的框架(Orkas 就是本地多智能体桌面这一路),EGM 则是"单条流水线上的固定角色"。前者适合把很多重复任务拆开并行推进,后者适合把一次关键决策做扎实。两者不冲突,先用后者把关键设计定下来,再用前者铺量执行,是比较顺的组合。

12.4 对比四:什么都不加

如果你的项目很小、需求很清楚、改动一两个文件就能对,那 EGM 是过度设计。README 自己划了这条线:明确的小 bug 修复不需要它。

12.5 成本对照

EGM 本身是 Apache-2.0 开源技能包,装在已有的编码助手里,模型还是你已经在付的那些。真正的成本是多跑几次模型会话,换来的是返工次数下降。

谁适合,谁不适合

适合:

  • 需要先做设计决策的功能:新增支付流程、引入缓存、改动数据模型、加 webhook 投递。
  • 团队里新人经常拿着文档寸步难行、文档长期没人维护的项目。
  • 已经用 Claude Code 或 Codex,并且愿意花一次模型会话换来一份能评审的规格。

不适合:

  • 改一行配置、修一个报错明确的 bug。
  • 无法创建子会话的环境(那部分能力直接用不了)。
  • 需求本身还没想清楚的时候。

装起来之前要知道的几件事

  1. 你的编码助手必须支持创建子会话,否则金鱼审阅和头脑风暴都跑不起来,工具会明确报错并停下,这是设计如此。
  2. 安装后记得用带前缀的命令形式,在不同版本的命令行助手里前缀补全行为不一致,自己写全更稳。
  3. 装完先在新会话里用——README 明确要求安装后新开一个会话。
  4. 它不是 Google 官方支持的产品。仓库 README 里写明了这一点:这是 Google 内部工程师在用、对外以开源社区形式发布的东西。把它当成熟度高的社区项目来用,不要当官方产品依赖。
  5. 用它写规格,不要用它跳过设计。真正的收益在写规格那一步,不在后面的评审。

最后

EGM 真正值得带走的,不是那五个评审阶段,而是两个反直觉的做法:

独立审查靠隔离,不靠措辞——不给审阅者加强语气,而是把审阅者放进一个信息更少的位置,让独立性成为结构的结果。

做不到就大声失败——没有子会话能力就停下告诉你,而不是拿同上下文自审冒充一次合格的评审。对一个装在你工作流里的 AI 工具来说,这句话比任何"全能助手"的宣传都更能说明它靠不靠谱。

如果你手上正好有一个"大家都以为说清楚了、但没人能确认"的需求,或者一份总是补不完的文档,值得拿它试一次。

仓库地址:https://github.com/google/elephant-goldfish-model 官网:https://egm.dev

阅读量: 302