<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tools on Christian Roy</title>
    <link>https://christianroy.dev/fr/tags/tools/</link>
    <description>Recent content in Tools on Christian Roy</description>
    <generator>Hugo -- 0.156.0</generator>
    <language>fr</language>
    <lastBuildDate>Tue, 07 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://christianroy.dev/fr/tags/tools/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Le tableau RAID qui perdait un disque à chaque redémarrage</title>
      <link>https://christianroy.dev/fr/til/raid-array-losing-disk-every-reboot/</link>
      <pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/raid-array-losing-disk-every-reboot/</guid>
      <description>&lt;p&gt;&lt;em&gt;Résumé en français. Le récit complet, beaucoup plus détaillé, est disponible &lt;a href=&#34;https://christianroy.dev/til/raid-array-losing-disk-every-reboot/&#34;&gt;en anglais&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sur mon NAS quatre baies, un disque de remplacement s&amp;rsquo;est mal inséré: une brève chute de capacité pendant l&amp;rsquo;insertion a fait échouer la seule tentative de reconstruction automatique du firmware. Résultat: le tableau RAID 5 restait dégradé (&lt;code&gt;[4/3]&lt;/code&gt;), et même après une reconstruction manuelle réussie, chaque redémarrage faisait retomber le disque hors du tableau.&lt;/p&gt;
&lt;p&gt;Avec Claude Code, j&amp;rsquo;ai désassemblé les binaires propriétaires du firmware pour comprendre pourquoi. La vraie cause était une boucle: au moment d&amp;rsquo;éteindre le NAS, une routine expulsait explicitement tout disque absent d&amp;rsquo;un registre de volume (corrompant son superblock RAID), donc le démarrage suivant l&amp;rsquo;excluait légitimement, donc les registres se régénéraient comme &amp;ldquo;trois disques&amp;rdquo;, et ainsi de suite indéfiniment. Plusieurs pistes plausibles se sont révélées être des impasses, dont l&amp;rsquo;édition de champs de configuration que le code ne lit jamais, avant qu&amp;rsquo;un traçage rigoureux, vérifié instruction par instruction, ne révèle le vrai mécanisme.&lt;/p&gt;</description>
    </item>
    <item>
      <title>opencode avec un Qwen3.6-35B-A3B local a itéré jusqu&#39;à un jouet web de physique des couleurs fonctionnel</title>
      <link>https://christianroy.dev/fr/til/opencode-local-qwen36-35b-a3b-color-physics-web-toy/</link>
      <pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/opencode-local-qwen36-35b-a3b-color-physics-web-toy/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai donné à &lt;a href=&#34;https://opencode.ai&#34;&gt;opencode&lt;/a&gt; un cahier des charges d&amp;rsquo;un
paragraphe : « un canvas HTML où des cercles colorés s&amp;rsquo;attirent selon des
teintes similaires et se repoussent quand ils sont opposés », et je l&amp;rsquo;ai
branché sur la quantification d&amp;rsquo;unsloth de Qwen3.6-35B-A3B (UD-Q8_K_XL,
~3 milliards de paramètres actifs) tournant en local. Une douzaine de tours
de pilotage plus tard, à corriger des bugs et ajuster le comportement,
j&amp;rsquo;avais une démo fonctionnelle dans un seul fichier.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini 3.1 Flash Live : IA vocale à faible latence avec sortie audio native</title>
      <link>https://christianroy.dev/fr/til/gemini-3-1-flash-live-low-latency-voice-ai/</link>
      <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/gemini-3-1-flash-live-low-latency-voice-ai/</guid>
      <description>&lt;p&gt;Google a lancé Gemini 3.1 Flash Live via la Live API pour créer des agents vocaux et visuels en temps réel. Le modèle traite des flux continus d&amp;rsquo;audio, vidéo et texte pour fournir des réponses parlées immédiates avec détection de nuances acoustiques et support de 90+ langues.&lt;/p&gt;
