Si vous utilisez Claude au quotidien, vous avez probablement remarqué qu’il revient toujours aux mêmes tournures. « Load-bearing », « honest take », « you’re absolutely right » : ces expressions finissent par taper sur les nerfs. Bonne nouvelle : il existe une solution technique directement dans Claude Code.
Pourquoi Claude répète-t-il toujours les mêmes expressions ?
Ce phénomène n’est pas un bug isolé. C’est un effet de bord du fine-tuning par renforcement humain (RLHF). Les modèles comme Claude apprennent à maximiser l’approbation humaine, et certaines formulations finissent par revenir en boucle parce qu’elles ont été renforcées pendant l’entraînement.
Les développeurs qui utilisent Claude dans des workflows professionnels ressentent rapidement cette limite. Le modèle semble compétent, mais son registre stylistique reste figé. Difficile de lui faire adopter un ton différent via de simples instructions en langage naturel.
Johanna Larsson a publié sur jola.dev une solution concrète et immédiatement applicable. L’article a obtenu 463 points sur Hacker News avec 519 commentaires, ce qui confirme que la frustration est largement partagée.
La solution : le hook MessageDisplay de Claude Code
Claude Code expose un mécanisme de hooks configurables. Ces hooks permettent d’intercepter les sorties du modèle avant qu’elles ne s’affichent, et d’y appliquer des transformations. C’est exactement ce dont on a besoin pour filtrer un vocabulaire indésirable.
La méthode repose sur trois éléments :
- Un script Python qui lit la sortie JSON de Claude, applique des substitutions d’expressions, puis renvoie le texte modifié
- Un fichier exécutable placé dans
~/.claude/hooks/ - Une entrée dans
~/.claude/settings.jsonpour connecter le hook à l’événementMessageDisplay
Écrire le script de remplacement
Voici le script proposé par Johanna Larsson, légèrement commenté pour la clarté :
#!/usr/bin/env python3
import json, re, sys
replacements = {
"seam": "whatchamacallit",
"you're absolutely right": "I'm a complete clown",
"honest take": "spicy doodad",
"load-bearing": "cooked"
}
data = json.load(sys.stdin)
text = data.get("delta") or ""
for phrase, replacement in replacements.items():
pattern = r"\b" + re.escape(phrase) + r"\b"
text = re.sub(pattern, replacement, text, flags=re.IGNORECASE)
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "MessageDisplay",
"displayContent": text,
}
}))
Sauvegardez ce script dans ~/.claude/hooks/wordswap.sh et rendez-le exécutable :
chmod +x ~/.claude/hooks/wordswap.sh
Connecter le hook à Claude Code
Ouvrez votre fichier ~/.claude/settings.json et ajoutez le bloc suivant dans la section hooks :
{
"hooks": {
"MessageDisplay": [
{
"hooks": [
{
"type": "command",
"command": "$HOME/.claude/hooks/wordswap.sh"
}
]
}
]
}
}
Les hooks se chargent au démarrage de session. Il suffit d’ouvrir une nouvelle session Claude Code pour que les remplacements soient actifs.
Aller plus loin : contraindre Claude avec des outils externes
La méthode des hooks illustre une tendance plus large chez les développeurs : ne plus faire confiance aux instructions en prose pour contrôler le comportement du modèle, mais utiliser des outils externes et reproductibles.
Un article de zernie.com, également remarqué sur Hacker News, pousse cette logique encore plus loin. Il propose de remplacer les règles stylistiques dans CLAUDE.md par de vraies règles de linting. L’idée est simple : si vous voulez qu’un comportement soit fiable, ne le confiez pas à une instruction en langage naturel. Codifiez-le dans un outil qui ne laisse pas de place à l’interprétation.
Ces deux approches se complètent bien. Les hooks interceptent la sortie en temps réel. Le linting agit en amont sur le code ou le texte produit. Ensemble, ils permettent de reprendre un contrôle granulaire sur ce que Claude génère réellement.
Ce qu’il faut retenir
- Claude tend à répéter des expressions caractéristiques à cause du RLHF : c’est structurel, pas aléatoire.
- Le hook
MessageDisplayde Claude Code permet d’intercepter et de remplacer ces expressions avant affichage, via un simple script Python. - La configuration se fait dans
~/.claude/settings.jsonet s’active au démarrage d’une nouvelle session. - Adapter le dictionnaire de remplacements à vos propres irritants est immédiat : il suffit de modifier le script.
- La tendance de fond est claire : les développeurs préfèrent contraindre les LLM par des outils plutôt que par des prompts, surtout en production.
Si vous travaillez avec Claude dans des pipelines professionnels, ces mécanismes méritent d’être explorés sérieusement. Vous avez une approche différente pour contrôler le comportement stylistique de vos modèles ? Je suis curieux d’en discuter, n’hésitez pas à me contacter ou à suivre le blog pour les prochains articles sur le sujet.
Sources
- How to stop Claude from saying load-bearing – jola.dev – Article original de Johanna Larsson avec le code complet
- Fil Hacker News – HN 48905248 – Discussion communautaire (463 points, 519 commentaires)
- zernie.com – Use real linting rules instead of CLAUDE.md prose – Approche complémentaire par linting
- Documentation Claude Code – Hooks – Référence officielle Anthropic sur le mécanisme de hooks
