Vue normale

Codage agentique : le retour d’expérience de Spotify

4 février 2026 à 14:33

« Tu es un ingénieur très expérimenté qui effectue une revue de code. Ta tâche est de comprendre si les changements proposés suivent les instructions. »

Ainsi débute un des prompts système que Spotify a définis dans le cadre de son architecture de codage agentique.

L’entreprise avait amorcé sa réflexion à ce sujet en février 2025. Son système Fleet Management automatisait alors déjà une grande partie de la maintenance logicielle. À partir d’extraits de code, il exécutait les transformations à l’échelle dans un environnement GKE et ouvrait les PR sur les dépôts cibles.

Ce mécanisme facilitait des opérations telles que la mise à niveau des dépendances dans les fichiers de build, la mise à jour des fichiers de configuration et le refactoring simple (par exemple, supprimer ou remplacer un appel de méthode). La moitié des PR poussés depuis mi-2024 l’avaient été par ce biais.

Fleet Management était moins adapté aux changements complexes nécessitant de manipuler l’arbre de la syntaxe abstraite d’un programme ou d’utiliser des expressions régulières. Illustration avec le gestionnaire de dépendances Maven. Autant sa fonction principale est simple (identifier les fichiers pom.xml et mettre à niveau les dépendances Java), autant les cas particuliers avaient fait grossir à plus de 20 000 lignes le script de transformation associé. Plus globalement, peu d’équipes avaient l’expertise et le temps adéquats.

Un premier focus sur la migration de code

La mise en place de l’approche agentique s’est d’abord portée sur la déclaration du code de transformation. Objectif : permettre la définition et l’exécution de changements en langage naturel, en remplacement des scripts de migration déterministes.

Plutôt que de choisir un agent sur étagère, Spofity a conçu un CLI. Celui-ci peut déléguer l’exécution d’un prompt à divers modèles d’IA. Mais aussi exécuter des tâches de formatage et de linting en utilisant MCP, évaluer une diff par LLM as a judge, uploader des logs vers GCP et capturer des traces dans MLflow.

Début novembre 2025, quelque 1500 PR fusionnés étaient passés par ce système. Spotify s’attaquait alors à des opérations telles que :

  • Modernisation de langage (par exemple, remplacer des value types par des records en Java)
  • Upgrades sans breaking changes (migration de pipelines data vers la dernière version de Scio)
  • Migration entre composants UI (passage vers le nouveau système front-end de Backstage)
  • Changements de configuration (mise à jour de paramètres dans des fichiers JSON et YAML en respectant schémas et formats)

Spotify disait alors avoir gagné, sur ces tâches de migration, 60 à 90 % de temps par rapport à l’écriture du code à la main. Il se projetait sur l’amélioration du ROI avec la perspective de l’élargissement à d’autres codebases.

Slack, Jira et Cie intégrés dans une architecture agentique

En complément à cette démarche sur la migration, les travaux se sont orientés sur un système plus généraliste, capable de remplir des tâches ad hoc. On en est arrivé à une architecture multiagent qui planifie, génère et révise des PR.

Au premier niveau, il y a des agents associés à différentes applications (Slack, Jira, GitHub Enterprise…). L’interaction avec eux, éventuellement additionnée de contexte récupéré sur des serveurs MCP, produit un prompt. Ce dernier part vers l’agent de codage, lui aussi exposé par MCP. Ses actions sont vérifiées par un autre groupe d’agents.

Entre autres usages « satisfaisants », Spotify mentionne la capture de décisions d’architecture depuis des threads Slack et la possibilité, pour les product managers, de proposer des changements simples sans avoir à cloner de dépôts sur leur machine.

Des agents open source à Claude Code

Les premiers essais se sont faits avec des agents open source comme Goose et Aider. Appliqués à la migration, ils n’ont cependant pas produit de PR fiables. Spotify a donc construit sa propre boucle agentique superposée aux API de LLM. Principe : l’utilisateur fournit un prompt et une liste des fichiers que l’agent édite en incorporant à chaque étape le feed-back du système de build. La tâche s’achève quand elle réussit les tests ou qu’elle dépasse certaines limites (10 tours par session ; 3 retries).

Cette approche a convenu à de « petits » changements : éditer une ligne de code, modifier un manifeste, remplacer un flag… Mais l’agent restait difficile à utiliser. Le chargement des fichiers dans la fenêtre de contexte reposait sur une commande git-grep. En fonction de pattern de recherche, on pouvait saturer la fenêtre ou au contraire ne pas fournir assez de contexte. L’agent avait de plus du mal avant l’édition de multiples fichiers. Souvent, la boucle atteignait la limite de tours. Et lorsque la fenêtre de contexte se remplissait, l’agent finissait par oublier la tâche.

