Poltergit : comprendre le code avec une IA locale13 min de lecture2 620 mots

Poltergit : comprendre le code avec une IA locale

Découvrez comment Poltergit utilise une IA locale pour expliquer l’histoire du code, vérifier ses sources et préserver les raisons des décisions techniques.

PoltergitIA localehistorique du codeGit et intelligence artificielleoutils IA pour développeurs
Poltergit : comprendre le code avec une IA locale

Poltergit : faire parler l'historique du code sans confier son dépôt à une IA distante

Dans un dépôt ancien, certaines lignes ressemblent à des décisions fossilisées. Un délai de trois secondes, un nombre de tentatives fixé à sept, une constante au nom peu explicite : le code fonctionne, mais on ne sait plus très bien pourquoi. git blame vous indique qui a modifié une ligne et à quel moment. Pratique... sauf qu'il ne rend pas toujours le raisonnement qui a mené à la décision.

Poltergit part de là et propose une idée assez directe : interroger une ligne de code comme si elle pouvait raconter ce qui l'a amenée là. L'outil parcourt les commits, retrouve quand c'est possible des discussions liées et demande à un modèle exécuté localement de formuler une réponse appuyée par des citations vérifiées. S'il manque des éléments, il doit aussi le dire : l'historique est muet.

L'intérêt, au fond, dépasse la mise en scène. Il s'agit de garder un logiciel sain sans « fabriquer » des explications et sans envoyer systématiquement le code à un service externe. Voyons ce que fait Poltergit, les choix techniques derrière, et les limites à garder en tête avant d'en faire un outil de tous les jours.

Pourquoi l'historique d'une ligne ne suffit pas toujours

Les dépôts de code conservent plus que des fichiers. Ils gardent aussi des morceaux de décisions : messages de commit, changements successifs, parfois des demandes de fusion, des revues ou des tickets. Le hic, c'est que ces informations sont rarement organisées pour répondre à une question très précise : « Pourquoi cette ligne est-elle encore là ? »

git blame est un bon début. Il associe une ligne à un commit et à un auteur. Ça aide pour retrouver le contexte immédiat, mais un commit nommé « update » ou « fix » n'explique pas forcément la contrainte initiale. Et si le code a été déplacé ou réécrit plusieurs fois, la raison « vraie » peut être dans un ancien changement, ou dans une discussion qui ne figure pas dans le fichier actuel.

Au final, ce n'est pas juste un manque documentaire. Quand quelqu'un reprend un service, il peut supprimer un délai qui évitait une rafale de reconnexions, réduire le nombre de tentatives nécessaire pendant une fenêtre de maintenance ou modifier une constante qui paraissait arbitraire. À l'inverse, conserver chaque ligne « au cas où » augmente vite la complexité et la charge de maintenance. Sans contexte, l'équipe hésite entre deux risques : casser un comportement important ou perpétuer une précaution devenue inutile.

Le vrai manque : relier une ligne à ses raisons

Poltergit traite la ligne comme un point d'entrée vers plusieurs niveaux d'historique. Il suit les modifications de cette ligne, regarde les différences introduites par les commits, et, quand c'est possible, relie ces changements à des demandes de fusion, des revues ou des tickets GitHub.

Il y a un point important : le but n'est pas de « deviner » l'intention à partir de l'apparence du code. Le modèle reçoit des éléments issus du dépôt, puis reformule ce qu'on peut étayer. L'objectif est de réduire le temps perdu à reconstituer le contexte, pas de transformer une supposition en décision prouvée.

Un outil d'exploration, pas une documentation magique

Une réponse générée ne remplace ni une documentation de conception, ni une conversation avec les personnes qui connaissent le système. En revanche, ça peut accélérer une première enquête : retrouver le commit pertinent, comprendre le changement associé, puis repérer rapidement là où les traces sont trop faibles.

