<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Open-Source | Antoine Weill--Duflos</title>
    <link>https://antoine.weill-duflos.fr/fr/category/open-source/</link>
      <atom:link href="https://antoine.weill-duflos.fr/fr/category/open-source/index.xml" rel="self" type="application/rss+xml" />
    <description>Open-Source</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>fr-fr</language><lastBuildDate>Sat, 13 Jun 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://antoine.weill-duflos.fr/media/icon_hu_d686267daab28486.png</url>
      <title>Open-Source</title>
      <link>https://antoine.weill-duflos.fr/fr/category/open-source/</link>
    </image>
    
    <item>
      <title>Pointeuse : un suivi du temps natif pour Odoo, sur ordinateur et Android</title>
      <link>https://antoine.weill-duflos.fr/fr/project/pointeuse/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/project/pointeuse/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/Leicas/pointeuse&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pointeuse&lt;/a&gt; est un outil de suivi du temps rapide et natif pour &lt;a href=&#34;https://www.odoo.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Odoo&lt;/a&gt;. Une &lt;em&gt;pointeuse&lt;/em&gt;, c&amp;rsquo;est exactement ce que c&amp;rsquo;est : une petite application qui vit dans la barre des tâches et qui permet de démarrer et d&amp;rsquo;arrêter un minuteur sur n&amp;rsquo;importe quelle tâche Odoo sans ouvrir de navigateur.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.odoo.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Odoo&lt;/a&gt; est un ERP puissant, mais son interface complète peut submerger quelqu&amp;rsquo;un qui veut juste noter ce sur quoi il a travaillé. Pointeuse est l&amp;rsquo;inverse : la surface la plus simple possible devant lui. Votre seul travail est de dire sur quelle tâche vous êtes, de recevoir un petit rappel, et de changer en un clic ; le temps se déverse dans Odoo sous forme de vraies feuilles de temps en coulisses, pour que l&amp;rsquo;entreprise garde toute la puissance de l&amp;rsquo;ERP. C&amp;rsquo;est aussi une démonstration que s&amp;rsquo;intégrer à Odoo est facile, sur ordinateur ou sur mobile, sans module côté serveur.&lt;/p&gt;
&lt;p&gt;Elle fait ce qu&amp;rsquo;un flux de feuilles de temps Odoo demande, mais en application native plutôt qu&amp;rsquo;en onglet web :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suivre le temps sur les tâches Odoo.&lt;/strong&gt; Démarrer ou arrêter un minuteur sur n&amp;rsquo;importe quelle &lt;code&gt;project.task&lt;/code&gt; ; la feuille de temps atterrit dans &lt;code&gt;account.analytic.line&lt;/code&gt;, là où Odoo l&amp;rsquo;attend.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration de la présence.&lt;/strong&gt; Pointer l&amp;rsquo;entrée et la sortie (&lt;code&gt;hr.attendance&lt;/code&gt;) depuis l&amp;rsquo;application ou la barre des tâches. Le minuteur s&amp;rsquo;arrête automatiquement quand vous sortez depuis ailleurs, y compris le client web Odoo ou le mobile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rappels d&amp;rsquo;inactivité.&lt;/strong&gt; Une fenêtre configurable demande sur quoi vous travaillez, avec des suggestions pour changer de tâche en un clic. Sur Android, ce sont des notifications avec boutons d&amp;rsquo;action.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hors ligne d&amp;rsquo;abord.&lt;/strong&gt; Toutes les données Odoo sont mises en cache dans SQLite. Les feuilles de temps sont mises en file localement quand vous êtes hors ligne et se synchronisent au retour de la connexion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un tableau de bord des tâches.&lt;/strong&gt; Un kanban groupé par étape et par projet, un panneau de détail de tâche, et un journal du temps avec des vues jour, semaine et mois.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elle dialogue avec n&amp;rsquo;importe quelle instance Odoo 14+ via le XML-RPC standard, sans module côté serveur à installer. Les identifiants, ou une clé API pour Odoo Online, sont stockés dans le trousseau du système, jamais sur le disque.&lt;/p&gt;
&lt;p&gt;Sous le capot, elle est construite avec &lt;strong&gt;Tauri 2&lt;/strong&gt; et un backend &lt;strong&gt;Rust&lt;/strong&gt;, avec un frontend volontairement en &lt;strong&gt;JavaScript pur sans framework&lt;/strong&gt;. Une seule base de code est publiée pour &lt;strong&gt;Windows, Linux, macOS et Android&lt;/strong&gt;. Les commits sur &lt;code&gt;main&lt;/code&gt; suivent les Conventional Commits, semantic-release découpe les versions, GitHub Actions construit les quatre plateformes, et les applications de bureau se mettent à jour seules depuis les GitHub Releases.&lt;/p&gt;
&lt;p&gt;Pointeuse est sous &lt;strong&gt;licence MIT&lt;/strong&gt;. L&amp;rsquo;histoire complète, pourquoi je l&amp;rsquo;ai construite et comment elle fonctionne, est dans l&amp;rsquo;article de blog &lt;a href=&#34;../../post/pointeuse/&#34;&gt;Pointeuse : un suivi du temps natif et hors ligne d&amp;rsquo;abord pour Odoo&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <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>Pointeuse : un suivi du temps natif et hors ligne d&#39;abord pour Odoo</title>
      <link>https://antoine.weill-duflos.fr/fr/post/pointeuse/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/pointeuse/</guid>
      <description>&lt;p&gt;















&lt;figure  id=&#34;figure-le-tableau-de-bord-des-tâches-de-pointeuse-kanban-groupé-par-étape-avec-barres-deffort-échéances-et-démarrage-du-minuteur-en-un-clic-les-captures-utilisent-une-démo-odoo-jetable-avec-des-projets-dexemple-il-ny-a-donc-aucune-donnée-réelle-ici&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;Le tableau de bord des tâches de Pointeuse : un kanban avec des colonnes groupées par étape, des cartes de tâche affichant le projet, des barres d&amp;rsquo;effort et des échéances, avec un bouton lecture sur chaque carte pour démarrer le suivi&#34; srcset=&#34;
               /fr/post/pointeuse/featured_hu_c78fb50d28b8ea95.webp 400w,
               /fr/post/pointeuse/featured_hu_bf5c2a403149cd66.webp 760w,
               /fr/post/pointeuse/featured_hu_eacfcd29b9ffc67a.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/pointeuse/featured_hu_c78fb50d28b8ea95.webp&#34;
               width=&#34;760&#34;
               height=&#34;505&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Le tableau de bord des tâches de Pointeuse, kanban groupé par étape, avec barres d&amp;rsquo;effort, échéances et démarrage du minuteur en un clic. Les captures utilisent une démo Odoo jetable avec des projets d&amp;rsquo;exemple, il n&amp;rsquo;y a donc aucune donnée réelle ici.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.odoo.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Odoo&lt;/a&gt; est un ERP réellement puissant. Il gère les ventes, les stocks, les projets, les RH et la comptabilité au même endroit, et le temps que vous y enregistrez alimente de vraies données métier. Mais cette puissance a un coût sur les bords. Pour un utilisateur du quotidien qui veut juste noter ce sur quoi il a travaillé, l&amp;rsquo;interface web complète, c&amp;rsquo;est beaucoup : ouvrir un onglet, attendre le client, retrouver la bonne tâche, ajouter une ligne de feuille de temps, saisir les heures. Même dans une entreprise qui vit déjà dans Odoo, cette friction est réelle, et la friction est précisément ce qui pousse les gens à ne plus enregistrer leur temps honnêtement.&lt;/p&gt;
