Une méthodologie pour construire des agents IA

Le 31 mars 2026, un fichier .map de 59.8 MB a été publié accidentellement dans le package npm de Claude Code. 512 000 lignes de TypeScript, 1 906 fichiers. Tout le harness agentique d'Anthropic exposé au grand jour.

Tout le monde en a parlé et c'est bien normal. Les codenames de futurs modèles (Capybara, Tengu), l'agent autonome KAIROS, les faux outils anti-distillation. C'est du bon matériel pour les gros titres.

Mais ce qui m'intéresse, c'est autre chose. Je précise d'emblée que je n'ai pas eu accès au code leaké moi-même. Ce qui suit est une synthèse des analyses techniques publiées par d'autres dans les jours qui ont suivi la fuite, croisée avec le projet claw-code qui a reproduit l'architecture from scratch en Python et Rust pour des raisons légales. À partir de ces sources, j'ai fini par trouver quelque chose qui me semble plus précieux que des codenames ou que des bouts de code : une méthodologie. Sept principes de conception que je confronte à ce que je construis avec mAIstrow, le système d'IA agentique sur lequel je travaille au quotidien. Ils sont utiles à peu près à tous les gens que je vois se lancer sérieusement dans un système d'agents.

7 PRINCIPES POUR CONSTRUIRE UN AGENT IA d'après les analyses publiques du leak de Claude Code 1. Le scaffold compte plus que le modèle GPT-4 peut varier d'un facteur 10 en performance selon l'orchestration qui l'entoure. 2. Le prompt est l'architecture Un prompt se conçoit comme du code, avec ses règles DRY et sa structure. 3. La mémoire est un hint, pas une vérité Trois couches : index, topic files, transcripts. L'agent vérifie toujours avant d'agir. 4. Sécurité en profondeur, pas en largeur Chaque action traverse plusieurs couches de vérification, pas un unique gardien. 5. Read parallèle, Write sériel Les lectures concurrentes sont gratuites. Les écritures s'enchaînent, jamais en parallèle. 6. Concevoir pour le coût dès le départ Chaque token facturé est du compute réel. Le contexte se gère comme un budget. 7. Du réactif au proactif : KAIROS L'agent agit sur des déclencheurs qu'il a appris à repérer par lui-même. BONUS Anti-distillation Fake tools, connector-text signé, undercover mode, char code encoding.

Le chiffre qui change tout

Avant d'entrer dans la méthodologie, deux chiffres qui devraient suffire à convaincre n'importe qui de s'y intéresser.

Le premier vient de SWE-bench Lite. Avec un scaffold basique, GPT-4 résout 2,7 % des problèmes. Avec le framework CodeR [1], le même modèle monte à 28,3 %. Un facteur dix sans toucher une ligne de pondération. Le second vient de Terminal-Bench 2.0 : Opus 4.5 testé avec trois scaffoldings différents (Augment, Cursor, Claude Code) montre 17 problèmes d'écart sur les 731 issues du benchmark [2]. Même modèle, trois infrastructures, trois scores nettement différents.

La conclusion est dure à esquiver. Le choix du modèle n'est pas le facteur déterminant de la performance d'un agent. L'infrastructure autour du modèle (le scaffold [3], le harness, l'outillage) compte autant et souvent plus. C'est aussi ce que les analyses publiées du code de Claude Code décrivent, section après section.

Sebastian Raschka arrive à la même conclusion le jour même du leak, dans un premier post [4] où il liste les mêmes ingrédients que ceux que je vais détailler plus bas : gestion du contexte projet, prompt cache, outils structurés, compression de contexte, mémoire, sous-agents. Il développe ensuite l'analyse dans Components of a Coding Agent avec un mini coding agent en Python et sa formule résume assez bien ce que disent aussi tous les autres analystes du leak : "the surrounding system plays as much of a role as the model itself". Les principes qui suivent sont une lecture des analyses disponibles à travers cette grille.

Principe 1. Le scaffold compte plus que le modèle

Les analyses publiées décrivent un système de plus de cinquante outils organisés en registre plugin. Le modèle ne "code" pas à proprement parler. Il orchestre des appels structurés (lire un fichier, lancer une commande, chercher un pattern dans un dossier) et c'est le scaffold qui les exécute.

