<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Navigation-De-Code | Antoine Weill--Duflos</title>
    <link>https://antoine.weill-duflos.fr/fr/tag/navigation-de-code/</link>
      <atom:link href="https://antoine.weill-duflos.fr/fr/tag/navigation-de-code/index.xml" rel="self" type="application/rss+xml" />
    <description>Navigation-De-Code</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>fr-fr</language><lastBuildDate>Sat, 06 Jun 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://antoine.weill-duflos.fr/media/icon_hu_d686267daab28486.png</url>
      <title>Navigation-De-Code</title>
      <link>https://antoine.weill-duflos.fr/fr/tag/navigation-de-code/</link>
    </image>
    
    <item>
      <title>cortexmd : un cerveau de mémoire à long terme et de navigation de code pour agents IA</title>
      <link>https://antoine.weill-duflos.fr/fr/project/cortexmd/</link>
      <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/project/cortexmd/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/Leicas/cortexmd&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cortexmd&lt;/a&gt; est un cerveau de mémoire à long terme et de navigation de code pour agents IA, exposé via le &lt;strong&gt;Model Context Protocol&lt;/strong&gt;. Tout a commencé par un projet privé sur mon homelab appelé obsidian-mcp, un serveur qui permettait à Claude de lire, chercher et écrire des notes dans mon coffre Obsidian. Je l&amp;rsquo;ai construit pour moi, puis je l&amp;rsquo;ai nettoyé pour le partager.&lt;/p&gt;
&lt;p&gt;Il fait deux choses.&lt;/p&gt;
&lt;p&gt;La première, c&amp;rsquo;est la &lt;strong&gt;mémoire&lt;/strong&gt;. Les agents oublient tout d&amp;rsquo;une session à l&amp;rsquo;autre. cortexmd leur offre un endroit où déposer ce qu&amp;rsquo;ils apprennent : des mémoires auto-catégorisées en types comme observation, décision, intuition et plan, avec un cycle de vie thermique où lire une mémoire la réchauffe et l&amp;rsquo;inactivité la refroidit. Le rappel est hybride, fusionnant la recherche plein texte et la recherche sémantique, amplifié par la température et les liens. Au début d&amp;rsquo;une session, l&amp;rsquo;agent effectue un réveil qui fait remonter les mémoires les plus chaudes et les plus pertinentes, pour reprendre là où il s&amp;rsquo;était arrêté.&lt;/p&gt;
&lt;p&gt;La seconde, c&amp;rsquo;est la &lt;strong&gt;navigation de code&lt;/strong&gt;. Un indexeur en Rust parcourt un dépôt, l&amp;rsquo;analyse avec tree-sitter et construit une base de données de symboles en SQLite qui enregistre, pour chaque symbole, son nom, son type, sa signature, sa docstring, sa plage dans le fichier et son graphe d&amp;rsquo;appels. Cet index est exposé sous forme d&amp;rsquo;outils MCP peu coûteux : recherche de symboles, plan de fichier, appelants et appelés, impact des changements, chaîne d&amp;rsquo;appels, code mort, cycles d&amp;rsquo;import et doublons issus de copier-coller. L&amp;rsquo;objectif de conception est qu&amp;rsquo;un agent navigue dans le code en interrogeant l&amp;rsquo;index, à environ 60 jetons par résultat, plutôt qu&amp;rsquo;en lisant des fichiers entiers. Un hook shell optionnel réécrit des commandes comme grep et cat sur un dépôt indexé en l&amp;rsquo;appel de navigation de code équivalent.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;élément qui l&amp;rsquo;a rendu publiable, c&amp;rsquo;est le &lt;strong&gt;modèle de coffre-cerveau&lt;/strong&gt; (brain-vault). cortexmd possède un coffre-cerveau distinct qui est la seule chose dans laquelle il écrit. Vos propres coffres sont attachés en tant que sources en lecture seule, indexés pour la recherche et la navigation de code, jamais modifiés, avec une liste d&amp;rsquo;autorisation par refus par défaut pour que les sous-arbres privés restent à l&amp;rsquo;écart. Les données circulent dans un seul sens, donc il n&amp;rsquo;y a aucun fichier mutable partagé et aucune course à la fusion.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  SOURCE_VAULTS[]  (read-only, opt-in, allowlisted)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ┌───────────┐  ┌───────────┐  ┌───────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  │  notes/   │  │  code/    │  │  docs/    │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  └─────┬─────┘  └─────┬─────┘  └─────┬─────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        │  index (one-way, read)      │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        └──────────────┼──────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              │     cortexmd     │   &amp;lt;- sole writer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              │   (MCP server)   │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       │ writes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              │   BRAIN_VAULT    │   memories · journal · diaries
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              │ (own dir, not    │   tasks · KG notes · code-repos.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              │  your vault)     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il fonctionne selon deux modes : un mode &lt;strong&gt;local-stdio&lt;/strong&gt; sans Docker, sans authentification et sans réseau, recommandé pour une seule personne ; et un mode &lt;strong&gt;HTTP auto-hébergé&lt;/strong&gt; avec authentification pour les configurations multi-clients. Le dépôt est un monorepo polyglotte, un serveur MCP en TypeScript et un binaire Rust unique, maintenus cohérents par un contrat partagé et une vérification de parité en CI.&lt;/p&gt;
&lt;p&gt;cortexmd est &lt;strong&gt;en pré-alpha et sous licence MIT&lt;/strong&gt;. Les API et les noms de configuration sont encore susceptibles de changer.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;histoire complète est racontée dans une série de quatre billets de blog. Commencez par &lt;a href=&#34;../../post/cortexmd-second-brain/&#34;&gt;Donner un second cerveau à un agent IA&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Le tueur de tokens : naviguer dans le code sans le lire</title>
      <link>https://antoine.weill-duflos.fr/fr/post/cortexmd-token-killer/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/cortexmd-token-killer/</guid>
      <description>&lt;p&gt;Dans la &lt;a href=&#34;../cortexmd-memory-engine/&#34;&gt;deuxième partie&lt;/a&gt;, j&amp;rsquo;ai écrit sur la moitié de cortexmd qui combat l&amp;rsquo;oubli : le moteur de mémoire, avec sa chaleur, sa décroissance et son rêve nocturne. Ce billet parle de l&amp;rsquo;autre moitié, celle qui combat le gaspillage.&lt;/p&gt;