&lt;p&gt;Je voulais donc l&amp;rsquo;inverse : la façon la plus simple et la plus agréable possible de suivre son temps sur Odoo. Quelque chose où votre seul travail est de &lt;strong&gt;dire sur quelle tâche vous êtes&lt;/strong&gt;, de recevoir un petit rappel de temps en temps, et de &lt;strong&gt;changer de tâche en un clic&lt;/strong&gt;. Tout le reste, les lignes de feuille de temps, les enregistrements de présence, la synchronisation, devrait se faire pour vous, en arrière-plan, et atterrir dans Odoo comme de vraies données. J&amp;rsquo;ai construit cela, et je l&amp;rsquo;ai appelé &lt;strong&gt;Pointeuse&lt;/strong&gt;. C&amp;rsquo;est open source sous licence MIT.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est aussi une démonstration. Pointeuse montre qu&amp;rsquo;on peut s&amp;rsquo;intégrer à Odoo &lt;strong&gt;très facilement&lt;/strong&gt;, en application de bureau ou sur mobile, sans rien installer côté serveur, et poser une petite surface conviviale devant toute la puissance ERP qu&amp;rsquo;Odoo possède déjà. Vous laissez Odoo faire ce qu&amp;rsquo;il fait de mieux, et vos utilisateurs ne voient jamais qu&amp;rsquo;une pointeuse.&lt;/p&gt;
&lt;h2 id=&#34;ce-quelle-fait&#34;&gt;Ce qu&amp;rsquo;elle fait&lt;/h2&gt;
&lt;p&gt;Pointeuse est une application native qui vit dans la &lt;strong&gt;barre des tâches&lt;/strong&gt; et suit le temps sur vos vraies tâches Odoo. La boucle centrale est volontairement ennuyeuse, et c&amp;rsquo;est tout l&amp;rsquo;intérêt :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suivre le temps sur les tâches Odoo.&lt;/strong&gt; Démarrer ou arrêter un minuteur sur n&amp;rsquo;importe quelle &lt;code&gt;project.task&lt;/code&gt;. La feuille de temps atterrit dans &lt;code&gt;account.analytic.line&lt;/code&gt;, exactement là où les vues de feuilles de temps d&amp;rsquo;Odoo vont lire, donc rien d&amp;rsquo;autre dans votre configuration Odoo n&amp;rsquo;a à changer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration de la présence.&lt;/strong&gt; Vous pouvez pointer l&amp;rsquo;entrée et la sortie (&lt;code&gt;hr.attendance&lt;/code&gt;) depuis l&amp;rsquo;application ou directement depuis la barre des tâches. Et comme la présence est un état partagé, le minuteur &lt;strong&gt;s&amp;rsquo;arrête automatiquement quand vous sortez depuis ailleurs&lt;/strong&gt;, que ce soit le client web Odoo ou l&amp;rsquo;application mobile. Le suivi de bureau et le reste d&amp;rsquo;Odoo restent d&amp;rsquo;accord.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rappels d&amp;rsquo;inactivité.&lt;/strong&gt; Si vous restez silencieux, une petite fenêtre demande sur quoi vous travaillez, avec des suggestions pour changer de tâche afin de corriger l&amp;rsquo;enregistrement en un clic. Sur Android, le même rappel arrive sous forme de notification avec boutons d&amp;rsquo;action.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un tableau de bord des tâches.&lt;/strong&gt; Un kanban groupé par étape et par projet, un panneau de détail de tâche, et un journal du temps avec des vues jour, semaine et mois, pour que l&amp;rsquo;application soit aussi l&amp;rsquo;endroit où vous regardez où sont passées vos heures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-connexion-à-une-instance-odoo-url-base-de-données-identifiant-ou-une-clé-api-pour-odoo-online-les-identifiants-vont-dans-le-trousseau-du-système-jamais-sur-le-disque&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;L&amp;rsquo;écran de connexion, un formulaire simple pour l&amp;rsquo;URL du serveur Odoo, la base de données et l&amp;rsquo;identifiant ou la clé API&#34; srcset=&#34;
               /fr/post/pointeuse/connect_hu_2dcc36bd6a75cb77.webp 400w,
               /fr/post/pointeuse/connect_hu_f9bfe7771546dd3c.webp 760w,
               /fr/post/pointeuse/connect_hu_4476e491fefee446.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/pointeuse/connect_hu_2dcc36bd6a75cb77.webp&#34;
               width=&#34;496&#34;
               height=&#34;689&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Connexion à une instance Odoo. URL, base de données, identifiant, ou une clé API pour Odoo Online. Les identifiants vont dans le trousseau du système, jamais sur le disque.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;comment-elle-se-connecte--xml-rpc-sans-module-serveur&#34;&gt;Comment elle se connecte : XML-RPC, sans module serveur&lt;/h2&gt;
