Guides et modèles

Modèle de notes de débogage

Un modèle de notes de débogage capture une enquête sur un bogue au fur et à mesure que vous la réalisez, afin que le travail reste reproductible plutôt que de vivre dans votre tête et de défiler dans le terminal. Vous notez le symptôme, la façon exacte de le déclencher, les hypothèses que vous avez envisagées, celle que les preuves ont confirmée et comment, le correctif, et le test qui le verrouille. Le résultat unique est une cause confirmée appuyée par des preuves, enregistrée pour que la prochaine personne puisse la répéter. Il trouve sa place dès qu'un bogue est intermittent, revient ou doit être transmis.

ModèleProgrammation

Quand utiliser ceci

  • Vous avez un test qui échoue ou une erreur et vous êtes sur le point de commencer une enquête qui prendra plus que quelques minutes.
  • Le bogue est intermittent ou difficile à reproduire, et un changement aléatoire est susceptible de le masquer plutôt que de le corriger.
  • Vous avez déjà corrigé ce symptôme une fois et il est revenu, ce qui signifie que la véritable cause n'a jamais été confirmée.
  • Vous utilisez un assistant pour déboguer et souhaitez un endroit pour enregistrer quelle hypothèse il a classée en premier et quelles preuves ont réellement décidé.
  • Vous allez transmettre le bogue à un collègue, l'attacher à une PR, ou le reprendre demain, donc le raisonnement doit survivre en dehors de votre mémoire.
  • La trace de pile pointe vers un cadre ou une dépendance et vous ne pouvez pas encore dire laquelle de vos propres lignes l'a déclenchée.

Ce que cela aide à clarifier

  • Si vous pouvez reproduire le bogue à la demande, ce qui est la seule façon honnête de confirmer un correctif plus tard.
  • Quelle cause les preuves soutiennent réellement, séparée de l'explication qui semblait simplement convaincante.
  • La vérification exacte qui a déterminé la cause, afin qu'un réviseur puisse la relancer au lieu de faire confiance au diff.
  • Le plus petit changement qui répond à la cause confirmée, plutôt que l'endroit où l'erreur est apparue.
  • Si un test de régression existe qui échoue sur l'ancien code et réussit sur le nouveau.
  • Toute instrumentation temporaire que vous avez ajoutée, afin que les lignes de journal et les serveurs de débogage soient supprimés avant de valider.

Pourquoi c'est important

La façon coûteuse de déboguer est de passer directement à un changement. Vous tombez sur une trace de pile rouge, essayez quelque chose, le test échoué devient vert, et vous passez à autre chose. Deux jours plus tard, la même défaillance refait surface sur une entrée légèrement différente, car le changement a atténué le symptôme sans jamais confirmer la cause. Aucun raisonnement n'a été consigné, donc la prochaine personne, souvent vous, recommence à zéro.

Un modèle de notes de débogage corrige cela en transformant une chasse en un enregistrement. C'est la surface de travail du débogage basé sur les hypothèses, la pratique consistant à traiter chaque cause suspectée comme une affirmation que vous prédisez puis testez, de la même manière qu'un scientifique mène une expérience avant de croire au résultat. Cette discipline n'est pas du folklore. Dans une expérience contrôlée randomisée UIST 2023 avec 16 développeurs professionnels, un outil de débogage basé sur les hypothèses a amélioré le taux de réussite de correction des défauts par un facteur de cinq et réduit le temps de débogage par un facteur de trois, comparé aux débogueurs par points d'arrêt et à la recherche sur le web. Le gain vient du fait de forcer la confirmation de la cause avec des preuves avant tout changement de code.

