Vous vous souvenez qu’on en a parlé. Vous ne vous souvenez pas des mots. Avec la 0.16.1, Diffwright cherche dans vos Pull Requests par le sens : un modèle installé avec l’application compare des idées plutôt que des mots, sur votre ordinateur. C’est en bêta, les chiffres viennent d’un corpus de test, et cet article dit aussi ce que la fonction ne fait pas encore.
En bref
- Tapez la question avec vos mots dans ⌘K (« pourquoi on a retiré le cache des avatars ? ») : Diffwright cherche la PR, la description ou le fil de discussion qui en parle, même s’il est formulé autrement.
- Une seule liste « Résultats » classe ensemble les PR, les commentaires et les passages trouvés par le sens. Chaque ligne dit pourquoi elle est là.
- Dans l’onglet Infos d’une PR, la carte « PR similaires » montre les PR passées qui parlent de la même chose.
- La recherche se fait sur votre ordinateur : le modèle est installé avec Diffwright, il n’y a ni compte ni clé d’API, rien n’est envoyé sur le réseau pour la recherche et rien n’est écrit sur la plateforme.
- Disponible à partir de la 0.16.1, sur Mac Apple Silicon et Windows. Pas sur Mac Intel.
On se souvient du sens, pas des mots
Dans le dépôt atlas-identity de Contoso, quelqu’un a expliqué il y a quelques mois pourquoi les utilisateurs étaient déconnectés au bout d’un quart d’heure. Vous ne savez plus si la PR parlait de « timeout », d’« expiration », de « session » ou de « jeton », ni si elle était rédigée en français ou en anglais. Une recherche par mots-clés vous demande de deviner le mot qu’a choisi l’auteur. Si vous vous trompez, elle ne trouve rien, et vous ne savez pas si c’est parce que la discussion n’existe pas.
La recherche par le sens part de l’autre bout. Elle compare ce que disent les textes, pas les lettres qu’ils contiennent : « déconnecté au bout d’un quart d’heure » peut retrouver une PR intitulée « Fix session timeout », sans un seul mot commun.
Ce que vous voyez dans ⌘K
Dès trois lettres, la recherche affiche un seul groupe, « Résultats ». Les PR trouvées par leur titre, les commentaires (dont la recherche a été présentée dans l’article précédent) et les passages trouvés par le sens y sont classés ensemble, par pertinence. Il n’y a plus « les PR d’abord, les commentaires ensuite ».
Chaque ligne indique :
- d’où vient la correspondance : Titre, Commentaire, Description ou Sens ;
- sa « température », en trois barres : Très pertinent, Pertinent ou Peu sûr ;
- l’extrait trouvé, avec vos mots surlignés quand c’est utile.
Un résultat trouvé par le sens seul doit dépasser un seuil de proximité pour apparaître, et il reste marqué « Peu sûr » tant que ni les mots ni un commentaire ne le confirment. Diffwright préfère vous montrer moins de résultats qu’un résultat sans rapport présenté avec assurance.
La recherche est aussi plus simple : les boutons « Sens seul », « Partout » et « Tri » ont disparu. Elle cherche dans tous les projets (coupez Réglages › Synchronisation › « Chercher dans tous les projets » pour la limiter à vos favoris) et décide de l’ordre : la pertinence quand vous tapez du texte, les signaux (à relire, récentes) quand vous n’avez que des filtres.
Deux améliorations de la recherche par mots en profitent, avec ou sans recherche par le sens :
- la description des PR est lue : un mot présent dans la description fait remonter la PR (après la prochaine lecture de la PR par l’index ; le titre reste prioritaire) ;
- moins de faux résultats : un mot de quatre lettres ou plus n’est plus « retrouvé » dans un long titre où ses lettres sont simplement éparpillées. Les fautes de frappe restent tolérées.
Comment ça marche, sans jargon
Pour chaque Pull Request de l’index, Diffwright découpe le texte en fragments : un pour l’en-tête (titre, description, nom des branches) et un par fil de discussion. Un modèle compact, EmbeddingGemma (publié par Google, environ 300 millions de paramètres), transforme chaque fragment en une suite de nombres qui en représente le sens. Ce modèle n’écrit rien et ne répond à aucune question : il mesure seulement à quel point deux textes parlent de la même chose. Les nombres sont rangés dans la base locale de la recherche, à côté de l’index des mots.
Quand vous cherchez, deux méthodes travaillent ensemble :
- les mots, imbattables pour un identifiant : un numéro de PR, un nom de fonction, un nom de branche ;
- le sens, qui rattrape les reformulations, les synonymes et, en partie, les autres langues.
Leurs résultats sont fusionnés en une seule liste. En pratique, sur une question en langage courant, c’est surtout le sens qui classe ; sur un identifiant, ce sont les mots.
Mesuré sur un corpus de test, pas sur votre équipe
Les chiffres ci-dessous viennent d’un corpus synthétique de 2 400 PR et 114 questions, mesuré le 14 octobre 2026 sur un Mac M4 Pro. Ils comparent les méthodes entre elles ; ils ne prédisent pas ce que vous obtiendrez sur vos dépôts. La mesure : la part des PR attendues qui apparaissent dans les dix premiers résultats.
| Type de question | Mots seuls | Sens seul | Mots + sens |
|---|---|---|---|
| Toutes les questions | 36 % | 52 % | 61 % |
| Reformulées, sans mot commun avec la PR | 4 % | 43 % | 43 % |
| Posées dans l’autre langue | 1 % | 32 % | 32 % |
| Identifiant exact (numéro, nom de fonction) | 100 % | 55 % | 100 % |
Ce qu’il faut en retenir :
- sur une question reformulée, les mots seuls ne trouvent presque rien, le sens trouve un peu moins d’une PR attendue sur deux ;
- d’une langue à l’autre, le sens aide, mais modestement : environ une fois sur trois ;
- la combinaison garde la précision des mots sur les identifiants, là où le sens seul hésite.
Côté temps de réponse, transformer la question en nombres prend environ 37 ms, et la recherche elle-même jusqu’à environ 26 ms sur un index de 80 000 fragments : de l’ordre de 40 à 70 ms au total. Windows n’a pas été mesuré.
Une précaution : les questions « reformulées » du corpus ont été écrites exprès sans aucun mot commun avec leur PR, le cas le plus défavorable à la recherche par mots. Dans une vraie équipe, on reprend plus souvent les mots des PR. La pertinence sur un historique réel n’a pas encore été mesurée, et les réglages pourront évoluer quand elle le sera.
Ce qui reste sur votre ordinateur
- Le modèle est installé avec Diffwright. L’application ne télécharge pas de modèle, ne demande ni compte ni clé d’API, et rien n’est envoyé sur le réseau pour la recherche. Sans connexion, vous cherchez dans ce qui est déjà indexé ; l’indexation, elle, a besoin de lire la plateforme.
- L’index vit dans
~/.diffwright/search/. Vous pouvez le purger dépôt par dépôt, ou en entier, depuis les réglages. - Elle ne passe par aucun moteur d’IA (ni
claude, ni Ollama, ni un fournisseur par clé d’API) et ne dépend pas du réglage IA : couper l’IA ne coupe pas la recherche par le sens. Pour la couper, c’est dans Réglages › Recherche sémantique.
Ce confort a un coût, et il vaut mieux le connaître :
- le modèle pèse environ 330 Mo, ce qui alourdit l’installeur et les mises à jour ;
- chargé, il occupe environ 1,1 Go de mémoire (mesure de développement) ; il n’est chargé qu’au premier besoin et libéré après cinq minutes sans indexation ni recherche ;
- il a ses propres conditions d’utilisation (Gemma Terms of Use, de Google), reproduites dans la fenêtre « Licences et mentions légales » (À propos).
Une indexation qui lit sans écrire
La recherche par le sens est activée par défaut. Une première passe démarre environ 45 secondes après le lancement, puis l’indexation continue en arrière-plan, à faible priorité, et se met en retrait sur batterie faible, en mode économie d’énergie ou sur un réseau limité.
Elle ne fait que lire, avec un plafond de requêtes par heure : 600 sur Azure DevOps, 300 sur GitLab, 150 sur GitHub. Elle respecte la limite de débit de chaque plateforme et recule quand celle-ci le demande. Aucun commentaire, aucun vote, aucune écriture.
Sur Azure DevOps, ce plafond correspond à environ 300 à 600 PR par heure. Sur une grande organisation, la première indexation prend donc plusieurs heures d’application ouverte : 3 000 PR, c’est de l’ordre de 5 à 10 heures. Sur GitHub et GitLab, seules les PR que Diffwright connaît déjà (ouvertes dans l’application, ou reçues par notification) sont indexées.
Dans Réglages › Recherche sémantique, vous pouvez :
- activer ou couper la fonction ;
- suivre l’avancement, le mettre en pause et le reprendre ;
- choisir les dépôts indexés ;
- régler l’historique indexé, de 6 mois à 5 ans (24 mois par défaut) ;
- voir la place occupée sur le disque, et purger un dépôt ou tout l’index.
Pour donner un ordre de grandeur : sur le corpus de test, un fragment occupe environ 900 octets sur le disque, soit à peu près 90 Mo pour 80 000 fragments. Des discussions plus longues que celles du corpus donneront plus de fragments par PR.
« PR similaires » : le précédent sous la main
Pendant une review, la dernière carte de l’onglet Infos propose les PR les plus proches de celle que vous lisez, avec un niveau « Très proche » ou « Proche », jamais un score. Elle sert à trois moments :
- repérer un doublon avant de commenter ;
- retrouver un précédent (« on avait déjà traité ça côté API ») ;
- comprendre pourquoi une décision a été prise ailleurs.
Un clic ouvre la PR, ⌘-clic (Ctrl-clic sous Windows) l’ouvre dans une nouvelle fenêtre. La comparaison s’appuie sur l’en-tête de la PR : titre, description et branches. Sur le corpus de test, c’était nettement plus fiable que de mélanger tous les fils, parce que les remarques génériques (« ajoute un test ») font se ressembler toutes les PR. Le calcul réutilise ce qui est déjà indexé : la carte n’attend aucun calcul de modèle.
Les limites, dites franchement
- Mac Intel : pas de recherche par le sens, le moteur d’inférence utilisé n’existe pas en version précompilée pour ces Mac. La recherche par mots, descriptions comprises, fonctionne normalement.
- macOS 13.4 minimum : Diffwright demande désormais macOS 13.4 ou plus récent.
- Windows : la fonction n’a pas encore été essayée sur une vraie machine Windows. Si elle se comporte mal, coupez-la dans Réglages › Recherche sémantique et signalez-le : [CANAL-DE-RETOUR].
- Aucune vraie organisation : ni la pertinence, ni les plafonds de requêtes, ni les temps d’indexation n’ont encore été vérifiés sur une organisation réelle. Les chiffres de cet article sont ceux du corpus de test.
- Le code n’est pas indexé : la recherche par le sens porte sur les PR, leurs descriptions et leurs discussions, pas sur le contenu des fichiers.
- GitHub et GitLab sont en bêta dans Diffwright, et seules les PR déjà connues de l’application sont indexées.
- 0.16.0 : ses installeurs ont été publiés sans le modèle, ce qui masquait la fonction. Mettez à jour vers la 0.16.1.
Et aussi dans la 0.16
- GitHub et GitLab dans l’assistant de connexion. L’étape « Connexion » propose Azure DevOps, GitHub et GitLab sous forme de cartes, pilotables aux flèches et à ↵, avec l’aide de création de token propre à chaque plateforme. Avec un seul projet ou un seul dépôt, l’assistant ne propose plus de favori.
- L’aide des raccourcis (⌘/) se filtre. Tapez quelques lettres : elle retrouve un raccourci par son libellé ou par ses touches, et place en tête ceux de l’espace où vous êtes.
- Des panneaux repliés lisibles. Le bandeau Review replié dit en clair « 20/389 fichiers revus », « 15 en attente », « 7 fils ouverts ».
- Un risque qui ne rassure pas à tort. Quand Diffwright n’a mesuré qu’une partie des fichiers, la carte Risque affiche « au moins moyen » ou « incomplet » au lieu de « faible ».
Essayer
Mettez Diffwright à jour vers la 0.16.1 depuis l’application, ou téléchargez-le. Ouvrez ⌘K (Ctrl+K sous Windows), et posez la question comme vous la poseriez à un collègue. La réponse vient de vos propres PR, et la recherche se fait sur votre ordinateur.
Diffwright est en bêta. Recherche par le sens disponible à partir de la 0.16.1, sur Mac Apple Silicon (macOS 13.4 ou plus récent) et Windows.