AIDive

Pack vidéo

Relire le plan de Claude Code d'abord : le kit EGM et la checklist sauter ou relire

7 min de lecture

TL;DR et verdict

L'agent qui a écrit ton plan ne voit pas ses trous. EGM, l'Elephant-Goldfish Model, est le plugin gratuit de Google pour Claude Code qui règle ça : l'éléphant écrit le plan avec toi, et des relecteurs poissons rouges, sans aucun souvenir de la conversation, ne lisent que le plan et ton code. Ce n'est pas un produit officiellement supporté par Google s25.

Nous l'avons lancé sur une vraie fonctionnalité d'une appli de liste de cadeaux familiale (Next.js, Notion comme base) : permettre à un proche de réserver un cadeau pour que deux personnes n'achètent jamais le même, sans que les parents puissent voir qui a réservé quoi. Sur une copie du dépôt, jamais sur la vraie liste.

  • Le planificateur a nommé la course lui-même. Les relecteurs ont trouvé deux trous que personne dans la conversation n'avait soulevés : les parents pouvaient deviner qui a réservé quoi grâce aux logs de leur hébergement, et un cookie enregistré pouvait être rejoué pour annuler la réservation de quelqu'un d'autre.
  • Le correctif proposé par la relecture pour la course affaiblissait l'objectif. Nous l'avons contesté, et le design a changé.
  • Une session neuve a construit la fonctionnalité selon le design approuvé : 216 tests, et 30/30 courses sur le dernier exemplaire ont donné exactement un gagnant. Cela a tourné contre un faux Notion, donc la vraie vérification reste à notre charge.
  • Sur un correctif d'une ligne dans le README, le workflow simple a coûté $0.0455 et 10 s. Le chemin EGM pour la fonctionnalité a coûté $7.10 et 32 min avant tout code.

Verdict : lance la relecture quand une erreur touche les données de quelqu'un d'autre, la vie privée, les permissions ou l'argent. Saute-la pour un petit correctif clair. Le pack ci-dessous te donne l'installation, la ligne de CLAUDE.md, un aide-mémoire et la checklist.

Synthèse sourcée

Ce qu'est EGM. Le README de Google dit que des milliers d'ingénieurs de Google l'utilisent pour rédiger des specs avec des agents à contexte profond et les mettre à l'épreuve avec des sous-agents sans aucun contexte avant d'écrire du code s1. C'est l'affirmation de Google elle-même, sans chiffre. L'idée vient de Dave Rensin, qui a écrit "We are mass-producing our mistakes" (nous produisons nos erreurs en série) si nous ne faisons pas attention s7. La seule version publiée à ce jour est la v0.1.0, sortie le 2026-10-27 s26. Elle est sous licence Apache-2.0 et "not an officially supported Google product" (pas un produit officiellement supporté par Google) s25 s9.

L'installation, c'est deux commandes et une nouvelle session. claude plugin marketplace add google/elephant-goldfish-model, puis claude plugin install egm@egm, puis une nouvelle session s1 s2. D'autres rapportent les mêmes deux commandes s6 s8. Nous avons ajouté --scope project à l'installation, donc elle ne s'applique qu'à ce dépôt. Il faut Claude Code 2.1.271 ou plus pour la prise en charge de omitClaudeMd s2. Notre version était la 2.1.294.

Pourquoi les relecteurs sont aveugles. Les sous-agents normaux excluent la conversation parente. omitClaudeMd exclut aussi les fichiers d'instructions utilisateur, projet et locaux s2. Les adaptateurs de relecteurs déclarent tools: [Read, Grep, Glob], model: inherit et omitClaudeMd: true s20. Le synthétiseur est différent : il lance des relecteurs, avec un imbriquage permis jusqu'à 3 niveaux s2. La doc ajoute une réserve : c'est de l'isolation de contexte et d'outils, "not filesystem isolation: reviewers can read accessible files" (pas de l'isolation du système de fichiers : les relecteurs peuvent lire les fichiers accessibles) s2.

Une ligne de CLAUDE.md range les rapports dans un dossier. Sans elle, les fichiers de relecture s'accumulent à la racine du dépôt, où tu peux les committer par erreur s23. Une ligne EGM artifact directory: <path> dans CLAUDE.md ou AGENTS.md les envoie dans ce dossier s2.