Les assistants augmentent les enjeux dans les deux sens. Ils traduisent une trace cryptique en langage clair plus rapidement que vous ne le pouvez, et ils listent plus d'hypothèses que vous ne le feriez seul. Ils produisent aussi une cause principale classée avec confiance qui peut être erronée concernant votre code, car faire correspondre des motifs à travers des millions de dépôts publics est une opération différente du raisonnement causal à l'intérieur d'une seule base de code. La note est l'endroit où vous gardez le modèle honnête : vous enregistrez ce qu'il a classé en premier, puis vous enregistrez la vérification qui a réellement décidé. Sans cela, une explication plausible passe comme si elle était prouvée. C'est la même boucle que les outils de débogage modernes ont commencé à automatiser. Cursor Debug Mode, livré en décembre 2025, génère plusieurs hypothèses, ajoute des instructions de log qui diffusent vers un serveur de débogage local, vous fait reproduire le bogue, puis lit les données d'exécution capturées pour identifier la véritable cause avant de faire une correction ciblée. Les champs de ce modèle sont cette boucle écrite, qu'un outil l'exécute pour vous ou que vous l'exécutiez manuellement.

Considérez le coût concrètement. Une développeuse nommée Maya possède un petit module utilitaire dans un service Node. Une API partenaire envoie des horodatages comme "2026-03-14T10:00+02:00", et parseDate() génère une erreur sur la forme de décalage. Demandez à un assistant une correction immédiate et il peut envelopper l'analyse dans un try/catch et retourner une date de secours. L'exception disparaît, le test évident réussit, et une heure silencieusement incorrecte s'écoule maintenant dans chaque exportation. La trace s'est tue; le bogue s'est caché. Une note remplie l'aurait attrapé, car le champ Preuve n'a nulle part où écrire "J'ai confirmé que le décalage a été analysé correctement."

La note se rentabilise également dans les cas qui traînent. Un bogue qui prend une heure et trois faux départs est un cas où le modèle vous aurait empêché de réessayer une hypothèse que vous aviez déjà réfutée, car le champ Preuve enregistre ce que chaque vérification a écarté. Et la deuxième fois qu'une trace similaire apparaît, la note fait la différence entre cinq minutes de reconnaissance et une nouvelle heure de redécouverte. La section suivante parcourt chaque champ pour qu'une bonne entrée soit évidente par rapport à une faible.

Comment bien le remplir

Le modèle comporte neuf champs, et chacun résiste à un raccourci spécifique. Remplissez les trois premiers par observation, puis obtenez le reste par investigation.

  • Symptôme. Énoncez le comportement observé de manière factuelle, attendu versus réel, sans cause supposée. Une entrée solide : parseDate() génère une exception sur les entrées avec un décalage horaire; attendu une Date, obtenu une exception. Une entrée faible : le parseur de date est brisé sur des entrées bizarres. La faible introduit une théorie ("brisé") et cache le déclencheur ("bizarres"), ce qui biaise tout ce qui suit.
  • Reproduction. Capturez l'entrée exacte, la commande et les conditions, et indiquez si c'est constant ou intermittent. Les directives de rapport de bogue sont claires ici : reproduisez-le au moins deux fois avant d'écrire quoi que ce soit, et partez d'un état connu. Une entrée solide nomme la valeur littérale et le chemin : parseDate("2026-03-14T10:00+02:00") dans src/utils/date.ts, constant, uniquement sur les décalages +HH:MM. Une faible dit se produit parfois avec les données des partenaires, ce que vous ne pouvez pas relancer et donc pas utiliser pour confirmer un correctif.
  • Environnement. Notez le runtime et la version, le système d'exploitation, les versions clés des dépendances, et la branche ou le commit. De nombreux bogues "non reproductibles" sont dus à un écart de version, et c'est ici que cela apparaît.
  • Hypothèses. Listez les causes probables classées par ordre de probabilité, chacune formulée comme une affirmation testable. Le classement est important car il force un engagement que vous pouvez réfuter, plutôt qu'une couverture générale. Si un assistant les a générées, collez son ordre tel quel pour voir plus tard si le modèle avait raison.
  • Preuve. C'est le champ qui sépare le vrai débogage de la supposition. Notez le seul contrôle que vous avez effectué pour l'hypothèse principale et exactement ce qu'il a montré, et nommez l'alternative qu'il a écartée. Une entrée solide : journalisé offsetMinutes avant utilisation; il a imprimé NaN, donc la regex n'a jamais correspondu; une erreur de signe donnerait quand même un nombre, donc la théorie du mauvais signe est écartée. Une entrée faible : regardé, semble être la regex. "Semble être" n'est pas une preuve, et cela laisse les alternatives en vie.
  • Cause confirmée. Nommez l'hypothèse que la preuve a soutenue, et celles qu'elle a éliminées. Si vous ne pouvez pas remplir cela sans vague, vous n'avez pas terminé l'investigation, peu importe à quel point l'explication semblait convaincante.
  • Correctif. Décrivez le plus petit changement qui résout la cause, par fichier et une description en une ligne. Visez le correctif à la cause que la preuve a indiquée, pas à la ligne où l'erreur est apparue. Un try/catch qui avale l'exception n'a pas sa place ici.
  • Test. Notez le test de régression qui échoue avant le correctif et réussit après, et où il se trouve. Un correctif sans test échouant puis réussissant est une supposition qui a simplement calmé le symptôme. Ce champ est la preuve que la cause était réelle.
  • Nettoyage et notes. Listez l'instrumentation temporaire que vous avez retirée, le prompt qui a trouvé la cause, et tout suivi. Des outils comme Cursor Debug Mode retirent leurs propres déclarations de log une fois le correctif vérifié; faites de même à la main pour que les lignes de débogage n'atteignent jamais le diff.

