diffox
Blog

L’architecture de diffox : 17 agents spécialisés, quatre étapes

diffox répartit une revue de code par IA entre 17 agents spécialisés. Chaque constat cite le code ; la citation est vérifiée par du code, pas par un modèle.

PartagerXLinkedIn

En bref. diffox est un outil de revue de code par IA qui examine les pull requests sur GitHub. Chaque review passe par quatre étapes ; cet article explique ce qui se passe à chacune, et pourquoi. Nous avons mesuré les résultats dans les deux premiers articles : diffox ultra est premier des 23 outils du benchmark de Martian ; une review de diffox coûte $0,41.

  • Contexte et orientation. diffox rassemble le changement, ses fichiers avant et après, et les règles que vous avez écrites. La nature du changement et son risque déterminent quels agents spécialisés le liront.
  • Analyse spécialisée. L’équipe compte 17 agents spécialisés. Chacun cherche une seule chose et appuie ce qu’il trouve sur une citation exacte du code.
  • Vérification des preuves. C’est du code, et non un modèle, qui contrôle chaque constat. Le code cité est-il vraiment dans ce fichier ? Le constat porte-t-il sur ce que cette pull request a changé ? Le même problème a-t-il été signalé deux fois ?
  • Choisir et publier. Chaque constat a une classe : Critique, Avertissement ou Suggestion. La pull request reçoit ce que vous devez corriger : les constats critiques et les avertissements. Les suggestions ne se perdent pas, elles attendent sur la page Constats. Une review ne bloque jamais un merge.

Comment se déroule une review

17agents spécialisés
4étapes
3classes de constats
6langues de review

Pour examiner un changement, le plus rapide est de demander à un modèle : « Y a-t-il un bug ici ? » diffox ne procède pas ainsi. Il fait lire le même changement par plusieurs agents spécialisés : l’un traque les erreurs de logique, un autre les problèmes de concurrence, un troisième regarde si un test teste vraiment quelque chose. Chaque agent a une mission étroite et bien définie. Deux étapes suivent. Des vérifications rattachent chaque constat au fichier lui-même plutôt qu’à la parole du modèle, puis une sélection décide de ce qui est publié.

4 étapes, une review: Une pull request passe par quatre étapes avant de devenir des commentaires. 1. Contexte et orientation: diffox rassemble le changement et choisit les agents. 2. Analyse spécialisée: Les agents choisis le lisent ; chacun cherche une seule chose. 3. Vérification des preuves: Chaque constat est confronté au code sur lequel il repose. 4. Choisir et publier: Les constats retenus sont publiés sous leur ligne.
Les quatre étapes d’une review. Une version interactive est disponible sur notre page d’accueil.

Nous avons mesuré ce que donne cette architecture dans le premier article : sur le benchmark de Martian (50 pull requests), diffox ultra a détecté 119 des 158 bugs connus et diffox 106. Le coût est détaillé dans le deuxième article. Voici maintenant les quatre étapes, dans l’ordre.

Ce que voient les agents, et lesquels interviennent

Une review démarre sans que vous ayez à la demander : à l’ouverture d’une pull request et à chaque nouveau push. diffox publie d’abord sur la pull request un commentaire indiquant que la review a commencé ; une fois la review terminée, ce même commentaire affiche le résultat. Avant que les agents spécialisés voient le changement, deux questions sont tranchées : que leur présenter, et lesquels appeler.

Étape 1, Contexte et orientation. Pas seulement le diff : le changement et son contexte. Les agents spécialisés reçoivent quatre choses. Vos règles viennent de la branche où la pull request sera fusionnée. diff: les lignes modifiées; fichiers: avant et après; description: titre, texte, messages de commit; vos règles: AGENTS.md ou CLAUDE.md.
Première étape : le contexte présenté aux agents spécialisés.

Chacune des quatre parties répond à une question différente. Le diff dit ce qui a changé. Les fichiers, avant et après, montrent où se situe le changement. Le titre, la description et les messages de commit disent ce que l’auteur voulait faire. Et AGENTS.md ou CLAUDE.md, si votre dépôt en contient un, indique les règles que suit votre équipe.

Le fichier de règles est lu sur la branche dans laquelle la pull request sera fusionnée, pas sur la branche de la pull request elle-même. Une pull request ne peut donc pas modifier les règles de sa propre review : un changement du fichier de règles ne s’applique qu’une fois fusionné. Les fichiers de verrouillage, le code tiers comme vendor/ et node_modules/, et les fichiers minifiés ne sont pas examinés.

Vient ensuite l’orientation. diffox détermine la nature du changement (correction de bug, nouvelle fonctionnalité, refactoring, migration, test…) et évalue son risque : combien de fichiers il touche, s’il affecte d’autres fichiers, s’il est accompagné de tests. Certains agents lisent tous les changements ; d’autres n’interviennent que si leur sujet est concerné. Si aucune ligne n’a été supprimée, l’agent qui cherche les comportements retirés n’a rien à faire. Si aucun test n’a été touché, l’agent qui cherche les tests vides non plus.