Le bénéfice dépend donc de la qualité de l'historique. Des messages de commit clairs et des discussions conservées donnent à l'outil plus de matière. Un historique lacunaire le restera, même avec un modèle de langage. La promesse utile n'est pas « l'IA connaît les raisons oubliées », mais « l'IA rend les indices existants plus faciles à retrouver et à examiner ».

Comment Poltergit transforme Git en séance de questions-réponses

Poltergit est un outil libre écrit en Python : vous l'utilisez en ligne de commande et via une petite interface web locale. La commande poltergit why src/client.py:13, par exemple, demande une explication pour une ligne précise. Le parcours combine d'abord des opérations classiques sur Git, puis une génération de réponse par un modèle local.

Suivre la ligne dans les commits

Le projet s'appuie sur git log -L, qui remonte l'historique d'une ligne ou d'une fonction même quand sa position change dans le fichier. Poltergit récupère les commits concernés, leurs messages et leurs différences. Il travaille sur la révision validée dans HEAD, et il prévient s'il y a des modifications non validées, pour éviter de mélanger le code enregistré et l'état de votre espace de travail.

Concrètement, ça donne un enchaînement assez pragmatique : l'outil commence par les preuves trouvées dans le dépôt, au lieu de demander au modèle d'inventer une explication « de tête ». Et si l'utilisateur l'autorise et que l'accès est configuré, Poltergit peut intégrer aussi le contexte des demandes de fusion, des revues et des tickets liés aux commits.

Demander une réponse qui parle comme le code

Le modèle Gemma 4 E4B, exécuté avec Ollama sur la machine de l'utilisateur, reçoit la ligne, le code autour, et l'historique pertinent. En sortie, il doit produire des affirmations structurées, chacune associée à une source et à une citation exacte, ou alors dire clairement quand le dépôt ne permet pas de conclure.

Faire « parler le code » plutôt que l'auteur est une convention d'interface. Une réponse du type « Mon existence est liée à la prévention d'une tempête de reconnexions » rend l'explication lisible, mais ça ne prétend pas sonder la psychologie de quelqu'un. La citation et le commit restent ce qu'il faut vérifier.

Présenter le silence comme un résultat valide

Dans une démo reproductible, la ligne time.sleep(3) est reliée à un commit expliquant qu'une session fermée restait réservée pendant deux secondes. Le délai de trois secondes devient alors cohérent : une marge avant reconnexion. La réponse pointe ce commit et affiche une citation vérifiée.

À l'inverse, une constante modifiée par un commit nommé « update » peut ne pas fournir assez d'éléments. Dans ce cas, Poltergit indique que l'historique ne dit rien. Lors d'un test, le modèle a tenté de proposer une raison en s'appuyant sur une citation non valide : la validation a rejeté la réponse et a montré les extraits disponibles.

Le projet propose aussi poltergit ofrenda, qui génère un mémorial de fichiers et de fonctions supprimés. Les fiches précisent quand un élément est apparu, combien de temps il a vécu et quel commit l'a retiré. Ce n'est pas une réponse directe à « pourquoi cette ligne existe ? », mais ça donne une vue utile sur le cycle de vie du logiciel et sur la logique des suppressions.

Quels choix d'IA rendent l'outil plus fiable

Utiliser une IA pour traiter du code pose une question simple (et un peu brutale) : que voit réellement le modèle, et comment vérifier ce qu'il dit ? Poltergit répond avec plusieurs choix techniques. Ils réduisent certains risques, sans promettre que le raisonnement sera « toujours bon ».

Vérifier les citations avant d'afficher la réponse

Le modèle doit produire des citations d'au moins douze caractères qui correspondent mot pour mot à une source disponible. Le programme vérifie cette correspondance avant d'afficher la réponse. Si une citation ne matche pas, la réponse complète est rejetée et les extraits sont affichés tels quels.