Lisez une note bien remplie et vous pouvez répondre à une question sans faire confiance à quiconque : pourquoi croyez-vous cette cause, et qu'est-ce qui vous aurait prouvé le contraire ? Si la note ne peut pas répondre à cela, c'est une histoire, pas une investigation. Les pièges qui font qu'une note semble terminée tout en laissant cette question sans réponse viennent ensuite.

Pièges et utilisation en équipe

Chaque piège ci-dessous donne l'impression de progresser tout en brisant discrètement le dossier, donc le correctif se trouve dans le même élément.

  • Ignorer la Reproduction. Remplir Correctif et Test sur un bogue que vous ne pouvez pas déclencher à la demande signifie que vous ne pouvez pas dire si le changement a fonctionné ou si l'échec ne s'est simplement pas produit. Construisez d'abord la reproduction, même un script d'une ligne, et réutilisez-le comme test de régression.
  • Considérer une explication confiante comme une Preuve. La cause la mieux classée par l'assistant est lue comme un fait, donc le champ Preuve obtient une paraphrase de l'hypothèse au lieu d'un contrôle. Écrivez seulement ce qu'une sonde a réellement montré, et nommez l'alternative qu'elle a écartée.
  • Le correctif en rafale. Laisser un agent modifier cinq fichiers en poursuivant une théorie laisse le champ Correctif incapable de dire quel changement importait ou ce qui a été cassé d'autre. Changez une chose, relancez la reproduction, puis enregistrez-la.
  • Symptôme plutôt que cause. Une valeur par défaut ou une erreur avalée fait taire la trace sans aborder pourquoi la valeur était incorrecte. Le champ Cause confirmée est le garde : s'il nomme la surface, pas la source, le bogue reviendra.
  • Laisser l'instrumentation derrière. Les lignes de log et les serveurs de débogage ajoutés pendant la chasse sont du bruit dans le diff et peuvent fuir des données. Le champ Nettoyage existe pour que le retrait soit une étape que vous cochez, pas une réflexion après coup.
  • La dépendance hallucinée. Un assistant peut "corriger" un bogue en important un package qui n'existe pas. L'étude USENIX Security 2025 a généré 576 000 échantillons de code et a trouvé que 19,7 % des 2,23 millions de packages qu'ils ont référencés n'existaient pas, et 58 % de ces noms inventés réapparaissaient à travers les exécutions, donc les attaquants les enregistrent pour attendre le prochain développeur qui copie la suggestion. Avant qu'un nouvel import n'atterrisse dans Correctif, confirmez que le package se résout à une entrée réelle et prévue sur le registre.

Un véritable cas limite étire le formulaire simple : le bogue non déterministe. Les conditions de course et les échecs de synchronisation ne se reproduisent pas à la demande, donc un seul passage réussi ne prouve rien. Ici, le champ Preuve devrait contenir une instrumentation qui capture l'ordre des événements et l'état partagé à travers plusieurs reproductions, jusqu'à ce que le mauvais entrelacement apparaisse dans les données capturées, plutôt qu'un seul passage chanceux.