&lt;p&gt;Principales améliorations par rapport à Gemini 2.5 Flash Native Audio :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Meilleur filtrage du bruit dans des environnements réels&lt;/li&gt;
&lt;li&gt;Respect renforcé des instructions système complexes&lt;/li&gt;
&lt;li&gt;Dialogue plus naturel avec latence améliorée&lt;/li&gt;
&lt;li&gt;Capacité de réflexion via &lt;code&gt;thinkingLevel&lt;/code&gt; (minimal/low/medium/high) au lieu de &lt;code&gt;thinkingBudget&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le modèle produit de l&amp;rsquo;audio natif (pas de pipeline STT+TTS) avec une fenêtre de contexte de 128k. Il supporte l&amp;rsquo;appel de fonctions synchrones, Google Search grounding et l&amp;rsquo;entrée vidéo en plus de l&amp;rsquo;audio.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitAgent définit les agents IA comme des dépôts git, exportables vers n&#39;importe quel framework avec une seule commande CLI</title>
      <link>https://christianroy.dev/fr/til/gitagent-ai-agents-as-git-repos/</link>
      <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/gitagent-ai-agents-as-git-repos/</guid>
      <description>&lt;p&gt;GitAgent propose que votre dépôt git &lt;em&gt;est&lt;/em&gt; votre agent. Deux fichiers obligatoires -
&lt;code&gt;agent.yaml&lt;/code&gt; (le manifeste) et &lt;code&gt;SOUL.md&lt;/code&gt; (l&amp;rsquo;identité) - définissent l&amp;rsquo;agent. Tout
le reste - skills, outils, mémoire, artefacts de conformité - est une structure
optionnelle ajoutée par-dessus.&lt;/p&gt;
&lt;p&gt;La partie intéressante est le modèle de supervision : quand un agent met à jour sa
mémoire ou acquiert un nouveau skill, le changement devient un commit git ou une PR.
Les réviseurs humains peuvent examiner les diff des changements de personnalité de
l&amp;rsquo;agent comme n&amp;rsquo;importe quelle revue de code. Si le comportement dérive, &lt;code&gt;git revert&lt;/code&gt;
le ramène en arrière.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Le serveur MCP Colab de Google permet a n&#39;importe quel agent IA de creer et d&#39;executer des notebooks dans le cloud</title>
      <link>https://christianroy.dev/fr/til/colab-mcp-server-ai-agents-notebooks/</link>
      <pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/colab-mcp-server-ai-agents-notebooks/</guid>
      <description>&lt;p&gt;Google a publie un serveur MCP open source pour Google Colab. N&amp;rsquo;importe quel
agent compatible MCP - Claude Code, Gemini CLI, ou un agent personnalise - peut
maintenant controler un notebook Colab par programmation : creer des cellules,
ecrire et executer du code, installer des dependances, reorganiser le contenu.&lt;/p&gt;
&lt;p&gt;La configuration tient en un seul bloc :&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;colab-mcp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;git+https://github.com/googlecolab/colab-mcp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;30000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La motivation est concrete : les developpeurs copiaient du code depuis leur
terminal vers des cellules Colab pour l&amp;rsquo;executer ou visualiser des donnees. Ce
changement de contexte brise la concentration. Avec ce serveur, l&amp;rsquo;agent ecrit
directement dans un notebook ouvert - vous obtenez un artefact reproductible et
executable dans le cloud plutot qu&amp;rsquo;un simple extrait de code dans votre terminal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenShell de NVIDIA applique les garde-fous des agents IA en dehors du processus agent, pour qu&#39;un agent compromis ne puisse pas les contourner</title>
      <link>https://christianroy.dev/fr/til/nvidia-openshell-out-of-process-agent-guardrails/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/nvidia-openshell-out-of-process-agent-guardrails/</guid>
      <description>&lt;p&gt;Le probleme avec les garde-fous qui vivent a l&amp;rsquo;interieur de l&amp;rsquo;agent : un agent