Ce contrôle est plus robuste qu'une simple consigne dans un prompt : il est appliqué par le code. Il garantit que les citations renvoient à des mots réellement présents dans les éléments consultés. Par contre, ça ne garantit pas que l'interprétation de ces mots est juste. Une citation exacte peut soutenir une conclusion trop large, ou ignorer une contrainte présente dans le dépôt. La vérification des sources est donc un garde-fou, pas un certificat de vérité.

Retrouver du contexte au-delà de l'historique direct

Se limiter aux commits qui touchent directement une ligne peut faire passer à côté d'une explication. Dans l'exemple du projet, une boucle de tentatives n'avait été modifiée que lors de l'ajout du client. L'explication utile se trouvait ailleurs : dans un commit qui avait augmenté la valeur maximale de trois à sept.

Pour élargir la recherche, Poltergit peut indexer l'historique avec EmbeddingGemma, puis stocker les vecteurs dans PostgreSQL via pgvector. Une recherche hybride combine similarité vectorielle et recherche plein texte. Les résultats sont fusionnés par classement réciproque, pour équilibrer les passages proches « par le sens » et les correspondances lexicales plus directes.

Cette indexation est distincte du parcours de base. Le modèle peut tourner localement, tandis que le stockage des vecteurs peut utiliser un service distant (Tiger Cloud dans la démonstration). Les périmètres (dépôt, révision, modèle) sont séparés pour éviter de mélanger les historiques. Une équipe doit quand même décider clairement où résident les données d'indexation et quelles règles internes s'appliquent.

Mesurer les lenteurs au lieu de les attribuer au modèle

Le projet instrumente chaque séance avec Sentry : parcours de l'historique, appel au modèle et validation des preuves. D'après l'implémentation décrite, les prompts et le code ne sont pas envoyés ; les traces portent sur des informations opérationnelles comme les durées, le modèle et le nombre de jetons.

Ces mesures ont aidé à distinguer « modèle défaillant » et « modèle lent ». Sur une machine sans GPU, une génération a pris presque trois minutes. Le premier délai d'attente, fixé à 180 secondes, interrompait donc une inférence encore en cours. La trace a permis d'identifier la cause et de rendre le délai configurable. Elle a aussi révélé des spans IA mal rattachés à la transaction et des traces perdues quand la commande se terminait avant leur envoi.

Cette partie rappelle une règle saine pour les projets d'IA : mesurez l'ensemble du parcours. Sans instrumentation, une latence peut sembler venir de Git, du réseau ou du modèle. Mais l'observabilité elle-même doit être configurée avec soin, pour éviter d'inclure du code ou des données sensibles dans les événements envoyés.

À quoi sert Poltergit en entreprise, et quelles sont ses limites

Dans une équipe qui maintient un logiciel ancien, Poltergit peut servir lors d'une revue, d'un diagnostic ou de l'intégration d'un nouveau développeur. Vous pouvez interroger une ligne suspecte avant de la supprimer, retrouver un commit lié à une anomalie, ou examiner une fonction récemment retirée. C'est particulièrement utile quand la documentation manque, mais que l'historique conserve encore des indices exploitables.

Le projet met en avant une exécution locale des modèles : Gemma pour les réponses, EmbeddingGemma pour les représentations vectorielles et Kokoro pour la lecture audio. Ça évite d'envoyer le dépôt à une API distante pendant l'inférence. Pour des dépôts propriétaires ou des données couvertes par des exigences de confidentialité, ça peut peser lourd.

Mais attention : « local pendant l'inférence » ne veut pas dire « tout hors ligne ». L'indexation peut s'appuyer sur une base distante et la télémétrie dépend de votre configuration. Il faut vérifier ces flux dans l'environnement réel.

Un coût marginal faible, mais une latence à anticiper

L'inférence locale n'entraîne pas de facturation par requête à un fournisseur de modèle. Résultat : une consultation fréquente reste envisageable, surtout pour des équipes qui ne veulent pas transformer chaque question en coût d'API variable.

