Cinq portes qualité franchies, notées par l'agent qui avait écrit le code
L'agent a écrit le code, écrit ses tests, lancé les contrôles et annoncé cinq feux verts. Rien dans la chaîne n'était prévu pour demander qui contrôle le contrôleur.
5 portes qualité sur mes agents de code IA. Toutes franchies. Et toutes notées par l’agent qui avait écrit le code.
Pourquoi cela compte
L’agent a écrit le code, écrit ses tests, lancé les contrôles et rapporté les résultats. Les 5 au vert. Rien dans la chaîne n’était prévu pour poser la question : qui contrôle le contrôleur ?
Cela paraît philosophique jusqu’au jour où votre agent écrit un test qui est d’accord avec un bug. Le test passe. La porte annonce une réussite. L’humain voit du vert. Et personne ne l’attrape, parce que le seul témoin était celui qui l’avait écrit.
Des travaux présentés à NeurIPS en 2024 ont montré que les modèles de langage reconnaissent leurs propres textes et les notent plus haut parce qu’ils les reconnaissent. Ma chaîne portait ce biais dans sa boucle de notation, sans aucun moyen de le voir.
Un auditeur doit observer sans modifier ce qu’il audite.
Comment cela fonctionne
Trois agents Claude Code sur mesure : recherche, construction, relecture. La première version passait 5 portes avant tout commit. Quatre confirmaient la syntaxe, le style, les types et les motifs de vulnérabilité. La cinquième était pytest, qui notait des tests écrits par le même agent.
Un test que vous n’avez jamais vu échouer n’a rien prouvé. C’est cette phrase qui a mené à la refonte. J’ai ajouté trois portes que les cinq premières ne pouvaient pas voir. Celle qui compte ici, ce sont les tests de mutation : ils cassent la source exprès pour vérifier si la suite le remarque, et notent donc les tests plutôt que le code.
Puis la moitié la plus difficile. À la fin d’une session, un hook Stop relance 7 des 8 portes et refuse de clore en cas d’écart : le rapport de l’agent devient une observation plutôt qu’un verdict. Le formateur y tourne en mode vérification, sans rien écrire : un auditeur qui reformate le code a modifié la preuve.
Les tests de mutation sont la huitième porte, et le hook ne les relance pas. Muter tout l’arbre coûte une exécution de la suite par mutant. Google les limite au diff au moment de la revue pour cette raison, et j’ai écrit un script qui fait de même.
Un ingénieur sur une session attrape un rapport vert erroné. Des agents qui tournent sans surveillance ou en parallèle n’ont aucun lecteur de ce genre, et c’est ce cas-là qui mérite qu’on construise pour lui.
Où cela s’arrête : l’un de mes trois agents peut encore installer des paquets sans garde. Il ne peut ni committer, ni pousser, ni taguer, si bien que le rayon d’impact est un environnement cassé plutôt qu’une erreur publiée.