compromis peut les contourner. Claude Code et Cursor embarquent des prompts de
securite internes, mais ces protections sont dans le meme processus qu&amp;rsquo;elles sont
censees surveiller. Une injection de prompt ou un skill tiers malveillant a acces
au meme environnement d&amp;rsquo;execution.&lt;/p&gt;
&lt;p&gt;NVIDIA OpenShell deplace le point d&amp;rsquo;application en dehors. Il encapsule n&amp;rsquo;importe
quel agent dans un conteneur isole avec des politiques YAML que l&amp;rsquo;agent ne peut ni
lire ni modifier. L&amp;rsquo;acces reseau est refuse par defaut et rechargeable a chaud ; les
contraintes sur le systeme de fichiers et les processus sont verouillees a la
creation. L&amp;rsquo;agent ne peut pas escalader ses privileges parce que le noyau ne le
permet pas - pas parce qu&amp;rsquo;on lui a dit de ne pas le faire.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unsloth Studio est une interface no-code open source pour entraîner et exécuter des LLMs localement</title>
      <link>https://christianroy.dev/fr/til/unsloth-studio-no-code-local-llm-training/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/unsloth-studio-no-code-local-llm-training/</guid>
      <description>&lt;p&gt;Unsloth Studio regroupe l&amp;rsquo;inférence locale, le fine-tuning et l&amp;rsquo;export de modèles dans
une seule interface web sans code. Une commande curl suffit pour l&amp;rsquo;installer; on peut
ensuite exécuter des modèles GGUF ou safetensor sur Mac, Windows ou Linux sans écrire
une seule ligne de code.&lt;/p&gt;
&lt;p&gt;Le volet entraînement est le principal attrait: fine-tuning 2x plus rapide avec 70% moins
de VRAM sur 500+ familles de modèles (texte, vision, TTS, embeddings). LoRA, FP8 et
le fine-tuning complet fonctionnent sur le matériel NVIDIA, avec support multi-GPU
déjà intégré.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenViking: Une base de contexte utilisant un paradigme de système de fichiers pour les agents IA</title>
      <link>https://christianroy.dev/fr/til/openviking-context-database-ai-agents/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/openviking-context-database-ai-agents/</guid>
      <description>&lt;p&gt;OpenViking abandonne le stockage vectoriel RAG traditionnel et utilise plutôt un paradigme de système de fichiers. Il organise le contexte de l&amp;rsquo;agent (mémoires, ressources, compétences) sous les URI &lt;code&gt;viking://&lt;/code&gt; avec une structure à trois niveaux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L0 (Abstract)&lt;/strong&gt;: Résumé en une phrase pour une récupération rapide&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L1 (Overview)&lt;/strong&gt;: Informations essentielles et scénarios d&amp;rsquo;utilisation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2 (Details)&lt;/strong&gt;: Données originales complètes, chargées à la demande&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cela permet une récupération récursive par répertoires qui verrouille d&amp;rsquo;abord les répertoires à haut score, puis affine l&amp;rsquo;exploration du contenu. La trajectoire de récupération est entièrement observable, permettant aux utilisateurs de voir exactement comment le contexte est accédé.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Passer les reponses d&#39;agents Mastra dans jq pour coloriser le raisonnement et les appels d&#39;outils dans le terminal</title>
      <link>https://christianroy.dev/fr/til/mastra-jq-ansi-agent-responses/</link>
      <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/mastra-jq-ansi-agent-responses/</guid>
      <description>&lt;p&gt;L&amp;rsquo;API HTTP d&amp;rsquo;agents de Mastra retourne une structure JSON avec des &lt;code&gt;steps&lt;/code&gt;, chacune