&lt;p&gt;Voici le problème. Quand vous demandez à un agent IA de travailler sur une vraie base de code, le réflexe par défaut est de lire des fichiers. L&amp;rsquo;agent ouvre un fichier, le tout atterrit dans son contexte, et vous payez désormais pour chacune de ses lignes. La plupart de ces lignes sont du bruit pour la tâche en cours. Vous vouliez savoir ce que fait une fonction et qui l&amp;rsquo;appelle, et au lieu de cela vous avez acheté un fichier de mille lignes, plus ses imports, plus trois modules d&amp;rsquo;aide qu&amp;rsquo;il a tirés au passage par prudence. Faites cela quelques fois et la fenêtre de contexte se remplit de code que l&amp;rsquo;agent n&amp;rsquo;utilisera jamais, le signal est enseveli, et la facture est bien réelle.&lt;/p&gt;
&lt;p&gt;La solution consiste à arrêter de lire le code pour commencer à l&amp;rsquo;interroger.&lt;/p&gt;
&lt;h2 id=&#34;un-dépôt-est-un-graphe-pas-un-tas-de-texte&#34;&gt;Un dépôt est un graphe, pas un tas de texte&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;intuition est ancienne, ennuyeuse et juste : le code source n&amp;rsquo;est pas vraiment un tas plat de texte. C&amp;rsquo;est un graphe de symboles. Des fonctions, des méthodes, des types, et les arêtes entre eux, qui appelle qui. Un IDE le sait. &amp;ldquo;Aller à la définition&amp;rdquo; et &amp;ldquo;trouver toutes les références&amp;rdquo; ne lisent pas vos fichiers de haut en bas à chaque clic. Ils consultent un index. cortexmd donne la même chose à un agent.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;indexeur est un binaire Rust (&lt;code&gt;cortexmd-cli&lt;/code&gt;, le même binaire qui embarque le client en ligne de commande et les hooks de session dont je parlerai plus loin). Il parcourt un dépôt, analyse chaque fichier avec tree-sitter, et écrit le résultat dans une base de données de symboles SQLite. Pour chaque symbole, il enregistre le nom, le genre (fonction, méthode, type, et ainsi de suite), la signature, la docstring s&amp;rsquo;il y en a une, la plage dans le fichier, et, point crucial, le graphe d&amp;rsquo;appels : les appelants et les appelés. tree-sitter est le bon outil ici parce qu&amp;rsquo;il est rapide, incrémental, et qu&amp;rsquo;il parle beaucoup de langages, si bien que la même passe d&amp;rsquo;indexation fonctionne sur un dépôt polyglotte au lieu d&amp;rsquo;exiger un parseur sur mesure par chaîne d&amp;rsquo;outils.&lt;/p&gt;
&lt;p&gt;Une fois cette base de données en place, l&amp;rsquo;agent n&amp;rsquo;a plus jamais besoin d&amp;rsquo;ouvrir un fichier juste pour se repérer.&lt;/p&gt;
&lt;h2 id=&#34;les-outils-de-navigation-de-code&#34;&gt;Les outils de navigation de code&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;index est exposé aux clients MCP sous la forme d&amp;rsquo;un ensemble d&amp;rsquo;outils peu coûteux. Chacun répond à une question précise qu&amp;rsquo;un agent se pose réellement pendant qu&amp;rsquo;il travaille :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;recherche de symboles&lt;/strong&gt; : trouver des symboles par nom, signature, ou texte de docstring. Le point d&amp;rsquo;entrée vers tout le reste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;plan de fichier&lt;/strong&gt; : la forme d&amp;rsquo;un fichier (ses symboles et leurs signatures) sans les corps. Vous obtenez la table des matières plutôt que le livre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;récupérer un symbole&lt;/strong&gt; : extraire le corps d&amp;rsquo;exactement un symbole quand vous avez décidé que vous en aviez besoin, et rien d&amp;rsquo;autre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;appelants et appelés&lt;/strong&gt; : parcourir le graphe d&amp;rsquo;appels dans un sens ou dans l&amp;rsquo;autre. Qui appelle ceci, et ce que ceci appelle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;impact d&amp;rsquo;un changement&lt;/strong&gt; : la réponse transitive à &amp;ldquo;si je modifie ceci, qui casse ?&amp;rdquo;. C&amp;rsquo;est celui que je dégaine le plus souvent avant de toucher à quoi que ce soit de porteur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;chaîne d&amp;rsquo;appels&lt;/strong&gt; : le chemin d&amp;rsquo;un symbole à un autre, pour voir comment A atteint réellement Z.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;détection de code mort&lt;/strong&gt; : les symboles vers lesquels rien ne pointe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;détection de cycles d&amp;rsquo;imports&lt;/strong&gt; : là où le graphe de modules boucle sur lui-même.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;détection de doublons sémantiques&lt;/strong&gt; : la détection de copier-coller, les corps quasi identiques qui ont divergé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-la-vue-des-économies-de-navigation-de-code-avec-cortexmd-qui-indexe-son-propre-dépôt-le-projet-qui-fait-du-dogfooding-de-son-indexeur-les-chiffres-proviennent-de-la-démo-seedée-du-projet-pas-dun-benchmark-formel&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://antoine.weill-duflos.fr/img/cortexmd/code.png&#34; alt=&#34;L&amp;rsquo;onglet Code du tableau de bord cortexmd, montrant les tokens économisés par outil, un graphique de cumul, et les dépôts indexés&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      La vue des économies de navigation de code, avec cortexmd qui indexe son propre dépôt (le projet qui fait du dogfooding de son indexeur). Les chiffres proviennent de la démo seedée du projet, pas d&amp;rsquo;un benchmark formel.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Le motif est le même pour tous. L&amp;rsquo;agent restreint avant de lire. Rechercher pour trouver le symbole, dresser le plan pour voir le voisinage, consulter les appelants et l&amp;rsquo;impact d&amp;rsquo;un changement pour comprendre le rayon d&amp;rsquo;explosion, et seulement ensuite, s&amp;rsquo;il en a vraiment besoin, récupérer un symbole. La plupart des tâches n&amp;rsquo;exigent jamais un fichier complet.&lt;/p&gt;
&lt;h2 id=&#34;environ-60-tokens-par-résultat&#34;&gt;Environ 60 tokens par résultat&lt;/h2&gt;
&lt;p&gt;Voici l&amp;rsquo;objectif de conception qui a guidé tout cela. Une recherche de navigation de code est censée coûter environ 60 tokens par résultat. Lire un fichier entier en coûte des milliers. Interroger l&amp;rsquo;index est donc censé revenir bien moins cher que lire, pour la même réponse utile.&lt;/p&gt;
&lt;p&gt;Je veux être honnête sur ce qu&amp;rsquo;est ce chiffre et ce qu&amp;rsquo;il n&amp;rsquo;est pas. C&amp;rsquo;est une cible que j&amp;rsquo;ai visée en concevant l&amp;rsquo;outil, pas un résultat de référence que je vous cite. Le coût exact dépend du symbole, du langage, de la quantité de docstring. Mais sa forme générale est tout l&amp;rsquo;enjeu : un résultat est un enregistrement compact (nom, genre, signature, une plage, quelques arêtes), pas un pavé de code source. Quand l&amp;rsquo;unité de travail est un fait de 60 tokens au lieu d&amp;rsquo;un fichier de 2 000 tokens, un agent peut poser vingt questions pour le prix d&amp;rsquo;une lecture, et la fenêtre de contexte reste pleine de réponses au lieu de meule de foin.&lt;/p&gt;
&lt;p&gt;Cela se lit aussi mieux pour le modèle. Une liste propre d&amp;rsquo;appelants est plus facile à raisonner que la même information étalée sur cinq fichiers que l&amp;rsquo;agent a dû charger pour la reconstituer.&lt;/p&gt;
&lt;h2 id=&#34;attraper-la-vieille-habitude&#34;&gt;Attraper la vieille habitude&lt;/h2&gt;
&lt;p&gt;Il y a un piège à donner de meilleurs outils à un agent : il doit penser à les utiliser. La mémoire musculaire d&amp;rsquo;&amp;ldquo;enquêter sur le code&amp;rdquo;, c&amp;rsquo;est &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;. Ces habitudes sont profondes, et un agent y retombera volontiers et se mettra à charger des fichiers dans son contexte dès que vous cessez de surveiller.&lt;/p&gt;
&lt;p&gt;Alors cortexmd embarque un hook shell optionnel. Quand il est activé et que vous travaillez dans un dépôt indexé, il réécrit ces commandes en leurs équivalents peu coûteux de navigation de code. Un &lt;code&gt;grep&lt;/code&gt; cherchant un symbole devient une recherche de symboles. Un &lt;code&gt;cat&lt;/code&gt; d&amp;rsquo;un fichier devient un plan de fichier. L&amp;rsquo;agent croit faire la vieille chose, et l&amp;rsquo;index répond discrètement à la place. C&amp;rsquo;est optionnel à dessein, parce que réécrire les commandes shell de quelqu&amp;rsquo;un est exactement le genre de magie à laquelle on veut consentir plutôt que la découvrir, et parce que la réécriture n&amp;rsquo;a de sens que sur un dépôt réellement indexé.&lt;/p&gt;
&lt;p&gt;La belle propriété, c&amp;rsquo;est qu&amp;rsquo;il rejoint l&amp;rsquo;agent là où ses habitudes sont déjà. Vous n&amp;rsquo;avez pas à rééduquer le réflexe, vous l&amp;rsquo;interceptez simplement.&lt;/p&gt;
&lt;h2 id=&#34;le-dogfooding-sur-son-propre-code-source&#34;&gt;Le dogfooding sur son propre code source&lt;/h2&gt;
&lt;p&gt;Je n&amp;rsquo;ai pas testé cela sur un jouet. cortexmd est un monorepo polyglotte (TypeScript d&amp;rsquo;un côté, Rust de l&amp;rsquo;autre, j&amp;rsquo;y reviens dans la quatrième partie), et j&amp;rsquo;ai pointé l&amp;rsquo;indexeur sur le code source du projet lui-même pour travailler dessus à travers ses propres outils de navigation. C&amp;rsquo;est le test qui compte. Quand vous modifiez l&amp;rsquo;indexeur tout en naviguant avec l&amp;rsquo;indexeur, les aspérités vous trouvent vite. &amp;ldquo;L&amp;rsquo;impact d&amp;rsquo;un changement dit que rien ne casse, alors pourquoi ça a cassé&amp;rdquo; est une phrase très motivante à lire dans ses propres journaux.&lt;/p&gt;
&lt;p&gt;Le dogfooding est aussi l&amp;rsquo;endroit où les deux moitiés de cortexmd se rencontrent. L&amp;rsquo;index de code dit à l&amp;rsquo;agent ce qu&amp;rsquo;est le code en ce moment. Le moteur de mémoire de la &lt;a href=&#34;../cortexmd-memory-engine/&#34;&gt;deuxième partie&lt;/a&gt; lui dit pourquoi le code est ce qu&amp;rsquo;il est, les décisions et les impasses qu&amp;rsquo;aucune base de données de symboles n&amp;rsquo;enregistrera jamais. La structure plus l&amp;rsquo;histoire. L&amp;rsquo;une s&amp;rsquo;interroge, l&amp;rsquo;autre se rappelle, et ensemble elles forment l&amp;rsquo;essentiel de ce que je veux qu&amp;rsquo;un collaborateur possède.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est encore une pré-alpha, donc les noms exacts des outils et la configuration vont bouger. L&amp;rsquo;idée sous-jacente est stable : naviguer dans le code en interrogeant un index, pas en lisant des fichiers, et payer 60 tokens pour un fait plutôt que des milliers pour une meule de foin.&lt;/p&gt;
&lt;p&gt;Dans la &lt;a href=&#34;../cortexmd-open-source/&#34;&gt;quatrième partie&lt;/a&gt;, j&amp;rsquo;aborde la partie qui a transformé un outil privé de homelab en quelque chose que je pouvais mettre sur internet : pourquoi un outil entièrement réglé sur ma propre installation ne pouvait pas être partagé tel quel, la refonte autour du brain-vault qui l&amp;rsquo;a généralisé, et pourquoi je l&amp;rsquo;ai passé en open source.&lt;/p&gt;
&lt;p&gt;La page du projet est &lt;a href=&#34;../../project/cortexmd/&#34;&gt;ici&lt;/a&gt;, et le code se trouve sur &lt;a href=&#34;https://github.com/Leicas/cortexmd&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;github.com/Leicas/cortexmd&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;série&#34;&gt;Série&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-second-brain/&#34;&gt;Donner un second cerveau à un agent IA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-memory-engine/&#34;&gt;Le moteur de mémoire : chaleur, décroissance et rêves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Le tueur de tokens : naviguer dans le code sans le lire (vous êtes ici)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-open-source/&#34;&gt;Ouvrir le cerveau : le modèle brain-vault&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Donner un second cerveau à un agent IA</title>
      <link>https://antoine.weill-duflos.fr/fr/post/cortexmd-second-brain/</link>
      <pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/cortexmd-second-brain/</guid>
      <description>&lt;p&gt;Je travaille avec un agent de programmation presque tous les jours maintenant. Il est vraiment bon. Il lit mon code, raisonne dessus, propose des changements, lance les tests, répare ce qu&amp;rsquo;il a cassé. Et chaque fois que j&amp;rsquo;ouvre une nouvelle session, il a la mémoire d&amp;rsquo;un poisson rouge.&lt;/p&gt;
