Ce que le leak de Claude Code révèle vraiment : 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. En étudiant les analyses techniques publiées à partir de ce code, et en regardant le projet claw-code qui a reproduit l'architecture from scratch en Python et Rust pour des raisons légales, j'ai trouvé quelque chose de plus précieux que des codenames : une méthodologie. Sept principes de conception que je confronte à ce que je construis avec herbert-rs, et qui sont applicables par n'importe qui.

Le chiffre qui change tout

Avant d'entrer dans la méthodologie, un seul chiffre :

GPT-4 sur SWE-bench Lite : 2.7% avec un scaffold basique, 28.3% avec CodeR [1]. Même modèle. 10x de différence.

Et un deuxième :

Opus 4.5 avec trois scaffoldings différents (Augment, Cursor, Claude Code) : 17 problèmes d'écart sur 731 issues SWE-bench [2].

La conclusion est brutale : le choix du modèle n'est pas le facteur déterminant. L'infrastructure autour du modèle (le scaffold [3], le harness, l'outillage) compte autant, voire plus. C'est exactement ce que le code de Claude Code confirme dans chaque fichier.

Sebastian Raschka arrive à la même conclusion. Le jour même du leak, il publie Claude Code's Real Secret Sauce (Probably) Isn't the Model [4] où il identifie les mêmes patterns : repo context, prompt cache, outils structurés, réduction 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. Sa formulation : "the surrounding system plays as much of a role as the model itself". Les principes qui suivent sont une lecture du code de Claude Code à travers cette même grille.

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

Le code leaké révèle un système de 50+ outils organisés en registre plugin. Le modèle ne "code" pas. Il orchestre des appels structurés (lire un fichier, lancer une commande, chercher un pattern) et le scaffold exécute.

Chaque outil a un niveau de risque (LOW, MEDIUM, HIGH). Le scaffold décide si l'action passe directement, demande une confirmation, ou est bloquée. Le modèle propose, le scaffold dispose.

Ce design a une conséquence directe : on peut changer de modèle sans changer le système. Opus, Sonnet, ou un modèle tiers, le scaffold reste identique. Le code confirme d'ailleurs l'existence de feature flags pour basculer entre modèles.

La leçon : si vous construisez un agent IA, commencez par le scaffold, pas par le choix du modèle. Le modèle est un composant remplaçable. Le scaffold est votre produit.

C'est la même approche dans herbert-rs : le moteur d'inférence est découplé du modèle. Le format des poids, l'architecture du transformer, les opérateurs, tout est modulaire. Le modèle passe, le moteur reste.

Principe 2. Le prompt est l'architecture

Le system prompt [3] de Claude Code fait environ 38 000 à 50 000 tokens [3]. C'est un document structuré, pas une instruction vague.

Mais le plus remarquable, c'est que l'orchestration multi-agent est définie dans le prompt, pas dans le code. Le mode Coordinator, qui répartit le travail entre sous-agents, est une directive textuelle. Pas du code TypeScript. Pas du branching. Du texte.

L'avantage est évident : changer le comportement de l'orchestration, c'est changer un texte. Pas de compilation, pas de release, pas de déploiement. Un A/B test de stratégies d'orchestration se fait en modifiant une section du prompt et en activant un feature flag [3] GrowthBook.

Le prompt contient aussi des directives comportementales précises. Pas d'emojis sauf demande explicite. Réponses concises. Action d'abord, raisonnement ensuite. Et surtout : évaluer la réversibilité et le blast radius de chaque action avant de l'exécuter.

La leçon : dans un système agentique, le prompt n'est pas une configuration, c'est l'architecture. Investissez dans sa structure autant que dans votre code.

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

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 toujours 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.

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. Ses quatre principes : mémoire explicite et inspectable (pas une boîte noire), fichiers markdown plutôt qu'une base de données ("file over app"), données sous le contrôle de l'utilisateur, et modèle interchangeable ("BYOAI"). C'est exactement ce que fait MEMORY.md : des fichiers markdown, vérifiables, locaux, indépendants du modèle.

Plus frappant encore : dans les réponses au thread, un utilisateur 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. C'est autoDream et KAIROS, réinventés par un praticien qui n'a jamais vu le code de Claude Code.

Quand le même pattern émerge indépendamment chez Anthropic, chez Karpathy, et chez des utilisateurs individuels, ce n'est plus un choix d'implémentation. C'est un principe.

La leçon : la mémoire d'un agent est un cache, pas une base de données. Elle accélère, mais elle ne fait pas autorité. Concevoir votre système de mémoire avec cette distinction change tout : vous évitez les hallucinations basées sur des souvenirs périmés.

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

Le fichier bashSecurity.ts contient 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

Le système de permissions a 5 modes : Default (confirmations fréquentes), Allow Edits (fichiers OK, bash confirmé), Auto (classification ML), Bypass, et YOLO (tout passe, pour le développement). Un classifieur ML détermine le risque des commandes en mode Auto.

Et 5 CVEs [3] publiques documentent des bypasses trouvés et corrigés via HackerOne, preuve que la surface d'attaque est réelle et activement testée.

La leçon : la sécurité d'un agent IA n'est pas un firewall unique, c'est un oignon. Chaque couche suppose que la précédente a échoué. Et le fait qu'Anthropic ait un bug bounty actif montre que la sécurité n'est jamais "terminée".

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).

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é.