&lt;p&gt;La contrainte que je me suis fixée était que Pointeuse devait fonctionner avec &lt;strong&gt;n&amp;rsquo;importe quel&lt;/strong&gt; Odoo, y compris les instances hébergées Odoo Online et les instances auto-hébergées, &lt;strong&gt;sans installer de module côté serveur&lt;/strong&gt;. Demander aux gens de déployer un addon Odoo personnalisé juste pour suivre leur temps irait à l&amp;rsquo;encontre du but.&lt;/p&gt;
&lt;p&gt;Elle parle donc à Odoo via son interface &lt;strong&gt;XML-RPC&lt;/strong&gt; standard (&lt;code&gt;/xmlrpc/2/&lt;/code&gt;), que chaque Odoo 14 et suivant expose d&amp;rsquo;origine. Vous lui donnez trois choses : l&amp;rsquo;URL du serveur, le nom de la base de données, et votre identifiant avec soit un mot de passe, soit une &lt;strong&gt;clé API&lt;/strong&gt;. La voie de la clé API compte pour Odoo Online, où le mot de passe du compte est bloqué pour le XML-RPC externe, donc une clé est le seul moyen d&amp;rsquo;entrer. Ce que vous lui donnez est stocké dans le &lt;strong&gt;trousseau du système&lt;/strong&gt;, jamais écrit sur le disque.&lt;/p&gt;
&lt;p&gt;La belle propriété de construire sur les mêmes modèles XML-RPC qu&amp;rsquo;Odoo utilise en interne (&lt;code&gt;project.task&lt;/code&gt;, &lt;code&gt;account.analytic.line&lt;/code&gt;, &lt;code&gt;hr.attendance&lt;/code&gt;), c&amp;rsquo;est qu&amp;rsquo;il n&amp;rsquo;y a pas de source de vérité parallèle. Pointeuse n&amp;rsquo;est qu&amp;rsquo;un client de plus, plus rapide, pour des données qu&amp;rsquo;Odoo possède déjà.&lt;/p&gt;
&lt;h2 id=&#34;hors-ligne-dabord-parce-que-les-connexions-tombent&#34;&gt;Hors ligne d&amp;rsquo;abord, parce que les connexions tombent&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;autre chose sur laquelle j&amp;rsquo;ai refusé de transiger, c&amp;rsquo;était le comportement hors ligne. Un minuteur que vous ne pouvez pas démarrer parce que le WiFi a cligné est inutile, et une pointeuse qui perd un pointage est pire que pas de pointeuse du tout.&lt;/p&gt;
&lt;p&gt;Donc tout est &lt;strong&gt;mis en cache dans SQLite&lt;/strong&gt; localement. Vos projets, tâches et feuilles de temps récentes sont tous disponibles sans aller-retour réseau, ce qui explique aussi pourquoi l&amp;rsquo;application paraît instantanée. Quand vous enregistrez du temps hors ligne, la &lt;strong&gt;feuille de temps est mise en file localement et se synchronise au retour de la connexion&lt;/strong&gt;. Vous n&amp;rsquo;êtes jamais bloqué par l&amp;rsquo;accessibilité du serveur à l&amp;rsquo;instant précis où vous décidez de commencer à travailler.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-la-fenêtre-du-minuteur-une-tâche-un-minuteur-les-totaux-du-jour-en-un-coup-dœil-cest-la-vue-que-je-garde-réellement-ouverte&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;La fenêtre du minuteur affichant la tâche active et les totaux suivis du jour en un coup d&amp;rsquo;œil&#34; srcset=&#34;
               /fr/post/pointeuse/timer_hu_be2c1fc8fec54efa.webp 400w,
               /fr/post/pointeuse/timer_hu_a48d458bebaeecb4.webp 760w,
               /fr/post/pointeuse/timer_hu_9a4491cf92ff9665.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/pointeuse/timer_hu_be2c1fc8fec54efa.webp&#34;
               width=&#34;496&#34;
               height=&#34;689&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      La fenêtre du minuteur. Une tâche, un minuteur, les totaux du jour en un coup d&amp;rsquo;œil. C&amp;rsquo;est la vue que je garde réellement ouverte.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;comment-elle-est-construite&#34;&gt;Comment elle est construite&lt;/h2&gt;
&lt;p&gt;Pointeuse est une application &lt;a href=&#34;https://tauri.app/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Tauri 2&lt;/a&gt;. Le backend est en &lt;strong&gt;Rust&lt;/strong&gt;, et le frontend est en &lt;strong&gt;JavaScript pur, sans aucun framework&lt;/strong&gt;. Ce choix sans framework était délibéré : l&amp;rsquo;interface n&amp;rsquo;est pas compliquée, et une pointeuse n&amp;rsquo;a aucune raison de tirer un mégaoctet de framework pour afficher quelques boutons et une liste. Le résultat est un binaire petit et rapide, plutôt qu&amp;rsquo;un navigateur dans une boîte.&lt;/p&gt;
&lt;p&gt;Le côté Rust fait le vrai travail : le client XML-RPC qui parle à Odoo, le cache SQLite (via &lt;code&gt;rusqlite&lt;/code&gt;, embarqué pour qu&amp;rsquo;il n&amp;rsquo;y ait pas de dépendance système), le moteur de minuteur, la logique de présence et de rappel, et la barre des tâches. Le HTTP passe par &lt;code&gt;reqwest&lt;/code&gt; sur &lt;code&gt;rustls&lt;/code&gt;, le XML par &lt;code&gt;quick-xml&lt;/code&gt;, et les identifiants par la crate &lt;code&gt;keyring&lt;/code&gt;. Le même cœur Rust se compile pour le bureau et pour Android, où les rappels d&amp;rsquo;inactivité deviennent de vraies notifications Android.&lt;/p&gt;
&lt;p&gt;Une seule base de code Tauri produit des installateurs pour les &lt;strong&gt;quatre cibles&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;, un &lt;code&gt;.exe&lt;/code&gt; d&amp;rsquo;installation qui se met à jour tout seul&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;, un &lt;code&gt;.AppImage&lt;/code&gt; ou un &lt;code&gt;.deb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;, un &lt;code&gt;.dmg&lt;/code&gt; universel&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android&lt;/strong&gt;, un &lt;code&gt;.apk&lt;/code&gt; à charger manuellement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le pipeline de publication garde tout cela honnête. Les commits sur &lt;code&gt;main&lt;/code&gt; suivent les &lt;a href=&#34;https://www.conventionalcommits.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Conventional Commits&lt;/a&gt;, &lt;a href=&#34;https://semantic-release.gitbook.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;semantic-release&lt;/a&gt; décide du numéro de version à partir de l&amp;rsquo;historique des commits, GitHub Actions construit chaque plateforme, et les applications de bureau &lt;strong&gt;se mettent à jour seules depuis les GitHub Releases&lt;/strong&gt;. Je pousse un commit, et un peu plus tard une nouvelle version est sur chaque machine sans que je touche à un installateur.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-créer-une-tâche-sans-quitter-lapplication-vous-pouvez-la-créer-et-démarrer-le-suivi-dans-la-même-étape&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;La fenêtre de création de tâche : sélecteur de projet, nom, échéance, priorité, et une option Créer et démarrer&#34; srcset=&#34;
               /fr/post/pointeuse/new-task_hu_5e3d6f30b21a7aaf.webp 400w,
               /fr/post/pointeuse/new-task_hu_4a9a813ba408164d.webp 760w,
               /fr/post/pointeuse/new-task_hu_3e93d403768de754.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/pointeuse/new-task_hu_5e3d6f30b21a7aaf.webp&#34;
               width=&#34;760&#34;
               height=&#34;505&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Créer une tâche sans quitter l&amp;rsquo;application. Vous pouvez la créer et démarrer le suivi dans la même étape.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;pourquoi-les-données-comptent--rsde-et-subventions&#34;&gt;Pourquoi les données comptent : RS&amp;amp;DE et subventions&lt;/h2&gt;
