Un fil de discussion circule en ce moment : quelqu’un peste parce que son assistant IA « n’arrête pas d’ajouter à mon code des imports qui n’existent pas ». Le meilleur, ce sont les réponses. L’agent de programmation d’une personne a inventé un module, on le lui a signalé, et l’agent a répliqué que le module était bien réel. Quelqu’un d’autre a trouvé un paquet mystérieux nommé quelque chose comme TrjnHrs.Pkg ajouté discrètement à son projet. Une troisième personne a réalisé qu’un module inexistant était la raison pour laquelle le service qu’une IA avait réécrit pour un collègue était silencieusement cassé depuis une journée.
On a ri. Puis on a arrêté de rire, parce que ça nous rendait fous nous aussi.
Pourquoi les modèles inventent des imports
Les grands modèles de langage sont des reconnaisseurs de motifs, pas des compilateurs. Quand un modèle écrit import suivi d’un nom plausible, il ne vérifie pas si ce paquet existe. Il prédit ce qu’un programmeur sûr de lui taperait probablement ensuite. La plupart du temps, la prédiction tombe juste. Parfois, il tend la main avec assurance vers requests_async, react-use-debounce-hook, ou un utilitaire au nom bien propre que personne n’a jamais publié.
Le modèle n’a aucune source de vérité. Il a du flair. Et le flair est excellent pour produire des noms qui ressemblent exactement à de vrais paquets.
La partie qui devrait vraiment vous faire peur
Un import halluciné, ce n’est pas seulement un build cassé. C’est une surface d’attaque.
Les chercheurs ont désormais un nom pour ça : le slopsquatting. Les attaquants observent quels faux noms de paquets les outils d’IA ont tendance à halluciner, puis ils enregistrent ces noms sur les registres publics avec un malware à l’intérieur. Votre assistant invente trjnhrs-pkg. Quelqu’un a déjà publié trjnhrs-pkg. Votre commande d’installation se résout sans accroc. Et vous voilà en train d’exécuter le code de quelqu’un d’autre. L’import qui « n’existait pas » hier existe aujourd’hui, exprès, et il est hostile.
C’est le mode de défaillance vraiment dangereux. Une coquille, vous la repérez en cinq secondes. Un nom de paquet plausible qui se résout en silence vers la charge utile de quelqu’un, c’est le genre de chose que vous ne repérez qu’une fois en production.
Pourquoi « dites-lui juste de ne pas le faire » ne marche pas
Le fil regorge des conseils habituels. Écrivez de meilleurs prompts. Dites-lui de ne pas faire d’erreurs. Configurez les warnings en erreurs. Prenez un checker.
Les deux premiers relèvent du vœu pieux. On ne peut pas, à coups de prompts, rendre déterministe un système probabiliste sur des faits qu’il ne possède pas. Les deux derniers s’en approchent, mais un linter générique signale le symptôme (un import non résolu) sans en comprendre la cause. La dépendance n’a-t-elle tout simplement jamais été ajoutée au manifeste ? Est-ce un module interne que le linter ne voit pas ? Ou ce paquet n’existe-t-il vraiment nulle part sur Terre ? Ces trois cas sont identiques aux yeux d’un checker bête et appellent des réponses complètement différentes. (C’est la même raison pour laquelle se relire soi-même ne rattrape pas les erreurs d’allure plausible d’une IA : ce qui a écrit le code ne peut pas être la seule chose qui le vérifie.)
C’est précisément la faille que Surmado Code Review a été conçu pour combler.
Comment on l’attrape vraiment : vérifications déterministes et jugement
La solution, ce n’est pas un modèle plus intelligent. C’est de ne pas poser au modèle la question factuelle, pour commencer.
Les vérifications déterministes font le travail de savoir. À chaque pull request, Surmado Code Review résout chaque import du diff par rapport à une source de vérité : votre lockfile, votre manifeste, vos modules installés, la bibliothèque standard, vos paquets internes. Cette étape ne devine pas. Un paquet se résout ou ne se résout pas. Si super-fast-parser apparaît dans le diff et ne se résout vers rien dans votre graphe de dépendances ni rien sur le registre, c’est un fait, pas une opinion. Aucune hallucination n’est possible ici, parce que rien n’est généré. C’est une recherche.
Scout fait le travail de jugement. Une fois les faits en main, le modèle fait ce que les modèles savent vraiment faire : trier et expliquer. Il fait la différence entre « vous avez oublié d’ajouter ceci à package.json » et « ce module n’existe pas, et le vrai le plus proche porte un autre nom ». Il déduplique. Il vous pointe vers l’import que vous vouliez presque certainement. Et il fait remonter le cas qui fait peur : ce nom se résout vers un paquet publié il y a trois jours que rien d’autre dans votre écosystème ne référence. C’est l’odeur du slopsquatting, et c’est exactement le jugement qu’un simple linter ne peut pas porter.
Aucune moitié ne fonctionne seule. Les vérifications déterministes sans jugement sont bruyantes et ne savent pas s’expliquer. Un modèle sans ancrage déterministe n’est qu’une chose de plus qui hallucine des imports, en train de relire maintenant vos imports hallucinés. Mettez les deux ensemble et vous obtenez ce que tout le monde dans ce fil voulait vraiment : la certitude de ce qui est réel, plus le jugement sur ce qu’il faut faire.
Où ça tourne
Surmado Code Review commente vos pull requests. Il vérifie le diff par rapport au STANDARDS.MD de votre équipe et signale les imports inventés avant qu’ils ne soient fusionnés, pas après qu’ils ont silencieusement cassé la branche d’un collègue ou tiré un paquet que personne n’a vérifié. Un commentaire par PR, ancré à vos règles, édité sur place quand vous poussez un correctif. C’est la couche entre « l’IA l’a écrit » et « c’est dans main ».
Essayez-le gratuitement
On a construit ça parce que le problème des imports-qui-n’existent-pas nous faisait perdre du temps, et que sa version chaîne d’approvisionnement nous a vraiment fait peur. On l’utilise sur nos propres dépôts ; voici comment on l’a construit. Alors on ne le met pas derrière un mur.
Surmado Code Review est gratuit pour 10 PR par mois. Connectez-le à un dépôt GitHub, rédigez un STANDARDS.MD (Scout vous aide à le rédiger à partir d’une conversation, comme si vous expliquiez votre code à une nouvelle recrue), et il commence à attraper les imports hallucinés dès votre prochaine PR. Au-delà, c’est 15 $ par mois pour 100 PR. Pas de tarif par siège. Zéro conservation des données.
Votre IA va continuer à inventer des imports. Vous n’êtes pas obligé de continuer à les fusionner.
Essayez Surmado Code Review gratuitement
À lire également :