Dans ce contexte, Spotify a basculé vers Claude Code. Lequel a permis des « prompts plus naturels » tout en apportant sa capacité native de gestion de to-do lists et de création de sous-agents. Il couvre désormais la majorité des PR fusionnés en production.

Savoir interdire… et ne pas tout faire à la fois

L’agent initial fonctionnait au mieux avec des prompts stricts structurés étape par étape. Claude Code se débrouille mieux avec des prompts qui décrivent l’état final et laissent de la latitude sur le chemin à suivre.

Spotify constate qu’il peut être utile de dire clairement à l’agent quand il ne doit pas agir. Cela évite des tâches impossibles à réaliser, notamment au cas où on réutilise des prompts entre repos qui n’utilisent pas forcément les mêmes versions de langages.

Fournir des exemples de code influence par ailleurs beaucoup le résultat. Idéalement, on définira l’état souhaité sous forme de tests, l’agent ayant besoin d’un objectif vérifiable pour pouvoir itérer. On s’assurera de surcroît de ne demander qu’un changement à la fois pour éviter l’épuisement de la fenêtre de contexte. Et on n’hésitera pas à demander à l’agent un retour d’expérience à la fin de la session.

Une ouverture limitée via MCP

Spotify a privilégié les longs prompts statiques, sur lesquels les modèles raisonnement plus simplement.

Une approche alternative consiste à commencer avec un prompt plus court, mais à donner à l’agent l’accès à des outils MCP. Le contexte qu’il peut ainsi récupérer lui permet théoriquement de traiter des tâches plus complexes. Mais il rend aussi son comportement moins vérifiable et moins prévisible.

Pour le moment, Spotify permet à son agent d’accéder à un vérificateur (formatage, linting, tests), à une sélection de sous-commandes Git (pas de push ou de change origin, par exemple) et à un ensemble de commandes Bash (comme riggrep).

Encoder la méthode d’invocation des systèmes de build dans un MCP a été jugé plus simple que de s’appuyer sur des fichiers AGENTS.md. La raison : les configurations de build peuvent être très différents à travers les milliers de repos sur lesquels travaille l’agent. Cela permet aussi de réduire le bruit dans les outputs des outils en les résumant avant transmission à l’agent.

Une boucle de vérification déterministe…

Il arrive que le système échoue à générer des PR. Parfois, il en produit, mais qui ne passent pas le CI ou s’avèrent fonctionnellement incorrects. Parfois, c’est lié à un problème de couverture des tests sur le composant cible. Dans d’autres cas, l’agent va au-delà des instructions ou ne comprend tout simplement pas comment bien exécuter build et tests.

Là interviennent des boucles de vérification qui guident l’agent vers le résultat désiré. Ce dernier ignore tout de leur fonctionnement : il sait simplement qu’il peut y faire appel.

La boucle comprend plusieurs vérificateurs indépendants, exposés – par MCP – en fonction du composant logiciel. Par exemple, le vérificateur Maven ne s’active qu’en présence d’un fichier pom.xml à la racine de la codebase.

L’ensemble permet de faire abstraction d’une grande partie du bruit qui remplirait sinon la fenêtre de contexte. L’agent n’a effectivement pas besoin de comprendre les spécificités de l’appel aux différents systèmes de build ou du parsing des résultats de tests.

Qu’ils aient été ou non déclenchés pendant l’exécution de la tâche, les vérificateurs pertinents s’activent avant toute ouverture d’un PR. Avec Claude Code, cela passe par le hook stop.

… et du LLM as a judge

Au-dessus de ces vérificateurs déterministes, Spotify a ajouté une couche LLM as a judge. Nécessaire face à la tendance de l’agent à sortir du cadre des instructions.

Le LLM juge évalue la diff du changement proposé et le prompt d’origine. Il s’exécute après les autres vérificateurs. Les métriques internes indiquent qu’il rejette environ un quart des sessions. Pour la moitié d’entre elles, l’agent finit par se corriger.

Spécialisé (il ne pousse pas de code, ne rédige pas de prompts, n’interagit pas avec les utilisateurs), l’agent en est aussi plus prévisible. Et potentiellement plus sécurisé.