Quand un nouveau push arrive sur la même pull request, diffox ne lit que le nouveau changement.

Chaque agent spécialisé cherche une seule chose

À la deuxième étape, les agents spécialisés lisent le changement. L’équipe compte 17 agents, répartis en deux types selon ce qu’ils cherchent.

Étape 2, Analyse spécialisée. 17 agents spécialisés, un changement. Chacun cherche une seule chose et montre ce qu’il a trouvé par une citation du code. 12 agents cherchent des bugs: Logic Agent, Null Path Agent, Race Agent, Silent Failure Agent, Data Integrity Agent, Security Agent, Blast Radius Agent, Regression Agent, Safety Net Agent, Hot Path Agent, Naming Agent, House Rules Agent. 5 agents cherchent des contradictions: Broken Promise Agent, Dead Code Agent, Stale Contract Agent, Lost Behaviour Agent, Empty Test Agent.
Deuxième étape : les 17 agents spécialisés de l’équipe, sous les noms qu’ils portent dans les commentaires de pull request.

12 agents cherchent des bugs : du code qui donne un résultat faux à l’exécution. 5 cherchent des contradictions : des endroits où le code ne concorde pas avec le commentaire, le test ou le document qui l’accompagne. Chaque agent a ses propres consignes ; tous lisent le même changement et le même contexte.

Pour être pris en compte, un constat doit dire trois choses : ce qu’il affirme, ce qui tourne mal et dans quelle situation, et le code sur lequel repose l’affirmation, cité mot pour mot. Un constat de contradiction apporte deux citations : le code et le texte qui le contredit. S’il en manque une, le constat n’est pas pris en compte.

Un commentaire de constat d’exemple : diffox, avec le badge Logic Agent, a commenté sous la ligne modifiée. Ligne : if (attempt > MAX_RETRIES) return; Titre : La condition limite autorise une tentative de trop. Quand attempt vaut MAX_RETRIES , la boucle s’exécute encore une fois : 4 tentatives au lieu de 3. À côté : Chaque constat dit trois choses. Citation: Une ligne copiée telle quelle du code. Affirmation: Ce qui est faux. Scénario: Ce qui tourne mal, et dans quelle situation.
Les trois parties d’un constat, sur un commentaire d’exemple.

Les agents ne donnent pas de numéro de ligne. Les modèles de langage ne comptent pas les lignes de façon fiable ; diffox demande donc au modèle la citation plutôt que le numéro, puis trouve la ligne lui-même en cherchant la citation dans le fichier. Ainsi, qu’un constat tombe sous la bonne ligne ne dépend pas de ce que dit le modèle.

Des détecteurs à base de règles tournent en parallèle des agents spécialisés. Ils n’utilisent aucun modèle et cherchent avec des règles exactes : un identifiant qui a fuité dans le code, une méthode définie deux fois dans la même classe, une branche qui ne peut jamais être atteinte.

Toute l’équipe, et ce que cherche chaque agent :

17 agents spécialisés, le type de chacun et ce qu’il cherche
AgentTypeCe qu’il cherche
➗  LogicBugTraque les décalages d'une unité, les conditions aux limites, les conditions inversées, les mauvais opérateurs et les contrats de fonction non respectés.
⭕  Null PathBugTraque une valeur qui peut être absente là où le code la lit comme présente : un None, un null ou un résultat vide utilisé comme s'il contenait quelque chose.
🔀  RaceBugTraque les situations de concurrence, les interblocages, les séquences lecture-modification-écriture non atomiques, l'état partagé non protégé et les problèmes d'ordre des verrous.
🔇  Silent FailureBugTraque les exceptions avalées, les catch trop larges, les valeurs de retour ignorées et les faux replis qui masquent les erreurs.
💾  Data IntegrityBugTraque les schémas incohérents, les migrations non rétrocompatibles, les écritures perdues et les opérations non idempotentes.
🔓  SecurityBugTraque les injections, l'authentification et l'autorisation cassées, les fuites de secrets, les SSRF et la désérialisation ou la gestion de chemins non sûres.
💥  Blast RadiusBugTraque les appelants cassés, les surfaces d'API modifiées et les changements de signature ou de type de retour qui cassent d'autres fichiers du changement.
🐛  RegressionBugTraque le retour de motifs de bugs déjà corrigés dans ces fichiers.
🥅  Safety NetBugTraque une rupture de contrat entre le changement et les tests qui le couvrent : un comportement vérifié par un test et modifié par ce diff sans mise à jour du test.
🔥  Hot PathBugTraque les requêtes N+1, les allocations inutiles sur les hot paths et les régressions algorithmiques.
🏷️  NamingBugNe traque que quatre cas démontrables : une faute de frappe dans un identifiant, contredite par un voisin du même diff, deux orthographes d'une même clé, un libellé qui nomme la mauvaise chose, un test nommé d'après ce qu'il n'exécute jamais.
📐  House RulesBugTraque les lignes de ce diff qui enfreignent les règles de review que le dépôt a écrites lui-même dans AGENTS.md ou CLAUDE.md, s'il en a.
💬  Broken PromiseContradictionTraque le texte qui fait une promesse que le code voisin ne tient pas : un commentaire, une docstring ou un README qui annonce ce que le code ne fait pas.
🪦  Dead CodeContradictionTraque le code dont l'effet ne peut pas être observé : inaccessible après ce changement, ou dupliqué.
📜  Stale ContractContradictionTraque une déclaration modifiée ici alors que du code visible repose encore sur son ancienne forme.
🗑️  Lost BehaviourContradictionTraque un comportement que ce changement a supprimé sans le remplacer, et demande si quelque chose en dépend encore.
📭  Empty TestContradictionTraque un test qui ne teste pas ce qu'il prétend tester : il passerait quoi que fasse le code.