En contrepartie, la machine doit avoir de quoi tourner, et l'expérience peut être lente sans accélération matérielle. Le coût en argent peut être faible, mais le coût en temps, en ressources et en maintenance ne disparaît pas.

Le projet est distribué sous licence MIT, avec une interface locale, une commande en ligne de commande et un export statique pour les mémoriaux de code supprimé. La démonstration repose sur un dépôt fictif reproductible, ce qui facilite la vérification des réponses. L'approche rend l'expérimentation plus accessible, mais rien ne remplace le test sur vos propres dépôts et vos conventions de sécurité.

Ce que l'outil ne peut pas savoir

Poltergit ne reconstitue pas une intention absente des traces. Un commit trop vague, une revue supprimée ou une discussion tenue hors du dépôt peuvent laisser le modèle sans matière. Et même quand le modèle trouve une explication, des commentaires, des tests ou des changements plus récents peuvent contredire ce qui était vrai au départ.

Une réponse citée doit donc être traitée comme une piste de recherche, pas comme une permission de modifier le comportement.

Avant un déploiement, ça vaut le coup de vérifier :

  • quelles données quittent le poste, y compris les embeddings et les événements de télémétrie ;
  • comment les droits d'accès aux dépôts et aux discussions sont appliqués ;
  • si la latence locale est compatible avec vos usages ;
  • si les équipes comprennent qu'une citation exacte ne garantit pas une interprétation exacte.

Poltergit est le plus utile quand il accélère une enquête humaine et montre clairement ses preuves. Il devient plus risqué si ses formulations sont recopiées comme des décisions « définitives », sans retour aux commits et aux discussions d'origine.

Conclusion : l'IA éclaire les traces, elle ne remplace pas la mémoire d'équipe

Poltergit répond à un problème assez courant : le code garde les effets des décisions, mais pas toujours leur explication. En combinant l'historique Git, une recherche élargie et un modèle local tenu de citer ses sources, l'outil transforme une enquête souvent pénible en point de départ plus clair.

Ce qui compte le plus, au-delà du modèle, ce sont les garde-fous : validation des citations, capacité à répondre « je ne sais pas », mesure du temps de traitement et transparence sur les données. En pratique, ça rappelle une règle simple : une IA utile en développement doit rendre ses limites visibles, pas seulement produire une réponse fluide.

Pour une équipe, le bon usage reste simple : interroger l'historique, examiner les preuves, puis décider avec les tests et le contexte métier. L'IA peut aider à retrouver pourquoi une ligne existe. Ensuite, c'est à l'équipe de vérifier si cette raison tient encore aujourd'hui.

Questions frequentes

Le modèle Gemma utilisé pour répondre fonctionne localement avec Ollama, sans appel à une API d’inférence distante. Cela ne signifie pas que tous les composants sont nécessairement hors ligne : l’indexation peut utiliser une base de données distante et l’observabilité peut transmettre des métadonnées. Il faut vérifier la configuration retenue.
Chaque affirmation doit être associée à une source et à une citation exacte, contrôlée automatiquement avant affichage. Si la citation ne correspond pas, la réponse est rejetée. Ce mécanisme empêche les références fabriquées, mais ne garantit pas que l’interprétation d’une citation réelle soit correcte.
Pas de manière fiable. L’outil peut élargir la recherche à l’historique indexé et, si l’accès est configuré, à des discussions liées. Si aucune preuve suffisante n’existe, il doit signaler que l’historique est muet. C’est une limite saine : le modèle ne devrait pas combler le manque par une supposition.
Il peut aider les développeurs qui reprennent un dépôt ancien, les équipes de maintenance et les responsables de revue à retrouver plus vite le contexte de décisions passées. Il est surtout utile quand Git et les discussions conservent des traces exploitables. Il ne remplace ni la documentation, ni les tests, ni la validation d’une modification.

Articles similaires