TL;DR : les consignes écrites dans un CLAUDE.md sont des recommandations, un hook est une loi. En branchant un script de trente lignes sur l’événement Stop, Claude Code relit votre liste d’erreurs connues avant chaque fin de réponse, et se corrige tout seul. Testé chez nous, ça marche, avec une limite qu’on vous montre aussi.
Quiconque travaille avec un agent de code connaît le cycle : on lui signale une erreur, il s’excuse, il la corrige, et il la refait la semaine suivante. Écrire la consigne dans un fichier d’instructions aide, mais ne suffit pas : une instruction textuelle finit noyée dans le contexte. Un article de XDA propose une parade qui nous a paru assez simple pour être essayée dans l’heure.
Le principe : bloquer la sortie, une fois
Claude Code expose des hooks, des commandes qui s’exécutent à des moments précis. Celui qui nous intéresse est Stop : il se déclenche quand l’agent estime avoir fini. Le script reçoit un JSON, et s’il répond {"decision": "block", "reason": "..."}, l’agent ne rend pas la main : il lit la raison comme une consigne et continue.
Le nôtre tient en trois gestes : à la première tentative d’arrêt, bloquer et exiger une relecture du fichier mistakes.md ; au second passage, reconnaître le champ stop_hook_active et laisser passer, sinon la boucle serait infinie.
if echo "$INPUT" | jq -e '.stop_hook_active == true' > /dev/null; then
exit 0 # relecture déjà faite, on laisse passer
fi
jq -n '{decision: "block",
reason: "Relis mistakes.md et vérifie ta réponse contre chaque point avant de terminer."}'
Le fichier mistakes.md est votre mémoire des erreurs passées, une ligne par erreur. Le nôtre en avait quatre, dont « jamais de division sans traiter le diviseur zéro ».
Ce que ça donne chez nous
Nous avons demandé une fonction qui calcule un pourcentage. Premier jet : la division arrive sans garde-fou, exactement l’erreur de la liste. Le hook bloque, exige la relecture, et Claude passe sa propre copie en revue, point par point : trois coches vertes, une croix rouge, puis il corrige le fichier et ajoute le contrôle du zéro. 19 secondes entre le blocage et la version corrigée, sans qu’on ait rien dit.

Et maintenant, l’envers, parce qu’il vaut la démonstration. La fonction corrigée était toujours fausse : une coquille d’arrondi lui faisait rendre 5 là où on attend 50. Le hook n’a rien vu, et c’est normal : le filet n’attrape que ce qu’on a mis dedans. Cette erreur-là n’était pas sur la liste. Elle y est maintenant, et c’est exactement comme ça que l’outil se bonifie : chaque erreur payée une fois devient une ligne.
À qui ça sert
À tous ceux dont l’agent a déjà refait deux fois la même bêtise, c’est à dire tout le monde. Ce site tient un fichier de règles apprises qui en compte trente-trois, chacune payée par une vraie erreur : ce hook est la version mécanique de ce réflexe. La relecture n’est plus une discipline qu’on espère, c’est une étape qu’on impose. Et si vous confiez de l’autonomie à votre agent, les garde-fous restent de rigueur : un hook qui relit une liste ne remplace pas un humain qui relit le résultat.
Rien à installer : un fichier settings.json, un script Bash, jq que votre machine a sans doute déjà. Le tout se pose en dix minutes et s’oublie, ce qui est la meilleure qualité d’un garde-fou.