Comment bien rédiger un bon `CLAUDE.md`
(humanlayer.dev)- Comme un LLM est une fonction sans état,
CLAUDE.mdsert de document clé pour présenter la base de code à Claude à chaque session - Le fichier doit contenir de façon concise le WHAT (structure), le WHY (objectif) et le HOW (mode de fonctionnement) du projet, et un excès de commandes inutiles peut dégrader les performances
- Claude peut ignorer le contenu de
CLAUDE.mds’il estime, selon les consignes du message système, qu’il n’est pas pertinent - Un fichier efficace ne contient que des informations courtes et applicables de manière générale, tandis que les consignes détaillées doivent être séparées dans d’autres documents selon une approche de Progressive Disclosure
CLAUDE.mdétant le point d’impact le plus élevé du harnais d’agent, il faut l’écrire soigneusement à la main plutôt que de le générer automatiquement
Le caractère sans état des LLM et le rôle de CLAUDE.md
- Les LLM utilisent des poids figés au moment de l’inférence et ne conservent ni apprentissage ni mémoire entre les sessions
- Le modèle doit donc recevoir sous forme de tokens d’entrée toutes les informations nécessaires pour comprendre la base de code
- Les agents de code comme Claude Code doivent gérer explicitement la mémoire, et
CLAUDE.mdest le seul fichier automatiquement inclus dans toutes les conversations - Cela rend les trois points suivants indispensables
- Au début d’une session, Claude ne sait rien de la base de code
- Il faut lui redonner les informations nécessaires à chaque session
- Le moyen standard pour cela est
CLAUDE.md
Onboarding de la base de code : WHAT, WHY, HOW
CLAUDE.mdjoue le rôle de document d’onboarding pour aider Claude à comprendre le projet- WHAT : fournit une carte du code, comme la stack technique, la structure du projet ou l’organisation du monorepo
- WHY : explique l’objectif et la fonction de chaque composant
- HOW : précise comment exécuter les tâches concrètes comme le build, les tests ou le typecheck
- En revanche, lister toutes les commandes est inefficace ; il faut n’inclure que le strict minimum d’informations nécessaires
Pourquoi Claude ignore parfois CLAUDE.md
- Claude Code insère dans le message utilisateur un rappel système du type suivant
IMPORTANT: this context may or may not be relevant...- À cause de cela, Claude ignore ce contexte s’il juge qu’il n’est pas lié à la tâche en cours
- Plus le fichier contient de consignes peu universelles, plus il risque d’être ignoré
- On suppose qu’Anthropic a ajouté ce mécanisme parce qu’ignorer les consignes inutiles améliorait la qualité des résultats
Principes pour rédiger un bon CLAUDE.md
Less (instructions) is more
- Un LLM peut suivre de manière stable environ 150 à 200 consignes
- Plus le modèle est petit, plus la dégradation est brutale, et les tâches à plusieurs étapes lui conviennent moins
- Le prompt système de Claude Code contient déjà environ 50 consignes
CLAUDE.mdne doit donc contenir qu’un minimum de consignes universelles et indispensables
- Plus le nombre de consignes augmente, plus la qualité d’exécution de l’ensemble des consignes diminue de façon uniforme
Longueur du fichier et périmètre d’application
- Les LLM fonctionnent mieux avec un contexte concentré et fortement pertinent
- Comme
CLAUDE.mdest inclus dans toutes les sessions, il faut n’y conserver que des informations applicables de manière générale - En règle générale, il est recommandé de rester sous les 300 lignes, et si possible encore moins
- Le fichier d’exemple de HumanLayer fait moins de 60 lignes
Progressive Disclosure
- Dans les grands projets, il est difficile de tout mettre dans un seul fichier, d’où la recommandation d’une approche de Progressive Disclosure
- Les consignes détaillées sont séparées dans des fichiers Markdown distincts du dossier
agent_docs/ - Exemples :
building_the_project.md,running_tests.md,code_conventions.md, etc.
- Les consignes détaillées sont séparées dans des fichiers Markdown distincts du dossier
CLAUDE.mdne doit contenir que la liste de ces fichiers et une brève description, ainsi qu’une instruction indiquant à Claude de les lire si nécessaire- Il vaut mieux utiliser des références
file:lineplutôt que des extraits de code afin de garder les informations à jour - Cette approche ressemble au concept de Claude Skills, mais elle met l’accent sur la gestion des consignes plutôt que sur l’usage des outils
Claude n’est pas un linter
- Inclure des règles de style de code dans
CLAUDE.mdest inefficace- Les LLM sont coûteux, lents et moins déterministes qu’un linter
- Les règles de style sont apprises naturellement à partir des motifs du code existant, sans qu’il soit nécessaire d’ajouter des consignes spécifiques
- Pour le formatage, mieux vaut utiliser des linters auto-correctifs (comme Biome) et ne transmettre à Claude que le résultat des corrections
- Si nécessaire, on peut automatiser le formatage et la validation avec un Stop Hook ou une Slash Command
Pas de génération automatique
- Un
CLAUDE.mdcréé avec la commande/initou une fonctionnalité de génération automatique est déconseillé- Ce fichier est en effet un point à fort levier qui influence toutes les sessions et tous les livrables
- Une seule ligne de consigne erronée peut avoir un effet en chaîne négatif sur la qualité globale du code
- Il faut donc relire soigneusement chaque phrase et rédiger le document à la main
Conclusion
CLAUDE.mdest un document destiné à onboarder Claude sur la base de code, et il doit définir clairement les WHY, WHAT et HOW- Il faut réduire au minimum les consignes et ne conserver que des contenus universels et concis
- L’approche Progressive Disclosure permet de fournir les informations nécessaires par étapes
- Il ne faut pas utiliser Claude comme linter, mais l’associer à des outils dédiés ainsi qu’à des hooks et commandes
- Plutôt que la génération automatique, il faut privilégier une rédaction manuelle soigneuse afin de maximiser la qualité globale du harnais
1 commentaires
Avis Hacker News
Claude a parfois tendance à ignorer les instructions de CLAUDE.md
Plus le fichier contient d’informations sans rapport avec la tâche en cours, moins Claude suit ces consignes
Un ami avait demandé à Claude de l’appeler « Mr Tinkleberry », et quand Claude l’oubliait, c’était un bon indicateur qu’il ignorait le fichier
J’utilise depuis longtemps l’approche table des matières
Je sépare les consignes par tâche dans des fichiers markdown distincts, et je ne mets dans CLAUDE.md que leur liste avec une brève description
Cela permet de garder la fenêtre de contexte propre
On peut voir mon exemple de fichier ici
Claude lisait très rarement les autres fichiers de documentation
J’ai l’impression que donner trop de contexte à Claude finit par dégrader la qualité
Du coup, je maintiens toujours deux versions du code
Je ne donne au LLM que la première version
Je pense que le point clé, c’est le ratio calcul / information. La capacité de calcul est limitée
Il n’est pas nécessaire d’y mettre absolument tout, mais y mettre les informations essentielles avait un ROI élevé
Claude fonctionne bien sur des projets classiques, mais il se perd souvent avec de nouveaux frameworks ou outils
J’aimerais savoir si tu utilises un script qui enlève les commentaires et les espaces après les modifications
En réalité, il existe une solution même sans toute cette configuration complexe
C’est tout simplement de documenter clairement le code
Si chaque fichier explique brièvement ce qu’il fait, cela sert déjà de prompt
Il suffit d’utiliser README.md de manière active
Les LLM ont déjà été entraînés sur des informations publiques, donc il n’y a pas besoin d’inventer quelque chose de nouveau
Le simple conseil « documentez bien votre code » n’est pas adapté à ce contexte
README est utile, mais CLAUDE.md a un autre objectif
Par exemple, Claude/agents.md peut être automatiquement injecté dans le contexte lors de l’accès à un répertoire donné
Dans des bases de code complexes, la gestion du contexte devient bien plus importante
Donc le conseil « il suffit d’écrire un bon prompt » passe à côté de l’essentiel
Si on la met dans le README, cela finit par jouer le même rôle que CLAUDE.md
Le but de CLAUDE.md est de fournir à l’avance les informations clés pour que Claude n’ait pas à relire toute la documentation à chaque fois
Les humains se souviennent, mais Claude oublie à chaque tâche, donc il faut une structure qui réduise le ré-onboarding
Franchement, s’il faut aller jusqu’à mettre en place une infrastructure IA de ce niveau, j’ai l’impression qu’il vaut mieux coder moi-même
Je gère séparément les règles communes et les règles spécifiques à chaque projet
Ne pas utiliser l’IA, c’est simplement une perte de productivité
Si la configuration n’est nécessaire qu’une seule fois, l’investissement vaut largement le coup
Dire que « la configuration est pénible », c’est un peu comme les excuses de ceux qui évitent de configurer leur débogueur
Moi, je copie-colle simplement le code nécessaire dans la fenêtre de discussion et je m’en sers comme dans une conversation
Les modèles se sont tellement améliorés ces derniers temps qu’on obtient déjà des résultats tout à fait corrects sans fichier .md
Ces fichiers apportent peut-être une légère amélioration, mais je ne pense pas que ce soit une magie de productivité x100
Ici, on parle de situations où Claude réalise lui-même une implémentation complète ou corrige un bug
Il suffit de donner le contexte nécessaire pour que ça marche très bien. Ça ressemble un peu à du bikeshedding
Moi, je demande à Claude de rédiger lui-même CLAUDE.md
Si on lui dit « README.md est pour les utilisateurs, CLAUDE.md est pour toi »,
il met aussi automatiquement à jour des consignes comme « vérifie toujours la documentation de l’API »
Pas besoin de connaître un prompt magique tant que le résultat est bon
Rien ne dit vraiment qu’une IA sache mieux se prompter elle-même