Chaque outil a un niveau de risque classé LOW, MEDIUM ou HIGH et c'est le scaffold qui décide en conséquence si l'action passe directement, demande une confirmation, ou est bloquée. Cette séparation a une conséquence qui est moins anodine qu'elle n'en a l'air : on peut changer de modèle sans changer le système. Opus, Sonnet, un modèle tiers, le scaffold reste identique. Les analyses mentionnent d'ailleurs l'existence de feature flags pour basculer entre modèles en cours de route.

Principe 1 — Le modèle propose, le scaffold exécute Modèle raisonne, propose un appel tool_call Scaffold reçoit, dispatche Permission LOW / MED / HIGH pass / confirm / block Sandbox exécution isolée Résultat nettoyé, retour au modèle retour dans le contexte du modèle

Ce que j'en retiens pour mes propres projets, c'est qu'il est plus rentable de commencer par le scaffold que par le choix du modèle. Le modèle, vous finirez par en changer ; le scaffold, c'est ce que vous construisez vraiment. C'est la ligne que suit mAIstrow côté système, comme le fait aussi herbert-rs un cran plus bas côté moteur d'inférence : le moteur y est délibérément découplé du modèle qu'il charge, le format des poids, l'architecture du transformer et les opérateurs sont traités comme des modules interchangeables. J'ai fait cet effort dès le départ précisément parce que je savais qu'aucun modèle choisi aujourd'hui ne me servirait encore dans deux ans.

Principe 2. Le prompt est l'architecture

D'après les analyses, le system prompt [3] de Claude Code ferait entre 38 000 et 50 000 tokens. C'est un document structuré, qui ressemble davantage à une spécification qu'à une instruction en langage naturel.

Le point qui m'a le plus marqué à la lecture de ces analyses, c'est qu'une bonne partie de l'orchestration multi-agent serait définie dans le prompt lui-même et non dans le code. Le mode Coordinator, qui répartit le travail entre sous-agents, serait décrit textuellement, comme une directive adressée au modèle et non comme du branching TypeScript. L'avantage est concret : pour changer le comportement de l'orchestration, il suffit de réécrire une section du prompt et d'activer un feature flag [3] GrowthBook, là où un équivalent codé en dur aurait demandé une compilation, une release, un déploiement et sans doute une revue de pull request.