contenant des elements &lt;code&gt;content&lt;/code&gt; types comme &lt;code&gt;reasoning&lt;/code&gt;, &lt;code&gt;tool-call&lt;/code&gt;, &lt;code&gt;tool-result&lt;/code&gt; et
&lt;code&gt;text&lt;/code&gt;. La sortie brute est dense. Commencez par l&amp;rsquo;explorer:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Appeler l&amp;#39;API et voir la structure brute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq .
&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 class=&#34;c1&#34;&gt;# Obtenir uniquement la reponse finale&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.text&amp;#39;&lt;/span&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 class=&#34;c1&#34;&gt;# Explorer ce qui se trouve dans les steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.steps[].content[] | .type&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;reasoning&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;tool-call&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;tool-result&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;reasoning&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;text&amp;#34;&lt;/span&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 class=&#34;c1&#34;&gt;# Voir quels champs chaque type possede&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.steps[].content[] | select(.type == &amp;#34;tool-call&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois la structure comprise, passez dans &lt;code&gt;jq -r&lt;/code&gt; avec des sequences d&amp;rsquo;echappement
ANSI en ligne pour coloriser chaque element:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Les skills OpenClaw disparaissent silencieusement sans descriptions YAML entre guillemets et sans metadonnees openclaw</title>
      <link>https://christianroy.dev/fr/til/openclaw-skill-frontmatter-metadata/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/openclaw-skill-frontmatter-metadata/</guid>
      <description>&lt;p&gt;Si un skill OpenClaw personnalise n&amp;rsquo;apparait pas dans &lt;code&gt;openclaw skills list&lt;/code&gt; et que
l&amp;rsquo;agent ne peut pas le voir non plus, le frontmatter de SKILL.md est probablement en
cause. OpenClaw echoue silencieusement, donc le retour de debogage est minimal.&lt;/p&gt;
&lt;p&gt;Deux choses doivent etre correctes. Premierement, tout &lt;code&gt;name&lt;/code&gt; ou &lt;code&gt;description&lt;/code&gt; contenant
un deux-points doit etre entoure de guillemets doubles, sinon YAML interprete le
deux-points comme un separateur cle-valeur et l&amp;rsquo;analyse echoue. Deuxiemement, le
frontmatter doit inclure un bloc de metadonnees &lt;code&gt;openclaw&lt;/code&gt; declarant l&amp;rsquo;icone emoji et
les binaires ou variables d&amp;rsquo;environnement requis. Sans cela, OpenClaw n&amp;rsquo;enregistrera
pas le skill du tout.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Un site peut servir une vraie interface terminal ANSI quand on le curle plutôt que du HTML</title>
      <link>https://christianroy.dev/fr/til/curl-ansi-terminal-website/</link>
      <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/curl-ansi-terminal-website/</guid>
      <description>&lt;p&gt;Faire &lt;code&gt;curl ysap.sh&lt;/code&gt; ne retourne pas du HTML. Ça retourne une interface terminal complètement
rendue: en-tête en pixel art, panneaux avec bordures, disposition en deux colonnes, liens en
couleur. Exactement ce qu&amp;rsquo;on attendrait d&amp;rsquo;une app TUI, livré via HTTP ordinaire.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;astuce: inspecter l&amp;rsquo;en-tête &lt;code&gt;User-Agent&lt;/code&gt;. Quand il commence par &lt;code&gt;curl/&lt;/code&gt;, répondre avec
des codes d&amp;rsquo;échappement ANSI et des caractères de dessin. Quand c&amp;rsquo;est un navigateur,
répondre avec du HTML. Même URL, deux expériences complètement différentes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTPie a besoin de --ignore-stdin dans les environnements non-TTY comme Claude Code</title>
      <link>https://christianroy.dev/fr/til/httpie-ignore-stdin-claude-code/</link>
      <pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/httpie-ignore-stdin-claude-code/</guid>
      <description>&lt;p&gt;HTTPie détecte s&amp;rsquo;il tourne dans un TTY. Quand il n&amp;rsquo;y en a pas, comme lorsque Claude Code