Le commentaire d’un constat porte le symbole et le nom de l’agent qui l’a trouvé, par exemple ➗ Logic Agent.

Comment chaque constat est vérifié sur le code

Un modèle de langage peut écrire quelque chose de convaincant et pourtant faux : il cite une ligne absente du fichier, conteste du code que cette pull request n’a pas touché, ou formule le même problème trois fois en trois phrases différentes. La troisième étape rattache donc chaque constat au fichier lui-même, et non à la parole du modèle.

Étape 3, Vérification des preuves. Le code vérifie, pas le modèle. Avant d’être publié, un constat est confronté au code sur lequel il repose. Les trois vérifications sont du code ordinaire. Anchor Verifier: La citation est-elle dans le fichier, sur une ligne modifiée par cette pull request ? Second Witness: La même objection a-t-elle été soulevée deux fois au même endroit ? Elle devient un seul constat. Verbatim Matcher: La seconde citation existe-t-elle vraiment ? Elle est cherchée mot pour mot.
Troisième étape : trois vérifications qui rattachent un constat au fichier lui-même.

Ces vérifications sont du code ordinaire, pas un appel à un modèle : la même entrée donne toujours la même réponse.

  • Anchor Verifier. La citation du constat est recherchée dans le fichier. Une citation introuvable ne désigne aucune ligne. Si la ligne trouvée ne fait pas partie de ce que cette pull request a changé, le constat est hors périmètre.
  • Second Witness. Les constats qui soulèvent la même objection au même endroit sont fusionnés en un seul : on ne vous signale pas deux fois le même problème. Et quand plusieurs sources désignent un même endroit, cela joue en faveur du constat.
  • Verbatim Matcher. La seconde citation d’un constat de contradiction est elle aussi recherchée mot pour mot : dans le changement, les fichiers, la description de la pull request, les messages de commit et votre fichier de règles. Si le modèle prétend qu’un commentaire dit quelque chose qu’il ne dit pas, cela se voit ici.

Une autre vérification s’ajoute : un constat qui affirme qu’une valeur peut être vide est réfuté si le type de la valeur, ou un contrôle quelques lignes plus haut, l’exclut déjà.

Quels constats sont publiés

Après les vérifications, il reste une liste de candidats. La quatrième étape décide lesquels publier sur la pull request.

Étape 4, Choisir et publier. La pull request reçoit ce que vous devez corriger. Les suggestions ne se perdent pas : elles attendent 30 jours sur la page Constats, et vous publiez celles que vous voulez. Sur la pull request: Critique, Avertissement. Sur la page Constats: Suggestion.
Quatrième étape : les classes publiées sur la pull request et la classe qui attend sur la page Constats, avec les marques qu’elles portent.

Attention Ranker répond à une seule question pour chaque candidat : quelle est la probabilité que ce constat soit un bug réel ? Le score tient compte de la gravité et du type du constat, du résultat des vérifications de preuves, et du fait que d’autres constats désignent ou non le même endroit. Parmi des constats situés sur des lignes voisines, seul le plus solide est publié.

Sur la pull request, vous ne voyez que ce qui doit être corrigé : les constats critiques et les avertissements. Les suggestions attendent sur la page Constats, sans réglage à faire de votre côté.

Nous avons mesuré les chiffres ci-dessous sur le même benchmark, avec trois réglages de sensibilité. Ce réglage était un seuil appliqué à un score. Élevée a détecté le plus de bugs. Moyenne et Faible relevaient le seuil : diffox publiait moins de constats, et il était plus sûr de ceux qu’il publiait.