&lt;p&gt;Il ne se souvient pas de la décision que nous avons prise la semaine dernière sur la raison pour laquelle un module est structuré comme il l&amp;rsquo;est. Il ne se souvient pas que je préfère les virgules aux tirets, ni qu&amp;rsquo;un coin du code est porteur et fragile. Il ne se souvient pas de la conversation où nous avions écarté une approche pour de bonnes raisons. Tout ce contexte vivait dans la session précédente, et la session précédente n&amp;rsquo;existe plus. Alors je réexplique. Puis je réexplique encore le lendemain.&lt;/p&gt;
&lt;p&gt;Voilà le premier problème. L&amp;rsquo;agent oublie.&lt;/p&gt;
&lt;p&gt;Et il n&amp;rsquo;y a pas que le code. Dès que je lui demande de l&amp;rsquo;aide pour quoi que ce soit d&amp;rsquo;humain, le même trou s&amp;rsquo;ouvre. Demandez-lui de rédiger un e-mail et il n&amp;rsquo;a aucune idée de qui est le destinataire pour moi, s&amp;rsquo;il s&amp;rsquo;agit d&amp;rsquo;un ami proche, d&amp;rsquo;un collègue ou d&amp;rsquo;un partenaire avec qui je dois faire attention, et donc il ne sait pas quel ton adopter, parce que ce ton vivait dans des conversations passées qu&amp;rsquo;il ne peut plus voir. Il fait un mauvais travail pour relier une session à la suivante, si bien que chaque fil repart à froid. Et la façon dont je cloisonne ma vie aggrave les choses : le personnel dans un compte, le professionnel dans un autre, comme la plupart des gens. Dès que je passe de l&amp;rsquo;un à l&amp;rsquo;autre, tout ce que l&amp;rsquo;agent avait appris sur moi a tout simplement disparu. Pouf. Plus de mémoire.&lt;/p&gt;
&lt;h2 id=&#34;deux-problèmes-pas-un-seul&#34;&gt;Deux problèmes, pas un seul&lt;/h2&gt;
&lt;p&gt;Le second problème est plus discret, mais il apparaît sur chaque facture. Pour faire quoi que ce soit d&amp;rsquo;utile, l&amp;rsquo;agent doit comprendre le code, et la façon dont il comprend le code, c&amp;rsquo;est en le lisant. Donc il lit des fichiers. Des fichiers entiers. Pour répondre à une petite question sur une fonction, il va charger un module entier dans son contexte, et souvent les modules qui appellent ce module aussi. Multipliez cela sur une session de travail et vous payez, en tokens, pour charger le même code source encore et encore, dont la majeure partie n&amp;rsquo;a rien à voir avec la question posée.&lt;/p&gt;
&lt;p&gt;Les deux problèmes viennent du même endroit : l&amp;rsquo;agent n&amp;rsquo;a aucun stockage persistant de ce qu&amp;rsquo;il a appris, et aucun moyen bon marché de consulter les choses. Il n&amp;rsquo;a que la fenêtre de contexte devant lui, et cette fenêtre est à la fois oublieuse et coûteuse à remplir.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai décidé de m&amp;rsquo;attaquer aux deux. Pas parce que j&amp;rsquo;avais une idée de produit, mais parce que ça m&amp;rsquo;agaçait au quotidien et que j&amp;rsquo;avais un homelab qui ne demandait qu&amp;rsquo;à être utile.&lt;/p&gt;
&lt;p&gt;Il y avait aussi une raison personnelle qui rendait la forme de la solution évidente. Il y a quelque temps, après avoir lu le long récit d&amp;rsquo;un &lt;a href=&#34;https://blog.tolki.dev/posts/2022/pkm/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ami sur son propre parcours de gestion de connaissances personnelles&lt;/a&gt;, je me suis mis à prendre des notes dans Obsidian. Construire ce second cerveau pour moi-même a changé ma façon de voir le problème. Si un coffre de notes liées fonctionne comme mémoire externe pour moi, il devrait fonctionner comme mémoire externe pour l&amp;rsquo;agent aussi. Je pouvais le laisser lire le mien pour démarrer, en lecture seule, puis le laisser construire le sien, un cerveau que je pourrais réellement ouvrir, parcourir et comprendre. Pas une boîte noire d&amp;rsquo;embeddings quelque part, mais des notes, dans un coffre, qui m&amp;rsquo;appartiennent.&lt;/p&gt;
&lt;h2 id=&#34;lorigine-sur-le-homelab&#34;&gt;L&amp;rsquo;origine sur le homelab&lt;/h2&gt;
&lt;p&gt;Depuis un moment, je fais tourner un petit serveur MCP sur mon homelab. MCP, le Model Context Protocol, est la manière standard de donner à un client IA des outils et des données qu&amp;rsquo;il peut aller chercher. Le serveur que j&amp;rsquo;avais construit s&amp;rsquo;appelait obsidian-mcp, et son premier rôle était simple : donner à Claude la capacité de lire, de chercher et d&amp;rsquo;écrire des notes dans mon coffre Obsidian.&lt;/p&gt;
&lt;p&gt;Il tournait dans un conteneur Docker derrière un reverse proxy, mes notes étaient déjà là, et tout à coup l&amp;rsquo;agent pouvait y accéder. Cela seul était déjà utile. Mais cela transformait aussi le coffre en un endroit naturel où placer les réponses à mes deux problèmes, parce qu&amp;rsquo;un coffre n&amp;rsquo;est que du texte structuré qu&amp;rsquo;un agent peut lire et écrire, et c&amp;rsquo;est exactement ce sur quoi une mémoire et un index de code doivent reposer.&lt;/p&gt;
&lt;p&gt;Le serveur a donc fait pousser deux nouvelles capacités, une pour chaque problème.&lt;/p&gt;
&lt;p&gt;La première capacité est un système de mémoire, inspiré de &lt;a href=&#34;https://github.com/mempalace/mempalace&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mempalace&lt;/a&gt;, un projet de palais de mémoire pour agents IA. Au lieu de laisser tout s&amp;rsquo;évaporer à la fin d&amp;rsquo;une session, l&amp;rsquo;agent peut stocker ce qu&amp;rsquo;il apprend : une observation, une décision, une intuition, une préférence que j&amp;rsquo;ai exprimée à voix haute. Ces mémoires ne s&amp;rsquo;empilent pas simplement à l&amp;rsquo;infini dans une liste plate. Elles ont un cycle de vie. Celles qui servent restent chaudes et faciles à faire remonter, celles que personne ne touche refroidissent et finissent par être pliées dans des résumés, et au début d&amp;rsquo;une nouvelle session l&amp;rsquo;agent fait un réveil qui ramène à la surface les mémoires les plus chaudes et les plus pertinentes. L&amp;rsquo;objectif, c&amp;rsquo;est la continuité. L&amp;rsquo;agent reprend à peu près là où il s&amp;rsquo;était arrêté plutôt qu&amp;rsquo;à partir de zéro. C&amp;rsquo;est le sujet de la deuxième partie.&lt;/p&gt;
&lt;p&gt;La seconde capacité est un index de code. Plutôt que de lire des fichiers entiers pour comprendre un dépôt, l&amp;rsquo;agent interroge un index de celui-ci. Un indexeur en Rust parcourt le dépôt, l&amp;rsquo;analyse et enregistre les choses que l&amp;rsquo;on veut réellement consulter : quels symboles existent, leurs signatures, où ils vivent, et surtout qui appelle qui. Ensuite l&amp;rsquo;agent pose des questions ciblées. À quoi ressemble cette fonction ? Qui l&amp;rsquo;appelle ? Qu&amp;rsquo;est-ce qui casse si je la modifie ? Chaque réponse est petite et bon marché, de l&amp;rsquo;ordre d&amp;rsquo;une consultation plutôt que d&amp;rsquo;une lecture complète, au lieu de traîner le fichier entier dans le contexte. L&amp;rsquo;objectif de conception est franc : une consultation de navigation de code devrait coûter environ soixante tokens par résultat et être bien moins chère que la lecture du fichier dont elle provient. C&amp;rsquo;est le sujet de la troisième partie.&lt;/p&gt;
&lt;h2 id=&#34;dun-outil-privé-à-cortexmd&#34;&gt;D&amp;rsquo;un outil privé à cortexmd&lt;/h2&gt;
&lt;p&gt;Pendant des mois, ce fut une affaire personnelle. Ça tournait sur mon matériel, sur mon propre coffre Obsidian privé, celui qui contient à la fois des notes personnelles et professionnelles. Je n&amp;rsquo;en citerai rien ici, et l&amp;rsquo;outil lui-même est délibérément construit pour que les données restent les miennes. Mais le constat tient : c&amp;rsquo;était un outil que j&amp;rsquo;avais fait pour moi, et je l&amp;rsquo;utilisais tous les jours.&lt;/p&gt;
&lt;p&gt;Puis je me suis heurté à un autre genre de mur, qui venait précisément de la façon dont il marchait bien pour moi. Je le raconterai correctement dans la quatrième partie, mais en résumé : tout était réglé sur ma propre installation, mon coffre, monté et synchronisé à ma façon, ce qui en faisait un excellent outil personnel et le rendait impossible à faire tourner pour quiconque d&amp;rsquo;autre. Le rendre partageable impliquait une refonte, et c&amp;rsquo;est cette refonte qui en a finalement fait quelque chose que d&amp;rsquo;autres pouvaient utiliser.&lt;/p&gt;
&lt;p&gt;Cette refonte est devenue cortexmd. C&amp;rsquo;est open source, sous licence MIT, et public sur &lt;a href=&#34;https://github.com/Leicas/cortexmd&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;github.com/Leicas/cortexmd&lt;/a&gt;. C&amp;rsquo;est honnêtement en pré-alpha. Les API et les noms de configuration sont encore en mouvement, et je ne miserais pas un workflow de production dessus pour l&amp;rsquo;instant. Le cadrage honnête est le bon : j&amp;rsquo;ai construit ça pour moi, puis je l&amp;rsquo;ai nettoyé pour le partager. Le nettoyage est un vrai travail et il constitue l&amp;rsquo;essentiel de la quatrième partie.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-ce-que-cest-devenu--le-panneau-de-contrôle-de-cortexmd-cette-capture-provient-de-la-démonstration-autonome-du-projet-donc-les-données-sont-des-exemples-seedés-pas-mon-propre-coffre&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://antoine.weill-duflos.fr/img/cortexmd/overview.png&#34; alt=&#34;L&amp;rsquo;onglet vue d&amp;rsquo;ensemble du panneau de contrôle de cortexmd, avec les panneaux de requêtes, de latence, de mémoire et de navigation de code, et un tableau d&amp;rsquo;usage des outils&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Ce que c&amp;rsquo;est devenu : le panneau de contrôle de cortexmd. Cette capture provient de la démonstration autonome du projet, donc les données sont des exemples seedés, pas mon propre coffre.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Voilà donc la forme de la série. Il y avait deux problèmes, un agent qui oublie et un agent qui brûle des tokens à relire du code. Il y a deux réponses, un système de mémoire et un index de code, tous deux nés à l&amp;rsquo;intérieur d&amp;rsquo;un serveur MCP sur un homelab. Et il y a la refonte qui a transformé un outil privé en quelque chose que vous pouvez faire tourner vous-même.&lt;/p&gt;
&lt;h2 id=&#34;ce-qui-arrive&#34;&gt;Ce qui arrive&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Partie 2, le moteur de mémoire.&lt;/strong&gt; Chaleur, déclin et rêves. Les huit catégories dans lesquelles une mémoire peut tomber, le cycle de vie chaud vers tiède vers froid, la promotion à l&amp;rsquo;accès, la consolidation, le rappel hybride qui fusionne recherche plein texte et recherche sémantique, le réveil de session, et le graphe de liaison automatique qui relie les notes entre elles au fur et à mesure qu&amp;rsquo;elles sont stockées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partie 3, le tueur de tokens.&lt;/strong&gt; L&amp;rsquo;indexeur en Rust et tree-sitter, la base de données de symboles SQLite, les outils de navigation de code, l&amp;rsquo;idée des environ soixante tokens par résultat, le hook shell optionnel qui réécrit des commandes comme grep et cat sur un dépôt indexé en leur équivalent bon marché, et ce que ça a donné de l&amp;rsquo;utiliser sur le propre code source du projet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partie 4, l&amp;rsquo;ouverture du cerveau en open source.&lt;/strong&gt; Pourquoi un outil qui ne marchait que pour moi a dû être repensé pour être partagé, le modèle du brain-vault qui le généralise, les deux modes de déploiement, le monorepo polyglotte tenu ensemble par un contrat partagé, le renommage, et pourquoi je tiens à posséder mes propres données.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous voulez sauter directement au code, la page du projet est par &lt;a href=&#34;../../project/cortexmd/&#34;&gt;ici&lt;/a&gt; et le dépôt est &lt;a href=&#34;https://github.com/Leicas/cortexmd&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;sur GitHub&lt;/a&gt;. Sinon, la deuxième partie est l&amp;rsquo;endroit où l&amp;rsquo;agent commence à se souvenir.&lt;/p&gt;
&lt;h2 id=&#34;série&#34;&gt;Série&lt;/h2&gt;
&lt;p&gt;Ceci est la &lt;strong&gt;Partie 1 : Donner un second cerveau à un agent IA&lt;/strong&gt; (vous êtes ici).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Partie 1 : Donner un second cerveau à un agent IA (ce billet)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-memory-engine/&#34;&gt;Partie 2 : Le moteur de mémoire : chaleur, déclin et rêves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-token-killer/&#34;&gt;Partie 3 : Le tueur de tokens : naviguer dans le code sans le lire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-open-source/&#34;&gt;Partie 4 : Ouvrir le cerveau en open source : le modèle brain-vault&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Page du projet : &lt;a href=&#34;../../project/cortexmd/&#34;&gt;cortexmd&lt;/a&gt;. Source : &lt;a href=&#34;https://github.com/Leicas/cortexmd&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;github.com/Leicas/cortexmd&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