Le coordinateur a des directives explicites dans son prompt : "Do not rubber-stamp weak work" et "You must understand findings". Ces directives empêchent le pattern du coordinateur passif qui relaie sans valeur ajoutée.

La leçon : l'orchestration multi-agent suit les mêmes règles que la programmation concurrente. Les lectures sont parallélisables, les écritures sont exclusives. Et le coordinateur doit comprendre ce qu'il coordonne, sinon il est un goulot d'étranglement sans valeur ajoutée.

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

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.

Le fichier promptCacheBreakDetection.ts surveille 14 vecteurs qui peuvent 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 révèle un bug historique :

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

Le fix : un circuit breaker [3] à 3 échecs consécutifs maximum. Simple, efficace, et probablement économiquement significatif à l'échelle d'Anthropic.

La leçon : dans un système IA en production, le coût n'est pas un problème d'optimisation, c'est une contrainte architecturale. Concevoir la structure du prompt pour le cache, surveiller les vecteurs d'invalidation, et mettre des circuit breakers partout. Chaque appel API qui ne produit rien est de l'argent brûlé.

C'est une préoccupation que je retrouve dans herbert-rs : l'inférence locale élimine le coût par token, mais le coût en compute reste. Chaque opération matricielle inutile est du temps perdu. L'obsession du coût se traduit différemment (API vs compute), mais le principe est le même.

Principe 7. Du réactif au proactif : KAIROS

KAIROS est référencé 150+ fois dans le codebase. 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.

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 d'équivalent. Cursor, OpenHands, Copilot sont réactifs. Devin est autonome mais sans la persistence daemon ni la consolidation mémoire. KAIROS représente le passage de l'outil qui répond à l'agent qui anticipe.

La leçon : l'avenir des agents IA n'est pas le chat interactif. C'est le daemon intelligent qui travaille en arrière-plan, priorise, et n'interrompt l'humain que quand c'est nécessaire. Le budget de 15 secondes est un détail de design brillant : il empêche l'agent de monopoliser les ressources tout en restant utile.

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

Un aspect inattendu du code : 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.

Claude Code implémente 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.

C'est une stratégie pragmatique : elle ne bloque pas les attaquants déterminés (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.

La leçon : dans l'économie de l'IA, la valeur n'est plus dans le modèle (ils sont de plus en plus ouverts) mais dans le scaffold. Et le scaffold se protège par des mécanismes d'empoisonnement de données, pas par l'obscurité du code, puisque, comme ce leak le prouve, le code finit toujours par fuiter. D'ailleurs, le projet claw-code a démontré qu'on peut reproduire l'architecture entière from scratch en Python et Rust, à partir des seules analyses publiques. Preuve que la méthodologie, elle, n'est pas un secret.

Ce que j'en retiens pour herbert-rs

Ces sept principes ne sont pas théoriques. En construisant herbert-rs, un moteur d'inférence LLM en Rust et assembleur, je retrouve les mêmes arbitrages :

  1. Le scaffold > le modèle : herbert-rs est conçu pour être agnostique au modèle. Le moteur d'inférence est un composant dans une chaîne plus large.
  2. L'architecture modulaire : chaque opérateur (matmul, attention, RoPE) est un module remplaçable, optimisable indépendamment.
  3. Le coût comme contrainte : en inférence locale, le "coût" est en cycles CPU/GPU. Chaque opération est profilée. Le même principe que les 14 vecteurs de cache-break, appliqué au compute.
  4. La sécurité en couches : Rust élimine toute une classe de bugs mémoire par construction. C'est une couche de sécurité structurelle, pas un check à l'exécution.

Le leak de Claude Code confirme ce que les praticiens savent déjà : le modèle est nécessaire, le scaffold est suffisant. La méthodologie pour construire le scaffold, voilà ce qui fait la différence.

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