Bugs réels détectés et fausses alertes sur 50 pull requests, aux trois réglages de sensibilité de l’époque
Sensibilitédiffoxdiffox ultra
Bugs réelsFausses alertesBugs réelsFausses alertes
Élevée106132119144
Moyenne89559851
Faible59197019

Benchmark de Martian : 50 pull requests, 158 bugs connus, juge Claude Opus 4.5. Sensibilité élevée : notre exécution publique, 7 octobre 2026. Moyenne et faible : notre mesure interne sur les mêmes 50 pull requests, moyenne de 5 exécutions pour diffox ultra et de 2 pour diffox.

Rien de ce qui n’est pas publié sur la pull request n’est perdu : ces constats attendent 30 jours sur votre page Constats, dans la console, et vous pouvez publier n’importe lequel depuis cette page.

La publication comprend deux parties : un commentaire de synthèse sur la pull request et, pour chaque constat, un commentaire juste sous la ligne concernée. Quand un constat peut être corrigé, il est accompagné d’une correction suggérée que GitHub applique en un clic ; le commit est fait en votre nom. Les titres et les corrections suggérées sont rédigés après la sélection, uniquement pour les constats qui seront publiés. La review arrive dans la langue de votre équipe. La dernière ligne de la synthèse indique le prix de la review, sa durée et le commit lu.

Le statut de diffox sur une pull request ne passe jamais au rouge : c’est votre équipe qui décide de fusionner. À chaque 👍 et 👎 sur ses commentaires, diffox apprend à mieux vous connaître, vous et votre dépôt, et ses reviews s’ajustent peu à peu à votre équipe.

Ce que diffox ultra fait différemment

diffox ultra passe par les mêmes quatre étapes ; la différence se joue à la deuxième et à la quatrième. Deux modèles distincts lisent le changement, chacun menant sa propre review du début à la fin. Les deux reviews tournent en parallèle et sont publiées comme une seule. À l’étape de sélection intervient aussi un troisième modèle, un petit modèle de décision : il n’écrit aucun texte et répond par oui ou par non à des questions sur chaque constat. La sélection note les constats des deux reviews en tenant compte de ces réponses ; quand les deux modèles désignent le même endroit, cela joue en faveur du constat. Après la sélection, le modèle de décision repère les constats qui remontent à la même cause et les regroupe en un seul.

Le résultat est dans les deux premiers articles : diffox ultra a détecté 119 des 158 bugs connus et diffox 106 ; une review de diffox ultra coûte en moyenne $1,64, une review de diffox $0,41.

Questions fréquentes

Pourquoi diffox utilise-t-il des agents spécialisés ?

« Y a-t-il un bug ici ? » est une question large, et la réponse l’est tout autant. Chaque agent spécialisé cherche une seule chose et doit appuyer ce qu’il trouve sur une citation du code. On sait ainsi de quel agent vient chaque constat.

Puis-je donner mes propres règles de review à diffox ?

Oui. Les règles que vous écrivez dans AGENTS.md ou CLAUDE.md, à la racine de votre dépôt, sont lues à chaque review, et un agent dédié cherche les lignes qui les enfreignent. Elles sont lues sur la branche dans laquelle la pull request sera fusionnée : si une pull request modifie le fichier de règles, la modification s’applique une fois la pull request fusionnée.

À quoi servent les 👍 et les 👎 ?

À chaque réaction, diffox apprend à mieux vous connaître, vous et votre dépôt : il comprend ce qui compte pour vous et ce qui n’est que du bruit. Ses reviews s’ajustent peu à peu à votre équipe.

diffox bloque-t-il un merge ?

Non. Le statut de diffox sur une pull request ne passe jamais au rouge et ce n’est pas une vérification obligatoire ; votre équipe fusionne quand elle le veut.

Toute la pull request est-elle réexaminée à chaque push ?

Non. diffox examine automatiquement chaque push, mais ne lit que le nouveau changement. Après les 5 premiers push, il n’examine que lorsque vous le demandez ; vous pouvez modifier ce nombre dans la console.

Pourquoi les suggestions ne sont-elles pas publiées sur la pull request ?

Dans nos mesures, publier aussi les suggestions ajoutait des commentaires à la pull request et faisait baisser la part de bugs réels parmi eux. La pull request reçoit donc les constats critiques et les avertissements. Les suggestions ne se perdent pas : elles attendent 30 jours sur la page Constats, et vous publiez celles que vous voulez depuis cette page.

diffox conserve-t-il mon code ?

Non. diffox ne conserve pas de copie du code analysé ; la copie du dépôt est supprimée à la fin de l’analyse. Les services utilisés sont indiqués sur notre page de confidentialité.

La suite : le modèle de décision

Le quatrième article décrit le modèle de décision que diffox ultra utilisait alors à la quatrième étape, et la règle que nous avons tirée de nos mesures : Comment nous utilisons Jev en revue de code par IA.