En équipe, la note cesse d'être une aide personnelle et devient un artefact partagé. Une responsable nommée Priya fait d'une note complétée une partie de la définition de fait pour un correctif de bogue, afin que la prochaine personne qui voit une trace similaire trouve le raisonnement, pas juste le correctif. La même note appartient à la description du PR, qui devrait enregistrer qu'un assistant a proposé le correctif et le prompt qui a trouvé la cause, afin qu'un réviseur puisse répéter la vérification au lieu de faire confiance au diff. Gardez les correctifs petits pour la même raison que vous gardez les hypothèses uniques : un diff ciblé sous quelques dizaines de lignes est un que le réviseur peut réellement lire, tandis qu'un changement tentaculaire enterre la véritable correction.

Le principe durable à retenir, quelle que soit la taille de l'équipe : confirmez la cause avec des preuves avant de modifier le code, et verrouillez le correctif avec un test qui échouait il y a un instant. Pour votre prochain vrai bogue, remplissez Symptôme et Reproduction avant de demander un seul correctif, puis consultez le guide Debugging with AI pour la boucle complète d'analyse d'abord et Reviewing AI Code Safely pour la lecture finale sur le diff.

Le modèle

Remplissez les champs de haut en bas au fur et à mesure que vous travaillez. Les trois premiers sont des faits que vous observez; le reste, vous les gagnez à travers l'enquête.

  • Symptôme : le comportement observé en une phrase factuelle, avec l'attendu versus l'actuel. Aucune cause supposée pour l'instant.
  • Reproduction : l'entrée exacte, la commande et les conditions qui la déclenchent, ainsi que si elle est constante ou intermittente.
  • Environnement : versions du langage et du runtime, OS, versions clés des dépendances, et la branche ou le commit.
  • Hypothèses : les causes probables classées par ordre de probabilité, chacune formulée comme une affirmation que vous pouvez tester.
  • Preuve : la vérification unique que vous avez effectuée pour l'hypothèse principale (une ligne de journal, un point d'arrêt, une entrée restreinte) et ce qu'elle a révélé.
  • Cause confirmée : l'hypothèse que la preuve a soutenue, et les alternatives qu'elle a écartées.
  • Correctif : le plus petit changement qui résout la cause, nommé par fichier et une description en une ligne.
  • Test : le test de régression qui échoue avant le correctif et réussit après, et où il se trouve.
  • Nettoyage et notes : instrumentation temporaire retirée, le prompt de l'assistant qui a trouvé la cause, et les suivis éventuels.

Exemple

Exemple concret
Symptôme : parseDate() lance une exception sur les horodatages de l'API partenaire. Un Date était attendu, une exception a été reçue. L'export quotidien montre une heure décalée quand il ne lance pas. Reproduction : parseDate("2026-03-14T10:00+02:00") dans src/utils/date.ts. Constant, uniquement sur les entrées avec un décalage +HH:MM. Environnement : Node 22.3, macOS 15, pas de nouvelles dépendances, branche fix/parse-offset à a4f1c92. Hypothèses : 1) l'expression régulière du décalage correspond à Z et aux heures seules mais pas à +HH:MM. 2) le décalage est analysé mais appliqué avec le mauvais signe. 3) l'entrée est mal coupée en amont. Preuve : décalageMinutes enregistré juste avant l'utilisation. Avec la chaîne partenaire, il a imprimé NaN, donc l'expression régulière n'a jamais correspondu. Une erreur de signe donnerait quand même un nombre, donc #2 est écartée. Cause confirmée : hypothèse 1. L'expression régulière du décalage ne gère pas la forme +HH:MM, donc décalageMinutes est NaN. Correctif : src/utils/date.ts, étendre l'expression régulière du décalage à +HH:MM et convertir en minutes signées. Environ 5 lignes, aucune autre branche touchée. Test : tests/date.test.ts affirme que parseDate("2026-03-14T10:00+02:00") est égal à la bonne valeur UTC. Échoue sur l'ancien code, réussit sur le nouveau. Nettoyage et notes : ligne de journal temporaire retirée. Prompt qui l'a trouvé : "classer les 3 causes probables, puis donner la plus petite sonde pour la principale."