l&amp;rsquo;appelle comme subprocess, HTTPie suppose que stdin pourrait avoir des données à venir et
interprète la requête comme un POST, même si tu voulais faire un GET.&lt;/p&gt;
&lt;p&gt;La correction, c&amp;rsquo;est &lt;code&gt;--ignore-stdin&lt;/code&gt; :&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http --ignore-stdin GET localhost:3000/things
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le piège : une fois que tu dis à Claude Code de toujours utiliser &lt;code&gt;--ignore-stdin&lt;/code&gt;, il va
aussi l&amp;rsquo;utiliser quand tu pipes des données, ce qui brise complètement ce cas d&amp;rsquo;utilisation :&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTPie interprète les clés numériques comme des index de tableau, brise les mises à jour de champs personnalisés Asana</title>
      <link>https://christianroy.dev/fr/til/httpie-asana-custom-fields-oom/</link>
      <pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/httpie-asana-custom-fields-oom/</guid>
      <description>&lt;p&gt;Les GID de champs personnalisés Asana sont de longues chaînes numériques. Quand tu les passes
comme clés imbriquées avec la syntaxe bracket d&amp;rsquo;HTTPie, HTTPie voit une clé numérique et suppose
que tu construis un tableau, puis essaie d&amp;rsquo;allouer de la mémoire jusqu&amp;rsquo;à cet index. Avec un GID
à 16 chiffres, c&amp;rsquo;est suffisant pour faire planter le processus en OOM.&lt;/p&gt;
&lt;p&gt;Ça brise :&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https --session pat PUT https://app.asana.com/api/1.0/tasks/1208765432100001 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  data&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;custom_fields&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;1205432109876543&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1205432109876544&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTPie lit &lt;code&gt;1205432109876543&lt;/code&gt; comme un index de tableau et tente de construire un tableau
sparse de cette taille. Il n&amp;rsquo;arrive même jamais à faire la requête.&lt;/p&gt;</description>
    </item>
    <item>
      <title>glow enlève les couleurs quand appelé depuis un subprocess: forcer avec des variables d&#39;environnement</title>
      <link>https://christianroy.dev/fr/til/glow-ansi-subprocess/</link>
      <pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/glow-ansi-subprocess/</guid>
      <description>&lt;p&gt;&lt;code&gt;glow&lt;/code&gt; détecte s&amp;rsquo;il écrit vers un vrai terminal. Quand il est appelé depuis un script ou un
subprocess (comme &lt;code&gt;subprocess.run&lt;/code&gt; en Python), il ne voit pas de TTY et enlève tous les codes
de couleur ANSI, tu te retrouves avec du texte plain.&lt;/p&gt;
&lt;p&gt;La correction se fait avec deux variables d&amp;rsquo;environnement :&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CLICOLOR_FORCE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;COLORTERM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;truecolor glow --style dark file.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CLICOLOR_FORCE=1&lt;/code&gt; indique aux outils CLI qui gèrent les couleurs d&amp;rsquo;en émettre peu importe
la détection de TTY. &lt;code&gt;COLORTERM=truecolor&lt;/code&gt; dit à glow d&amp;rsquo;utiliser les couleurs 24 bits au lieu
de se rabattre sur le mode 8 couleurs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zvec est une base de donnees vectorielle embarquee qui vise a etre le SQLite de la recherche vectorielle</title>
      <link>https://christianroy.dev/fr/til/zvec-embedded-vector-database/</link>
      <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/fr/til/zvec-embedded-vector-database/</guid>
      <description>&lt;p&gt;Zvec est une base de donnees vectorielle embarquee open source d&amp;rsquo;Alibaba, construite sur
leur moteur Proxima. Le positionnement est simple: une recherche vectorielle qui s&amp;rsquo;execute
en cours de processus, sans serveur, avec la meme facilite d&amp;rsquo;installation que SQLite.&lt;/p&gt;
&lt;p&gt;Le vide qu&amp;rsquo;il comble est reel. Faiss donne des index mais pas de CRUD ni de recuperation
apres crash. DuckDB-VSS a des fonctionnalites vectorielles limitees. Milvus necessite son
propre processus et un saut reseau. Zvec vise a etre l&amp;rsquo;option qui fonctionne simplement
quand on construit un pipeline RAG local, un outil en ligne de commande, ou n&amp;rsquo;importe
quoi en local ou on a besoin de recherche semantique sans infrastructure.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
