---
title: Comment l’équipe Claude Code relit le code qu’écrit Claude
description: Claude écrit environ 90 % de Claude Code, et l’équipe relit toujours chaque changement. L’essentiel de la lecture est passé aux machines : six couches de contrôles, des niveaux de risque fixés par le changement, et un plafond de tours qui a fait converger la revue. Notes sur l’article d’octobre de l’équipe, à côté de ma propre boucle.
date: 2026-10-26
tags: agents de code IA, revue de code, Claude Code, génie logiciel
---

Claude écrit environ 90 % de Claude Code, et l’équipe relit toujours chaque changement. Ce qui a changé, c’est qui fait la lecture. Claude vérifie son propre travail avant même qu’une pull request existe, un panel d’agents relit chaque PR, et l’approbation d’une personne n’est exigée que là où se trouve le risque. De juin à septembre, le nombre de pull requests mergées a plus que doublé, tandis que la part qu’il a fallu annuler baissait de plus de 40 %.

C’est tiré de [How the Claude Code team does code review](https://claude.dev/blog/solving-code-review-at-anthropic/), publié sur le blog claude.dev le 15 octobre par Addy Osmani, Morgan Westlee Lunt et Qing Wang. Addy l’a republié sous forme d’[article X](https://x.com/addyosmani/status/2114604912520921136) le 26 octobre. Plus tôt ce mois-ci, j’ai résumé une autre réponse au même problème, celle d’Overmind : [relisez le plan, pas la pull request](/fr/notes/review-the-plan-not-the-pull-request.html). L’équipe Claude Code a gardé la revue après le code. Elle a simplement cessé d’en faire une seule barrière.

## Lire chaque ligne a cessé d’être le critère

Quand des agents écrivent le code, le nombre de changements explose. Dans le monorepo d’Anthropic, les changements intégrés par jour sont passés d’environ 2 500 en mai à plus de 30 000 en septembre. Claude Code vit dans son propre dépôt, mais subit la même pression. Personne ne lit ça ligne par ligne.

Alors l’équipe est revenue à ce à quoi sert la revue. Elle remplit deux rôles : trouver et corriger les problèmes avant la mise en production, et répandre la compréhension du code dans l’équipe. L’essentiel de l’article porte sur le premier.

Leur phrase clé, c’est que « un humain a-t-il lu le code ? » est un indicateur imprécis. La vraie question, c’est ce qui pourrait mal tourner avec ce changement, et quel contrôle, automatique ou humain, est le bon pour l’attraper.

Ça a aussi déplacé la revue dans le temps. Avant, c’était une barrière en bout de chaîne : écrire le code, ouvrir une PR, attendre un collègue. Maintenant, ça fonctionne plutôt comme un correcteur orthographique pendant qu’on écrit. La plupart des changements ont été relus et corrigés par Claude au moins une fois avant qu’on demande à une personne d’y jeter un œil.

L’objectif est concret. La plupart des PR des dépôts Claude Code (la CLI, les applications desktop et web, les applications mobiles) doivent être mergées avec au plus une personne dans la boucle, et cette personne peut être l’auteur. L’équipe suit le nombre d’approbations humaines par PR, en médiane et au 95e centile, les commentaires humains, et le temps qu’une PR passe à attendre une personne. Les reverts et les incidents servent de garde-fou, parce que le temps humain a deux faces : le temps passé à relire, et le temps passé à réparer ce que le mauvais code casse. Si les reverts augmentent, on n’a pas gagné de temps, on l’a seulement déplacé.

<figure class="fd-fig cr-ask" aria-labelledby="cr1-cap" data-desc="Où se place la revue, avant et maintenant. Avant, la revue était une barrière en bout de chaîne : une personne écrit le code, ouvre une pull request, attend un collègue, et le collègue la lit. Cela répond à une question : un humain a-t-il lu le code ? Maintenant, elle fonctionne comme un correcteur orthographique pendant qu’on écrit : Claude vérifie et corrige le changement au moins une fois, des agents relisent la pull request, et une personne regarde là où se trouve le risque. Cela répond à une autre question : qu’est-ce qui pourrait mal tourner, et quel contrôle l’attrape ? L’équipe suit les approbations humaines par pull request en médiane et au 95e centile, les commentaires humains, et le temps qu’une pull request attend une personne, avec les taux de revert et d’incident comme garde-fou. L’objectif : que la plupart des pull requests soient mergées avec au plus une personne dans la boucle, qui peut être l’auteur.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Avant</p>
<p class="mp-two-name">Une barrière à la fin</p>
<ol class="rp-flow">
<li><span class="rp-who">Humain</span>Écrit le code</li>
<li><span class="rp-who">Humain</span>Ouvre une pull request</li>
<li class="cr-wait"><span class="rp-who">Humain</span>Attend un collègue</li>
<li class="rp-rev"><span class="rp-who">Humain</span>Lit chaque ligne</li>
</ol>
<p class="cr-q"><span class="rp-k">La question</span>Un humain a-t-il lu le code ?</p>
</div>
<p class="mp-two-vs">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Maintenant</p>
<p class="mp-two-name">Un correcteur pendant qu’on écrit</p>
<ol class="rp-flow">
<li><span class="rp-who rp-who-ai">Claude</span>Vérifie et corrige, au moins une fois</li>
<li><span class="rp-who rp-who-ai">Agents</span>Relisent la pull request</li>
<li class="rp-rev"><span class="rp-who">Humain</span>Regarde là où est le risque</li>
</ol>
<p class="cr-q"><span class="rp-k">La question</span>Qu’est-ce qui peut mal tourner, et quel contrôle l’attrape ?</p>
</div>
</div>
<p class="rp-metrics"><span class="rp-k">Suivi</span><span>approbations par PR, médiane et p95</span><span>commentaires humains</span><span>temps d’attente d’une personne</span></p>
<p class="rp-metrics"><span class="rp-k">Garde-fou</span><span>taux de revert</span><span>taux d’incident</span></p>
<p class="mp-strip"><b>Objectif</b><span>La plupart des pull requests mergées avec au plus une personne dans la boucle, qui peut être l’auteur.</span></p>
<figcaption id="cr1-cap">Le même changement, relu à la fin ou tout du long. Les lignes surlignées sont celles où une personne relit. L’objectif et les chiffres qui le suivent sont ceux de l’équipe.</figcaption>
</figure>

## Six couches, puis le retour arrière

Un changement typique, parti d’un portable ou d’une session Claude dans Slack, traverse six couches de contrôles : la vérification avant la PR, la CI obligatoire, la revue par IA, une revue de sécurité, une approbation humaine proportionnée au risque, et une merge queue avec des feature flags. Sous toutes ces couches, il y a le retour arrière rapide.

Chaque couche attrape certains problèmes et en rate d’autres. Peu passent les six, et le retour arrière s’occupe du reste. La majeure partie du chemin est automatisée, et l’attention d’une personne va là où est le risque.

<figure class="fd-fig cr-layers" aria-labelledby="cr2-cap" data-desc="Six couches de contrôles avec le retour arrière en dessous, dessinées comme des tranches trouées. Six problèmes arrivent en haut, un par colonne. La vérification avant la pull request arrête le premier. La CI obligatoire, c’est-à-dire le lint, les types, les tests et le build, arrête le deuxième. La revue IA, où des agents cherchent et votent, arrête le troisième. La revue de sécurité, à part, arrête le quatrième. L’approbation humaine, avec zéro, une ou deux personnes selon le risque, arrête le cinquième. Le sixième problème passe par tous les trous, au-delà de la merge queue et des feature flags, et c’est le retour arrière rapide qui l’attrape : flags coupés, changement annulé. Cinq des couches sont automatisées, une est une personne, et le retour arrière sert de rattrapage. Quelle couche arrête quel problème relève du schéma : l’article ne donne aucun chiffre par couche.">
<div class="cr-cheese" role="img" aria-label="Six problèmes traversent six couches. La vérification, la CI obligatoire, la revue IA, la revue de sécurité et l’approbation humaine en arrêtent chacune un. La merge queue et les flags n’en arrêtent aucun dans ce schéma, et le dernier problème atteint le retour arrière rapide.">
<p class="cr-in"><span>Problèmes entrants</span><span class="cr-cells"><i></i><i></i><i></i><i></i><i></i><i></i></span></p>
<p class="cr-row cr-auto"><span class="cr-name">Vérification<em>avant la PR</em></span><span class="cr-cells"><i class="x"></i><i class="h"></i><i class="h"></i><i class="h"></i><i class="h"></i><i class="h"></i></span></p>
<p class="cr-row cr-auto"><span class="cr-name">CI obligatoire<em>lint, types, tests, build</em></span><span class="cr-cells"><i></i><i class="x"></i><i class="h"></i><i class="h"></i><i class="h"></i><i class="h"></i></span></p>
<p class="cr-row cr-auto"><span class="cr-name">Revue IA<em>des agents cherchent et votent</em></span><span class="cr-cells"><i></i><i></i><i class="x"></i><i class="h"></i><i class="h"></i><i class="h"></i></span></p>
<p class="cr-row cr-auto"><span class="cr-name">Revue de sécurité<em>une passe à part</em></span><span class="cr-cells"><i></i><i></i><i></i><i class="x"></i><i class="h"></i><i class="h"></i></span></p>
<p class="cr-row cr-person"><span class="cr-name">Approbation humaine<em>zéro, une ou deux personnes</em></span><span class="cr-cells"><i></i><i></i><i></i><i></i><i class="x"></i><i class="h"></i></span></p>
<p class="cr-row cr-auto"><span class="cr-name">Merge queue, flags<em>revérifie sur main</em></span><span class="cr-cells"><i></i><i></i><i></i><i></i><i></i><i class="h"></i></span></p>
<p class="cr-row cr-floor"><span class="cr-name">Retour arrière rapide<em>flags coupés, revert</em></span><span class="cr-cells"><i></i><i></i><i></i><i></i><i></i><i class="x"></i></span></p>
</div>
<ul class="cr-key">
<li><i class="cr-k-auto"></i>automatisé</li>
<li><i class="cr-k-person"></i>une personne, selon le risque</li>
<li><i class="cr-k-floor"></i>rattrapage</li>
<li><i class="cr-k-x"></i>un problème arrêté</li>
</ul>
<figcaption id="cr2-cap">L’image que donne l’article, ce sont des couches, pas une barrière unique. Quelle couche arrête quel problème relève du schéma : il ne donne aucun chiffre par couche.</figcaption>
</figure>

## Avant la PR, montrer le résultat

L’essentiel de la revue se fait désormais avant qu’une pull request existe. Claude reçoit quelque chose qu’il peut exécuter, comme des tests, un build ou une capture d’écran à comparer à la maquette, et doit montrer le résultat au lieu de dire que c’est fini. Ensuite, un sous-agent relit le diff avec un contexte neuf. Beaucoup de membres de l’équipe lancent aussi des skills internes avant d’ouvrir une PR : un qui chasse les bugs, un qui simplifie le diff, un qui vérifie le comportement de bout en bout.

Boris Cherny, le créateur de Claude Code, considère que donner à Claude un moyen de vérifier son travail est sans doute ce qui compte le plus pour obtenir de bons résultats. Selon lui, cela rend le résultat final deux à trois fois meilleur.

Quand le relecteur signale sans cesse la même chose, l’équipe corrige à la source : dans le skill, avec une règle de lint, ou dans deux fichiers d’instructions. `CLAUDE.md` dit ce qu’est le projet : la stack, les conventions, les objectifs et les non-objectifs. Chaque revue le charge, alors il reste court et renvoie vers d’autres docs. Le relecteur signale aussi le code qui enfreint une de ses conventions, et les changements qui rendent une de ses lignes obsolète.

`REVIEW.md` est écrit par les code owners, pour dire au relecteur ce qui compte dans leur partie du code, et l’équipe vérifie à part si le relecteur le suit. Les bons sont courts. Ils disent à quoi ressemble un échec dans ce dépôt (pour la doc, c’est « elle ment », pour la config, « elle route mal »), plafonnent les nits, listent les chemins à ignorer, et exigent un fichier et une ligne comme preuve au lieu d’une supposition tirée d’un nom. Ils demandent aussi un résumé qui commence par un décompte et dit clairement quand il n’y a rien à corriger.

<figure class="fd-fig cr-pre" aria-labelledby="cr3-cap" data-desc="La revue avant la pull request, en trois étapes. Un : exécuter, c’est-à-dire des tests, un build, ou une capture d’écran comparée à la maquette. Deux : montrer la sortie, au lieu d’affirmer que c’est fini. Trois : un regard neuf, un sous-agent relit le diff avec un contexte vierge. L’estimation de Boris Cherny : un moyen de vérifier son travail rend le résultat deux à trois fois meilleur. Puis les deux fichiers qui corrigent à la source les remarques répétées. CLAUDE.md, chargé par chaque revue : la stack et les conventions, les objectifs et les non-objectifs, en restant court et en renvoyant vers d’autres docs ; le relecteur signale le code qui enfreint une convention et les changements qui rendent une ligne obsolète. REVIEW.md, écrit par les code owners : à quoi ressemble un échec ici, par exemple une doc qui ment ou une config qui route mal, un plafond de nits, les chemins à ignorer, un fichier et une ligne comme preuve au lieu d’une supposition tirée d’un nom, et un résumé qui commence par un décompte et dit clairement quand il n’y a rien à corriger. L’équipe vérifie à part si le relecteur le suit.">
<ol class="mp-trio">
<li><p class="mp-trio-n"><b>1</b>Exécuter</p><p class="mp-trio-what">Des tests, un build, ou une capture comparée à la maquette</p></li>
<li><p class="mp-trio-n"><b>2</b>Montrer</p><p class="mp-trio-what">La sortie, pas « c’est fini »</p></li>
<li><p class="mp-trio-n"><b>3</b>Un regard neuf</p><p class="mp-trio-what">Un sous-agent relit le diff avec un contexte vierge</p></li>
</ol>
<p class="mp-strip"><b>Boris Cherny</b><span>Son estimation : un moyen de vérifier son travail rend le résultat deux à trois fois meilleur.</span></p>
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Chaque revue le charge</p>
<p class="mp-two-name cr-file">CLAUDE.md</p>
<ul class="cr-doc">
<li>La stack et les conventions</li>
<li>Les objectifs et les non-objectifs</li>
<li>Court, renvoie vers d’autres docs</li>
</ul>
<p class="mp-two-line">Le relecteur signale le code qui enfreint une convention, et un changement qui rend une ligne obsolète</p>
</div>
<p class="mp-two-vs">et</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Les code owners l’écrivent</p>
<p class="mp-two-name cr-file">REVIEW.md</p>
<ul class="cr-doc">
<li>À quoi ressemble un échec ici : une doc qui ment, une config qui route mal</li>
<li>Un plafond de nits</li>
<li>Les chemins à ignorer</li>
<li>Un fichier et une ligne comme preuve, pas une supposition tirée d’un nom</li>
<li>Un résumé qui commence par un décompte, et dit clairement quand il n’y a rien à corriger</li>
</ul>
<p class="mp-two-line">Vérifié à part : le relecteur le suit-il ?</p>
</div>
</div>
<figcaption id="cr3-cap">La preuve avant la revue, puis les deux fichiers où atterrit une remarque répétée. Les lignes de REVIEW.md sont la description qu’en donne l’article.</figcaption>
</figure>

## Le relecteur vote avant de commenter

Chaque pull request reçoit une revue de Claude avant qu’une personne la regarde. Elle lit le diff au regard de tout le dépôt et de l’intention annoncée de la PR, et se demande si le changement résout son problème, s’intègre au système, ou casse autre chose. Sur un correctif de bug, elle cherche la cause racine.

Les remarques sont vérifiées avant que quiconque les voie. Plusieurs agents cherchent des bugs en même temps. Un groupe distinct vote sur chaque remarque, et elle n’est publiée que si assez d’entre eux s’accordent à dire qu’elle est réelle. Les remarques qui ne portent que sur le style, les diagnostics ou le nettoyage sont écartées ; l’équipe a d’abord testé ces filtres en A/B sur ses propres PR. Ce qui reste arrive en commentaires en ligne, triés par gravité, chacun étiqueté Important, Nit ou Pre-existing, pour qu’un vieux bug n’ait pas l’air d’être la faute de l’auteur.

Au lancement de la research preview, la part des PR internes recevant des commentaires de revue substantiels est passée de 16 % à 54 %. La plupart des PR de plus de 1 000 lignes reçoivent des remarques, et la plupart des petites reviennent sans rien. Les admins règlent chaque dépôt sur Quick, Standard ou Deep.

Chaque remarque doit recevoir une réponse : la corriger, ou résoudre le fil avec une raison. Une revue de sécurité distincte fonctionne de la même façon, et une remarque ouverte de l’une ou de l’autre bloque le merge. La CI bloque aussi, avec des dizaines de contrôles sur une pull request typique de la CLI. Le modèle de PR demande comment le changement a été testé et comment l’annuler. Claude peut le remplir, mais c’est la personne qui a demandé le changement qui le valide.

<figure class="fd-fig cr-bot" aria-labelledby="cr4-cap" data-desc="Comment le relecteur IA filtre ses propres remarques, en quatre étapes. Un, chercher : plusieurs agents cherchent des bugs en même temps, dessinés comme neuf remarques candidates. Deux, voter : un groupe distinct vote sur chaque remarque, et seules celles sur lesquelles assez de votants s’accordent survivent, dessinées comme cinq. Trois, filtrer : les remarques qui ne portent que sur le style, les diagnostics ou le nettoyage sont écartées, dessinées comme trois. Quatre, publier : ce qui reste arrive sur la pull request en commentaires en ligne triés par gravité, étiquetés Important, Nit ou Pre-existing. Au lancement de la research preview, les pull requests internes avec des commentaires de revue substantiels sont passées de 16 % à 54 %. Chaque remarque est corrigée ou résolue avec une raison, et une remarque ouverte de la revue de code ou de la revue de sécurité bloque le merge.">
<ol class="cr-funnel">
<li><p class="cr-fn-n"><b>1</b>Chercher</p><p class="cr-sq" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></p><p class="cr-fn-s">Plusieurs agents cherchent des bugs en même temps</p></li>
<li><p class="cr-fn-n"><b>2</b>Voter</p><p class="cr-sq" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i class="o"></i><i class="o"></i><i class="o"></i><i class="o"></i></p><p class="cr-fn-s">Publiée seulement si assez de votants la jugent réelle</p></li>
<li><p class="cr-fn-n"><b>3</b>Filtrer</p><p class="cr-sq" aria-hidden="true"><i></i><i></i><i></i><i class="o"></i><i class="o"></i></p><p class="cr-fn-s">Style, diagnostics et nettoyage écartés</p></li>
<li><p class="cr-fn-n"><b>4</b>Publier</p><p class="cr-tags"><span class="cr-imp">Important</span><span class="cr-nit">Nit</span><span class="cr-pre">Pre-existing</span></p><p class="cr-fn-s">En ligne, triées par gravité</p></li>
</ol>
<div class="rp-bars">
<p class="rp-bars-h">PR internes avec des commentaires de revue substantiels</p>
<p class="rp-bar"><span>Avant la research preview</span><i class="cr-w-16"></i><b>16 %</b></p>
<p class="rp-bar rp-bar-win"><span>Avec Code Review</span><i class="cr-w-54"></i><b>54 %</b></p>
</div>
<p class="mp-strip"><b>Chaque remarque</b><span>Corrigée, ou résolue avec une raison. Une remarque ouverte de cette revue ou de la revue de sécurité bloque le merge.</span></p>
<figcaption id="cr4-cap">Les carrés relèvent du schéma : l’article ne donne aucun chiffre par étape. Les deux barres sont à l’échelle sur un axe de 0 à 100 %.</figcaption>
</figure>

## C’est le changement qui fixe le niveau, pas l’auteur

Une correction de doc et un changement de l’auto-updater ne portent pas le même risque, alors ils n’ont pas droit à la même revue. L’article décrit trois niveaux :

- Faible : docs, textes, fonctionnalités internes, ajouts derrière un flag. Aucune approbation humaine une fois la revue automatique et les contrôles de sécurité au vert.
- Moyen : les changements produit ordinaires, et les zones sensibles comme le cache, l’auto-updater ou les prompts système. Une personne.
- Élevé : le code le plus risqué, plus un petit ensemble de chemins qui en exigent toujours deux. Deux personnes.

Un classifieur lit le changement et choisit le niveau. Un second classifieur se demande si ce changement précis a besoin d’une personne même quand son niveau dit le contraire. Les chemins que les owners déclarent sensibles, et tout fichier de workflow CI, exigent toujours une personne.

Ce sont les règles autour du tableau qui le font tenir. Seuls les auteurs inscrits sur la liste de confiance du dépôt ont droit aux chemins allégés ; tous les autres ont besoin d’une deuxième personne. L’approbation d’un agent ne compte jamais comme celle d’une personne. La personne qui a lancé une PR écrite par un agent compte parmi ses relecteurs requis, comme si elle avait tapé le code. Et une approbation couvre un seul commit : un push d’agent, ou un merge résolu à la main, en exige une nouvelle.

<figure class="fd-fig cr-tier-fig" aria-labelledby="cr5-cap" data-desc="L’approbation humaine proportionnée au risque, d’après le tableau de l’article. Risque faible : les docs, les textes, les fonctionnalités internes et les ajouts derrière un flag n’ont besoin d’aucune personne une fois la revue automatique et les contrôles de sécurité au vert. Risque moyen : les changements produit ordinaires et les zones sensibles comme le cache, l’auto-updater ou les prompts système demandent une personne. Risque élevé : le code le plus risqué et un petit ensemble de chemins demandent deux personnes. Un classifieur lit le changement et fixe le niveau, et un second se demande si ce changement a quand même besoin d’une personne. Les chemins que les owners déclarent sensibles, et tout fichier de workflow CI, exigent toujours une personne. L’approbation d’un agent ne remplace jamais celle d’une personne. Une approbation couvre un commit : un push d’agent ou un merge résolu à la main en exige une nouvelle. Sur une pull request écrite par un agent, la personne qui l’a lancée compte parmi les relecteurs requis.">
<div class="cr-tiers">
<div class="cr-tier">
<p class="cr-tier-k">Faible</p>
<p class="cr-heads" aria-hidden="true"><svg class="cr-head cr-head-none" viewBox="0 0 24 30"><circle cx="12" cy="8" r="6"/><path d="M2,29 Q2,17 12,17 Q22,17 22,29 Z"/></svg></p>
<p class="cr-tier-n">Aucune personne</p>
<p class="cr-tier-s">une fois la revue automatique et les contrôles de sécurité au vert</p>
<p class="cr-tier-e">Docs, textes, fonctionnalités internes, ajouts derrière un flag</p>
</div>
<div class="cr-tier">
<p class="cr-tier-k">Moyen</p>
<p class="cr-heads" aria-hidden="true"><svg class="cr-head" viewBox="0 0 24 30"><circle cx="12" cy="8" r="6"/><path d="M2,29 Q2,17 12,17 Q22,17 22,29 Z"/></svg></p>
<p class="cr-tier-n">Une personne</p>
<p class="cr-tier-e">Changements produit ordinaires, et zones sensibles : cache, auto-updater, prompts système</p>
</div>
<div class="cr-tier cr-tier-hi">
<p class="cr-tier-k">Élevé</p>
<p class="cr-heads" aria-hidden="true"><svg class="cr-head" viewBox="0 0 24 30"><circle cx="12" cy="8" r="6"/><path d="M2,29 Q2,17 12,17 Q22,17 22,29 Z"/></svg><svg class="cr-head" viewBox="0 0 24 30"><circle cx="12" cy="8" r="6"/><path d="M2,29 Q2,17 12,17 Q22,17 22,29 Z"/></svg></p>
<p class="cr-tier-n">Deux personnes</p>
<p class="cr-tier-e">Le code le plus risqué, et un petit ensemble de chemins qui en exigent toujours deux</p>
</div>
</div>
<div class="rp-pair">
<p><span class="rp-k">Qui fixe le niveau</span>Le changement, lu par un classifieur. Un second demande s’il faut quand même une personne.</p>
<p><span class="rp-k">Toujours une personne</span>Les chemins que les owners déclarent sensibles, et tout fichier de workflow CI</p>
</div>
<div class="rp-pair">
<p><span class="rp-k">L’approbation d’un agent</span>Ne remplace jamais celle d’une personne</p>
<p><span class="rp-k">Une approbation couvre</span>Un commit. Un push d’agent ou un merge résolu à la main en exige une nouvelle.</p>
</div>
<p class="mp-strip"><b>Responsable</b><span>Sur une PR écrite par un agent, la personne qui l’a lancée fait partie des relecteurs requis.</span></p>
<figcaption id="cr5-cap">Le tableau des niveaux de l’article, puis les règles autour. Seuls les auteurs inscrits sur la liste de confiance d’un dépôt ont droit aux chemins allégés.</figcaption>
</figure>

## Les incidents servent de jeu de test

L’équipe a construit le jeu de test du relecteur à partir de vraies pannes. Elle a rassemblé d’anciennes PR qui avaient causé des incidents, avec leurs correctifs et leurs reverts, et fait confirmer chaque bug et son emplacement par des ingénieurs qui connaissent ce code. Le relecteur tourne contre ce jeu tous les jours. Chaque nouvel incident ajoute un cas, et chaque changement des prompts, des outils ou du modèle du relecteur est noté sur l’ensemble.

Attraper plus de bugs est facile si l’on accepte de signaler des non-bugs, alors l’équipe mesure aussi le bruit. Chaque commentaire est classé selon ce qu’en a fait la personne sur la PR : elle l’a corrigé, a dit qu’il était faux, a dit que le comportement était voulu, ou a jugé que ça n’avait pas d’importance. L’équipe fait aussi tourner le relecteur sur des PR connues pour être saines, et compte les signalements qui auraient poussé quelqu’un à faire un changement nuisible. La priorité est écrite noir sur blanc : les vrais bugs d’abord, moins de tours de revue ensuite.

<figure class="fd-fig cr-eval" aria-labelledby="cr6-cap" data-desc="L’éval du relecteur, construite à partir des incidents, en deux rangées reliées. Le jeu grandit : un incident ou un revert, un changement qui a cassé quelque chose, est vérifié par des ingénieurs qui connaissent le code, qui confirment le bug et son emplacement, puis il est ajouté au jeu, un cas par incident. Le relecteur change : quelqu’un modifie ses prompts, ses outils ou son modèle, l’éval quotidienne le note sur chaque cas du jeu, et si le score monte, le changement est gardé ; sinon, il est jeté. Le bruit se mesure à ce que les gens ont fait de chaque commentaire de revue : corrigé, jugé faux, déclaré voulu, ou jugé sans importance. La priorité écrite : les vrais bugs d’abord, moins de tours de revue ensuite.">
<div class="cr-loop">
<p class="cr-lane-h">Le jeu grandit</p>
<ol class="cr-lane">
<li><b>Incident ou revert</b>Un changement qui a cassé quelque chose</li>
<li><b>Vérifié par des experts</b>Des ingénieurs qui connaissent le code confirment le bug et son emplacement</li>
<li><b>Ajouté au jeu</b>Un cas par incident</li>
</ol>
<p class="cr-feed">Chaque cas, chaque jour</p>
<p class="cr-lane-h">Le relecteur change</p>
<ol class="cr-lane cr-lane-ai">
<li><b>Changer le relecteur</b>Ses prompts, ses outils ou son modèle</li>
<li><b>Éval quotidienne</b>Notée sur chaque cas</li>
<li><b>Le score monte ?</b>On garde. Sinon, on jette.</li>
</ol>
</div>
<p class="rp-metrics"><span class="rp-k">Bruit</span><span>corrigé</span><span>jugé faux</span><span>voulu</span><span>sans importance</span></p>
<p class="mp-strip"><b>Priorité</b><span>Les vrais bugs d’abord, moins de tours de revue ensuite. Par écrit.</span></p>
<figcaption id="cr6-cap">Les incidents alimentent le jeu, le jeu note chaque changement du relecteur, et ce que les gens font des commentaires tient le bruit en respect.</figcaption>
</figure>

## La revue doit converger

Le bruit coûte plus cher quand l’auteur est un agent. Une personne balaie un nit en quelques secondes. Un agent le corrige, ce qui veut dire un commit de plus et un tour de revue de plus. Un agent auteur et un agent relecteur peuvent s’occuper l’un l’autre indéfiniment : une pull request de la CLI a enchaîné plus de cinquante tours pendant une nuit avant que son auteur l’arrête.

Quand l’équipe a lancé git blame sur ce que le relecteur signalait sans arrêt, environ 59 % concernaient du code présent depuis le premier passage du relecteur. Il ne trouvait pas de nouveaux bugs. Il trouvait quelques vieux bugs de plus à chaque tour. L’équipe avait elle-même aggravé les choses, en lançant plusieurs tours par défaut parce que chaque passage attrape quelque chose de nouveau.

Alors elle a changé la re-revue :

1. Un plafond de tours. Après trois tours, le relecteur demande à l’auteur de prendre du recul et de reconsidérer l’approche.
2. Une re-revue limitée au diff après les premiers passages.
3. Signaler la classe de bug, pour que l’auteur corrige chaque occurrence, pas une seule ligne.
4. Pas de répétition des remarques déjà publiées.

Les vieux bugs sont toujours chassés, simplement pas sur votre PR : des agents de revue tournent aussi chaque nuit sur le code existant. Après le changement, les PR validées après un seul tour de revue et de correction sont passées de 65 % à 78 %, les PR nécessitant cinq tours ou plus sont tombées de 8,9 % à 1,5 %, et le nombre moyen de revues avant validation est tombé de 2,08 à 1,32.

<figure class="fd-fig cr-conv" aria-labelledby="cr7-cap" data-desc="Une revue qui converge. Les quatre changements de la re-revue : un, un plafond de tours, pour qu’après trois tours le relecteur demande à l’auteur de prendre du recul et de repenser l’approche ; deux, le diff seul, pour qu’après les premiers passages seul le nouveau diff soit relu ; trois, la classe de bug, pour que l’auteur corrige chaque occurrence et pas une seule ligne ; quatre, pas de répétition d’une remarque déjà publiée. Les résultats sur les pull requests internes, avant et après ce travail : la validation après un seul tour de revue et de correction est passée de 65 à 78 % ; le besoin de cinq tours ou plus est tombé de 8,9 à 1,5 % ; le nombre moyen de revues avant validation est tombé de 2,08 à 1,32. Avant le changement, une pull request de la CLI a enchaîné plus de cinquante tours pendant une nuit avant que son auteur l’arrête.">
<ol class="rp-steps">
<li><p class="rp-step-n"><b>01</b>Un plafond de tours</p><p class="rp-step-s">Après trois tours, prendre du recul et repenser l’approche</p></li>
<li><p class="rp-step-n"><b>02</b>Le diff seul</p><p class="rp-step-s">Après les premiers passages, relire seulement le nouveau diff</p></li>
<li><p class="rp-step-n"><b>03</b>La classe de bug</p><p class="rp-step-s">Pour que l’auteur corrige chaque occurrence, pas une ligne</p></li>
<li><p class="rp-step-n"><b>04</b>Pas de répétition</p><p class="rp-step-s">Une remarque déjà publiée ne l’est pas une seconde fois</p></li>
</ol>
<div class="rp-bars">
<p class="rp-bars-h">Validées après un tour de revue et de correction</p>
<p class="rp-bar"><span>Avant</span><i class="cr-w-65"></i><b>65 %</b></p>
<p class="rp-bar rp-bar-win"><span>Après</span><i class="cr-w-full"></i><b>78 %</b></p>
<p class="rp-bars-h cr-next">Cinq tours ou plus</p>
<p class="rp-bar"><span>Avant</span><i class="cr-w-full"></i><b>8,9 %</b></p>
<p class="rp-bar rp-bar-win"><span>Après</span><i class="cr-w-15"></i><b>1,5 %</b></p>
<p class="rp-bars-h cr-next">Revues moyennes avant validation</p>
<p class="rp-bar"><span>Avant</span><i class="cr-w-full"></i><b>2,08</b></p>
<p class="rp-bar rp-bar-win"><span>Après</span><i class="cr-w-132"></i><b>1,32</b></p>
</div>
<p class="mp-strip"><b>Une nuit</b><span>Une pull request de la CLI a enchaîné plus de cinquante tours avant que son auteur l’arrête.</span></p>
<figcaption id="cr7-cap">Les quatre changements, puis les chiffres internes de l’équipe avant et après. Chaque paire de barres est à l’échelle de sa plus grande valeur.</figcaption>
</figure>

## Les humains gardent cinq tâches

Sortir un ingénieur senior d’un travail de fond pour attraper une erreur de routine coûte bien plus cher qu’une revue automatique. Alors les humains gardent les tâches que seuls des humains peuvent faire :

- Décider s’il faut le construire : la direction, le goût et le périmètre. Une équipe qui a déclaré son goulot de revue résolu garde quand même une revue humaine pour les changements venus d’en dehors de l’équipe, pour que quelqu’un se demande si le changement doit exister.
- Relire le code risqué, comme la facturation, l’auto-updater et les workflows CI.
- Relire l’architecture qui pose un modèle que d’autres copieront.
- Lire les preuves : la sortie des tests, la commande lancée et ce qu’elle a renvoyé, une capture d’écran, les remarques du relecteur.
- Répondre du résultat. Une personne est responsable de chaque changement mis en production, peu importe qui l’a tapé.

La tâche des preuves s’accompagne d’une règle à voler : « Si vous ne savez pas dire ce que les contrôles rateraient, demandez une vraie revue plutôt qu’une approbation rapide. »

<figure class="fd-fig cr-people" aria-labelledby="cr8-cap" data-desc="Les cinq tâches que gardent les humains. Un : décider s’il faut le construire, c’est-à-dire la direction, le goût et le périmètre. Deux : le code risqué, comme la facturation, l’auto-updater et les workflows CI. Trois : l’architecture, les choix qui posent un modèle que d’autres copient. Quatre : les preuves, c’est-à-dire la sortie des tests, la commande et ce qu’elle a renvoyé, une capture d’écran et les remarques du relecteur. Cinq : le résultat, parce qu’une personne répond de chaque changement mis en production, peu importe qui l’a tapé. La règle qui accompagne les preuves : si vous ne savez pas dire ce que les contrôles rateraient, demandez une vraie revue plutôt qu’une approbation rapide.">
<ol class="cr-jobs">
<li><b>S’il faut le construire</b><span>Direction, goût et périmètre</span></li>
<li><b>Le code risqué</b><span>Facturation, auto-updater, workflows CI</span></li>
<li><b>L’architecture</b><span>Les choix qui posent un modèle que d’autres copient</span></li>
<li><b>Les preuves</b><span>Sortie des tests, la commande et ce qu’elle a renvoyé, une capture, les remarques</span></li>
<li><b>Le résultat</b><span>Une personne répond de chaque changement mis en production, peu importe qui l’a tapé</span></li>
</ol>
<p class="mp-strip"><b>La règle</b><span>Si vous ne savez pas dire ce que les contrôles rateraient, demandez une vraie revue plutôt qu’une approbation rapide.</span></p>
<figcaption id="cr8-cap">Ce qui reste aux humains une fois la lecture de routine passée aux machines, dans l’ordre de l’article.</figcaption>
</figure>

## Qui le merge en répond

Le deuxième rôle de la revue était de diffuser le contexte. Lire le diff d’un collègue, c’est comme ça qu’on apprend le code. L’équipe n’a pas de remplacement formel, et dit que personne ne garde en tête un modèle complet de Claude Code, ni n’en a besoin. Quand on a besoin d’une partie du code, on demande à Claude une explication de cette tranche précise. Ça prend quelques minutes et ça correspond au code tel qu’il est aujourd’hui. Un changement de texte d’une ligne n’apprend presque rien. Une explication du module qu’on s’apprête à modifier en apprend beaucoup.

La responsabilité fonctionne de la même façon. Si vous mergez un changement petit ou moyen et qu’il casse, c’est généralement vous qui le réparez. Ça ne tourne pas mal parce que les changements sont petits, que les flags, les reverts et les déploiements progressifs annulent la plupart des erreurs en quelques minutes, que le rayon d’impact fixe la barre, que les régressions apparaissent vite dans la télémétrie et l’usage interne, et que les revues d’incident examinent le système, pas la personne.

Un code bon marché rend aussi bon marché le changement de cap. Quand quelqu’un dans le canal pointe une décision antérieure ou une voie plus simple, l’auteur ferme ou remanie la PR, et ce n’est pas vécu comme une perte. L’astuce, c’est de le soulever tôt dans le fil, pas en commentaire bloquant sur une PR terminée.

<figure class="fd-fig cr-own" aria-labelledby="cr9-cap" data-desc="Comment l’équipe apprend le code une fois que les machines font l’essentiel de la lecture. Avant : lire les diffs, mais un changement de texte d’une ligne n’apprend presque rien. Maintenant : demander à Claude une explication de la tranche exacte qu’on va modifier ; ça prend quelques minutes et ça correspond au code tel qu’il est aujourd’hui. Pourquoi répondre de ses propres merges fonctionne : les changements sont petits, tout est réversible, le rayon d’impact fixe la barre, les régressions remontent vite, et personne n’est blâmé. Changer de cap : le soulever tôt dans le fil, pas en commentaire bloquant sur une pull request terminée.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Apprendre le code, avant</p>
<p class="mp-two-name">Lire les diffs</p>
<svg class="mp-two-art" viewBox="0 0 300 92" aria-hidden="true"><rect class="rp-doc" x="96" y="4" width="108" height="84"/><rect class="rp-doc-h" x="96" y="4" width="108" height="14"/><rect class="mp-ln" x="106" y="28" width="80" height="4"/><rect class="mp-ln" x="106" y="38" width="66" height="4"/><rect class="cr-diff" x="106" y="48" width="74" height="5"/><rect class="mp-ln" x="106" y="60" width="84" height="4"/><rect class="mp-ln" x="106" y="70" width="58" height="4"/></svg>
<p class="mp-two-line">Un changement de texte d’une ligne n’apprend presque rien</p>
</div>
<p class="mp-two-vs">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Apprendre le code, maintenant</p>
<p class="mp-two-name">Demander une explication</p>
<svg class="mp-two-art" viewBox="0 0 300 92" aria-hidden="true"><rect class="rp-doc" x="96" y="4" width="108" height="84"/><rect class="rp-doc-h" x="96" y="4" width="108" height="14"/><rect class="cr-node" x="108" y="28" width="30" height="18"/><rect class="cr-node cr-node-on" x="162" y="28" width="30" height="18"/><rect class="cr-node" x="135" y="62" width="30" height="18"/><path class="cr-edge" d="M138,37 H162 M123,46 L143,62 M177,46 L157,62"/></svg>
<p class="mp-two-line">Exactement la tranche que vous allez modifier, en quelques minutes, telle qu’elle est aujourd’hui</p>
</div>
</div>
<p class="rp-metrics"><span class="rp-k">Ça marche parce que</span><span>petits changements</span><span>tout est réversible</span><span>le rayon d’impact fixe la barre</span><span>les régressions remontent vite</span><span>pas de reproches</span></p>
<p class="mp-strip"><b>Changer de cap</b><span>Le soulever tôt dans le fil, pas en commentaire bloquant sur une PR terminée.</span></p>
<figcaption id="cr9-cap">Un diff où une ligne a changé, à côté d’une explication de la partie que vous allez toucher.</figcaption>
</figure>

## À côté de ma propre boucle

Ma boucle est décrite sur [Comment je travaille avec l’IA](/fr/ia.html) : d’abord une issue, un agent construit sur sa propre branche, il prouve que le changement fonctionne, un modèle d’un autre fournisseur donne un second avis, et une pull request ferme le tout. Deux de mes règles là-bas disent la même chose que cet article. « Vérifier ce que le modèle a produit, pas ce qu’il dit avoir fait », c’est leur « montrer le résultat au lieu de dire que c’est fini ». « Une relecture vide n’est pas une validation », c’est leur `REVIEW.md` qui demande un résumé disant clairement quand il n’y a rien à corriger.

Mon pipeline Forge plafonne déjà les tours plus durement qu’eux. Un problème bloquant signalé par son relecteur a droit à une correction de plus, puis la pull request s’ouvre. C’est dans [la note sur OpenShell](/fr/notes/openshell-sandbox-inside-a-sandbox.html).

La différence, c’est la dernière étape. Sur cette page, chaque changement finit en pull request que je lis et que je merge, et dans [ma note sur l’usine logicielle](/fr/notes/software-factory-2022-to-lights-off.html), la partie lente de mon installation, c’est ma file de revue. Leur tableau des niveaux vise exactement ça : une correction de doc n’a besoin de personne une fois les contrôles au vert, et le temps d’une personne va à la facturation, à la CI et à l’auto-updater.

<figure class="fd-fig cr-mine" aria-labelledby="cr10-cap" data-desc="Le fonctionnement de l’équipe Claude Code à côté de ma boucle telle qu’elle est écrite sur ma page Comment je travaille avec l’IA, une ligne par sujet. La preuve d’abord : ils font montrer la sortie à Claude, des tests, un build ou une capture ; je demande le build et les tests, et des captures dans un vrai navigateur à 320 pixels et sur desktop. La revue IA : leurs agents Claude cherchent, votent, puis publient par gravité ; dans ma boucle, un modèle d’un autre fournisseur relit le changement. Quand rien n’est trouvé : leur résumé le dit clairement, avec un décompte ; ma règle, c’est qu’une relecture vide n’est pas une validation. Les tours : ils en autorisent trois, puis l’auteur repense l’approche ; mon pipeline Forge accorde une correction de plus à un problème bloquant. Qui approuve : chez eux, le changement fixe le niveau, zéro, une ou deux personnes ; dans ma boucle, c’est chaque pull request, moi. Cette dernière ligne, c’est là que ma file de revue s’accumule, et le tableau des niveaux est la pièce qui la vise.">
<div class="cr-vs">
<div class="cr-vs-row"><p class="cr-vs-k">La preuve d’abord</p><p><span class="rp-k">L’équipe</span>Claude montre la sortie : tests, build, capture</p><p><span class="rp-k">Moi</span>Build et tests, captures dans un vrai navigateur à 320 px et sur desktop</p></div>
<div class="cr-vs-row"><p class="cr-vs-k">Revue IA</p><p><span class="rp-k">L’équipe</span>Des agents Claude cherchent, votent, puis publient par gravité</p><p><span class="rp-k">Moi</span>Un modèle d’un autre fournisseur relit le changement</p></div>
<div class="cr-vs-row"><p class="cr-vs-k">Rien trouvé</p><p><span class="rp-k">L’équipe</span>Le résumé le dit clairement, avec un décompte</p><p><span class="rp-k">Moi</span>Une relecture vide n’est pas une validation</p></div>
<div class="cr-vs-row"><p class="cr-vs-k">Tours</p><p><span class="rp-k">L’équipe</span>Trois, puis on repense l’approche</p><p><span class="rp-k">Moi</span>Forge : une correction de plus après un problème bloquant</p></div>
<div class="cr-vs-row cr-vs-gap"><p class="cr-vs-k">Qui approuve</p><p><span class="rp-k">L’équipe</span>Le changement fixe le niveau : zéro, une ou deux personnes</p><p><span class="rp-k">Moi</span>Chaque pull request, moi</p></div>
</div>
<p class="mp-strip"><b>Ma file</b><span>C’est sur la dernière ligne qu’elle s’accumule. Le tableau des niveaux est la pièce qui la vise.</span></p>
<figcaption id="cr10-cap">Leurs couches à côté de ma boucle telle qu’elle est écrite sur /fr/ia.html. La ligne surlignée est celle qui diffère.</figcaption>
</figure>

## Essayez

L’article se termine par une checklist, et l’essentiel marche avec des outils que vous avez déjà :

- Avant la PR : donnez à votre agent des contrôles qu’il peut exécuter, listés dans un `CLAUDE.md` court, plus des hooks pour les formateurs et les linters. Lancez `/code-review` et `/security-review` en local, ou un sous-agent à contexte neuf. Commencez un `REVIEW.md` et déplacez-y les commentaires qui reviennent.
- Sur chaque PR : exigez la CI, ajoutez des sections Tests, Risques et Comment annuler au modèle de PR, mettez un relecteur IA sur un seul dépôt et ajustez `REVIEW.md` pendant quelques semaines avant d’élargir, et exigez que chaque fil de revue soit résolu. Plafonnez les tours, et ne relisez que le nouveau diff après les premiers.
- Approbation : écrivez des niveaux de risque fixés par le changement, commencez strict et assouplissez avec des preuves. Utilisez CODEOWNERS et la protection de branche pour que l’authentification, la facturation, la CI, les workflows de release et les installeurs exigent toujours une personne. Ne laissez jamais l’approbation d’un bot remplir une place humaine, et invalidez les approbations à chaque nouveau commit.
- Après le merge : une merge queue, des feature flags, l’usage interne d’abord, des déploiements progressifs et un retour arrière en une étape. Transformez les incidents et les reverts en jeu d’éval, et mesurez le temps humain avec les reverts comme garde-fou.

<figure class="fd-fig cr-adopt-fig" aria-labelledby="cr11-cap" data-desc="La checklist d’adoption de l’article, en quatre colonnes. Avant la pull request : des contrôles exécutables dans un CLAUDE.md court, des hooks pour les formateurs et les linters, les commandes code-review et security-review lancées en local, et un REVIEW.md pour les commentaires répétés. Sur chaque pull request : la CI obligatoire, des sections Tests, Risques et Comment annuler dans le modèle, un relecteur IA sur un seul dépôt d’abord, chaque fil résolu, et un plafond de tours avec une re-revue limitée au diff ensuite. Approbation : des niveaux de risque fixés par le changement, stricts d’abord puis assouplis avec des preuves, CODEOWNERS pour l’authentification, la facturation, la CI, la release et les installeurs, et des approbations de bot qui ne comptent jamais et sont invalidées à chaque nouveau commit. Après le merge : une merge queue et des feature flags, les utilisateurs internes d’abord puis des déploiements progressifs, un retour arrière en une étape, et les incidents et les reverts comme éval. En dessous : mesurer le temps humain par changement, avec les reverts et les incidents comme garde-fou.">
<ol class="cr-adopt">
<li><p class="cr-adopt-h"><b>1</b>Avant la PR</p><ul><li>Des contrôles exécutables dans un CLAUDE.md court</li><li>Des hooks pour formateurs et linters</li><li>/code-review et /security-review en local</li><li>Un REVIEW.md pour les commentaires répétés</li></ul></li>
<li><p class="cr-adopt-h"><b>2</b>Sur chaque PR</p><ul><li>CI obligatoire</li><li>Tests, Risques et Comment annuler dans le modèle</li><li>Un relecteur IA sur un dépôt d’abord</li><li>Chaque fil résolu, tours plafonnés</li></ul></li>
<li><p class="cr-adopt-h"><b>3</b>Approbation</p><ul><li>Niveaux fixés par le changement, stricts d’abord</li><li>CODEOWNERS pour auth, facturation, CI, release, installeurs</li><li>Les approbations de bot ne comptent jamais</li><li>Invalidées à chaque nouveau commit</li></ul></li>
<li><p class="cr-adopt-h"><b>4</b>Après le merge</p><ul><li>Merge queue et feature flags</li><li>Usage interne d’abord, puis progressif</li><li>Retour arrière en une étape</li><li>Incidents et reverts comme éval</li></ul></li>
</ol>
<p class="mp-strip"><b>Mesurer</b><span>Le temps humain par changement, avec les reverts et les incidents comme garde-fou.</span></p>
<figcaption id="cr11-cap">La checklist de la fin de l’article, raccourcie. L’ordre est le leur.</figcaption>
</figure>

Pour aller plus loin :

- [How the Claude Code team does code review](https://claude.dev/blog/solving-code-review-at-anthropic/), l’article, 14 minutes
- [L’article X d’Addy Osmani](https://x.com/addyosmani/status/2114604912520921136), le même article, réécrit
- [Code Review for Claude Code](https://code.claude.com/docs/en/code-review), la documentation
- [Claude Code best practices](https://code.claude.com/docs/en/best-practices), d’où vient l’habitude de faire vérifier son travail
- [Relisez le plan, pas la pull request](/fr/notes/review-the-plan-not-the-pull-request.html), la réponse d’Overmind au même problème

Choisissez une pièce cette semaine, un `REVIEW.md` ou un plafond de tours, et dites-moi ce que ça change à votre file de revue.
