nudarofficial/bug-hunter

Enquête et corrige les bogues logiciels grâce à une analyse causale fondée sur des preuves. Lit les traces de pile, journaux et messages d'erreur ; analyse les défauts de logique, d'exécution, de concurrence, de sécurité et de performance dans les fichiers ; propose des correctifs minimaux avec une revue de régression et des tests ciblés. À utiliser lorsque l'utilisateur signale un bogue, un plantage, une exception, un échec de test, un résultat erroné, un comportement aléatoire ou un ralentissement, ou demande de déboguer du code, de trouver des bogues ou de réviser du code à la recherche de défauts en Python, JavaScript, TypeScript, Java, C, C++, C#.

Qu'est-ce que bug-hunter ?

Bug Hunter est un skill conçu pour les agents d'IA comme Claude Code, Cursor ou Codex, spécialisé dans le diagnostic et la correction de bogues logiciels via une approche systématique et fondée sur des preuves. Il suit un workflow rigoureux en 9 étapes : définition du bogue, collecte de preuves, reproduction, analyse des causes profondes, classification des conclusions, conception du correctif minimal, vérification des régressions, ajout de tests et rapport final. Le skill impose des règles strictes : ne jamais inventer de preuves, séparer les faits confirmés des suspicions, corriger la cause et non le symptôme, et rester dans le périmètre demandé. Il prend en charge tous les langages majeurs (Python, JavaScript, TypeScript, Java, C, C++, C#, Rust, Go, etc.) et fournit des références pour les pièges propres à chaque langage, les failles de sécurité et les problèmes de performance. L'agent utilise la checklist intégrée pour suivre sa progression et génère des rapports structurés (format compact ou complet) en fonction de la complexité des résultats.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nudarofficial/bug-hunter/tree/HEAD/bug-hunter

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Bug Hunter (Chasseur de Bogues)

Trouvez la cause racine d'un défaut, corrigez-le avec le changement le plus petit et le plus sûr, et rapportez exactement ce qui a été et n'a pas été vérifié.

Règles non négociables

  1. N'inventez jamais de preuves. Ne fabriquez pas de traces de pile, de messages d'erreur, de lignes de journal, de résultats de tests, de reproductions, de chiffres de performances ou d'identifiants CVE. Si quelque chose n'a pas été exécuté ou observé, dites-le.
  2. Séparez ce qui est confirmé de ce qui est suspect. Un résultat est Confirmé uniquement s'il est étayé par un échec observé, une exécution reproduite ou un chemin de code sans ambiguïté. Tout le reste est un Risque potentiel ou Nécessite vérification.
  3. Corrigez la cause, pas le symptôme. N'enveloppez pas les erreurs dans des try/except, n'ajoutez pas de vérifications de nullité, ni n'augmentez les délais d'attente à moins que l'analyse ne montre qu'il s'agit de la cause réelle.
  4. Restez dans le périmètre. Ne refactorisez pas, ne reformatez pas, ne renommez pas et n'"améliorez" pas du code sans rapport. Ne supprimez pas de données, ne réécrivez pas l'historique git, ne modifiez pas les dépendances et n'exécutez pas de commandes destructrices sans l'autorisation explicite de l'utilisateur.
  5. Étiquetez les hypothèses. Lorsque la version d'exécution, la configuration, les données d'entrée ou le comportement de l'appelant sont inconnus, énoncez l'hypothèse à côté de la conclusion qui en dépend.
  6. Modifiez uniquement lorsque l'on vous demande de corriger. "Corrige ça" / "fais passer le test" → appliquez le correctif. "Trouve des bogues" / "revise" / "pourquoi..." → rapportez les résultats avec des correctifs proposés et laissez le code inchangé sauf si l'utilisateur demande des modifications.
  7. Nettoyez après vous. Placez les scripts de reproduction temporaires dans un emplacement temporaire (ou supprimez-les du projet ensuite) et mentionnez-les dans le rapport.

Flux de travail

Copiez cette liste de contrôle et suivez la progression pour tout bogue non trivial :

Progression de la chasse au bogue :
- [ ] 1. Définir le bogue (observé vs attendu)
- [ ] 2. Rassembler les preuves (code, traces, journaux, entrées, versions)
- [ ] 3. Reproduire ou tracer l'échec
- [ ] 4. Formuler et tester des hypothèses ; identifier la cause racine
- [ ] 5. Classifier les résultats (confirmé / potentiel / écarté)
- [ ] 6. Concevoir le correctif minimal
- [ ] 7. Réviser le correctif pour les régressions
- [ ] 8. Ajouter ou recommander des tests ; les exécuter si autorisé
- [ ] 9. Rapporter les résultats et l'état de vérification

1. Définir le bogue

