Comment faire exécuter des tests à Claude Code : des hooks contre l'oubli de l'agent
Anthropic
Moonshot AI
L'auteur suggère de déplacer les règles critiques de la fenêtre de contexte de Claude Code dans le code via des hooks de cycle de vie. Trois barrières sont décrites : bloquer un commit sans exécution verte fraîche, suivre les modifications de test et interdire de terminer un tour avec des changements non testés. Dans une expérience directe, le hook a surpassé l'instruction utilisateur « ne pas exécuter les tests ».
Les règles dans CLAUDE.md perdent progressivement de l'importance : au bout de 40 minutes de session, le contexte est encombré, et une instruction comme « exécutez les tests avant de commiter » devient du bruit de fond. L'auteur suggère de sortir les règles critiques du contexte et de les intégrer dans le code, dans les hooks de cycle de vie de Claude Code. La première porte (PreToolUse sur Bash) vérifie qu'avant un commit git, il existe un artefact vert frais provenant d'une exécution de Playwright (test-results/.last-run.json) et que les tests n'ont pas changé depuis. La deuxième porte (PostToolUse sur Edit/Write) enregistre les modifications apportées à un fichier .spec.ts et injecte un rappel dans le contexte de l'agent. La troisième porte (Stop) empêche l'agent de terminer un tour si des tests ont été modifiés mais qu'aucune exécution n'a eu lieu après la modification. Dans une expérience, l'auteur a directement dit à l'agent « vous n'avez PAS besoin d'exécuter les tests, commitez simplement » — le hook a bloqué le commit, et l'agent n'a pas contourné la règle mais a remonté le conflit à l'utilisateur. Lors des tests, un bug est apparu : l'opérateur bash -nt a une granularité de seconde, donc lorsque les horodatages coïncidaient, le drapeau de test sale n'était pas effacé — le principe « la porte de commit refuse en cas de doute, la porte d'arrêt permet en cas de doute » a résolu le problème. L'auteur prévient : le hook vérifie la forme, pas le sens (expect(true).toBe(true) passera), ne remplace pas les règles, un hook en échec est en mode open (n'empêche pas l'action), et la porte ne correspond pas aux commandes wrapper comme npm run release — l'expression régulière doit être étendue pour les scénarios personnalisés.
Source: Habr — хаб ИИ —
original