Notes d'utilisation

  • Écrivez le symptôme comme une observation, pas une théorie. "Lance une exception sur les entrées avec décalage" est un fait; "l'expression régulière est probablement cassée" est une supposition qui biaise toute la note.
  • Remplissez Reproduction avant de toucher au code. Un bogue que vous ne pouvez pas déclencher à la demande est un bogue que vous ne pouvez pas confirmer avoir corrigé, et la reproduction devient votre test de régression.
  • Gardez une ligne dans Preuve par hypothèse testée, en nommant la vérification qui aurait écarté les autres. Une cause confirmée sans vérification falsifiante reste une supposition.
  • Quand un assistant débogue, notez ses hypothèses classées et celle que la preuve a retenue. La note est l'endroit où vous séparez le modèle qui semblait juste de la cause qui était juste.
  • À jumeler avec le guide Déboguer avec l'IA, qui parcourt la boucle d'analyse de bout en bout, et avec Réviser le code IA en toute sécurité, où le correctif proposé et son test obtiennent leur lecture finale.
  • Joignez la note terminée à l'issue ou PR. Faites d'une note complétée une partie de la définition de terminé pour un correctif de bogue, afin que le raisonnement accompagne le correctif.

Sortie copiable

# Notes de débogage : <titre court du bogue> ## Symptôme - Attendu : - Réel : ## Reproduction - Étapes / entrée / commande : - Constant ou intermittent : ## Environnement - Runtime + version : - OS / dépendances / branche ou commit : ## Hypothèses (classées, la plus probable en premier) 1. 2. 3. ## Preuve - Vérification effectuée : - Ce qu'elle a montré : ## Cause confirmée - ## Correctif - Fichier : - Changement : ## Test - Nom / emplacement : - Échoue avant, réussit après : ## Nettoyage et notes - Instrumentation retirée : - Prompt qui a trouvé la cause : - Suivis :

Version téléchargeable

Un bogue, une page : le symptôme, la reproduction, la cause confirmée, et le test qui le verrouille.

Aperçu

ChampQuoi capturerExemple concret
Observer les faits
Titre du bogueUn résumé en une ligne du symptôme et où il apparaît, écrit factuellement.parseDate génère une erreur sur les horodatages de l'API partenaire avec un décalage horaire
SymptômeLe comportement observé, attendu versus réel, sans cause supposée.Attendu : une Date, obtenu : une exception; l'export quotidien montre la mauvaise heure
ReproductionL'entrée exacte, la commande et les conditions, plus cohérent ou intermittent.parseDate("2026-03-14T10:00+02:00"); cohérent, seulement sur les décalages +HH:MM
EnvironnementRuntime et versions, OS, versions des dépendances clés, branche ou commit.Node 22.3, macOS 15, pas de nouvelles dépendances, branche fix/parse-offset à a4f1c92
Enquêter et confirmer
HypothèsesLes causes probables classées de la plus probable à la moins probable, chacune étant une affirmation testable.1) regex manque +HH:MM 2) mauvais signe de décalage 3) mauvais découpage en amont
PreuveLa vérification unique effectuée pour l'hypothèse principale et ce qu'elle a exactement montré.Minutes de décalage enregistrées avant utilisation; imprimé NaN, donc le regex n'a jamais correspondu
Cause confirméeL'hypothèse que la preuve a soutenue et celles qu'elle a écartées.Hypothèse 1; une erreur de signe donnerait quand même un nombre, donc #2 est écartée
Corriger, verrouiller, nettoyer
CorrectionLe plus petit changement adressant la cause, par fichier et une description en une ligne.src/utils/date.ts : étendre le regex à +HH:MM, convertir en minutes signées (~5 lignes)
TestLe test de régression qui échoue avant et réussit après, et où il se trouve.tests/date.test.ts vérifie le résultat UTC; rouge sur l'ancien code, vert sur le nouveau
Nettoyage et notesInstrumentation retirée, le prompt de l'assistant qui l'a trouvé, suivis.Ligne de log retirée; prompt : classer 3 causes puis donner la plus petite sonde
Modèle de notes de débogage