Début décembre, Spotify déclarait vouloir étendre son infrastructure de vérification à davantage de plates-formes (au-delà de Linux-x86). Nombre de ses systèmes ont en effet des besoins spécifiques. Entre autres ses applications iOS, qui exigent des hôtes macOS pour une exécution correcte des vérificateurs. L’entreprise a de surcroît des back-ends Arm. Elle compte aussi intégrer son agent plus profondément dans son systèmes de déploiement continu, en lui permettant d’agir sur les CI checks dans les PR. Et développer des évaluations plus structurées favorisant l’exploration de nouvelles architectures agentiques.

Illustration générée par IA

The post Codage agentique : le retour d’expérience de Spotify appeared first on Silicon.fr.

Notepad++ compromis : les spécificités d’une campagne en trois temps

4 février 2026 à 10:51

Pendant plusieurs mois, Notepad++ a servi à diffuser des malwares.

Son développeur l’a officialisé cette semaine. Dans les grandes lignes, la compromission de l’infrastructure d’hébergement a permis la distribution de mises à jour malveillantes.

Une chronologie des événements commence à se dessiner. Apparaissent trois phases, marquées par autant de chaînes d’exécution. Parmi les cibles figurent une entité gouvernementale aux Philippines, une organisation financière au Salvador et un fournisseur IT au Viêtnam.

Phase 1 : une faille dans ProShow mise à profit

La première phase s’est étalée sur fin juillet-début août.

L’interception et la modification du trafic du gestionnaire de mises à jour de Notepad++ entraînait le téléchargement et l’exécution d’un installeur NSIS d’environ 1 Mo. Au lancement, celui-ci créait un dossier et un fichier texte en son sein, y inscrivait des informations système, les téléversait sur temp.sh et envoyait l’URL vers un serveur C2.

Un downloader déposait ensuite plusieurs fichiers dans le même dossier. Dont une version légitime de logiciel ProShow… souffrant d’une vulnérabilité qui permettait de lancer un shellcode.

Ce code déchiffrait un downloader Metasploit qui récupérait et lançait un implant Cobalt Strike. Lequel communiquait avec un autre C2.

Entre fin juillet et début août, quelques éléments ont changé. Essentiellement les URL de l’implant Cobalt Strike et du C2 associé.

Phase 2 : passage à l’interpréteur Lua

La deuxième phase a commencé mi-septembre et s’est achevée à la fin du mois.

La mise à jour malveillante de Notepad++ demeurait hébergée sur le même serveur. Il s’agissait toujours d’un installeur NSIS, mais plus léger (140 ko). La collecte d’infos système suivait le même schéma que lors de la première phase.

À partir de là, les choses changeaient. Exit ProShow, place à des fichiers liés à l’interpréteur Lua. Dont un exécutable qui lançait un script localisé dans un fichier .ini.

Ce script plaçait, en mémoire exécutable, du shellcode lancé via la fonction API EnumWindoStationsW. On retrombait alors sur la chaîne « Metasploit + Cobalt Strike », avec des URL similaires.

Sur la fin de la période, des fichiers de mise à jour avec des hashs différents sont apparus. Et la collecte d’infos système était divisée en plusieurs commandes.

Phase 3 : sideload de DLL dans un exécutable Bitdefender

La troisième phase a couvert le mois d’octobre.

À cette occasion, le serveur hébergeant les mises à jour malveillantes a changé. On restait sur des fichiers NSIS, mais sans capture d’infos système. Le chargement du shellcode était cette fois-ci réalisé par charge latérale d’une DLL dans un exécutable : BluetoothService.exe. Derrière ce nom se cachait une version légitime de Bitdefender Submission Wizard.

Le shellcode était déchiffré avec une routine embarquée. Il en résultait une backdoor. Rapid7 l’a appelée Chrysalis, en référence aux multiples couches (chiffrement en enveloppe, construction de noms de cibles à la volée, hachage d’API, URL au format des endpoints DeepSeek…) compliquant la détection de ses actions.

Un des loaders exploite un syscall non documenté associé à Microsoft Warbird, un framework d’obscurcissement de code. Il n’y a pas de chargement direct de Cobalt Strike. Mais l’implant a bien été trouvé sur une machine infectée, téléchargé là aussi via un downloader Metasploit, via des URL au format similaire à celles rencontrées lors des deux premières phases.

Des similitudes avec une analyse antérieure incitent à attribuer cette troisième phase – et potentiellement l’ensemble de la campagne – au mode opératoire Lotus Blossom, dit lié à la Chine. Actif depuis au moins 2009, il s’est livré à des actions d’espionnage en Asie du Sud-Est. Et plus récemment en Amérique centrale, avec un focus sur gouvernements, télécoms, aviation, médias et infrastructures critiques.

Illustration générée par IA

The post Notepad++ compromis : les spécificités d’une campagne en trois temps appeared first on Silicon.fr.

❌