Le workflow.

  • Le brainstorm lance un essaim de poissons rouges à 6 angles et écrit concepts_brief.md s21.
  • Le draft écrit design_draft.md s22.
  • La relecture passe par cinq phases : Initial Zoom Out Review, Comprehension Review, Design Critique, Intermediate Zoom Out Review et Implementation Readiness s3.
  • Resolve étiquette chaque problème CONTEST, ESCALATE, PROPOSE FIX ou DECLINE. Tu choisis, et "auto accept" applique d'un coup les correctifs proposés, en sautant les points contestés s24.

Ce qu'ont trouvé d'autres personnes. Un retour de terrain sur Claude Code et EGM 0.1.0 a compté 26 constats (9 bloquants, 9 majeurs, 8 détails), 20 corrigés, 4 ignorés, 2 faux, environ $3.40 d'usage aux prix de l'API et 24 tests sur 24 passés du premier coup. Sa propre leçon : "Goldfish read documents. They don't run code." (Les poissons rouges lisent des documents. Ils n'exécutent pas de code.) s6. Rensin dit qu'environ 30 % des suggestions sont très utiles, ce qu'il juge largement suffisant s7.

Et ce qui dit de la sauter. Le README : pour un petit bug clair, utilise ton workflow de code habituel s25. La FAQ : le design et la relecture "may not pay off for a small, well-understood change" (peuvent ne pas rapporter sur un petit changement bien compris), et terminer le workflow seul "does not demonstrate a productivity improvement" (ne démontre pas un gain de productivité) s4. Un co-constructeur l'essaierait sur des tâches de fond, des permissions, des changements de données ou une nouvelle frontière entre services s10. Un petit pilote (trois essais par bras) a trouvé qu'EGM "added nothing over the plain plan, at about five times the cost" (n'a rien ajouté au plan simple, pour environ cinq fois le coût) s5. Nous le citons comme un petit pilote, pas comme une règle.

Pourquoi la course est réelle. La doc de Notion n'offre ni incrément atomique ni écriture conditionnelle pour une propriété, et les écritures remplacent la valeur entière s27. Deux proches qui lisent le même compteur peuvent écrire tous les deux, et une réservation est perdue.

Notre propre run, tel quel. Ces chiffres sont les nôtres, pas ceux d'une source ci-dessus. Modèle de session Claude Sonnet 5.5, et les relecteurs en héritent. Les coûts sont équivalents API sur Sonnet 5.5.

  • La relecture complète a lancé 9 sous-agents relecteurs en 5 étapes successives, et le tour consolidé a pris 7 min 24 s. Constats bruts sur les cinq étapes : 77. Consolidés en 12 actions, dont 1 Bloquant.
  • Resolve a produit 37 problèmes : 4 ESCALATE, 5 CONTEST, 2 DECLINE, 26 PROPOSE FIX. Il a d'abord vérifié les relecteurs contre le code et trouvé un constat faux : un relecteur disait que input.tsx devenait inutilisé, mais la page de connexion l'importe encore.
  • La direction de correctif de la relecture pour la course était d'abandonner l'objectif. Nous l'avons contestée. Le design qui donnait un seul gagnant est sorti de cette contestation, et aucun relecteur ne l'a jamais lu.
  • Build depuis le design approuvé dans une session neuve : 216 tests passés, et le test de course sur le dernier exemplaire a donné un succès et un "full" sur 30 graines sur 30.
  • Coût : $7.10 et 32 min de temps modèle avant tout code (brainstorm, draft, review, resolve). Le correctif du README sur une copie sans EGM : $0.0455 et 10 s.

Code

Cinq fichiers de référence. Les quatre premiers, tu les copies dans ton dépôt ou tu les gardes ouverts. Le cinquième est le vrai rapport de notre run, pour que tu voies à quoi ressemble la sortie.

1. Installer et désinstaller. Lance-le depuis le dossier de ton projet, puis ouvre une nouvelle session.

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

egm-install.sh on GitHub

2. La ligne de CLAUDE.md. Ajoute-la au CLAUDE.md de ton projet pour que les rapports atterrissent dans 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

CLAUDE.md on GitHub

3. L'aide-mémoire de la relecture. Les commandes dans l'ordre, les cinq étapes et leurs fichiers de rapport, ce que veulent dire les étiquettes de resolve, et les réglages des relecteurs.

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. La checklist sauter ou relire. Lis-la avant de taper le prompt de build.

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.

skip-or-review.md on GitHub

5. Un vrai rapport consolidé. C'est le rapport de notre run sur une appli de liste de cadeaux familiale. Regarde comment chaque action renvoie aux constats d'étape qui la fondent.

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

À faire lundi

  • Vérifie claude --version. Il te faut la 2.1.271 ou plus.
  • Lance les deux commandes d'installation de egm-install.sh dans un projet, puis ouvre une nouvelle session.
  • Ajoute EGM artifact directory: docs/egm au CLAUDE.md de ce projet.
  • Choisis une fonctionnalité pas encore construite où une erreur touche des données partagées, la vie privée, les permissions ou l'argent. Lance /egm:egm-brainstorm dessus en une phrase.
  • Lance /egm:egm-draft, approuve le design section par section, puis /egm:egm-review <design> et lis les cinq rapports.
  • Lance /egm:egm-resolve. Réponds toi-même aux problèmes escaladés, et conteste tout correctif qui affaiblit ton objectif.
  • Ouvre une session neuve et envoie : "Build the feature exactly to the approved design in docs/egm/.md; add tests." Puis teste toi-même le chemin risqué.
  • Pour ton prochain petit correctif clair, ouvre skip-or-review.md et passe directement à ton workflow habituel.

Aller plus loin

Les autres commandes laissées de côté. Le plugin a aussi /egm:egm-bootstrap et /egm:egm-drift-report, un second workflow pour une base de code existante et un contrôle hebdomadaire de dérive. Nous ne les avons pas lancées, donc nous ne disons rien de leur qualité.

Les autres harnais et les modèles mixtes. Nous n'avons utilisé que Claude Code. Les relecteurs utilisent model: inherit, donc ils ont tourné sur le modèle de notre session et peuvent partager ses angles morts. Nous n'avons essayé ni d'autres harnais ni un mélange de modèles.

Plan Mode et les autres planificateurs. Nous n'avons pas comparé EGM à Plan Mode ni à d'autres outils de planification. Le pilote ci-dessus est le seul face-à-face que nous citons, et il est petit.

Les limites honnêtes de notre run.

  • Le correctif en registre de réservations pour la course est sorti de resolve après notre contestation de la relecture, et aucun poisson rouge ne l'a relu.
  • Le correctif repose sur le fait que Notion garde un seul ordre pour des ajouts simultanés. La documentation de Notion ne le promet pas.
  • Le résultat 30 sur 30 a tourné contre un faux Notion. Le test de course du design contre une copie de la vraie base n'a pas été lancé. Lance-le avant de livrer.
  • La relecture vérifie des documents et du code, et ne peut pas lancer l'appli. Deux affirmations sur le framework dans notre rapport (404 contre 405, réglages de retry par défaut du SDK) viennent de la lecture du code, et le rapport dit de les confirmer.
  • Les 30 % de Rensin et les chiffres du retour de terrain sont ceux de leurs auteurs, pas les nôtres.

FAQ

Les relecteurs voient-ils mon CLAUDE.md ou notre chat ? Non. Ils excluent la conversation, et omitClaudeMd: true masque CLAUDE.md et les autres fichiers d'instructions. Ils lisent quand même le plan et tout fichier accessible s2.

Pourquoi mes fichiers de relecture sont-ils à la racine du dépôt ? Claude Code n'a pas de dossier d'artefacts par défaut s23. Ajoute la ligne EGM artifact directory: à CLAUDE.md.

Dois-je répondre à chaque problème dans resolve ? Non. Réponds aux problèmes escaladés, puis écris "auto accept" pour appliquer d'un coup les correctifs proposés. Les points contestés sont sautés s24.

Une suite de tests verte suffit-elle comme preuve ? Non. La nôtre a passé 216 tests, et pourtant la vérification de la course contre le vrai Notion n'était pas faite. Teste toi-même le chemin risqué.

Quand sauter la relecture ? Pour un petit correctif clair, comme le dit le README s25. Dans notre run, ce correctif a coûté $0.0455 et 10 s sans elle.

Fichiers