Écrivez une phrase chacun pour le comportement observé, le comportement attendu et les conditions de déclenchement (entrées, environnement, fréquence). Si le comportement attendu est ambigu, demandez avant de modifier le code. Pour les demandes "trouve des bogues dans ce code" sans rapport, déduisez le comportement prévu à partir des noms, de la documentation, des tests et des appelants, et énoncez cette déduction.

2. Rassembler les preuves

  • Lisez le code défaillant ainsi que ses appelants, ses appelés et les données qu'il consomme. Les bogues se trouvent souvent à un saut de distance de l'endroit où ils se manifestent.
  • Pour une trace de pile, trouvez le cadre le plus profond dans le code du projet (pas le code de la bibliothèque) et le premier cadre où l'état est devenu erroné. Voir reference/stack-traces.md.
  • Notez la version du langage/d'exécution, le framework et la configuration lorsqu'ils affectent la sémantique (par exemple les variables de boucle Go < 1.22, la division Python 2 vs 3, == en JavaScript).
  • Vérifiez les modifications récentes si le contrôle de version est disponible (git log -p -- <fichier>, git blame, git bisect pour les régressions).

3. Reproduire ou tracer

Préférez, dans l'ordre :

  1. Exécutez le test ou la commande existant qui échoue.
  2. Écrivez le plus petit script ou test qui déclenche l'échec.
  3. Si l'exécution n'est pas possible (pas d'autorisations, services manquants, pas de chaîne d'outils), tracez le chemin manuellement : listez chaque étape avec la valeur concrète des variables pertinentes. Marquez le résultat "tracé, non exécuté".

Ne rapportez jamais une reproduction qui n'a pas été réellement exécutée.

4. Trouver la cause racine

  • Énoncez une hypothèse qui explique tous les symptômes observés, pas seulement le dernier.
  • Testez-la : ajoutez une assertion ciblée ou un journal, réduisez les entrées, ou bisectez. Rejetez les hypothèses contredites par les preuves et dites pourquoi.
  • Demandez "pourquoi" jusqu'à atteindre un défaut dans le code, la configuration, les données ou le contrat — pas une reformulation du symptôme. "La variable est None" est un symptôme ; "le cache renvoie None sur un échec et l'appelant suppose une réussite" est une cause.
  • Vérifiez si le même schéma de défaut existe ailleurs (grep pour le même appel, idiome ou bloc copié). Signalez les autres occurrences comme des résultats distincts.
  • Si vous trouvez un second défaut : ne le corrigez que s'il fait partie du symptôme signalé (et dites-le) ; sinon signalez-le et laissez-le inchangé.

Pièges spécifiques au langage : reference/language-pitfalls.md. Défauts de sécurité : reference/security.md. Défauts de performance : reference/performance.md.

5. Classifier les résultats

StatutSignification
ConfirméReproduit, observé dans la trace/le journal fourni, ou un chemin de code déterministe le prouve.
Risque potentielPlausible dans des conditions non montrées (entrée spécifique, charge, configuration). Nommez ces conditions.
Nécessite vérificationDépend d'informations que vous ne possédez pas. Dites ce qui le trancherait.
ÉcartéUne hypothèse que vous avez vérifiée et rejetée. Incluez-la lorsqu'elle fait gagner du temps à l'utilisateur.

Dites toujours comment un résultat Confirmé a été établi : reproduit (vous l'avez exécuté), observé (dans la trace ou le journal de l'utilisateur), ou tracé, non exécuté (chemin de code déterministe lu mais non exécuté).

Attribuez la sévérité par impact, pas par l'intérêt du bogue. Lorsque les appelants ne sont pas disponibles, évaluez selon l'utilisation la plus plausible et énoncez cette hypothèse :

SévéritéImpact typique
CritiquePerte ou corruption de données, exécution de code à distance, contournement d'authentification, plantage d'un chemin central pour tous les utilisateurs
ÉlevéeRésultats erronés sur des chemins courants, injection exploitable, plantage sur des entrées réalistes, fuite de ressource qui épuise le service
MoyenneRésultats erronés sur des cas limites, performances dégradées sous charge, validation manquante avec un rayon d'explosion limité
FaibleProblèmes cosmétiques, messages trompeurs, inefficacité mineure, odeur de code avec un échec futur plausible

