TL;DR и вердикт
Агент, написавший ваш план, не видит его дыр. EGM, Elephant-Goldfish Model, это бесплатный плагин Google для Claude Code, который это исправляет: слон пишет план вместе с вами, а золотые рыбки, ревьюеры без памяти о разговоре, читают только план и ваш код. Это не официально поддерживаемый продукт Google s25.
Мы запустили его на одной настоящей фиче приложения с семейным списком подарков (Next.js, Notion как база): дать родственнику зарезервировать подарок, чтобы двое не купили один и тот же, при этом родители не должны видеть, кто что зарезервировал. На копии репозитория, никогда на настоящем списке.
- Гонку планировщик назвал сам. Ревьюеры нашли две дыры, которых никто в разговоре не поднимал: родители могли вычислить, кто что зарезервировал, по логам собственного хостинга, а сохранённый cookie можно было воспроизвести и отменить чужой резерв.
- Решение ревью для гонки ослабляло цель. Мы оспорили его, и дизайн изменился.
- Новая сессия собрала фичу по утверждённому дизайну: 216 тестов, и в 30/30 гонок за последнюю единицу получился ровно один победитель. Это шло против заглушки вместо Notion, так что настоящую проверку нам ещё предстоит сделать.
- На правке README в одну строку обычный процесс стоил $0.0455 и 10 с. Путь EGM для фичи стоил $7.10 и 32 мин до любого кода.
Вердикт: запускайте ревью, когда ошибка касается чужих данных, приватности, прав или денег. Для небольшой, понятной правки пропускайте. В наборе ниже есть установка, одна строка для CLAUDE.md, шпаргалка и чек-лист.
Синтез с источниками
Что такое EGM. В README Google сказано, что тысячи инженеров Google используют его, чтобы составлять спецификации с агентами с глубоким контекстом и проверять их на прочность субагентами с нулевым контекстом до написания кода s1. Это собственное утверждение Google, без числа. Идея принадлежит Дейву Ренсину, который написал «We are mass-producing our mistakes» (мы массово производим свои ошибки), если мы не будем осторожны s7. Единственный релиз на сегодня это v0.1.0, опубликованный 2026-10-27 s26. Лицензия Apache-2.0, и это «not an officially supported Google product» (не официально поддерживаемый продукт Google) s25 s9.
Установка это две команды и новая сессия. claude plugin marketplace add google/elephant-goldfish-model, затем claude plugin install egm@egm, затем новая сессия s1 s2. Другие сообщают о тех же двух командах s6 s8. Мы добавили к установке --scope project, поэтому она действует только для этого репозитория. Нужен Claude Code 2.1.271 или новее ради поддержки omitClaudeMd s2. У нас была версия 2.1.294.
Почему ревьюеры слепые. Обычные субагенты исключают родительский разговор. omitClaudeMd исключает ещё и пользовательские, проектные и локальные файлы инструкций s2. Адаптеры ревьюеров объявляют tools: [Read, Grep, Glob], model: inherit и omitClaudeMd: true s20. Синтезатор устроен иначе: он порождает ревьюеров, допуская вложенность до 3 уровней s2. В документации есть оговорка: это «context and tool isolation, not filesystem isolation: reviewers can read accessible files» (изоляция контекста и инструментов, а не файловой системы: ревьюеры могут читать доступные файлы) s2.
Одна строка в CLAUDE.md держит отчёты в папке. Без неё файлы ревью накапливаются в корне репозитория, где их можно закоммитить по ошибке s23. Строка EGM artifact directory: <path> в CLAUDE.md или AGENTS.md отправляет их в эту папку s2.
Процесс.
- Брейнсторм запускает рой золотых рыбок с 6 линзами и пишет
concepts_brief.mds21. - Черновик пишет
design_draft.mds22. - Ревью проходит пять фаз: Initial Zoom Out Review, Comprehension Review, Design Critique, Intermediate Zoom Out Review и Implementation Readiness s3.
- Resolve помечает каждую проблему как CONTEST, ESCALATE, PROPOSE FIX или DECLINE. Выбираете вы, а «auto accept» применяет предложенные исправления пакетом, пропуская оспоренные пункты s24.
Что нашли другие. В полевом отчёте о Claude Code и EGM 0.1.0 насчитали 26 находок (9 blocker, 9 major, 8 nit), 20 исправлено, 4 пропущено, 2 ошибочные, около $3.40 расхода по ценам API и 24 из 24 тестов с первого раза. Его собственный вывод: «Goldfish read documents. They don't run code.» (Золотые рыбки читают документы. Они не запускают код.) s6. Ренсин говорит, что около 30% предложений очень ценны, и называет это более чем достаточным s7.
А что говорит пропустить его. README: для небольшого, понятного исправления бага используйте обычный рабочий процесс s25. FAQ: проектирование и ревью «may not pay off for a small, well-understood change» (могут не окупиться для небольшого, хорошо понятного изменения), а само завершение процесса «does not demonstrate a productivity improvement» (не демонстрирует роста продуктивности) s4. Один соавтор попробовал бы его на фоновых задачах, правах доступа, изменениях данных или новой границе сервисов s10. Небольшой пилот (три прогона на ветку) показал, что EGM «added nothing over the plain plan, at about five times the cost» (ничего не добавил к простому плану при стоимости примерно в пять раз выше) s5. Мы ссылаемся на него как на один небольшой пилот, а не на правило.
Почему гонка настоящая. В документации Notion нет атомарного инкремента или условной записи для свойства, а запись заменяет значение целиком s27. Двое родственников, прочитавших одно и то же число, могут оба записать, и один резерв потеряется.
Наш собственный прогон, дословно. Эти цифры наши, а не из источников выше. Модель сессии Claude Sonnet 5.5, ревьюеры наследуют её. Стоимость в эквиваленте API на Sonnet 5.5.
- Полное ревью запустило 9 субагентов-ревьюеров в 5 последовательных стадиях, сводный ход занял 7 мин 24 с. Сырых находок по пяти стадиям: 77. Сведено в 12 пунктов действий, из них 1 Blocker.
- Resolve дал 37 проблем: 4 ESCALATE, 5 CONTEST, 2 DECLINE, 26 PROPOSE FIX. Сначала он сверил ревьюеров с кодом и нашёл одну ошибочную находку: ревьюер сказал, что
input.tsxстал неиспользуемым, но страница входа его всё ещё импортирует. - Направление решения ревью для гонки было отказаться от цели. Мы оспорили его. Дизайн, давший одного победителя, родился из этого спора, и ни один ревьюер его не читал.
- Сборка по утверждённому дизайну в новой сессии: 216 тестов прошли, а тест гонки на последней единице дал один успех и один ответ «full» в 30 из 30 seed.
- Стоимость: $7.10 и 32 мин времени модели до любого кода (брейнсторм, черновик, ревью, resolve). Правка README на копии без EGM: $0.0455 и 10 с.
Код
Пять справочных файлов. Первые четыре вы копируете в свой репозиторий или держите открытыми. Пятый это настоящий отчёт из нашего прогона, чтобы вы видели, как выглядит результат.
1. Установка и удаление. Запустите из папки проекта, затем откройте новую сессию.
egm-install.sh
#!/usr/bin/env bash
# Install Google's EGM plugin for this project only.
# Needs Claude Code 2.1.271 or later (the reviewers rely on omitClaudeMd).
claude plugin marketplace add google/elephant-goldfish-model
claude plugin install egm@egm --scope project
# Start a new Claude Code session now, so the plugin loads.
# The commands then show up with the /egm: prefix.
# Uninstall (run from the same project folder):
# claude plugin uninstall egm@egm --scope project
# claude plugin marketplace remove egm
2. Строка для CLAUDE.md. Добавьте её в CLAUDE.md проекта, чтобы отчёты ложились в docs/egm.
CLAUDE.md
<!-- Keeps EGM reports in one folder instead of the repo root. Create docs/egm or let EGM create it. -->
EGM artifact directory: docs/egm
3. Шпаргалка по ревью. Команды по порядку, пять стадий и их файлы отчётов, что значат метки resolve и настройки ревьюеров.
egm-review-cheatsheet.md
# EGM review cheat sheet
## The commands, in order
1. `/egm:egm-brainstorm <the feature in one sentence>` writes `concepts_brief.md`.
2. `/egm:egm-draft` writes the design document, one section at a time. You approve each section.
3. `/egm:egm-review <design>` runs the five review stages (below). Pick the consolidated mode to get one merged list.
4. `/egm:egm-resolve` turns the reports into one table of issues. You answer each one.
5. Open a fresh session and send:
```
Build the feature exactly to the approved design in docs/egm/<file>.md; add tests.
```
## The five review stages and their report files
| Stage | What it asks | Report file |
|---|---|---|
| 1. Initial Zoom Out Review | Does the design solve the right problem? | `zoom_out_report.md` |
| 2. Comprehension Review | Would a newcomer understand it? | `comprehension_report.md` |
| 3. Design Critique | Attacks the design, its structure and its wording | `critic_report.md` |
| 4. Intermediate Zoom Out Review | Zooms out again on the unedited design | `intermediate_zoom_out_report.md` |
| 5. Implementation Readiness | Checks each step against your real code | `implementation_readiness_report.md` |
The consolidated mode also writes `consolidated_review_report.md`. Resolve writes `goldfish_review_report.md`.
## What resolve's suggestions mean
- ESCALATE: the reviewers found a decision only you can make.
- CONTEST: the agent thinks the finding is wrong or the fix is too weak, and says why. You can still overrule it.
- DECLINE: the agent proposes not acting on the finding.
- PROPOSE FIX: the agent proposes an edit to the design.
- "auto accept": reply with these two words to batch-apply every PROPOSE FIX and skip CONTEST items. Decide the escalated issues first.
## Reviewer settings (Claude adapters)
```
tools: [Read, Grep, Glob]
model: inherit
omitClaudeMd: true
```
Read-only tools, the same model as your session, and no CLAUDE.md or other instruction files. This is context and tool isolation, not filesystem isolation: reviewers can read accessible files.
## Before you build
Reviewers read documents. They do not run code. If your design relies on an outside service behaving a certain way, run a check against a copy of the real thing before you ship.
egm-review-cheatsheet.md on GitHub
4. Чек-лист «пропустить или ревьюить». Прочитайте его, прежде чем вводить промпт на сборку.
skip-or-review.md
# Skip or review
Ask one question before you type the build prompt: if this is wrong, whose data, privacy, permissions or money does it touch?
## Run the EGM review when the change involves
- [ ] Data that several people write at the same time
- [ ] Privacy: something someone must not be able to see or work out
- [ ] Permissions: who can do, change or cancel what
- [ ] Money: a charge, a price, a balance, a refund
- [ ] A time rule, a background job or a new service boundary
## Use your normal workflow when
- [ ] The fix is small and clear and you can say it in one sentence
- [ ] You could one-shot it
- [ ] A wrong result is visible at once and costs nothing to undo
## What the README says
> Use it when a feature needs design decisions before implementation. For a small, clear bug fix, use your normal coding workflow.
## What the FAQ adds
> Design and review take time and may not pay off for a small, well-understood change.
> Completing the EGM workflow alone does not demonstrate a productivity improvement.
5. Настоящий сводный отчёт. Это отчёт из нашего прогона на приложении с семейным списком подарков. Обратите внимание, как каждый пункт действий ссылается на находки стадий, стоящие за ним.
example-consolidated-report.md
<!-- The consolidated review report from our run on a family gift-list app. -->
# Consolidated Review Report
**Target:** `docs/egm/gift-reservations.md` (464 lines; FeatureRange 1-280, DetailedRange 281-464)
**Mode:** Consolidated report, all five stages, no checkpoints. No edits were applied to the document.
**Stage reports:** `zoom_out_report.md` (5), `comprehension_report.md` (6), `critic_report.md` (7), `intermediate_zoom_out_report.md` (8), `implementation_readiness_report.md` (9).
**Overall:** The design fits the problem and keeps Notion as the only store. It is not ready to implement. Five issues need decisions from the author, and the plan has errors a reader can check against the code: a build that breaks mid-sequence, a wrong HTTP status, and a wrong assumption about SDK retries.
## Blockers
Stage 8 raised one item to Blocker (A1). Stages 5, 6, 7 and 9 report none.
## Action items by priority
### 🔴 Blocker
**A1. Decide whether to drop the post-write re-read.** (Stage 5 ZO-2, Stage 6 CO-3/CO-6, Stage 7 CR-1/CR-2/CR-3/CR-8, Stage 8 Z8-1, Stage 9 IR-6)
Lines 28, 132-134, 159, 174, 220, 276, 360, 366, 415.
The re-read does not catch the main race (the document says so at line 174), assumes read-after-write consistency with no evidence, checks only `x`, adds a third Notion call, and leaves the cookie and response behaviour undefined when it fails. Goal 2 and the rejection of Alternative F rest on it. Stage 8 recommends removing it, along with `changed_meanwhile` and the "unverified" branch, rewriting Goal 2 as "reduces duplicate purchases, does not prevent them" and rewriting Alternative F around the real trade-off. If kept, every post-write failure needs a stated cookie and response behaviour. Decide this first: it closes or removes about eight other findings.
### 🟡 Major: design and scope
**A2. Fix the cookie's stated guarantees and the stale-record dead end.** (CR-4, CR-5, Z8-2, Z8-3, ZO-5)
Lines 32, 34, 85, 111, 114, 144-148, 246-250, 355.
A saved copy of the cookie can be replayed to cancel someone else's unit, and clearing the cookie bypasses the one-unit and 80-id limits. After the parents release a unit by hand, the stale cookie makes reserve fail with 409 `already_reserved`. State the real threat model (stops accidental cancels and casual tampering among about 30 relatives), and decide whether to keep the `already_reserved` guard and the 80-id cap.
**A3. Qualify "no identity is stored or logged", and decide on the bespoke log line.** (CR-6, Z8-4, CO-7)
Lines 29, 37, 270-271, 367.
Vercel request logs and Notion edit history, together with timestamped log lines, can let the parents correlate who reserved what. The log line is also specified three different ways.
**A4. Settle where configuration is checked, and the effect on the list route.** (ZO-4, Z8-5, CR-17, CO-12, IR-13)
Lines 36, 115, 117, 168, 394-395, 403.
The proxy 503 for `/api/registry*` changes the existing list GET route, which the plan doesn't list. Configuration is checked in the proxy, the routes and `canReserve`. The 401 versus 503 precedence is unspecified.
**A5. Reuse the existing HMAC helper.** (ZO-1, IR-8)
Lines 111, 324. `src/lib/auth.ts` already has `hmacBase64Url`. The plan writes a second implementation and leaves the crypto details (key import, base64url without `Buffer`, signed text) unspecified.
### 🟡 Major: factual errors and unstated assumptions
**A6. "Each step leaves the project building" is false.** (CO-2, IR-1, Z8-6)
Line 283. The build is red from item 8 through item 16. Group the changes into one landing phase or keep the old exports until the consumers go.
**A7. The deleted `PATCH` route returns 404, not 405.** (CO-5, CR-7, IR-2)
Lines 116, 181, 388, 458. Correct the claim and manual test 7. A 410 stub is an option, but Stage 8 advises against adding code for it.
**A8. Handler signatures ignore Next 16 async APIs.** (IR-3)
Lines 115, 378, 382, 402. `params` is a `Promise`, and `cookies()` is async.
**A9. The Notion SDK already retries 429s, and error classification is unspecified.** (IR-4, IR-5)
Lines 276, 339-345. "No automatic retry" is false unless `getClient` sets `retry: false`. Name how `rate_limited`, `not_found` and `retry-after` are detected, state the `pages.update` payloads, and reconcile the two signatures of `writeReservationState`. A missing `Acheté ?` returns 502 before the 422 check.
**A10. Undefined terms and sources.** (CO-1, CR-12, CO-4, CO-10, CO-14)
`concepts_brief.md`, "the owner", "reconciliation", "Public only" filter, `x` and `y`, and the data-source id are used without definition or link. Five places justify choices by process history a new reader cannot verify.
**A11. Required sections and rationale.** (CR-9, CR-10, CR-11)
There is no Risks & Mitigations section (the content is scattered). Alternatives A, J and M are rejected only on "the parents decided"; C and F lack the decisive trade-off. The Open Question at line 57 points to intro wording that is not in the plan.
**A12. Unresolved decisions in the plan.** (IR-6, IR-7, IR-9, IR-10, IR-11, IR-12)
Cancel error mapping, the cookie-change rule, response bodies, final French copy, the client rewrite details and automated test coverage for the Notion layer, routes, proxy and table.
### 🟢 Nit
* **Simplicity.** Single `[action]` route instead of two files; delete the unused `checkbox.tsx` and `input.tsx`; remove the "Optional extras" question; revert to strict `x/y` parsing or fix the Goal wording; fold Alternatives G, H and I into Goals and Non-Goals. (ZO-6, ZO-8, Z8-7, Z8-8, Z8-9, CR-19)
* **Structure.** Reorder Open Questions; split CUJ 4; add one error-path CUJ; fix the ambiguous state table and the packed response table; fix the "two new calls" list. (CR-13 to CR-16)
* **Wording and terminology.** Unify `acheté`/`achete`/`Acheté ?` and `x/y` versus `acquise/totale`; remove filler and duplicated statements; fix French copy and apostrophes; pin `vitest`; split the dense reserve step 7 and `act` handler sentences. (CR-18, CR-20 to CR-24, IR-14 to IR-20)
## Traceability matrix
| Action item | Stage 5 | Stage 6 | Stage 7 | Stage 8 | Stage 9 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| A1 re-read | ZO-2 | CO-3, CO-6 | CR-1, CR-2, CR-3, CR-8 | Z8-1 | IR-6 |
| A2 cookie guarantees, stale record | ZO-5 | | CR-4, CR-5 | Z8-2, Z8-3 | |
| A3 identity and logging | | CO-7 | CR-6 | Z8-4 | IR-17 |
| A4 config checks, list route | ZO-4 | CO-12 | CR-17 | Z8-5 | IR-13 |
| A5 HMAC reuse | ZO-1 | | | | IR-8 |
| A6 build order claim | | CO-2 | | Z8-6 | IR-1 |
| A7 405 vs 404 | | CO-5 | CR-7 | Z8-7 | IR-2 |
| A8 async handler APIs | | | | | IR-3 |
| A9 SDK retry, error mapping | | | | | IR-4, IR-5 |
| A10 undefined terms | | CO-1, CO-4, CO-10, CO-14 | CR-12 | | |
| A11 risks section, rationale | | | CR-9, CR-10, CR-11 | | |
| A12 unresolved plan decisions | ZO-3 | CO-13 | | | IR-6 to IR-12 |
| Nits | ZO-6 to ZO-8 | CO-8, CO-9, CO-11, CO-15, CO-16 | CR-13 to CR-24 | Z8-7 to Z8-9 | IR-14 to IR-20 |
## Coverage and limits
- Stage 7 critics reviewed lines 1-280 only. Stage 9 reviewers audited lines 281-464 against the real code under `src/`.
- No stage reviewed any file outside the target document and the existing source files named above.
- Stage 8 ran on the unedited document, so its recommendations (drop the re-read, drop `already_reserved`, remove the proxy 503) are proposals for the author to decide, not settled findings.
- Reviewers cannot run the app. The claims about Next.js (404 versus 405) and the Notion SDK (retry defaults) come from the reviewers reading the code and type definitions in the repo and should be confirmed during the fix.
example-consolidated-report.md on GitHub
Сделайте это в понедельник
- Проверьте
claude --version. Нужна версия 2.1.271 или новее. - Запустите две команды установки из
egm-install.shв проекте, затем откройте новую сессию. - Добавьте
EGM artifact directory: docs/egmв CLAUDE.md этого проекта. - Выберите одну ещё не построенную фичу, где ошибка касается общих данных, приватности, прав или денег. Запустите на ней
/egm:egm-brainstormодним предложением. - Запустите
/egm:egm-draft, утвердите дизайн раздел за разделом, затем/egm:egm-review <design>и прочитайте пять отчётов. - Запустите
/egm:egm-resolve. Ответьте на эскалированные проблемы сами и оспорьте любое исправление, ослабляющее вашу цель. - Откройте новую сессию и отправьте: «Build the feature exactly to the approved design in docs/egm/
.md; add tests.» Затем проверьте рискованный путь сами. - Для следующего небольшого, понятного исправления откройте
skip-or-review.mdи идите прямо в обычный рабочий процесс.
Что дальше
Другие команды, которые мы не трогали. У плагина есть ещё /egm:egm-bootstrap и /egm:egm-drift-report: второй процесс для существующей кодовой базы и еженедельная проверка дрейфа. Мы их не запускали, поэтому ничего не говорим о том, насколько они хороши.
Другие среды и смешанные модели. Мы запускали только Claude Code. Ревьюеры используют model: inherit, поэтому работали на модели нашей сессии и могут разделять её слепые пятна. Другие среды и смешивание моделей мы не пробовали.
Plan Mode и другие планировщики. Мы не сравнивали EGM с Plan Mode или другими инструментами планирования. Пилот выше это единственное прямое сравнение, на которое мы ссылаемся, и оно небольшое.
Честные ограничения нашего прогона.
- Исправление гонки через claim ledger родилось в resolve после того, как мы оспорили ревью, и ни одна золотая рыбка его повторно не проверяла.
- Исправление опирается на то, что Notion сохраняет один порядок для одновременных добавлений. Документация Notion этого не обещает.
- Результат 30 из 30 получен на заглушке вместо Notion. Собственная проверка гонки из дизайна на копии настоящей базы не запускалась. Запустите её перед выкаткой.
- Ревью проверяет документы и код и не может запустить приложение. Два утверждения о фреймворке в нашем отчёте (404 против 405, значения повторов по умолчанию в SDK) взяты из чтения кода, и отчёт просит их подтвердить.
- 30% Ренсина и цифры полевого отчёта это цифры их авторов, а не наши.
FAQ
Видят ли ревьюеры мой CLAUDE.md или наш чат?
Нет. Они исключают разговор, а omitClaudeMd: true прячет CLAUDE.md и другие файлы инструкций. План и любые доступные файлы они всё равно читают s2.
Почему файлы ревью лежат в корне репозитория?
В Claude Code по умолчанию нет каталога для артефактов s23. Добавьте в CLAUDE.md строку EGM artifact directory:.
Нужно ли отвечать на каждую проблему в resolve? Нет. Ответьте на эскалированные, затем напишите «auto accept», чтобы применить предложенные исправления пакетом. Оспоренные пункты пропускаются s24.
Достаточно ли зелёного набора тестов как доказательства? Нет. У нас прошло 216 тестов, а проверка гонки на настоящем Notion всё равно осталась несделанной. Проверяйте рискованный путь сами.
Когда стоит пропустить ревью? Для небольшого, понятного исправления, как говорит README s25. В нашем прогоне это исправление без него стоило $0.0455 и 10 с.
AIDive