&lt;p&gt;Il y a une raison économique de se soucier de tout cela, au-delà de rapports bien rangés. Au Canada, le programme &lt;strong&gt;RS&amp;amp;DE&lt;/strong&gt; (Recherche scientifique et développement expérimental) accorde aux entreprises des crédits d&amp;rsquo;impôt pour les travaux de R&amp;amp;D admissibles, et les projets financés par des subventions ont leurs propres obligations de reporting. Dans les deux cas, la demande repose sur des preuves : ce sur quoi on a travaillé, par qui, et pendant combien de temps. Si cet enregistrement est mince, ou reconstitué de mémoire après coup, la demande est plus faible et plus difficile à défendre.&lt;/p&gt;
&lt;p&gt;Le hic, c&amp;rsquo;est que cette preuve ne vaut jamais plus que l&amp;rsquo;habitude quotidienne qui la produit. Vous ne pouvez pas demander aux gens de consigner méticuleusement chaque heure sur le bon projet tout en rendant la consignation pénible. La friction l&amp;rsquo;emporte, et les données se dégradent en silence. La pointeuse la plus simple possible n&amp;rsquo;est donc pas un luxe, c&amp;rsquo;est ce qui rend les données dignes de confiance dès le départ. Faites en sorte que dire sur quoi on a travaillé prenne un seul clic, et au bout d&amp;rsquo;un an vous obtenez un enregistrement assez solide pour appuyer un crédit d&amp;rsquo;impôt ou un rapport de subvention.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est ça, le vrai fond de l&amp;rsquo;affaire. Tout est une question de gens qui gardent un œil sur leur propre temps, et quand c&amp;rsquo;est assez facile, ça marche raisonnablement bien.&lt;/p&gt;
&lt;h2 id=&#34;une-petite-surface-devant-un-erp-puissant&#34;&gt;Une petite surface devant un ERP puissant&lt;/h2&gt;
&lt;p&gt;Le but n&amp;rsquo;est pas de remplacer quoi que ce soit qu&amp;rsquo;Odoo fait. Le but, c&amp;rsquo;est que l&amp;rsquo;outil que vous attrapez cent fois par jour coûte le moins d&amp;rsquo;attention possible, pour que l&amp;rsquo;ERP puissant derrière reçoive vraiment des données exactes. La feuille de temps web d&amp;rsquo;Odoo est très bien quand vous êtes déjà dans Odoo en train de faire autre chose. C&amp;rsquo;est la mauvaise surface quand tout ce qu&amp;rsquo;une personne veut, c&amp;rsquo;est démarrer le chrono sur une tâche et retourner travailler.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est toute l&amp;rsquo;idée derrière Pointeuse : garder le travail de l&amp;rsquo;utilisateur minuscule, dire sur quoi vous travaillez et changer en un clic, et laisser tout se déverser dans Odoo sous forme de vraies feuilles de temps et de présence en coulisses. L&amp;rsquo;entreprise garde chaque rapport, chaque analyse, chaque parcelle de puissance ERP qu&amp;rsquo;elle a déjà payée. L&amp;rsquo;utilisateur, lui, ne voit qu&amp;rsquo;une pointeuse qui s&amp;rsquo;ouvre instantanément, survit à une connexion qui tombe, et reste synchronisée, qu&amp;rsquo;il soit à son bureau ou sur son téléphone.&lt;/p&gt;
&lt;p&gt;Et comme toute l&amp;rsquo;intégration passe par le XML-RPC standard d&amp;rsquo;Odoo sans module côté serveur, c&amp;rsquo;est aussi une petite preuve que poser une interface conviviale devant Odoo est réellement facile. C&amp;rsquo;est le suivi du temps que je voulais, et maintenant je fais tourner mes journées dessus.&lt;/p&gt;
&lt;h2 id=&#34;liens&#34;&gt;Liens&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Source et versions :&lt;/strong&gt; &lt;a href=&#34;https://github.com/Leicas/pointeuse&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Leicas/pointeuse&lt;/a&gt;, sous licence MIT. Les installateurs pour Windows, Linux, macOS et Android sont sur la page &lt;a href=&#34;https://github.com/Leicas/pointeuse/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Releases&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page projet :&lt;/strong&gt; &lt;a href=&#34;../../project/pointeuse/&#34;&gt;Pointeuse&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elle fonctionne avec n&amp;rsquo;importe quel Odoo 14 ou suivant, sans module côté serveur à installer. Si votre équipe tourne sur Odoo mais qu&amp;rsquo;enregistrer le temps honnêtement est la partie qui coince toujours, la réponse n&amp;rsquo;est pas plus d&amp;rsquo;interface, c&amp;rsquo;est moins : une pointeuse devant, l&amp;rsquo;ERP qui fait son travail derrière.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ouvrir le code du cerveau : le modèle du brain-vault</title>
      <link>https://antoine.weill-duflos.fr/fr/post/cortexmd-open-source/</link>
      <pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/cortexmd-open-source/</guid>
      <description>&lt;p&gt;Dans la &lt;a href=&#34;../cortexmd-token-killer/&#34;&gt;partie 3&lt;/a&gt; j&amp;rsquo;ai décrit le volet navigation de code de cette chose : un indexeur Rust qui parcourt un dépôt, construit une base de données de symboles, et permet à un agent d&amp;rsquo;interroger la structure du code pour à peu près le coût d&amp;rsquo;un simple grep au lieu de lire des fichiers entiers. Cela, plus le moteur de mémoire de la &lt;a href=&#34;../cortexmd-memory-engine/&#34;&gt;partie 2&lt;/a&gt;, constituait l&amp;rsquo;outil privé que je faisais tourner sur mon homelab depuis quelques mois. Ça marchait. Je l&amp;rsquo;utilisais tous les jours.&lt;/p&gt;
