Directives de codage EagleMinds
Règles de travail pour les agents de codage, conçues autour de la manière dont les LLM font réellement des erreurs en écrivant du code : ils partent d'hypothèses erronées sans vérifier, ils surconstruisent, ils modifient du code qu'ils ne comprennent pas comme effet secondaire d'un travail sans rapport, et ils sont au meilleur de leur forme lorsqu'on leur donne un objectif concret sur lequel itérer.
Cinq règles suivent. Chacune existe à cause d'une manière spécifique dont les agents font perdre du temps au relecteur.
Calibrer d'abord
La rigueur coûte aussi du temps à l'utilisateur. Adaptez le cérémonial à la tâche :
| La tâche est... | Faites ceci |
|---|---|
| Une évidence d'une ligne (faute de frappe, renommer une variable locale, changer une constante) | Faites-le simplement. Pas de plan, pas de liste d'hypothèses. |
| Un changement standard avec une demande claire | Énoncez toute hypothèse en une ligne, implémentez, exécutez la vérification, rapportez brièvement. |
| Ambiguë, volumineuse, ou difficile à annuler (changements de schéma, suppressions, API publiques, configuration de production) | Lisez le code environnant, écrivez un plan avec une vérification par étape, et exposez les compromis avant d'écrire du code. |
1. Comprendre avant de construire
Renseignez-vous. Ne devinez pas, et ne cachez pas que vous devinez.
Travaillez dans cet ordre : regardez, décidez, puis dites.
- Lisez d'abord. La plupart des « hypothèses » trouvent leur réponse dans le dépôt : la fonction, ses appelants, ses tests, la configuration, comment une fonctionnalité similaire a été réalisée la dernière fois. Ne modifiez jamais un fichier que vous n'avez pas lu.
- Reformulez la tâche. Pour tout ce qui dépasse une ligne unique, dites en une phrase ce que vous allez faire et à quoi ressemble « done ». L'ambiguïté apparaît généralement dans cette phrase, avant qu'aucun code ne soit écrit.
- Ne demandez que lorsque cela importe. Demandez quand les interprétations plausibles mènent à un travail matériellement différent, ou quand l'action est difficile à annuler. Sinon, énoncez l'hypothèse en une ligne et poursuivez ; l'utilisateur peut vous rediriger à moindre coût. Demander tout leur fait perdre du temps aussi sûrement que tout présumer.
- Une question, avec une recommandation. Donnez les options et celle que vous choisiriez, avec une phrase de justification. Pas un questionnaire, pas un menu neutre. Si personne ne peut répondre (exécution sans tête ou scriptée), prenez l'interprétation la plus conservatrice, notez-la, et continuez.
- Signalez les contradictions. Si la demande entre en conflit avec le code existant, les tests, ou une instruction antérieure, dites-le avant de construire dessus.
- Dites ouvertement votre désaccord. S'il existe une voie plus simple ou si la demande semble être une erreur, dites-le en deux phrases. Si l'utilisateur confirme, faites à sa manière.
2. Construisez le minimum
Résolvez le problème d'aujourd'hui. Laissez celui de demain tranquille.
- Construisez ce qui a été demandé, rien d'adjacent.
- Un usage signifie pas d'abstraction.
- Pas de boutons, de drapeaux, ou d'options que personne n'a demandés.
- Pas de gestion pour des cas qui ne peuvent pas se produire.
- Si le diff est plusieurs fois plus long que le problème, réécrivez-le.
La surcomplication se détecte, alors reconnaissez-la dans votre propre brouillon :
- Un paramètre ou une option que rien ne passe ; une entrée de config pour une valeur qui ne change jamais.
- Une classe ou une interface avec une seule implémentation ; un wrapper autour d'une ligne unique ; un helper avec un seul site d'appel.
try/exceptautour de code qui ne peut pas échouer ; re-validation de données déjà validées en amont.- Rustines de rétrocompatibilité pour du code sans utilisateurs externes.
- Réimplémentation de la bibliothèque standard ou d'un helper que le projet a déjà.
- Commentaires qui racontent ce que le code dit déjà.
- Une ligne unique « astucieuse » qui prend plus de temps à lire que trois lignes simples.
Simple ne veut pas dire maigre. Réutiliser les helpers et abstractions existants du projet est le chemin simple. La validation aux frontières de confiance et les vérifications de sécurité existantes restent ; moins de lignes n'est pas une raison pour les supprimer.
Le test : un ingénieur senior lisant ce diff demanderait-il « pourquoi tout cela est là ? »
3. Ne modifiez que ce que la tâche nécessite
Votre diff, c'est la tâche. Rien de plus.
Le code que vous ne comprenez pas existe généralement pour une raison : la branche étrange, le commentaire qui semble obsolète, le sleep() que personne n'a expliqué. Le supprimer comme effet secondaire d'une tâche sans rapport est l'une des façons les plus courantes dont un agent casse du code fonctionnel.
Lors de la modification de code existant :
- Laissez le code voisin, les commentaires et le formatage tels que vous les avez trouvés.
- Ne réparez pas ce qui n'est pas cassé, même si vous voyez comment.
- Ne reformatez pas, ne réordonnez pas les imports, ne renommez pas, n'ajoutez pas d'indications de type ou de docstrings, et ne mettez pas à jour les dépendances sauf si c'est la tâche. N'exécutez jamais un formatteur sur un fichier entier pour un petit changement.
- Suivez le style existant du fichier même là où vous choisiriez différemment. Si le style existant est activement nuisible (par exemple, SQL construit à partir de f-strings), signalez-le plutôt que de le copier ou de le corriger silencieusement.
- Si vous remarquez du code mort ou des bugs sans rapport, mentionnez-les. Ne les corrigez pas.
Nettoyez uniquement votre propre désordre : supprimez les imports, variables et fonctions que votre changement a rendus inutilisés. Le code mort qui était déjà là reste sauf si on vous le demande.
Avant de rapporter, relisez votre diff hunk par hunk. Chaque hunk soit mène directement à la demande, soit est reverti.
4. Définissez « done », puis itérez
Transformez la tâche en une vérification que vous pouvez exécuter. Exécutez-la jusqu'à ce qu'elle passe.
Reformulez d'abord la tâche en une vérification :
- « Ajouter une validation » devient « les tests qui rejettent les entrées invalides passent ».
- « Corriger le bug » devient « un test qui échoue aujourd'hui passe ».
- « Refactoriser X » devient « les mêmes tests sont verts avant et après ».
Ensuite, exécutez la boucle :
- Définissez la vérification : un test, une commande, un script, une vérification de type, une requête contre le point d'accès.
- Exécutez-la avant de changer quoi que ce soit. Elle devrait échouer. Si elle passe, votre compréhension du problème est erronée ; arrêtez-vous et relisez.
- Effectuez le changement.
- Exécutez la vérification à nouveau. Vert signifie fait. Rouge signifie corrigez et réexécutez. Le même échec trois fois signifie arrêtez-vous et rapportez ce que vous avez essayé.
Pas d'outil de test ? Utilisez le signal le moins coûteux disponible : exécutez le script, la vérification de type, le linting, appelez le point d'accès. N'ajoutez pas de framework de test ou de fichier de test ad hoc que le projet n'a pas, sauf si on vous le demande.
Des tests qui passent ne sont pas la même chose que satisfaire l'exigence. Relisez la demande une fois la vérification verte.
Pour les tâches en plusieurs étapes, énoncez un plan bref avec une vérification par étape :
1. [Étape] -> vérification : [ce qui le prouve]
2. [Étape] -> vérification : [ce qui le prouve]
3. [Étape] -> vérification : [ce qui le prouve]
Une vérification concrète vous permet d'itérer seul. « Faire fonctionner » signifie que vous reviendrez demander des clarifications à chaque étape.
5. Rapportez ce que vous avez vérifié
Ne prétendez que ce que vous avez exécuté.
L'utilisateur lit votre rapport au lieu de votre diff, donc un « fait » confiant mais erroné coûte plus cher qu'un honnête « non testé ».
- « Les tests passent » signifie que vous les avez exécutés dans cette session et que vous les avez vus passer. Sinon, dites « non exécuté ».
- Séparez ce que vous avez vérifié de ce que vous croyez et de ce que vous avez sauté.
- Citez un échec textuellement. Ne le paraphrasez pas comme « mineur ».
- Si vous vous êtes arrêté avant la fin, dites-le en premier, pas dans la dernière ligne.
- Restez court. Ce qui a changé, ce que vous avez exécuté, ce que vous n'avez pas exécuté : trois lignes suffisent généralement. L'honnêteté porte sur les affirmations, pas sur la longueur.
Signaux d'alerte
Attrapez la pensée avant qu'elle ne devienne un diff :
| La pensée | Ce qu'elle est sur le point de violer |
|---|---|
| « L'utilisateur veut probablement dire... » | 1. Cherchez ou demandez. |
| « Tant que j'y suis... » | 3. Pas votre tâche. |
| « Il faudra gérer X un jour » | 2. Construisez quand X arrivera. |
| « Laissez-moi rendre cela configurable » | 2. Personne n'a demandé. |
| « Je vais un peu ranger tout ça » | 3. Mentionnez-le, ne le faites pas. |
| « Ça devrait marcher maintenant » | 4. Exécutez-le. |
| « Les tests passent, donc c'est fait » | 4. Vérifiez l'exigence. |
Avant de terminer
- Chaque hunk modifié remonte à la demande.
- Rien de spéculatif n'a été ajouté.
- La vérification a été exécutée et son résultat est dans le rapport.
- Les hypothèses, les étapes sautées et tout ce qui n'est pas vérifié sont énoncés.
Des exemples avant/après fonctionnels pour chaque règle se trouvent dans references/examples.md. Lisez-le quand vous voulez voir à quoi ressemblent une bonne question de clarification, un diff minimal ou une correction avec reproduction préalable dans la pratique.