Principe 2 — Le prompt comme architecture cacheable Section statique ~38 000 à 50 000 tokens • Définition des 50+ outils (JSON schema) • Règles comportementales (ton, emojis, concision, action avant raisonnement) • Prompt du Coordinator multi-agent • Directives de sécurité (réversibilité, rayon d'impact) • Glossaires et conventions identique pour tous → prompt cache → facturé ~10% du tarif plein SYSTEM_PROMPT_DYNAMIC_BOUNDARY Section dynamique ~quelques milliers de tokens • Contenu de MEMORY.md et CLAUDE.md • État de la session (fichiers ouverts, historique récent) spécifique à chaque session → facturé plein tarif

Le prompt contiendrait aussi des directives comportementales assez précises. Pas d'emojis sauf demande explicite, réponses concises, action d'abord et raisonnement ensuite et surtout l'obligation d'évaluer la réversibilité et le rayon d'impact de chaque action avant de l'exécuter. Ce dernier point est d'ailleurs ce que je trouve le plus sage dans toute la méthodologie : ce sont des critères qu'un bon sysadmin applique depuis toujours et qu'il est rassurant de voir codifiés explicitement pour un agent.

Ce que j'en conclus, c'est que dans un système agentique le prompt n'est pas une configuration mais une véritable architecture et qu'il mérite le même soin que votre code. C'est-à-dire une revue, une structure, des règles de cohérence et probablement une forme de versionnement.

Principe 3. La mémoire est un hint, pas une vérité

Claude Code implémente un système mémoire à 3 couches :

CoucheContenuChargement
Index (MEMORY.md)Pointeurs d'une ligne (~150 chars max)Toujours en contexte
Topic files (.md)Notes détaillées par sujetÀ la demande
Transcripts (JSONL)Historique complet des sessionsRecherche uniquement
Principe 3 — Trois couches de mémoire, du plus chaud au plus froid MEMORY.md — l'index ~200 lignes max, 150 caractères par entrée pointeurs uniquement, pas de contenu toujours chargé Topic files — le détail user_profile.md, project_X.md, feedback_Y.md, reference_Z.md... un fichier par sujet, chargé à la demande quand l'index y pointe à la demande Transcripts JSONL — l'archive historique complet des sessions passées non chargé automatiquement, recherche explicite uniquement recherche seule

L'index est limité à 200 lignes. Chaque entrée est un pointeur, pas du contenu. Quand le modèle a besoin de détails, il charge le topic file correspondant. L'historique brut n'est accessible qu'en recherche.

La consolidation se fait en arrière-plan via un sous-agent forké (autoDream) qui fusionne les observations, supprime les contradictions et met à jour l'index. Trois conditions doivent être remplies : 24h depuis la dernière consolidation, 5+ sessions accumulées et un verrou acquis.

Mais le principe de design le plus important est celui-ci :

"La mémoire dit que X existe" ≠ "X existe maintenant."

Le modèle est instruit de vérifier contre le code réel avant d'agir sur un souvenir. Si la mémoire contredit la réalité, c'est la réalité qui gagne et la mémoire est mise à jour dans la foulée.

Ce pattern n'est pas un choix arbitraire d'Anthropic. Andrej Karpathy décrit indépendamment la même architecture dans un thread récent sur la mémoire personnalisée des agents IA. Il y défend quatre principes : une mémoire explicite et inspectable plutôt qu'une boîte noire, des fichiers markdown plutôt qu'une base de données (c'est son "file over app"), des données qui restent sous le contrôle de l'utilisateur et un modèle interchangeable ("BYOAI"). Ce que fait MEMORY.md dans Claude Code correspond très exactement à cette description : fichiers markdown, vérifiables, locaux, indépendants du modèle.

Et dans les réponses au thread de Karpathy, je suis tombé sur un utilisateur qui décrit son propre système avec "cron jobs and a dream cron to clean up stale memories/contradictions", de la mémoire partagée entre providers et de la synchronisation en temps réel. Sans connaître le code de Claude Code, il venait de réinventer autoDream et KAIROS. Quand le même pattern émerge indépendamment chez Anthropic, chez Karpathy et chez un praticien isolé, il est difficile de continuer à le considérer comme un simple choix d'implémentation.

La manière dont je formule cela pour mes propres systèmes, c'est que la mémoire d'un agent est un cache, pas une base de données. Elle accélère, elle donne du contexte, mais elle ne fait pas autorité. Dès qu'on accepte cette distinction, on évite toute une classe de comportements erratiques liés à des souvenirs périmés qui contredisent silencieusement la réalité.

Principe 4. La sécurité en profondeur, pas en largeur

Les analyses décrivent un fichier bashSecurity.ts qui contiendrait 23 vérifications numérotées appliquées à chaque commande avant exécution. 18 builtins Zsh bloqués (eval, exec, source, trap...). Détection d'injection Unicode (zero-width spaces). Vérification de traversée de chemin avec normalisation Unicode.

Mais les 23 checks ne sont que la première couche. L'architecture complète en compte cinq :

CoucheFonction
1. bashSecurity.ts23 checks syntaxiques et sémantiques
2. Permission SystemClassification LOW / MEDIUM / HIGH
3. User ConfirmationApprobation pour les actions HIGH
4. Sandbox ExecutionExécution isolée
5. Output SanitizationNettoyage des résultats
Principe 4 — Cinq tamis successifs, du brut au résultat Commande brute 1. bashSecurity.ts 23 vérifications — builtins bloqués, injection Unicode, traversée de chemin 2. Permission System classification LOW / MEDIUM / HIGH selon l'outil et les arguments 3. User Confirmation approbation explicite pour toute action marquée HIGH 4. Sandbox Execution exécution isolée, l'hôte reste protégé si l'action dérape 5. Output Sanitization nettoyage des résultats avant réinjection dans le contexte du modèle Résultat nettoyé chaque couche suppose que la précédente a laissé passer quelque chose

Le système de permissions offre cinq modes qui vont du plus strict au plus permissif : Default (confirmations fréquentes), Allow Edits (fichiers OK, bash confirmé), Auto (où un classifieur ML détermine le risque des commandes), Bypass et YOLO (tout passe, pour le développement ou les utilisateurs qui savent ce qu'ils font). Cinq CVEs [3] publiques documentent par ailleurs des bypasses trouvés et corrigés via HackerOne, ce qui est à la fois rassurant sur la maturité du processus et inquiétant sur la surface d'attaque réelle.

Ce que j'en retiens, c'est que la sécurité d'un agent IA ne peut pas reposer sur un firewall unique. Elle ressemble davantage à une pile de tamis dont chacun suppose que le précédent a laissé passer quelque chose. Le fait qu'Anthropic maintienne un bug bounty actif me semble confirmer que cette discipline n'est jamais "terminée" et c'est probablement la seule attitude raisonnable dans ce domaine.

Principe 5. Read parallèle, Write sériel

Le système multi-agent de Claude Code définit trois types de sous-agents :

TypeIsolationCas d'usage
ForkCopie byte-identique du contexte parentExplorations rapides
TeammateContexte propre, pane terminal séparéTâches longues en parallèle
WorktreeBranche git isoléeModifications code sans conflits

L'orchestration suit quatre phases : Research (parallèle, lecture seule) → Synthesis (coordinateur fusionne) → Implementation (sérielle, un seul agent écrit) → Verification (parallèle, tests et reviews).

Principe 5 — Quatre phases : parallèle, sériel, parallèle Research PARALLÈLE Agent 1 (read) Agent 2 (read) Agent 3 (read) Synthesis COORDINATEUR fusionne les findings (no rubber-stamp) Implementation SÉRIEL un seul agent écrit à la fois Verification PARALLÈLE Tests Review Linter lectures parallélisables, écritures exclusives

La règle de concurrence est simple : les opérations de lecture (Glob, Grep, Read) s'exécutent en parallèle. Les opérations d'écriture (Edit, Write, Bash) s'exécutent en série. Un seul agent modifie les fichiers à un instant donné.

Les analyses rapportent des directives explicites dans le prompt du coordinateur, du genre "Do not rubber-stamp weak work" ou "You must understand findings". Elles sont là pour empêcher un travers classique de ce type d'architecture, dans lequel le coordinateur se contente de relayer passivement les productions des sous-agents sans y apporter de jugement.

Ce principe rejoint directement ce que n'importe quel ingénieur connaît en programmation concurrente. Les lectures peuvent se paralléliser sans douleur, les écritures demandent une sérialisation. Et dans un système où le coordinateur ne comprend pas ce qu'il coordonne, il devient un goulot d'étranglement qui n'apporte rien de plus qu'un reroutage de messages.

Principe 6. Concevoir pour le coût dès le départ

D'après les analyses, le system prompt de Claude Code est divisé en deux par un marqueur SYSTEM_PROMPT_DYNAMIC_BOUNDARY :

Le prompt caching [3] facture les tokens cachés à 1/10e du prix. Cette division réduit le coût du system prompt d'environ 90%, soit la différence entre ~$0.75 et ~$0.075 par requête avec Opus 4.6.

Les analyses mentionnent un fichier promptCacheBreakDetection.ts qui surveillerait quatorze vecteurs susceptibles d'invalider ce cache : changement de MEMORY.md, toggle de mode, ajout d'outil, changement de modèle... Chaque vecteur a sa mitigation. Les "sticky latches" empêchent les oscillations de mode (plan → normal → plan) de casser le cache à chaque toggle.

Et un commentaire dans autoCompact.ts, rapporté par les analyses, révèle un bug historique :

"1,279 sessions had 50+ consecutive failures wasting ~250K API calls/day globally"

Le correctif documenté dans le code est un circuit breaker [3] plafonné à trois échecs consécutifs. C'est simple, efficace et à l'échelle d'Anthropic ça représente très probablement plusieurs dizaines de milliers de dollars par jour.

Ce que ce genre de détail me rappelle, c'est que dans un système IA en production le coût n'est pas un problème d'optimisation qu'on traite plus tard, c'est une contrainte architecturale qu'on intègre dès le début. Structurer le prompt pour tirer parti du cache, surveiller les vecteurs d'invalidation, mettre des circuit breakers sur chaque boucle où l'agent pourrait s'acharner, tout cela relève de la conception initiale, pas de l'optimisation de fin de projet.

Je retrouve la même préoccupation à deux niveaux dans ce que je construis. Côté mAIstrow, c'est une discipline de budget tokens qui ressemble beaucoup à celle décrite dans les analyses de Claude Code. Côté herbert-rs, la ressource rare n'est plus le token facturé mais le cycle CPU ou GPU. Chaque opération matricielle inutile devient du temps perdu qui se traduit par de la latence côté utilisateur. Les deux niveaux partagent la même logique : profiler, identifier le gaspillage, refuser ce qui ne sert à rien.

Principe 7. Du réactif au proactif : KAIROS

KAIROS serait référencé 150+ fois dans le codebase selon les analyses. C'est un agent daemon [3], un processus persistant qui tourne en continu, compilé à false dans les builds publics mais entièrement présent dans le code.

L'architecture : un cron toutes les 5 minutes, des webhooks GitHub, des daemon workers et un budget de 15 secondes par cycle d'action proactive. L'agent vérifie l'état des PRs, exécute des tâches planifiées, consolide sa mémoire via le skill /dream.

Principe 7 — KAIROS : le daemon qui anticipe Cron toutes les 5 minutes Webhooks GitHub PR, issues, commentaires Daemon workers tâches longue durée KAIROS agent daemon budget 15 s par cycle d'action proactive /dream consolidation mémoire Notifications push seulement si utile Actions PR review, merge, labels référencé 150+ fois dans le codebase, activé par flag compile-time

Des outils exclusifs lui sont réservés : envoi de fichiers à l'utilisateur, notifications push, abonnement aux événements de PR. Le mode Brief est activé par défaut, avec des réponses minimales et un focus sur l'action.

Aucun concurrent connu n'a aujourd'hui d'équivalent. Cursor, OpenHands et Copilot sont réactifs, Devin est autonome mais sans la persistance daemon ni la consolidation mémoire. KAIROS décrit un régime différent, celui où l'agent cesse d'attendre qu'on lui parle pour commencer à travailler sur ce qu'il estime pertinent.

C'est probablement là que se joue une bonne partie de l'avenir des agents IA et ce ne sera pas dans l'interface de chat. Ce sera dans ce type de daemon qui tourne en arrière-plan, priorise ses propres tâches et n'interrompt l'humain que quand il a quelque chose d'utile à lui dire. Le budget de quinze secondes par cycle d'action proactive est à ce titre un détail que je trouve particulièrement bien pensé : il empêche l'agent de monopoliser les ressources tout en lui laissant assez de marge pour faire quelque chose d'utile à chaque passage.

Bonus. L'anti-distillation, ou comment protéger sa valeur

Un aspect inattendu rapporté par les analyses : les mécanismes anti-distillation. La distillation [3] comportementale (entraîner un petit modèle sur les outputs d'un gros) est la menace existentielle des agents propriétaires.

D'après ces analyses, Claude Code implémenterait quatre contre-mesures :

MécanismePrincipeEfficacité
Fake toolsInjection d'outils fictifs dans le promptMoyenne (contournable via proxy)
Connector-textSignature cryptographique du texte intermédiaireHaute
Undercover modeSuppression des codenames internes sur repos publicsHaute
CharCode encodingNoms encodés via String.fromCharCode()Faible (obscurité ≠ sécurité)

Les faux outils sont activés par quatre conditions simultanées : flag compile-time, lancement via CLI, provider Anthropic first-party et flag GrowthBook actif. Si un distilleur entraîne sur ces données, son modèle apprend des outils qui n'existent pas.

La stratégie est pragmatique. Elle ne bloque pas un attaquant déterminé, puisqu'un proxy MITM suffit à contourner les fake tools, mais elle augmente le coût de la distillation au-dessus du seuil de rentabilité pour la majorité des acteurs qui pourraient être tentés par l'exercice.

Ce que cette partie moins spectaculaire du leak m'a appris, c'est que la valeur dans l'économie actuelle de l'IA a glissé. Les modèles deviennent progressivement des commodités ; ce qui les entoure est devenu, pour Anthropic comme pour ses concurrents, le véritable actif. Et cet actif ne se protège pas par l'obscurité du code, puisque ce leak prouve que le code finit toujours par fuiter d'une manière ou d'une autre. Il se protège par des mécanismes d'empoisonnement de données qui rendent la copie comportementale coûteuse. Le projet claw-code apporte une illustration presque parfaite de cette lecture : ses auteurs ont pu reproduire l'architecture entière from scratch en Python et Rust, uniquement à partir des analyses publiques, ce qui montre que la méthodologie n'est pas un secret. Le secret, s'il en reste un, c'est la discipline d'exécution.

Ce que j'en retiens pour mAIstrow

Aucun de ces sept principes n'est resté théorique pour moi. Je les retrouve dans mAIstrow, le système d'IA agentique sur lequel je travaille au quotidien. Je les retrouve aussi dans une moindre mesure dans herbert-rs, le moteur d'inférence LLM en Rust et en assembleur qui en constitue la couche basse.

Côté mAIstrow, la liste des principes applicables est essentiellement celle des sept décrits plus haut. Le scaffold est découplé du modèle sous-jacent pour que je puisse en changer sans réécrire le reste. Le prompt système y est traité comme une véritable architecture structurée, avec ses règles de cohérence et sa section statique cacheable. La mémoire suit la discipline "hint, pas vérité" avec un index en tête et des topic files chargés à la demande. Les actions sensibles passent par plusieurs couches de validation plutôt que par un contrôle unique. Le coût est intégré comme contrainte de conception, avec une attention particulière au ratio tokens cachés / tokens frais. Et l'orchestration multi-agent suit la règle "lectures en parallèle, écritures en série" dont j'ai découvert à l'usage qu'elle évite toute une classe de bugs d'état partagé.

Côté herbert-rs, l'analogie est plus limitée, parce qu'un moteur d'inférence n'est pas un agent. Trois principes y cascadent néanmoins. La modularité, d'abord, avec chaque opérateur (matmul, attention, RoPE) traité comme un module remplaçable indépendamment des autres, au même titre que les outils dans Claude Code. L'obsession du coût, ensuite, transposée du token facturé au cycle CPU ou GPU consommé, avec la même discipline de profiling systématique. Et la sécurité en couches, enfin, sous une forme particulière : Rust élimine par construction toute une classe de bugs mémoire, ce qui joue le rôle d'une couche structurelle posée une fois pour toutes au niveau du langage plutôt que d'un contrôle à l'exécution.

Ce que le leak de Claude Code confirme, pour moi, c'est ce que beaucoup de praticiens savaient déjà sans l'avoir formulé aussi clairement. Le modèle est une condition nécessaire pour qu'un agent fonctionne, mais le scaffold est ce qui détermine à quel point il sera utile en pratique. Et c'est sur la méthodologie de construction de ce scaffold que se joue aujourd'hui l'essentiel de la différence entre les projets qui tiennent la route et ceux qui restent à l'état de démonstration.

Sources

Les analyses sur lesquelles cet article s'appuie :

[3] Glossaire

[1] CodeR: Issue Resolving with Multi-Agent and Task Graphs (arXiv 2406.01304). CodeR utilise un framework multi-agent avec des graphes de tâches prédéfinis pour résoudre des issues GitHub. Le même GPT-4 passe de 2.7% (scaffold RAG basique) à 28.3% avec cette orchestration. Code source : NL2Code/CodeR.

[2] Terminal-Bench 2.0 : 6 points d'écart entre la configuration d'infrastructure la plus riche et la plus pauvre, avec le même modèle.

[4] Sebastian Raschka. Le jour du leak : Claude Code's Real Secret Sauce (Probably) Isn't the Model (31 mars 2026, 2 830 likes). Puis l'analyse développée : Components of a Coding Agent, avec un mini coding agent en Python. Raschka est l'auteur de Build a Large Language Model (From Scratch) et Build a Reasoning Model (From Scratch).

Reproduction indépendante :

Mon travail connexe :


Des questions sur cet article ou votre propre projet ? Réserver une consultation

Méthodologie agents IA -- série

  1. Une méthodologie pour construire des agents IA
  2. Une source de vérité par rôle : le piège silencieux des systèmes agentiques
  3. Optimiser le contexte d'un agent IA : eco & logique
  4. Le markdown comme assurance : pourquoi votre méthode agentique doit survivre au modèle