&lt;p&gt;Mais il avait une limite inscrite dans ses fondations, et cette limite est la raison d&amp;rsquo;être de ce billet.&lt;/p&gt;
&lt;h2 id=&#34;le-problème--il-ne-marchait-que-pour-moi&#34;&gt;Le problème : il ne marchait que pour moi&lt;/h2&gt;
&lt;p&gt;La version privée, celle qui s&amp;rsquo;appelait encore obsidian-mcp à l&amp;rsquo;époque, était entièrement façonnée autour de mon installation. Elle lisait mon coffre Obsidian personnel, celui que je garde synchronisé entre mes machines et que je traite comme la source de vérité pour tout ce que je fais. Ses conventions, ses chemins, la façon dont elle découvrait et indexait les notes, tout supposait mon environnement, ma structure, mes habitudes. Au quotidien, c&amp;rsquo;était invisible. C&amp;rsquo;était un outil vraiment bon, et il s&amp;rsquo;améliorait à mesure que je m&amp;rsquo;appuyais dessus.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ennui, c&amp;rsquo;est qu&amp;rsquo;il était bon pour moi d&amp;rsquo;une façon qui le rendait impossible à confier à quelqu&amp;rsquo;un d&amp;rsquo;autre. Vous ne pouviez pas simplement le pointer sur vos propres notes et le voir fonctionner. Il attendait mon coffre, monté comme je le monte, synchronisé comme je le synchronise. Il lisait depuis un espace réglé pour exactement une personne, et cette personne, c&amp;rsquo;était moi. Comme outil personnel, c&amp;rsquo;était parfait. Comme projet à passer en open source, c&amp;rsquo;était une impasse, car la première chose sur laquelle tomberait tout autre utilisateur, c&amp;rsquo;est que toute la conception supposait discrètement qu&amp;rsquo;il était moi.&lt;/p&gt;
&lt;p&gt;La question qui a guidé la refonte n&amp;rsquo;était donc pas comment corriger un bug. Elle était plus simple et plus exigeante : que faudrait-il pour qu&amp;rsquo;une personne qui n&amp;rsquo;est pas moi fasse tourner ceci sur ses propres notes, en toute sécurité, sans hériter de mon installation ? Y répondre honnêtement voulait dire séparer deux choses que la version privée avait emmêlées, les notes que je lis et les données que l&amp;rsquo;outil écrit.&lt;/p&gt;
&lt;h2 id=&#34;la-refonte--le-modèle-du-brain-vault&#34;&gt;La refonte : le modèle du brain-vault&lt;/h2&gt;
&lt;p&gt;Le correctif qui a rendu cortexmd partageable est presque embarrassant de simplicité une fois qu&amp;rsquo;on s&amp;rsquo;est brûlé. cortexmd possède son propre brain vault séparé, et ce brain vault est la seule chose dans laquelle il a le droit d&amp;rsquo;écrire. Mémoires, journal, journaux d&amp;rsquo;agents, tâches, notes du graphe de connaissances, la liste des dépôts de code indexés : tout cela vit dans le brain vault, et cortexmd en est l&amp;rsquo;unique rédacteur.&lt;/p&gt;
&lt;p&gt;Vos propres coffres, ceux que vous modifiez à la main dans Obsidian, sont attachés en tant que coffres sources en lecture seule. cortexmd les indexe pour la recherche et la navigation de code, et il ne les modifie jamais. Pas une mise à jour de chaleur, pas une étiquette, pas un seul octet. Attacher un coffre source se fait sur option, avec une liste d&amp;rsquo;autorisation qui refuse par défaut, de sorte que vous pouvez garder des sous-arbres privés entièrement hors de l&amp;rsquo;index et n&amp;rsquo;exposer que les parties que vous voulez que l&amp;rsquo;agent voie.&lt;/p&gt;
&lt;p&gt;Les données circulent dans un seul sens. Les coffres sources entrent, le brain vault sort, et les deux ne se chevauchent jamais. Vous attachez le coffre qui est le vôtre, l&amp;rsquo;outil le lit et n&amp;rsquo;y réécrit rien, et le cerveau qu&amp;rsquo;il construit vit entièrement ailleurs. C&amp;rsquo;est ce qui le rend général : il n&amp;rsquo;y a plus aucune supposition que le coffre soit le mien, monté à ma façon, ou synchronisé à ma façon. C&amp;rsquo;est aussi ce qui le rend sûr, car un outil qui n&amp;rsquo;écrit jamais dans vos notes ne peut pas les écraser, et il n&amp;rsquo;y a aucun fichier partagé qu&amp;rsquo;un agent de synchronisation puisse bifurquer. Le couplage qui maintenait la version privée collée à ma machine a tout simplement disparu.&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;Le brain vault par défaut est un répertoire de données dédié, quelque chose comme &lt;code&gt;~/.local/share/cortexmd/brain&lt;/code&gt;, jamais votre véritable coffre Obsidian. Vous pouvez le pointer ailleurs, mais le défaut garde les écritures de l&amp;rsquo;outil et vos notes dans deux endroits clairement séparés dès la première exécution.&lt;/p&gt;
&lt;h2 id=&#34;deux-façons-de-le-faire-tourner&#34;&gt;Deux façons de le faire tourner&lt;/h2&gt;
&lt;p&gt;Une fois que l&amp;rsquo;histoire de l&amp;rsquo;écriture était saine, l&amp;rsquo;histoire du déploiement devait suivre. cortexmd se livre avec deux modes, et ils sont d&amp;rsquo;égale importance plutôt qu&amp;rsquo;un vrai et un de jouet.&lt;/p&gt;
&lt;p&gt;Le défaut recommandé pour une seule personne est local-stdio. Il tourne sur votre propre machine, parle MCP via stdio avec n&amp;rsquo;importe quel client que vous utilisez, et lit vos coffres directement depuis le disque. Pas de synchronisation. Pas de Docker. Pas d&amp;rsquo;authentification. Aucun réseau du tout. Pour une personne sur une machine c&amp;rsquo;est tout ce dont vous avez besoin, et c&amp;rsquo;est le mode vers lequel j&amp;rsquo;orienterais presque tout le monde en premier. Tout l&amp;rsquo;intérêt de la refonte était qu&amp;rsquo;un seul utilisateur puisse obtenir le cerveau complet sans aucun du poids opérationnel que la version privée avait fini par accumuler autour d&amp;rsquo;elle.&lt;/p&gt;
&lt;p&gt;Le second mode est l&amp;rsquo;auto-hébergement HTTP, et c&amp;rsquo;est explicitement la voie avancée. Ici cortexmd tourne comme un serveur Express avec une authentification en bonne et due forme (clé d&amp;rsquo;API ou OAuth2), et les coffres sources sont tirés en lecture seule via un transport. Ce transport est une interface que j&amp;rsquo;ai appelée la couture IVault, avec des implémentations pour le disque local, git-pull, WebDAV et S3. C&amp;rsquo;est le mode pour les configurations multi-clients ou véritablement distantes, où plusieurs clients MCP partagent un cerveau ou bien les données sources vivent ailleurs que sur le disque du serveur lui-même. Cela représente plus de pièces mobiles, et vous n&amp;rsquo;y avez recours que lorsque vous en avez réellement besoin.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;important, c&amp;rsquo;est que les deux modes partagent le même modèle source-en-lecture-seule, cerveau-rédacteur-unique. Le mode HTTP conserve la même garantie : vos sources restent en lecture seule et le cerveau est la seule cible d&amp;rsquo;écriture. Il change seulement la façon dont les sources en lecture seule parviennent à l&amp;rsquo;indexeur.&lt;/p&gt;
&lt;h2 id=&#34;un-monorepo-polyglotte-tenu-ensemble-par-un-contrat&#34;&gt;Un monorepo polyglotte tenu ensemble par un contrat&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;autre chose que l&amp;rsquo;ouverture du code m&amp;rsquo;a forcé à nettoyer, c&amp;rsquo;est la couture entre les deux langages dont ce projet est fait, car ce sont vraiment deux projets portant un seul manteau.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;packages/server&lt;/code&gt; est le serveur MCP en TypeScript : Node 22, Express, le moteur de mémoire, la logique de rappel, les définitions d&amp;rsquo;outils qui apparaissent aux clients sous l&amp;rsquo;espace de noms &lt;code&gt;mcp__cortexmd__&lt;/code&gt;. &lt;code&gt;crates/cli&lt;/code&gt; est un unique binaire Rust, &lt;code&gt;cortexmd-cli&lt;/code&gt;, qui est l&amp;rsquo;indexeur tree-sitter plus le client en ligne de commande, les crochets de session, et le HUD de la barre d&amp;rsquo;état. Deux chaînes d&amp;rsquo;outils, collées ensemble par la CI.&lt;/p&gt;
&lt;p&gt;La partie difficile d&amp;rsquo;une scission comme celle-ci, c&amp;rsquo;est l&amp;rsquo;endroit où elles doivent s&amp;rsquo;accorder exactement. Les identifiants de symboles que l&amp;rsquo;indexeur Rust produit doivent être identiques octet pour octet à ceux que le côté TypeScript attend, sinon toute la couche de navigation de code pointe silencieusement vers rien. Il y a donc un répertoire &lt;code&gt;contract/&lt;/code&gt; qui contient le format de fil partagé, la spécification des identifiants de symboles, et un jeu de golden fixtures. Une vérification de parité en CI fait passer les mêmes entrées à travers les deux côtés et fait échouer la compilation si le producteur Rust et le consommateur TypeScript sont un jour en désaccord sur ce que devrait être un identifiant. Le contrat est l&amp;rsquo;arbitre, et il garde les deux langages honnêtes sans qu&amp;rsquo;aucun n&amp;rsquo;ait à faire confiance à l&amp;rsquo;autre.&lt;/p&gt;
&lt;h2 id=&#34;le-changement-de-nom-et-ce-que-cest-maintenant&#34;&gt;Le changement de nom, et ce que c&amp;rsquo;est maintenant&lt;/h2&gt;
&lt;p&gt;Quand j&amp;rsquo;ai rassemblé tout cela pour le partager, l&amp;rsquo;ancien nom ne convenait plus. obsidian-mcp décrivait ce que c&amp;rsquo;était au départ : un pont vers le coffre d&amp;rsquo;une seule application. Ce que c&amp;rsquo;était devenu, c&amp;rsquo;était un cerveau de mémoire et de navigation de code qui utilisait par hasard le markdown de style Obsidian comme un format de stockage parmi d&amp;rsquo;autres. Alors c&amp;rsquo;est devenu cortexmd, et c&amp;rsquo;est le nom sous lequel il se livre.&lt;/p&gt;
&lt;p&gt;Une note d&amp;rsquo;honnêteté : ceci est en pré-alpha. C&amp;rsquo;est public et sous licence MIT à &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;, et les noms de configuration ainsi qu&amp;rsquo;une partie des API sont encore mouvants. Je l&amp;rsquo;ai construit pour moi d&amp;rsquo;abord, l&amp;rsquo;ai fait tourner sur mon propre homelab au-dessus de mon propre coffre privé de notes personnelles et professionnelles, j&amp;rsquo;ai réalisé qu&amp;rsquo;il était câblé trop étroitement sur ma propre installation pour être partagé, je l&amp;rsquo;ai généralisé, puis je l&amp;rsquo;ai nettoyé suffisamment pour le mettre là où d&amp;rsquo;autres personnes peuvent l&amp;rsquo;utiliser. Ce n&amp;rsquo;est pas un produit fini et je ne prétends pas que c&amp;rsquo;en est un.&lt;/p&gt;
&lt;p&gt;Ce dont je me sens bien, c&amp;rsquo;est de sa forme. Vos notes restent les vôtres, sur votre disque, en lecture seule, avec les parties privées exclues par défaut. Le cerveau que l&amp;rsquo;agent construit vit dans son propre endroit et ne va jamais retoucher vos fichiers. Dans le mode par défaut rien ne quitte votre machine : pas de cloud, pas de compte, pas de réseau. C&amp;rsquo;est la version local-first, propriétaire-de-vos-données de l&amp;rsquo;idée que je voulais vraiment depuis le début, et il a fallu la détacher de ma propre installation pour y arriver.&lt;/p&gt;
&lt;p&gt;Si quoi que ce soit de tout cela vous est utile, la page du projet a la vue d&amp;rsquo;ensemble et les liens : &lt;a href=&#34;../../project/cortexmd/&#34;&gt;cortexmd&lt;/a&gt;. Et si vous voulez le lire depuis le début, la &lt;a href=&#34;../cortexmd-second-brain/&#34;&gt;partie 1&lt;/a&gt; est l&amp;rsquo;endroit où la série commence.&lt;/p&gt;
&lt;h2 id=&#34;série&#34;&gt;Série&lt;/h2&gt;
&lt;p&gt;Ceci est la partie 4 d&amp;rsquo;une série en quatre parties sur cortexmd.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-second-brain/&#34;&gt;Partie 1 : 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;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;Partie 4 : Ouvrir le code du cerveau : le modèle du brain-vault (vous êtes ici)&lt;/li&gt;
&lt;/ul&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>Le moteur de mémoire : chaleur, déclin et rêves</title>
      <link>https://antoine.weill-duflos.fr/fr/post/cortexmd-memory-engine/</link>
      <pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/cortexmd-memory-engine/</guid>
      <description>&lt;p&gt;Dans la &lt;a href=&#34;../cortexmd-second-brain/&#34;&gt;première partie&lt;/a&gt; j&amp;rsquo;ai décrit deux problèmes qui revenaient sans cesse me mordre quand je travaillais avec des agents IA. Le premier, c&amp;rsquo;est qu&amp;rsquo;ils oublient tout entre les sessions. Le second, c&amp;rsquo;est qu&amp;rsquo;ils brûlent des tokens à relire du code qu&amp;rsquo;ils ont déjà vu. Ce billet porte sur le premier problème, et sur la partie de cortexmd à laquelle je tiens le plus : le moteur de mémoire. L&amp;rsquo;approche d&amp;rsquo;ensemble est inspirée 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 ; ce qui suit, c&amp;rsquo;est la façon dont cortexmd en construit sa propre version.&lt;/p&gt;