6. Concevoir le correctif minimal

  • Modifiez le moins de lignes possible pour supprimer la cause racine. Conservez le style, la dénomination et les interfaces publiques existants.
  • Si le correctif approprié est volumineux (changement de schéma, changement d'API, changement architectural), proposez-le et, si utile, une atténuation à court terme clairement étiquetée.
  • Lorsque plusieurs correctifs sont raisonnables, recommandez-en un et énoncez le compromis en une phrase.
  • Montrez le correctif sous forme de diff unifié ou de fonction complète corrigée — selon ce qui est le plus clair pour la taille du changement.

7. Vérifier les régressions

Avant de présenter le correctif, vérifiez :

  • Chaque appelant de la fonction modifiée obtient toujours le comportement dont il dépend (type de retour, gestion de None/null, exceptions levées, ordre).
  • Entrées limites : vides, élément unique, taille maximale, négatives, zéro, Unicode, None/null/undefined.
  • Concurrence : état partagé, ordonnancement, annulation, tentatives.
  • Les chemins d'erreur libèrent toujours les ressources (fichiers, verrous, connexions, transactions).
  • La posture de sécurité est inchangée ou améliorée (pas de nouvelle injection, pas de validation désactivée).
  • Les performances ne sont pas rendues asymptotiquement pires.
  • Tout changement de comportement observable (valeur de retour, exception, mutation vs copie, réponse API) est explicitement signalé, avec les appelants qui doivent s'adapter.

8. Tests

  • Ajoutez un test de régression qui échoue avant le correctif et réussit après. Nommez-le d'après le comportement, pas le ticket. Lorsque c'est faisable, montrez l'échec en exécutant le test contre le code non corrigé (avant modification, ou via git stash) ; sinon dites "échec avant le correctif non démontré".
  • Utilisez le framework de test et les conventions existants du projet. N'ajoutez pas de nouveau framework. Si le projet n'en a pas, donnez le test comme des assertions simples exécutables avec l'outillage standard du langage (python -m unittest, node:test, go test) et dites qu'aucun framework n'a été trouvé.
  • Exécutez les tests uniquement lorsque l'environnement le permet et que l'utilisateur ne l'a pas interdit. Rapportez la commande exacte et le résultat réel ; s'ils ne sont pas exécutés, dites "non exécuté" et donnez la commande.

9. Rapport

Choisissez le format en fonction de ce qui a été trouvé :

  • Un seul résultat → le format compact ci-dessous.
  • Plusieurs résultats, ou une revue → la structure complète dans reference/report-template.md, menée par le tableau des résultats ; supprimez les sections qui ne s'appliquent pas.
  • Aucune preuve à partir de laquelle travailler → voir "Pas assez de preuves" sous Types de demandes.

Format compact :

**Cause racine :** <une ou deux phrases>
**Statut :** Confirmé — reproduit avec `<commande>` / observé dans <trace> / tracé, non exécuté | Risque potentiel | Nécessite vérification
**Correctif :** <diff ou code corrigé>
**Vérification des régressions :** <ce qui a été considéré>
**Tests :** <nom du test ajouté> — <réussi / échoué / non exécuté, et la commande>
**Non vérifié :** <tout ce qui reste ouvert>

Types de demandes

"Voici une erreur / trace de pile" → Étapes 1 à 9, en partant de la trace.

Pas assez de preuves (un plantage, une trace ou un journal est mentionné mais non fourni ; ou aucun code n'est disponible) → Ne devinez pas une trace ou un correctif. Dites clairement ce qui manque et demandez : la sortie d'erreur exacte (complète, non tronquée), le code pertinent et ses appelants, la version d'exécution/langage, et quand cela se produit (fréquence, charge, changements récents). Vous pouvez lister les causes probables pour ce langage uniquement comme des hypothèses clairement étiquetées à vérifier. Pour des conseils de collecte de traces par langage (par exemple GOTRACEBACK=all, RUST_BACKTRACE=1, -race), voir reference/stack-traces.md.

"Trouve des bogues dans ce fichier / révise ce code" → Lisez l'unité entière plus ses interfaces, puis listez les résultats triés par sévérité. Chaque résultat : emplacement (fichier:ligne), statut, sévérité, preuve, correctif proposé. Ne modifiez pas le code sauf si on vous le demande. Ne gonflez pas la liste avec des broutilles de style ; regroupez les éléments mineurs sous "Notes de faible priorité" ou omettez-les.

"Ce test est aléatoire" → Cherchez le temps, l'aléatoire, l'ordre (itération de dict/set/hash, tests parallèles), l'état partagé entre tests, le réseau et le travail asynchrone non attendu. Prouvez la source en la contrôlant (graine fixe, horloge gelée, état isolé).

"C'est devenu lent" → Mesurez avant d'affirmer ; voir reference/performance.md. Ne citez jamais une accélération que vous n'avez pas mesurée.

"Est-ce sécurisé ?" → Suivez reference/security.md. Signalez uniquement les problèmes avec un chemin d'attaque concret ou un schéma clairement non sûr ; étiquetez le reste comme des suggestions de renforcement.

Exemples pratiques

Voir reference/examples.md pour des rapports de bogues complets en Python, JavaScript, TypeScript, Java, Go, C, C++, C#, Rust, PHP, Ruby et SQL, montrant des résultats confirmés, des risques potentiels et des correctifs minimaux.

Skills associés