&lt;p&gt;La solution naïve à l&amp;rsquo;oubli, c&amp;rsquo;est de tout déverser dans le contexte. Garder un gros fichier de notes, le coller au début de chaque session et espérer que l&amp;rsquo;agent le lise. J&amp;rsquo;ai essayé des variantes de ça, et ça s&amp;rsquo;effondre vite. Le fichier grossit sans limite. Des faits anciens et périmés voisinent avec la seule chose qui compte vraiment aujourd&amp;rsquo;hui, sur un pied d&amp;rsquo;égalité. Vous payez pour toute la pile à chaque tour, et le signal qui vous intéresse se retrouve enseveli sous du bruit dont vous avez cessé de vous soucier depuis longtemps. Une mémoire humaine ne fonctionne pas comme ça, et elle ne le devrait pas. L&amp;rsquo;objectif de conception était donc simple à énoncer mais plus difficile à construire : l&amp;rsquo;agent devrait se souvenir comme le fait une personne, où ce que vous utilisez reste vif et ce que vous cessez de toucher s&amp;rsquo;estompe.&lt;/p&gt;
&lt;h2 id=&#34;huit-sortes-de-mémoire&#34;&gt;Huit sortes de mémoire&lt;/h2&gt;
&lt;p&gt;Quand un agent stocke quelque chose, cortexmd ne le traite pas comme un bloc de texte indifférencié. Chaque souvenir est auto-catégorisé dans l&amp;rsquo;une de huit sortes : observation, décision, idée, conversation, fait, préférence, plan et réflexion. La distinction compte parce que ces choses se comportent différemment dans le temps et veulent être retrouvées différemment. Une préférence (je veux toujours l&amp;rsquo;orthographe britannique, je déteste les tirets cadratins) est un fait durable sur ma façon de travailler, et elle devrait continuer à remonter. Un fragment de conversation est contextuel et surtout utile peu après qu&amp;rsquo;il s&amp;rsquo;est produit. Une décision est quelque chose que vous voulez pouvoir retrouver des mois plus tard quand vous vous demandez pourquoi diable vous avez fait ça. Étiqueter la sorte dès le départ donne au reste du système quelque chose à partir de quoi raisonner, au lieu de forcer chaque étape ultérieure à deviner à partir du texte brut.&lt;/p&gt;
&lt;h2 id=&#34;chaleur--chaud-tiède-froid&#34;&gt;Chaleur : chaud, tiède, froid&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;idée centrale est que chaque souvenir a une température, et que la température décline. Un souvenir frais ou récemment utilisé est chaud. Laissez-le intact et il refroidit vers tiède, puis après environ un mois d&amp;rsquo;inactivité il dérive vers froid, et les souvenirs plus froids finissent par être archivés plutôt que gardés au premier plan de l&amp;rsquo;esprit de l&amp;rsquo;agent.&lt;/p&gt;
&lt;p&gt;Le détail crucial, c&amp;rsquo;est la promotion à l&amp;rsquo;accès : lire un souvenir le réchauffe. C&amp;rsquo;est toute l&amp;rsquo;astuce. Vous n&amp;rsquo;avez pas à curer manuellement ce qui est important. L&amp;rsquo;importance se révèle par l&amp;rsquo;usage. Les souvenirs vers lesquels vous et l&amp;rsquo;agent revenez sans cesse restent chauds précisément parce que vous revenez sans cesse vers eux, et ceux que vous ne touchez jamais coulent d&amp;rsquo;eux-mêmes. C&amp;rsquo;est le même instinct qu&amp;rsquo;un cache de type least-recently-used, sauf que ce qui est mis en cache, c&amp;rsquo;est le sens qu&amp;rsquo;a l&amp;rsquo;agent de ce qui compte en ce moment, et l&amp;rsquo;éviction est gracieuse : froid puis archivé, pas supprimé.&lt;/p&gt;
&lt;p&gt;Pourquoi se donner tout ce mal au lieu d&amp;rsquo;un seul stock plat ? Parce que la température donne au rappel un a priori. Quand l&amp;rsquo;agent part chercher quelque chose, il ne fait pas face à une mer plate de notes également plausibles. Il a un sens intégré de ce qui a été actif récemment, et ce signal ne coûte rien de plus à maintenir parce qu&amp;rsquo;il découle de l&amp;rsquo;usage normal.&lt;/p&gt;
&lt;h2 id=&#34;consolidation--ranger-le-tiroir-des-froids&#34;&gt;Consolidation : ranger le tiroir des froids&lt;/h2&gt;
&lt;p&gt;Laisser les souvenirs refroidir n&amp;rsquo;est que la moitié de l&amp;rsquo;histoire. Si vous laissez simplement les souvenirs froids s&amp;rsquo;empiler, vous vous retrouvez avec un tiroir plein de bouts quasi dupliqués : cinq notes légèrement différentes sur la même tâche terminée depuis longtemps, chacune un peu périmée, aucune ne valant la peine d&amp;rsquo;être lue seule. Alors cortexmd consolide. Les souvenirs froids apparentés sont repliés ensemble en résumés, de sorte que l&amp;rsquo;essentiel survive en un endroit cohérent tandis que les fragments redondants cessent d&amp;rsquo;encombrer. Le détail n&amp;rsquo;est pas jeté à la légère, il est compressé en quelque chose que vous voudriez réellement lire plus tard. Le refroidissement décide de ce qui n&amp;rsquo;est plus urgent ; la consolidation décide quoi en faire.&lt;/p&gt;
&lt;h2 id=&#34;rappel-hybride&#34;&gt;Rappel hybride&lt;/h2&gt;
&lt;p&gt;Bien stocker la mémoire ne sert à rien si vous ne pouvez pas la récupérer. Le rappel dans cortexmd est hybride. Il lance une recherche lexicale en texte intégral (la correspondance par mots-clés, bonne pour les termes et noms exacts) et la fusionne avec une recherche sémantique sur des embeddings (la correspondance par le sens, bonne quand vous vous souvenez de l&amp;rsquo;idée mais pas des mots). Le lexical seul rate tout ce qui est formulé autrement que votre requête. Le sémantique seul peut dériver vers des choses vaguement dans le sujet mais pas ce que vous vouliez dire. Fusionner les deux compense les faiblesses de chacun.&lt;/p&gt;
&lt;p&gt;Par-dessus le score fusionné, le classement est rehaussé par trois choses : la température (les souvenirs plus chauds remontent, parce que la récence d&amp;rsquo;usage est un signal), l&amp;rsquo;importance (certains souvenirs sont simplement plus lourds) et les liens (un souvenir connecté à d&amp;rsquo;autres souvenirs pertinents est plus susceptible d&amp;rsquo;être celui que vous voulez). Le résultat est un classement qui reflète non seulement la similarité textuelle mais aussi à quel point un souvenir est actif et connecté. C&amp;rsquo;est bien plus proche de la façon dont vous vous rappelez réellement les choses qu&amp;rsquo;un simple score de similarité.&lt;/p&gt;
&lt;h2 id=&#34;le-réveil&#34;&gt;Le réveil&lt;/h2&gt;
&lt;p&gt;Tout cela se rejoint au début d&amp;rsquo;une session dans ce que j&amp;rsquo;appelle le réveil. Au lieu de commencer chaque conversation comme une page blanche, l&amp;rsquo;agent effectue un réveil de la mémoire qui fait remonter les souvenirs les plus chauds et les plus pertinents. C&amp;rsquo;est la différence entre un collègue qui entre en sachant déjà où vous en êtes restés hier et un que vous devez briefer de zéro chaque matin. Le réveil s&amp;rsquo;appuie sur tout ce qui précède : le modèle de chaleur décide ce qui est actif en ce moment, le rappel hybride décide ce qui est pertinent, et l&amp;rsquo;agent commence la session déjà orienté. C&amp;rsquo;est le moment où tout le moteur justifie son existence, parce que c&amp;rsquo;est le moment où vous sentez l&amp;rsquo;agent se souvenir de vous.&lt;/p&gt;
&lt;h2 id=&#34;la-phase-smarter-brain--liens-et-rêves&#34;&gt;La phase smarter-brain : liens et rêves&lt;/h2&gt;
&lt;p&gt;Les pièces ci-dessus formaient le cœur du système de mémoire v2.0. Une phase ultérieure, que je vois comme le travail smarter-brain, a ajouté quelques choses qui font que le cerveau ressemble moins à une base de données et davantage à quelque chose qui réfléchit pendant que vous êtes absent.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-longlet-intelligence-du-tableau-de-bord--santé-du-coffre-insights-de-rêve-grappes-thématiques-et-compteurs-dentités-et-du-graphe-de-connaissances-données-de-démonstration-issues-du-coffre-dexemple-seedé-du-projet&#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/intelligence.png&#34; alt=&#34;L&amp;rsquo;onglet Intelligence du tableau de bord cortexmd, montrant un score de santé du coffre, des insights de rêve, des grappes thématiques et des compteurs du graphe de connaissances&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      L&amp;rsquo;onglet Intelligence du tableau de bord : santé du coffre, insights de rêve, grappes thématiques, et compteurs d&amp;rsquo;entités et du graphe de connaissances. Données de démonstration issues du coffre d&amp;rsquo;exemple seedé du projet.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;La première, ce sont les liens automatiques du graphe de connaissances. À mesure que les données sont stockées, cortexmd trace de lui-même des liens entre les notes apparentées, au lieu d&amp;rsquo;attendre que je les câble à la main. Le lien manuel est exactement le genre de tâche administrative qui semble sympa et n&amp;rsquo;arrive jamais vraiment, donc avoir les connexions qui se forment automatiquement comme effet secondaire du stockage signifie que le signal de liens dans le rappel ne cesse de s&amp;rsquo;enrichir sans aucun effort de ma part.&lt;/p&gt;
&lt;p&gt;La deuxième, c&amp;rsquo;est le rêve. cortexmd lance une passe de consolidation planifiée, sur un calendrier calme, que j&amp;rsquo;ai nommée le rêve à cause de ce qu&amp;rsquo;elle fait et du moment où elle le fait. Elle réconcilie les notes similaires, avec une attention particulière aux plus anciennes, celles qui ont refroidi, et les replie dans des notes de projet. C&amp;rsquo;est le jardinier d&amp;rsquo;arrière-plan du cerveau : pendant qu&amp;rsquo;il ne se passe rien, il parcourt les coins refroidis, remarque que ces trois pensées à moitié finies ne sont en réalité qu&amp;rsquo;une seule chose, et les range en une note de projet cohérente. Vous réveillez l&amp;rsquo;agent le lendemain et le cerveau est un peu mieux organisé que vous ne l&amp;rsquo;aviez laissé, sans que vous n&amp;rsquo;ayez rien fait.&lt;/p&gt;
&lt;p&gt;La troisième, c&amp;rsquo;est quelque chose que j&amp;rsquo;ai emprunté tel quel à Obsidian : une vue graphe du coffre, rendue sur un canvas dans le tableau de bord web. Parce que le graphe de connaissances est réel, vous pouvez le regarder. Voir le cerveau comme une constellation de notes liées, avec les grappes denses et les orphelins solitaires étalés devant vous, rend le tout concret d&amp;rsquo;une manière qu&amp;rsquo;une liste de lignes ne fait jamais.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-la-vue-graphe-du-coffre-dans-le-tableau-de-bord-chaque-point-est-une-note-chaque-trait-un-lien-cest-le-coffre-de-démonstration-autonome-du-projet--les-noms-de-notes-sont-des-données-dexemple-seedées-pas-mes-propres-notes&#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/graph.png&#34; alt=&#34;Le graphe du coffre cortexmd : des notes dessinées en nœuds sur un canvas sombre, reliées par des liens, avec une barre de recherche et un compteur de nœuds en bas&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      La vue graphe du coffre dans le tableau de bord. Chaque point est une note, chaque trait un lien. C&amp;rsquo;est le coffre de démonstration autonome du projet : les noms de notes sont des données d&amp;rsquo;exemple seedées, pas mes propres notes.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-cliquez-sur-un-nœud-et-la-note-souvre-dans-le-panneau-latéral-avec-ses-liens-mêmes-données-de-démonstration-seedées&#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/graph-selected.png&#34; alt=&#34;Le même graphe avec un nœud sélectionné, montrant le contenu de la note et ses liens dans un panneau latéral&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Cliquez sur un nœud et la note s&amp;rsquo;ouvre dans le panneau latéral avec ses liens. Mêmes données de démonstration seedées.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;pourquoi-un-modèle-de-chaleur-lemporte&#34;&gt;Pourquoi un modèle de chaleur l&amp;rsquo;emporte&lt;/h2&gt;
&lt;p&gt;Pour rassembler le tout : la raison pour laquelle un modèle de chaleur bat le fait de tout déverser dans le contexte, c&amp;rsquo;est que l&amp;rsquo;attention est la ressource rare, pour un agent exactement comme pour une personne. Un stock plat traite une note d&amp;rsquo;il y a huit mois et une décision de ce matin comme des égaux, vous fait payer pour les deux à chaque tour, et force l&amp;rsquo;agent à redécouvrir ce qui compte à chaque fois. Le modèle de chaleur encode ce qui compte comme une propriété des données elles-mêmes, le tient à jour gratuitement par l&amp;rsquo;usage ordinaire, compresse ce qui a refroidi au lieu de l&amp;rsquo;accumuler, et fait remonter la tranche active et pertinente au réveil. L&amp;rsquo;agent porte moins, et ce qu&amp;rsquo;il porte, c&amp;rsquo;est ce qu&amp;rsquo;il faut.&lt;/p&gt;
&lt;p&gt;Voilà pour l&amp;rsquo;oubli. L&amp;rsquo;autre moitié du problème d&amp;rsquo;origine, l&amp;rsquo;agent qui brûle des tokens à relire du code qu&amp;rsquo;il a déjà vu, demande un mécanisme complètement différent. C&amp;rsquo;est un indexeur Rust et une base de données de symboles, et c&amp;rsquo;est le sujet de la &lt;a href=&#34;../cortexmd-token-killer/&#34;&gt;troisième partie : le tueur de tokens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;cortexmd est en pré-alpha et sous licence MIT. Le code, y compris le moteur de mémoire décrit ici, vit sur la &lt;a href=&#34;../../project/cortexmd/&#34;&gt;page du projet&lt;/a&gt; et sur GitHub à &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;. Les noms et la configuration sont encore mouvants, alors traitez les détails comme un instantané plutôt que comme un contrat.&lt;/p&gt;
&lt;h2 id=&#34;série&#34;&gt;Série&lt;/h2&gt;
&lt;p&gt;Ceci est la deuxième partie d&amp;rsquo;une série de quatre billets sur cortexmd :&lt;/p&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;Le moteur de mémoire : chaleur, déclin et rêves (vous êtes ici)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../cortexmd-token-killer/&#34;&gt;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;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>
