Architecture d'agents : construire des environnements de développement pilotés par l'IA
# Architecture d'agents : construire des environnements de développement pilotés par l'IA
TL;DR : Claude Code n’est pas une boîte de dialogue avec accès aux fichiers. C’est un runtime programmable doté de 22 événements de cycle de vie, chacun interceptable par des scripts shell que le modèle ne peut pas contourner. Empilez des hooks dans des dispatchers, des dispatchers dans des skills, des skills dans des agents, des agents dans des workflows, et vous obtenez un harness de développement autonome qui applique des contraintes, délègue le travail, conserve la mémoire entre les sessions et orchestre une délibération multi-agents. Ce guide couvre chaque couche de cette architecture : d’un simple hook à un système de consensus à 10 agents. Aucun framework requis. Uniquement du bash et du JSON.
Andrej Karpathy a forgé un terme pour décrire ce qui se développe autour d’un agent LLM : les griffes (claws). Les hooks, scripts et mécanismes d’orchestration qui permettent à l’agent de saisir le monde au-delà de sa fenêtre de contexte.1 La plupart des développeurs traitent les agents de programmation IA comme des assistants interactifs. Ils saisissent un prompt, regardent l’agent modifier un fichier, puis passent à autre chose. Cette vision limite la productivité à ce que vous pouvez personnellement superviser.
Le modèle mental d’infrastructure est différent : un agent de programmation IA est un runtime programmable avec un noyau LLM. Chaque action du modèle passe par des hooks que vous contrôlez. Vous définissez des politiques, pas des prompts. Le modèle opère au sein de votre infrastructure de la même manière qu’un serveur web opère sous les règles nginx. Vous ne vous asseyez pas devant nginx pour saisir des requêtes. Vous le configurez, le déployez et le surveillez.
Cette distinction est capitale, car l’infrastructure produit des effets cumulatifs. Un hook qui bloque les identifiants dans les commandes bash protège chaque session, chaque agent, chaque exécution autonome. Un skill qui encode votre grille d’évaluation s’applique de manière cohérente, que vous l’invoquiez ou qu’un agent le fasse. Un agent qui audite le code pour la sécurité exécute les mêmes vérifications, que vous soyez présent ou non.2
Points clés
- Les hooks garantissent l’exécution ; les prompts, non. Utilisez les hooks pour le linting, le formatage, les vérifications de sécurité et tout ce qui doit s’exécuter systématiquement, indépendamment du comportement du modèle. Le code de sortie 2 bloque les actions. Le code de sortie 1 ne fait qu’avertir.3
- Les skills encodent une expertise métier qui s’active automatiquement. Le champ
descriptiondétermine tout. Claude utilise le raisonnement LLM (et non la correspondance de mots-clés) pour décider quand appliquer un skill.4 - Les subagents préviennent l’inflation du contexte. Des fenêtres de contexte isolées pour l’exploration et l’analyse maintiennent la session principale légère. Jusqu’à 10 peuvent s’exécuter en parallèle.5
- La mémoire réside dans le système de fichiers. Les fichiers persistent d’une fenêtre de contexte à l’autre. CLAUDE.md, MEMORY.md, les répertoires de rules et les documents de passation forment un système structuré de mémoire externe.6
- La délibération multi-agents détecte les angles morts. Un agent isolé ne peut pas remettre en question ses propres hypothèses. Deux agents indépendants avec des priorités d’évaluation différentes détectent des défaillances structurelles que les quality gates ne peuvent pas traiter.7
- Le harness pattern constitue le système. CLAUDE.md, hooks, skills, agents et mémoire ne sont pas des fonctionnalités indépendantes. Ils se composent en une couche déterministe entre vous et le modèle, qui monte en puissance avec l’automatisation.
Comment utiliser ce guide
| Profil | Commencez ici | Puis explorez |
|---|---|---|
| Utilisation quotidienne de Claude Code, envie d’aller plus loin | Le harness pattern | Système de skills, Architecture des hooks |
| Création de workflows autonomes | Patterns de subagents | Orchestration multi-agents, Patterns de production |
| Évaluation d’une architecture d’agents | Pourquoi l’architecture d’agents est importante | Cadre de décision, Considérations de sécurité |
| Mise en place d’un harness d’équipe | Conception du CLAUDE.md | Architecture des hooks, Carte de référence rapide |
Chaque section s’appuie sur la précédente. Le cadre de décision en fin de guide fournit une table de correspondance pour choisir le mécanisme adapté à chaque type de problème.
Pourquoi l’architecture agent est essentielle
Simon Willison résume le moment actuel par une observation centrale : écrire du code est désormais peu coûteux.8 C’est exact. Mais le corollaire, c’est que la vérification est devenue la partie onéreuse. Du code bon marché sans infrastructure de vérification produit des bugs à grande échelle. L’investissement réellement rentable n’est pas un meilleur prompt. C’est le système autour du modèle qui rattrape ce que le modèle laisse passer.
Trois forces rendent l’architecture agent nécessaire :
Les fenêtres de contexte sont finies et sujettes à la perte d’information. Chaque lecture de fichier, sortie d’outil et tour de conversation consomme des tokens. Microsoft Research et Salesforce ont testé 15 LLMs sur plus de 200 000 conversations simulées et constaté une baisse de performance moyenne de 39 % entre l’interaction en un seul tour et l’interaction multi-tours.9 La dégradation commence dès deux tours et suit une courbe prévisible : des modifications multi-fichiers précises dans les 30 premières minutes se dégradent en vision tunnel mono-fichier au bout de 90 minutes. Des fenêtres de contexte plus larges ne résolvent pas ce problème. La condition « Concat » de la même étude (conversation complète en un seul prompt) a atteint 95,1 % de la performance mono-tour avec un contenu identique. La dégradation provient des frontières entre les tours, pas des limites de tokens.
Le comportement du modèle est probabiliste, pas déterministe. Dire à Claude « lance toujours Prettier après avoir modifié des fichiers » fonctionne environ 80 % du temps.3 Le modèle peut oublier, privilégier la rapidité ou décider que la modification est « trop mineure ». Pour la conformité, la sécurité et les standards d’équipe, 80 % n’est pas acceptable. Les hooks garantissent l’exécution : chaque Edit ou Write déclenche votre formateur, à chaque fois, sans exception. Le déterministe l’emporte sur le probabiliste.
Les perspectives uniques passent à côté des problèmes multidimensionnels. Un agent unique examinant un endpoint API a vérifié l’authentification, validé l’assainissement des entrées et contrôlé les en-têtes CORS. Résultat : rien à signaler. Un second agent, sollicité séparément en tant que testeur d’intrusion, a découvert que l’endpoint acceptait des paramètres de requête sans limite, pouvant déclencher un déni de service par amplification des requêtes en base de données.7 Le premier agent n’a jamais vérifié cet aspect, car rien dans son cadre d’évaluation ne traitait la complexité des requêtes comme une surface d’attaque. Cette lacune est structurelle. Aucune quantité de prompt engineering ne la corrige.
L’architecture agent répond à ces trois enjeux : les hooks imposent des contraintes déterministes, les subagents gèrent l’isolation du contexte, et l’orchestration multi-agents fournit des perspectives indépendantes. Ensemble, ils forment le harness.
Le pattern Harness
Le harness n’est pas un framework. C’est un pattern : un ensemble composable de fichiers, scripts et conventions qui enveloppent un agent de développement IA dans une infrastructure déterministe. Les composants :
┌──────────────────────────────────────────────────────────────┐
│ THE HARNESS PATTERN │
├──────────────────────────────────────────────────────────────┤
│ ORCHESTRATION │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Agent │ │ Agent │ │ Consensus │ │
│ │ Teams │ │ Spawning │ │ Validation│ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ Multi-agent deliberation, parallel research, voting │
├──────────────────────────────────────────────────────────────┤
│ EXTENSION LAYER │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Skills │ │ Hooks │ │ Memory │ │ Agents │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ Domain expertise, deterministic gates, persistent state, │
│ specialized subagents │
├──────────────────────────────────────────────────────────────┤
│ INSTRUCTION LAYER │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ CLAUDE.md + .claude/rules/ + MEMORY.md │ │
│ └──────────────────────────────────────────────────────┘ │
│ Project context, operational policy, cross-session memory │
├──────────────────────────────────────────────────────────────┤
│ CORE LAYER │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Main Conversation Context (LLM) │ │
│ └──────────────────────────────────────────────────────┘ │
│ Your primary interaction; finite context; costs money │
└──────────────────────────────────────────────────────────────┘
Couche d’instructions : Les fichiers CLAUDE.md et les répertoires de règles définissent ce que l’agent sait de votre projet. Ils se chargent automatiquement au démarrage de la session et après chaque compaction. C’est la mémoire architecturale à long terme de l’agent.
Couche d’extension : Les skills fournissent une expertise métier qui s’active automatiquement en fonction du contexte. Les hooks fournissent des portes déterministes qui se déclenchent à chaque appel d’outil correspondant. Les fichiers de mémoire persistent l’état entre les sessions. Les agents personnalisés fournissent des configurations de subagents spécialisés.
Couche d’orchestration : Les patterns multi-agents coordonnent des agents indépendants pour la recherche, la revue et la délibération. Les budgets de spawn empêchent la récursion incontrôlée. La validation par consensus assure la qualité.
L’idée clé : la plupart des utilisateurs travaillent exclusivement dans la couche Core, observant le contexte gonfler et les coûts grimper. Les utilisateurs avancés configurent les couches Instruction et Extension, puis n’utilisent la couche Core que pour l’orchestration et les décisions finales.2
Ce à quoi le harness ressemble sur le disque
~/.claude/
├── CLAUDE.md # Personal global instructions
├── settings.json # User-level hooks and permissions
├── skills/ # Personal skills (44+)
│ ├── code-reviewer/SKILL.md
│ ├── security-auditor/SKILL.md
│ └── api-designer/SKILL.md
├── agents/ # Custom subagent definitions
│ ├── security-reviewer.md
│ └── code-explorer.md
├── rules/ # Categorized rule files
│ ├── security.md
│ ├── testing.md
│ └── git-workflow.md
├── hooks/ # Hook scripts
│ ├── validate-bash.sh
│ ├── auto-format.sh
│ └── recursion-guard.sh
├── configs/ # JSON configuration
│ ├── recursion-limits.json
│ └── deliberation-config.json
├── state/ # Runtime state
│ ├── recursion-depth.json
│ └── agent-lineage.json
├── handoffs/ # Session handoff documents
│ └── deliberation-prd-7.md
└── projects/ # Per-project memory
└── {project}/memory/MEMORY.md
.claude/ # Project-level (in repo)
├── CLAUDE.md # Project instructions
├── settings.json # Project hooks
├── skills/ # Team-shared skills
├── agents/ # Team-shared agents
└── rules/ # Project rules
Chaque fichier de cette structure a une raison d’être. L’arborescence ~/.claude/ constitue l’infrastructure personnelle qui s’applique à tous les projets. L’arborescence .claude/ dans chaque dépôt est spécifique au projet et partagée via git. Ensemble, elles forment le harness complet.
Système de skills
Les skills sont des extensions invoquées par le modèle. Claude les découvre et les applique automatiquement en fonction du contexte, sans que vous ayez à les appeler explicitement.4 Le moment où vous vous surprenez à réexpliquer le même contexte d’une session à l’autre est le moment où vous devriez créer un skill.
Quand créer un skill
| Situation | Créez un… | Pourquoi |
|---|---|---|
| Vous collez la même checklist à chaque session | Skill | Expertise métier qui s’active automatiquement |
| Vous exécutez la même séquence de commandes explicitement | Slash command | Action déclenchée par l’utilisateur avec un déclencheur prévisible |
| Vous avez besoin d’une analyse isolée qui ne doit pas polluer le contexte | Subagent | Fenêtre de contexte séparée pour un travail ciblé |
| Vous avez besoin d’un prompt ponctuel avec des instructions spécifiques | Rien | Tapez-le directement. Tout ne nécessite pas une abstraction. |
Les skills représentent des connaissances que Claude a toujours à disposition. Les slash commands sont des actions que vous déclenchez explicitement. Si vous hésitez entre les deux, posez-vous la question : « Claude doit-il appliquer cela automatiquement, ou est-ce à moi de décider quand l’exécuter ? »
Créer un skill
Les skills peuvent résider dans quatre emplacements, du périmètre le plus large au plus restreint :4
| Périmètre | Emplacement | S’applique à |
|---|---|---|
| Entreprise | Paramètres gérés | Tous les utilisateurs de l’organisation |
| Personnel | ~/.claude/skills/<name>/SKILL.md |
Tous vos projets |
| Projet | .claude/skills/<name>/SKILL.md |
Ce projet uniquement |
| Plugin | <plugin>/skills/<name>/SKILL.md |
Là où le plugin est activé |
Chaque skill nécessite un fichier SKILL.md avec un frontmatter YAML :
---
name: code-reviewer
description: Review code for security vulnerabilities, performance issues,
and best practice violations. Use when examining code changes, reviewing
PRs, analyzing code quality, or when asked to review, audit, or check code.
allowed-tools: Read, Grep, Glob
---
# Code Review Expertise
## Vérifications de sécurité
Lors de la revue de code, vérifiez :
### Validation des entrées
- Toutes les entrées utilisateur assainies avant les opérations en base de données
- Requêtes paramétrées (pas d'interpolation de chaînes dans le SQL)
- Encodage de sortie pour le contenu HTML rendu
### Authentification
- Jetons de session validés sur chaque endpoint protégé
- Vérifications des permissions avant les mutations de données
- Aucun identifiant codé en dur ni clé API dans le code source
Référence du frontmatter
| Champ | Requis | Objectif |
|---|---|---|
name |
Oui | Identifiant unique (minuscules, tirets, 64 caractères max) |
description |
Oui | Déclencheur de découverte (1024 caractères max). Claude utilise ce champ pour décider quand appliquer le skill |
allowed-tools |
Non | Restreint les capacités de Claude (ex. : Read, Grep, Glob pour la lecture seule) |
disable-model-invocation |
Non | Empêche l’activation automatique ; le skill ne s’active que via /skill-name |
user-invocable |
Non | Définir à false pour masquer entièrement du menu / |
model |
Non | Remplace le modèle utilisé lorsque le skill est actif |
context |
Non | Définir à fork pour exécuter dans une fenêtre de contexte isolée |
agent |
Non | Exécuter en tant que subagent avec son propre contexte isolé |
hooks |
Non | Définit des hooks de cycle de vie limités à ce skill |
$ARGUMENTS |
Non | Substitution de chaîne : remplacé par l’entrée de l’utilisateur après /skill-name |
Le champ Description est déterminant
Au démarrage de la session, Claude Code extrait les champs name et description de chaque skill et les injecte dans le contexte de Claude. Lorsque vous envoyez un message, Claude utilise le raisonnement du modèle de langage pour déterminer si un skill est pertinent. Une analyse indépendante du code source de Claude Code confirme ce mécanisme : les descriptions des skills sont injectées dans une section available_skills du prompt système, et le modèle s’appuie sur sa compréhension linguistique standard pour sélectionner les skills pertinents.10
Mauvaise description :
description: Helps with code
Description efficace :
description: Review code for security vulnerabilities, performance issues,
and best practice violations. Use when examining code changes, reviewing
PRs, analyzing code quality, or when asked to review, audit, or check code.
La description efficace inclut : ce qu’il fait (revue de code pour des types de problèmes spécifiques), quand l’utiliser (examen de modifications, PRs, analyse de qualité), et des phrases déclencheuses (review, audit, check) que les utilisateurs tapent naturellement.
Budget de contexte
Toutes les descriptions de skills partagent un budget de contexte qui s’adapte dynamiquement à 2 % de la fenêtre de contexte, avec un seuil de repli de 16 000 caractères.4 Si vous avez de nombreux skills, gardez chaque description concise. Vous pouvez ajuster le budget via la variable d’environnement SLASH_COMMAND_TOOL_CHAR_BUDGET,11 mais la meilleure solution reste des descriptions plus courtes et plus précises. Lancez /context pendant une session pour vérifier si des skills sont exclus.
Fichiers complémentaires et organisation
Les skills peuvent référencer des fichiers supplémentaires dans le même répertoire :
~/.claude/skills/code-reviewer/
├── SKILL.md # Required: frontmatter + core expertise
├── SECURITY_PATTERNS.md # Referenced: detailed vulnerability patterns
└── PERFORMANCE_CHECKLIST.md # Referenced: optimization guidelines
Référencez-les depuis SKILL.md avec des liens relatifs. Claude lit ces fichiers à la demande lorsque le skill s’active. Maintenez SKILL.md sous 500 lignes et déplacez le matériel de référence détaillé dans des fichiers complémentaires.12
Partager des skills via Git
Les skills de projet (.claude/skills/ à la racine du dépôt) se partagent via le contrôle de version :4
mkdir -p .claude/skills/domain-expert
# ... write SKILL.md ...
git add .claude/skills/
git commit -m "feat: add domain-expert skill for payment processing rules"
git push
Lorsque vos coéquipiers font un pull, ils récupèrent automatiquement le skill. Pas d’installation, pas de configuration. C’est la méthode la plus efficace pour standardiser l’expertise au sein d’une équipe.
Les skills comme bibliothèque de prompts
Au-delà des skills à usage unique, la structure de répertoires fonctionne comme une bibliothèque de prompts organisée :
~/.claude/skills/
├── code-reviewer/ # Activates on: review, audit, check
├── api-designer/ # Activates on: design API, endpoint, schema
├── sql-analyst/ # Activates on: query, database, migration
├── deploy-checker/ # Activates on: deploy, release, production
└── incident-responder/ # Activates on: error, failure, outage, debug
Chaque skill encode une facette différente de votre expertise. Ensemble, ils forment une base de connaissances dans laquelle Claude puise automatiquement en fonction du contexte. Un développeur junior bénéficie de conseils de niveau senior sans avoir à les demander.
Les skills se composent avec les hooks
Les skills peuvent définir leurs propres hooks dans le frontmatter, qui ne s’activent que pendant l’exécution du skill. Cela crée un comportement spécifique au domaine qui ne pollue pas les autres sessions :2
---
name: deploy-checker
description: Verify deployment readiness. Use when preparing to deploy,
release, or push to production.
hooks:
PreToolUse:
- matcher: Bash
hooks:
- type: command
command: "bash -c 'INPUT=$(cat); CMD=$(echo \"$INPUT\" | jq -r \".tool_input.command\"); if echo \"$CMD\" | grep -qE \"deploy|release|publish\"; then echo \"DEPLOYMENT COMMAND DETECTED. Running pre-flight checks.\" >&2; fi'"
---
Les skills philosophiques s’activent automatiquement via des hooks SessionStart, injectant des contraintes de qualité dans chaque session sans invocation explicite. Le skill en lui-même est la connaissance. Le hook en est l’application. Ensemble, ils forment une couche de politique.
Erreurs courantes avec les skills
Descriptions trop larges. Un skill git-rebase-helper qui s’active sur n’importe quel prompt lié à git (rebases, merges, cherry-picks, voire git status) pollue le contexte dans 80 % des sessions. La solution consiste soit à resserrer la description, soit à ajouter disable-model-invocation: true et à exiger une invocation explicite via /skill-name.4
Trop de skills en concurrence pour le budget. Plus de skills signifie plus de descriptions en compétition pour le budget de contexte de 2 %. Si vous remarquez que des skills ne s’activent pas, vérifiez avec /context lesquels sont exclus. Privilégiez un nombre réduit de skills bien décrits plutôt que de nombreux skills vagues.
Informations critiques enfouies dans les fichiers complémentaires. Claude lit SKILL.md immédiatement mais n’accède aux fichiers complémentaires qu’en cas de besoin. Si une information critique se trouve dans un fichier complémentaire, Claude risque de ne pas la trouver. Placez les informations essentielles directement dans SKILL.md.4
Architecture des hooks
Les hooks sont des commandes shell déclenchées par les événements du cycle de vie de Claude Code.3 Ils s’exécutent en dehors du LLM sous forme de scripts classiques, et non comme des prompts interprétés par le modèle. Le modèle veut exécuter rm -rf / ? Un script bash de 10 lignes vérifie la commande par rapport à une liste de blocage et la rejette avant même que le shell ne la voie. Le hook se déclenche que le modèle le veuille ou non.
Événements disponibles
Claude Code expose 22 événements de cycle de vie répartis en six catégories :13
| Catégorie | Événements | Peut bloquer ? |
|---|---|---|
| Session | SessionStart, SessionEnd, Setup |
Non |
| Outil | PreToolUse, PostToolUse, PostToolUseFailure |
Pre : Oui |
| Utilisateur | UserPromptSubmit |
Oui |
| Achèvement | Stop, SubagentStop, TeammateIdle, TaskCompleted |
Oui |
| Contexte | PreCompact, PostCompact, InstructionsLoaded |
Non |
| Configuration | ConfigChange, WorktreeCreate, WorktreeRemove, PermissionRequest, Notification, Elicitation, ElicitationResult, StopFailure |
Variable |
Sémantique des codes de sortie
Les codes de sortie déterminent si les hooks bloquent les actions :3
| Code de sortie | Signification | Action |
|---|---|---|
| 0 | Succès | L’opération se poursuit. La sortie standard s’affiche en mode verbeux. |
| 2 | Erreur bloquante | L’opération s’arrête. La sortie d’erreur devient le message d’erreur transmis à Claude. |
| 1, 3, etc. | Erreur non bloquante | L’opération continue. La sortie d’erreur s’affiche comme avertissement. |
Crucial : chaque hook de sécurité doit utiliser exit 2, et non exit 1. Exit 1 est un avertissement non bloquant. La commande dangereuse s’exécute quand même. C’est l’erreur de hook la plus courante dans les équipes.14
Configuration des hooks
Les hooks résident dans les fichiers de paramètres. Au niveau du projet (.claude/settings.json) pour les hooks partagés. Au niveau utilisateur (~/.claude/settings.json) pour les hooks personnels :
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/validate-bash.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash -c 'if [[ \"$FILE_PATH\" == *.py ]]; then black --quiet \"$FILE_PATH\" 2>/dev/null; fi'"
}
]
}
]
}
}
Le champ matcher est une expression régulière correspondant aux noms d’outils : Bash, Write, Edit, Read, Glob, Grep, Agent, ou * pour tous les outils. Utilisez "" (chaîne vide) pour les événements sans outil comme UserPromptSubmit.
Protocole d’entrée/sortie des hooks
Les hooks reçoivent du JSON sur stdin avec le contexte complet :
{
"tool_name": "Bash",
"tool_input": {
"command": "npm test",
"description": "Run test suite"
},
"session_id": "abc-123",
"agent_id": "main",
"agent_type": "main"
}
Pour un contrôle avancé, les hooks PreToolUse peuvent produire du JSON en sortie afin de modifier l’entrée de l’outil, injecter du contexte ou prendre des décisions de permissions :
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "Command validated and modified",
"updatedInput": {
"command": "npm test -- --coverage --ci"
},
"additionalContext": "Note: This database has a 5-second query timeout."
}
}
Trois types de garanties
Avant d’écrire un hook, posez-vous la question : quel type de garantie me faut-il ?14
Les garanties de formatage assurent la cohérence après coup. Les hooks PostToolUse sur Write/Edit exécutent votre formateur après chaque modification de fichier. La sortie du modèle n’a aucune importance, car le formateur normalise tout.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash -c 'if [[ \"$FILE_PATH\" == *.py ]]; then black --quiet \"$FILE_PATH\" 2>/dev/null; elif [[ \"$FILE_PATH\" == *.js ]] || [[ \"$FILE_PATH\" == *.ts ]]; then npx prettier --write \"$FILE_PATH\" 2>/dev/null; fi'"
}
]
}
]
}
}
Les garanties de sécurité empêchent les actions dangereuses avant leur exécution. Les hooks PreToolUse sur Bash inspectent les commandes et bloquent les schémas destructeurs avec le code de sortie 2 :
#!/bin/bash
# validate-bash.sh — block dangerous commands
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command')
if echo "$CMD" | grep -qE "rm\s+-rf\s+/|git\s+push\s+(-f|--force)\s+(origin\s+)?main|git\s+reset\s+--hard|DROP\s+TABLE"; then
echo "BLOCKED: Dangerous command detected: $CMD" >&2
exit 2
fi
Les garanties de qualité valident l’état aux points de décision. Les hooks PreToolUse sur les commandes git commit exécutent votre linter ou votre suite de tests et bloquent le commit si les vérifications échouent :
#!/bin/bash
# quality-gate.sh — lint before commit
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command')
if echo "$CMD" | grep -qE "^git\s+commit"; then
if ! LINT_OUTPUT=$(ruff check . --select E,F,W 2>&1); then
echo "LINT FAILED -- fix before committing:" >&2
echo "$LINT_OUTPUT" >&2
exit 2
fi
fi
Types de hooks au-delà des commandes shell
Claude Code prend en charge trois types de hooks :13
Les hooks de commande (type: "command") exécutent des scripts shell. Rapides, déterministes, sans coût en tokens.
Les hooks de prompt (type: "prompt") envoient un prompt à tour unique vers un modèle Claude rapide. Le modèle renvoie { "ok": true } pour autoriser ou { "ok": false, "reason": "..." } pour bloquer. À utiliser pour les évaluations nuancées que les expressions régulières ne peuvent exprimer.
Les hooks d’agent (type: "agent") lancent un subagent avec accès aux outils (Read, Grep, Glob) pour une vérification en plusieurs tours. À utiliser lorsque la vérification nécessite d’inspecter des fichiers réels ou des résultats de tests :
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "agent",
"prompt": "Verify all unit tests pass. Run the test suite and check results. $ARGUMENTS",
"timeout": 120
}
]
}
]
}
}
Hooks asynchrones
Les hooks peuvent s’exécuter en arrière-plan sans bloquer l’exécution. Ajoutez async: true pour les opérations non critiques comme les notifications et la journalisation :13
{
"type": "command",
"command": ".claude/hooks/notify-slack.sh",
"async": true
}
Utilisez le mode asynchrone pour les notifications, la télémétrie et les sauvegardes. N’utilisez jamais le mode asynchrone pour le formatage, la validation ou toute opération devant se terminer avant l’action suivante.
Dispatchers plutôt que hooks indépendants
Quand sept hooks se déclenchent tous sur le même événement, chacun lisant stdin indépendamment, des conditions de concurrence apparaissent. Deux hooks écrivant simultanément dans le même fichier d’état JSON vont tronquer le JSON. Tous les hooks en aval qui analysent ce fichier échouent.2
La solution : un dispatcher unique par événement qui exécute les hooks séquentiellement à partir d’un stdin mis en cache :
#!/bin/bash
# dispatcher.sh — run hooks sequentially with cached stdin
INPUT=$(cat)
HOOK_DIR="$HOME/.claude/hooks/pre-tool-use.d"
for hook in "$HOOK_DIR"/*.sh; do
[ -x "$hook" ] || continue
echo "$INPUT" | "$hook"
EXIT_CODE=$?
if [ "$EXIT_CODE" -eq 2 ]; then
exit 2 # Propagate block
fi
done
Débogage des hooks
Cinq techniques pour déboguer les hooks qui échouent silencieusement :14
- Testez les scripts indépendamment. Envoyez un exemple de JSON via pipe :
echo '{"tool_input":{"command":"git commit -m test"}}' | bash your-hook.sh - Utilisez stderr pour la sortie de débogage. Tout ce qui est écrit sur stderr apparaît dans le contexte de Claude.
- Attention aux échecs de jq. Les chemins JSON incorrects renvoient
nullsilencieusement. Testez les expressionsjqavec de vraies entrées d’outils. - Vérifiez les codes de sortie. Un hook PreToolUse qui utilise
exit 1n’offre aucune protection tout en donnant l’impression de fonctionner. - Gardez les hooks rapides. Les hooks s’exécutent de manière synchrone. Maintenez tous les hooks sous 2 secondes, idéalement sous 500 ms.
Mémoire et contexte
Chaque conversation avec une IA s’inscrit dans une fenêtre de contexte finie. À mesure que la conversation s’allonge, le système compresse les échanges précédents pour faire place au nouveau contenu. Cette compression est avec perte. Des décisions architecturales documentées au tour 3 peuvent ne pas survivre jusqu’au tour 15.9
Les trois mécanismes d’effondrement multi-tours
L’étude MSR/Salesforce a identifié trois mécanismes indépendants, chacun nécessitant une intervention différente :9
| Mécanisme | Ce qui se produit | Intervention |
|---|---|---|
| Compression du contexte | Les informations antérieures sont écartées pour intégrer le nouveau contenu | Sauvegarde d’état sur le système de fichiers |
| Perte de cohérence du raisonnement | Le modèle contredit ses propres décisions antérieures d’un tour à l’autre | Itération en contexte vierge (boucle Ralph) |
| Défaillance de coordination | Plusieurs agents détiennent des instantanés d’état différents | Protocoles d’état partagé entre agents |
Stratégie 1 : le système de fichiers comme mémoire
La mémoire la plus fiable entre les frontières de contexte réside dans le système de fichiers. Claude Code lit CLAUDE.md et les fichiers mémoire au début de chaque session et après chaque compaction.6
~/.claude/
├── configs/ # 14 JSON configs (thresholds, rules, budgets)
│ ├── deliberation-config.json
│ ├── recursion-limits.json
│ └── consensus-profiles.json
├── hooks/ # 95 lifecycle event handlers
├── skills/ # 44 reusable knowledge modules
├── state/ # Runtime state (recursion depth, agent lineage)
├── handoffs/ # 49 multi-session context documents
├── docs/ # 40+ system documentation files
└── projects/ # Per-project memory directories
└── {project}/memory/
└── MEMORY.md # Always loaded into context
Le fichier MEMORY.md capture les erreurs, décisions et patterns d’une session à l’autre. Lorsque vous découvrez que ((VAR++)) échoue avec set -e en bash quand VAR vaut 0, vous l’enregistrez. Trois sessions plus tard, face à un cas limite similaire sur les entiers dans Python, l’entrée dans MEMORY.md fait remonter le pattern.15
Auto Memory (v2.1.32+) : Claude Code enregistre et rappelle automatiquement le contexte du projet. Au fil de votre travail, Claude écrit ses observations dans ~/.claude/projects/{project-path}/memory/MEMORY.md. L’auto memory charge les 200 premières lignes dans votre prompt système au démarrage de session. Restez concis et créez des liens vers des fichiers thématiques séparés pour les notes détaillées.6
Stratégie 2 : compaction proactive
La commande /compact de Claude Code résume la conversation et libère de l’espace de contexte tout en préservant les décisions clés, le contenu des fichiers et l’état des tâches.15
Quand compacter : - Après avoir terminé une sous-tâche distincte (fonctionnalité implémentée, bug corrigé) - Avant d’aborder une nouvelle zone du codebase - Quand Claude commence à se répéter ou à oublier le contexte antérieur - Environ toutes les 25-30 minutes lors de sessions intensives
Instructions de compaction personnalisées dans CLAUDE.md :
# Summary Instructions
When using compact, focus on:
- Recent code changes
- Test results
- Architecture decisions made this session
Stratégie 3 : documents de passation de session
Pour les tâches s’étendant sur plusieurs sessions, créez des documents de passation qui capturent l’état complet :
## Handoff: Deliberation Infrastructure PRD-7
**Status:** Hook wiring complete, 81 Python unit tests passing
**Files changed:** hooks/post-deliberation.sh, hooks/deliberation-pride-check.sh
**Decision:** Placed post-deliberation in PostToolUse:Task, pride-check in Stop
**Blocked:** Spawn budget model needs inheritance instead of depth increment
**Next:** PRD-8 integration tests in tests/test_deliberation_lib.py
La structure Status/Files/Decision/Blocked/Next fournit à la session suivante un contexte complet pour un coût minimal en tokens. Démarrer une nouvelle session avec claude -c (continuer) ou lire le document de passation permet de passer directement à l’implémentation.15
Stratégie 4 : itération en contexte vierge (la boucle Ralph)
Pour les sessions dépassant 60-90 minutes, lancez une instance Claude fraîche à chaque itération. L’état persiste via le système de fichiers, pas via la mémoire conversationnelle. Chaque itération dispose de l’intégralité du budget de contexte :16
Iteration 1: [200K tokens] -> writes code, creates files, updates state
Iteration 2: [200K tokens] -> reads state from disk, continues
Iteration 3: [200K tokens] -> reads updated state, continues
...
Iteration N: [200K tokens] -> reads final state, verifies criteria
Comparaison avec une session longue unique :
Minute 0: [200K tokens available] -> productive
Minute 30: [150K tokens available] -> somewhat productive
Minute 60: [100K tokens available] -> degraded
Minute 90: [50K tokens available] -> significantly degraded
Minute 120: [compressed, lossy] -> errors accumulate
L’approche contexte-vierge-par-itération échange 15-20 % de surcoût pour la phase d’orientation (lecture des fichiers d’état, analyse de l’historique git) contre des ressources cognitives complètes à chaque itération.16 Le calcul coût-bénéfice : pour les sessions de moins de 60 minutes, une conversation unique est plus efficace. Au-delà de 90 minutes, le contexte vierge produit un résultat de meilleure qualité malgré le surcoût.
Les anti-patterns
Lire des fichiers entiers quand vous n’avez besoin que de 10 lignes. La lecture d’un seul fichier de 2 000 lignes consomme 15 000 à 20 000 tokens. Utilisez les décalages de lignes : Read file.py offset=100 limit=20 économise la grande majorité de ce coût.15
Garder des sorties d’erreur verbeuses dans le contexte. Après avoir débogué un bug, votre contexte contient plus de 40 traces de pile issues d’itérations échouées. Un simple /compact après la correction libère ce poids mort.
Commencer chaque session en lisant tous les fichiers. Laissez les outils glob et grep de Claude Code trouver les fichiers pertinents à la demande, économisant plus de 100 000 tokens de pré-chargement inutile.15
Modèles de subagents
Les subagents sont des instances spécialisées de Claude qui gèrent des tâches complexes de manière indépendante. Ils démarrent avec un contexte vierge (sans pollution provenant de la conversation principale), fonctionnent avec des outils spécifiés et renvoient les résultats sous forme de résumés. Les résultats d’exploration n’alourdissent pas votre conversation principale ; seules les conclusions y sont renvoyées.5
Types de subagents intégrés
| Type | Modèle | Mode | Outils | Utilisation |
|---|---|---|---|---|
| Explore | Haiku (rapide) | Lecture seule | Glob, Grep, Read, bash sécurisé | Exploration du code, recherche de fichiers |
| Généraliste | Hérité | Lecture/écriture complète | Tous les outils disponibles | Recherche complexe + modification |
| Plan | Hérité (ou Opus) | Lecture seule | Read, Glob, Grep, Bash | Planification avant exécution |
Créer des subagents personnalisés
Définissez vos subagents dans .claude/agents/ (projet) ou ~/.claude/agents/ (personnel) :
---
name: security-reviewer
description: Expert security code reviewer. Use PROACTIVELY after any code
changes to authentication, authorization, or data handling.
tools: Read, Grep, Glob, Bash
model: opus
permissionMode: plan
---
You are a senior security engineer reviewing code for vulnerabilities.
When invoked:
1. Identify the files that were recently changed
2. Analyze for OWASP Top 10 vulnerabilities
3. Check for secrets, hardcoded credentials, SQL injection
4. Report findings with severity levels and remediation steps
Focus on actionable security findings, not style issues.
Champs de configuration des subagents
| Champ | Requis | Fonction |
|---|---|---|
name |
Oui | Identifiant unique (minuscules + tirets) |
description |
Oui | Quand invoquer (inclure « PROACTIVELY » pour encourager la délégation automatique) |
tools |
Non | Liste séparée par des virgules. Hérite de tous les outils si omis. Supporte Agent(agent_type) pour restreindre les agents pouvant être lancés |
disallowedTools |
Non | Outils à refuser, retirés de la liste héritée ou spécifiée |
model |
Non | sonnet, opus, haiku, inherit (par défaut : inherit) |
permissionMode |
Non | default, acceptEdits, delegate, dontAsk, bypassPermissions, plan |
maxTurns |
Non | Nombre maximal de tours agentiques avant l’arrêt du subagent |
memory |
Non | Portée de la mémoire persistante : user, project, local |
skills |
Non | Contenu de skills chargé automatiquement dans le contexte du subagent au démarrage |
hooks |
Non | hooks de cycle de vie limités à l’exécution de ce subagent |
background |
Non | Toujours exécuter en tâche de fond |
isolation |
Non | Définir sur worktree pour une copie isolée via git worktree |
Isolation par worktree
Les subagents peuvent fonctionner dans des git worktrees temporaires, fournissant une copie isolée complète du dépôt :5
---
name: experimental-refactor
description: Attempt risky refactoring in isolation
isolation: worktree
tools: Read, Write, Edit, Bash, Grep, Glob
---
You have an isolated copy of the repository. Make changes freely.
If the refactoring succeeds, the changes can be merged back.
If it fails, the worktree is discarded with no impact on the main branch.
L’isolation par worktree est essentielle pour les travaux expérimentaux susceptibles de casser la base de code.
Subagents parallèles
Claude Code prend en charge jusqu’à 10 subagents en parallèle.5 Utilisez l’exécution parallèle pour des tâches de recherche indépendantes :
> Have three explore agents search in parallel:
> 1. Authentication code
> 2. Database models
> 3. API routes
Chaque agent s’exécute dans sa propre fenêtre de contexte, trouve le code pertinent et renvoie un résumé. Le contexte principal reste propre.
Le garde-fou de récursion
Sans limites de lancement, les agents délèguent à des agents qui délèguent à d’autres agents, chacun perdant du contexte et consommant des tokens. Le modèle de garde-fou de récursion impose des budgets :16
#!/bin/bash
# recursion-guard.sh — enforce spawn budget
CONFIG_FILE="${HOME}/.claude/configs/recursion-limits.json"
STATE_FILE="${HOME}/.claude/state/recursion-depth.json"
MAX_DEPTH=2
MAX_CHILDREN=5
DELIB_SPAWN_BUDGET=2
DELIB_MAX_AGENTS=12
# Read current depth
current_depth=$(jq -r '.depth // 0' "$STATE_FILE" 2>/dev/null)
if [[ "$current_depth" -ge "$MAX_DEPTH" ]]; then
echo "BLOCKED: Maximum recursion depth ($MAX_DEPTH) reached" >&2
exit 2
fi
# Increment depth using safe arithmetic (not ((VAR++)) with set -e)
new_depth=$((current_depth + 1))
jq --argjson d "$new_depth" '.depth = $d' "$STATE_FILE" > "${STATE_FILE}.tmp"
mv "${STATE_FILE}.tmp" "$STATE_FILE"
Leçon essentielle : utilisez des budgets de lancement, pas uniquement des limites de profondeur. Les limites basées sur la profondeur suivent les chaînes parent-enfant (bloquées à la profondeur 3) mais ignorent la largeur : 23 agents à la profondeur 1 restent à « profondeur 1 ». Un budget de lancement comptabilise le nombre total d’enfants actifs par parent, plafonné à un maximum configurable. Ce modèle de budget correspond au véritable mode de défaillance (trop d’agents au total) plutôt qu’à une métrique indirecte (trop de niveaux d’imbrication).7
Agent Teams (aperçu de recherche)
Les Agent Teams coordonnent plusieurs instances de Claude Code qui travaillent indépendamment, communiquent via une boîte aux lettres et une liste de tâches partagées, et peuvent contester les conclusions des uns et des autres :5
| Composant | Rôle |
|---|---|
| Team lead | Session principale qui crée l’équipe, lance les coéquipiers et coordonne le travail |
| Teammates | Instances Claude Code distinctes travaillant sur des tâches assignées |
| Task list | Éléments de travail partagés que les coéquipiers revendiquent et complètent (verrouillage par fichier) |
| Mailbox | Système de messagerie pour la communication inter-agents |
Activation : export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
Quand utiliser les Agent Teams plutôt que les subagents :
| Subagents | Agent Teams | |
|---|---|---|
| Communication | Renvoient uniquement les résultats | Les coéquipiers échangent directement entre eux |
| Coordination | L’agent principal gère tout le travail | Liste de tâches partagée avec auto-coordination |
| Idéal pour | Tâches ciblées où seul le résultat compte | Travaux complexes nécessitant discussion et collaboration |
| Coût en tokens | Inférieur | Supérieur (chaque coéquipier = fenêtre de contexte distincte) |
Orchestration multi-agents
Les systèmes d’IA à agent unique présentent un angle mort structurel : ils ne peuvent pas remettre en question leurs propres hypothèses.7 La délibération multi-agents impose une évaluation indépendante selon plusieurs perspectives avant qu’une décision ne soit verrouillée.
Délibération minimale viable
Commencez avec 2 agents et 1 règle : les agents doivent évaluer indépendamment avant de voir le travail de l’autre.7
Decision arrives
|
v
Confidence check: is this risky, ambiguous, or irreversible?
|
+-- NO -> Single agent decides (normal flow)
|
+-- YES -> Spawn 2 agents with different system prompts
Agent A: "Argue FOR this approach"
Agent B: "Argue AGAINST this approach"
|
v
Compare findings
|
+-- Agreement with different reasoning -> Proceed
+-- Genuine disagreement -> Investigate the conflict
+-- Agreement with same reasoning -> Suspect herding
Ce patron couvre 80 % de la valeur. Tout le reste apporte des améliorations incrémentales.
Le déclencheur de confiance
Toutes les tâches ne nécessitent pas de délibération. Un module de scoring de confiance évalue quatre dimensions :17
- Ambiguïté — La requête admet-elle plusieurs interprétations valides ?
- Complexité du domaine — Requiert-elle des connaissances spécialisées ?
- Enjeux — La décision est-elle réversible ?
- Dépendance au contexte — Nécessite-t-elle une compréhension du système global ?
Le score se répartit en trois niveaux :
| Niveau | Seuil | Action |
|---|---|---|
| ÉLEVÉ | 0.85+ | Procéder sans délibération |
| MOYEN | 0.70-0.84 | Procéder avec une note de confiance journalisée |
| FAIBLE | En dessous de 0.70 | Déclencher la délibération multi-agents complète |
Le seuil s’adapte selon le type de tâche. Les décisions de sécurité exigent un consensus de 0.85. Les modifications de documentation n’ont besoin que de 0.50. Cela évite de sur-ingénierer les tâches simples tout en garantissant que les décisions risquées reçoivent l’examen nécessaire.7
La machine à états
Sept phases, chacune conditionnée par la précédente :7
IDLE -> RESEARCH -> DELIBERATION -> RANKING -> PRD_GENERATION -> COMPLETE
|
(or FAILED)
RESEARCH : Des agents indépendants étudient le sujet. Chaque agent reçoit un persona différent (architecte technique, analyste en sécurité, ingénieur performance, entre autres). L’isolation du contexte garantit que les agents ne peuvent pas voir les découvertes des autres pendant la recherche.
DELIBERATION : Les agents consultent l’ensemble des résultats de recherche et génèrent des alternatives. L’agent Debate identifie les conflits. L’agent Synthesis combine les résultats non contradictoires.
RANKING : Chaque agent note chaque approche proposée selon 5 dimensions pondérées :
| Dimension | Poids |
|---|---|
| Impact | 0.25 |
| Qualité | 0.25 |
| Faisabilité | 0.20 |
| Réutilisabilité | 0.15 |
| Risque | 0.15 |
L’architecture de validation à deux portes
Deux portes de validation détectent les problèmes à différentes étapes :7
Porte 1 : Validation du consensus (hook PostToolUse). S’exécute immédiatement après chaque agent de délibération : 1. La phase doit avoir atteint au minimum RANKING 2. Au moins 2 agents terminés (configurable) 3. Le score de consensus atteint le seuil adaptatif 4. Si un agent a émis une objection, les préoccupations doivent être documentées
Porte 2 : Pride Check (hook Stop). S’exécute avant la clôture de session : 1. Méthodes diversifiées : plusieurs personas uniques représentés 2. Transparence des contradictions : les dissensions sont documentées avec leurs raisons 3. Gestion de la complexité : au moins 2 alternatives générées 4. Confiance du consensus : classifiée comme forte (au-dessus de 0.85) ou modérée (0.70-0.84) 5. Preuve d’amélioration : la confiance finale dépasse la confiance initiale
Deux hooks à différents points du cycle de vie correspondent à la manière dont les défaillances surviennent réellement : certaines sont instantanées (mauvais score) et d’autres graduelles (faible diversité, documentation des dissensions manquante).7
Pourquoi l’accord est dangereux
Charlan Nemeth a étudié la dissidence minoritaire de 1986 jusqu’à son ouvrage de 2018 In Defense of Troublemakers. Les groupes avec des dissidents prennent de meilleures décisions que ceux qui parviennent rapidement à un accord. Le dissident n’a pas besoin d’avoir raison. L’acte même de désaccord force la majorité à examiner des hypothèses qu’elle aurait autrement ignorées.18
Wu et al. ont testé si les agents LLM peuvent véritablement débattre et ont constaté que, sans incitations structurelles au désaccord, les agents convergent vers la réponse initiale la plus assurée, indépendamment de sa justesse.19 Liang et al. ont identifié la cause profonde comme la « Dégénérescence de la Pensée » : une fois qu’un LLM établit sa confiance dans une position, l’autoréflexion ne peut générer de contre-arguments originaux, rendant l’évaluation multi-agents structurellement nécessaire.20
L’indépendance est la contrainte de conception critique. Deux agents évaluant la même stratégie de déploiement avec visibilité sur les résultats de l’autre ont produit des scores de 0.45 et 0.48. Les mêmes agents sans visibilité : 0.45 et 0.72. L’écart entre 0.48 et 0.72 représente le coût du conformisme.7
Détecter les faux accords
Un module de détection de conformité traque les schémas suggérant que les agents s’accordent sans évaluation véritable :7
Regroupement des scores : Tous les agents notant dans un intervalle de 0.3 points sur une échelle de 10 signale une contamination de contexte partagé plutôt qu’une évaluation indépendante. Lorsque cinq agents évaluant un refactoring d’authentification ont tous noté le risque de sécurité entre 7.1 et 7.4, une ré-exécution avec une isolation de contexte fraîche a dispersé les scores entre 5.8 et 8.9.
Dissidence stéréotypée : Des agents copiant le langage d’objection des autres plutôt que de générer des objections indépendantes.
Perspectives minoritaires absentes : Approbation unanime de personas aux priorités conflictuelles (un analyste en sécurité et un ingénieur performance sont rarement d’accord sur tout).
Le détecteur de conformité attrape les cas évidents (environ 10 à 15 % des délibérations où les agents convergent trop vite). Pour les 85 à 90 % restants, les portes de consensus et de pride check fournissent une validation suffisante.
Ce qui n’a pas fonctionné en délibération
Tours de débat en forme libre. Trois tours d’échanges textuels pour une discussion sur l’indexation de base de données ont produit 7 500 tokens de débat. Tour 1 : désaccord authentique. Tour 2 : positions reformulées. Tour 3 : arguments identiques en d’autres mots. Le scoring par dimensions structurées a remplacé le débat libre, réduisant le coût de 60 % tout en améliorant la qualité du classement.7
Porte de validation unique. La première implémentation utilisait un seul hook de validation en fin de session. Un agent a terminé la délibération avec un score de consensus de 0.52 (sous le seuil), puis a poursuivi des tâches sans rapport pendant 20 minutes avant que le hook de fin de session ne signale l’échec. La séparation en deux portes (une à la complétion de la tâche, une en fin de session) a permis de détecter les mêmes problèmes à différents points du cycle de vie.7
Coût de la délibération
Chaque agent de recherche traite environ 5 000 tokens de contexte et génère 2 000 à 3 000 tokens de résultats. Avec 3 agents, cela représente 15 000 à 24 000 tokens supplémentaires par décision. Avec 10 agents, environ 50 000 à 80 000 tokens.7
Au tarif actuel d’Opus, une délibération à 3 agents coûte approximativement 0,68 à 0,90 $. Une délibération à 10 agents coûte 2,25 à 3,00 $. Le système déclenche la délibération sur environ 10 % des décisions, soit un coût amorti de 0,23 à 0,30 $ par session. La pertinence de cet investissement dépend de ce que coûte une mauvaise décision.
Quand délibérer
| Délibérer | Passer |
|---|---|
| Architecture de sécurité | Coquilles dans la documentation |
| Conception de schéma de base de données | Renommage de variables |
| Modifications de contrat d’API | Mises à jour de messages de log |
| Stratégies de déploiement | Reformulation de commentaires |
| Mises à jour de dépendances | Mises à jour de fixtures de test |
Conception de CLAUDE.md
CLAUDE.md constitue une politique opérationnelle pour un agent IA, pas un README destiné aux humains.21 L’agent n’a pas besoin de comprendre pourquoi vous utilisez les commits conventionnels. Il doit connaître la commande exacte à exécuter et à quoi ressemble « terminé ».
La hiérarchie de précédence
| Emplacement | Portée | Partagé | Cas d’usage |
|---|---|---|---|
| Paramètres gérés par l’entreprise | Organisation | Tous les utilisateurs | Standards de l’entreprise |
./CLAUDE.md ou ./.claude/CLAUDE.md |
Projet | Via git | Contexte d’équipe |
~/.claude/CLAUDE.md |
Utilisateur | Tous les projets | Préférences personnelles |
./CLAUDE.local.md |
Projet local | Jamais | Notes personnelles de projet |
.claude/rules/*.md |
Règles de projet | Via git | Politiques catégorisées |
~/.claude/rules/*.md |
Règles utilisateur | Tous les projets | Politiques personnelles |
Les fichiers de règles se chargent automatiquement et fournissent un contexte structuré sans encombrer CLAUDE.md.6
Ce qui est ignoré
Ces schémas ne produisent de manière fiable aucun changement observable dans le comportement de l’agent :21
Paragraphes de prose sans commandes. « Nous valorisons un code propre et bien testé » relève de la documentation, pas des opérations. L’agent le lit puis écrit du code sans tests, faute d’instruction actionnable.
Directives ambiguës. « Soyez prudent avec les migrations de base de données » n’est pas une contrainte. « Exécutez alembic check avant d’appliquer les migrations. Abandonnez si le chemin de rétrogradation est manquant. » en est une.
Priorités contradictoires. « Avancez vite et livrez rapidement » plus « Assurez une couverture de tests complète » plus « Maintenez le temps d’exécution sous 5 minutes » plus « Lancez les tests d’intégration complets avant chaque commit. » L’agent ne peut satisfaire ces quatre exigences simultanément et finit par sauter la vérification.21
Guides de style sans mécanisme d’application. « Suivez le guide de style Python de Google » sans ruff check --select D ne donne à l’agent aucun moyen de vérifier la conformité.
Ce qui fonctionne
Instructions orientées commande :
## Build and Test Commands
- Install: `pip install -r requirements.txt`
- Lint: `ruff check . --fix`
- Format: `ruff format .`
- Test: `pytest -v --tb=short`
- Type check: `mypy app/ --strict`
- Full verify: `ruff check . && ruff format --check . && pytest -v`
Définitions de clôture :
## Définition de terminé
Une tâche est terminée lorsque TOUS les critères suivants sont validés :
1. `ruff check .` retourne 0
2. `pytest -v` retourne 0 sans échec
3. `mypy app/ --strict` retourne 0
4. Les fichiers modifiés ont été indexés et commités
5. Le message de commit suit le format conventionnel : `type(scope): description`
Sections organisées par tâche :
## Lors de l'écriture de code
- Exécutez `ruff check .` après chaque modification de fichier
- Ajoutez des annotations de type à toutes les nouvelles fonctions
## Lors de la revue de code
- Vérifiez les problèmes de sécurité : `bandit -r app/`
- Contrôlez la couverture de tests : `pytest --cov=app --cov-fail-under=80`
## Lors d'une mise en production
- Mettez à jour la version dans `pyproject.toml`
- Lancez la suite complète : `pytest -v && ruff check . && mypy app/`
Règles d’escalade :
## En cas de blocage
- Si les tests échouent après 3 tentatives : arrêtez et signalez le test en échec avec la sortie complète
- Si une dépendance manque : vérifiez d'abord `requirements.txt`, puis demandez
- Jamais : supprimer des fichiers pour résoudre des erreurs, forcer un push, ou ignorer les tests
Ordre de rédaction
Si vous partez de zéro, ajoutez les sections dans cet ordre de priorité :21
- Commandes de build et de test (l’agent en a besoin avant de pouvoir faire quoi que ce soit d’utile)
- Définition de terminé (évite les fausses complétion)
- Règles d’escalade (empêche les contournements destructeurs)
- Sections organisées par tâche (réduit l’analyse d’instructions non pertinentes)
- Cadrage par répertoire (monorepos : isole les instructions par service)
Ignorez les préférences de style tant que les quatre premiers points ne fonctionnent pas.
Imports de fichiers
Référencez d’autres fichiers dans CLAUDE.md :
See @README.md for project overview
Coding standards: @docs/STYLE_GUIDE.md
API documentation: @docs/API.md
Personal preferences: @~/.claude/preferences.md
Syntaxe d’import : relatif (@docs/file.md), absolu (@/absolute/path.md), ou répertoire personnel (@~/.claude/file.md). Profondeur maximale : 5 niveaux d’imports.6
Compatibilité inter-outils des instructions
AGENTS.md est un standard ouvert adopté par plus de 60 000 projets et reconnu par tous les principaux outils de développement assisté par IA.21 Si votre équipe utilise plusieurs outils, rédigez AGENTS.md comme source canonique et reproduisez les sections pertinentes dans les fichiers spécifiques à chaque outil :
| Outil | Fichier natif | Lit AGENTS.md ? |
|---|---|---|
| Codex CLI | AGENTS.md | Oui (natif) |
| Cursor | .cursor/rules |
Oui (natif) |
| GitHub Copilot | .github/copilot-instructions.md |
Oui (natif) |
| Amp | AGENTS.md | Oui (natif) |
| Windsurf | .windsurfrules |
Oui (natif) |
| Claude Code | CLAUDE.md | Non (format distinct) |
Les patterns d’AGENTS.md (commandes en premier, délimitation par fermeture, organisation par tâche) fonctionnent dans tout fichier d’instructions quel que soit l’outil. Ne maintenez pas de jeux d’instructions parallèles qui divergent. Rédigez une source unique faisant autorité et reproduisez-la.
Tester vos instructions
Vérifiez que l’agent lit et suit effectivement vos instructions :
# Check active instructions
claude --print "What instructions are you following for this project?"
# Verify specific rules are active
claude --print "What is your definition of done?"
Le test décisif : demandez à l’agent d’expliquer vos commandes de build. S’il ne peut pas les reproduire mot pour mot, les instructions sont soit trop verbeuses (le contenu est repoussé hors du contexte), soit trop vagues (l’agent ne parvient pas à en extraire des directives exploitables), soit non découvertes. L’analyse de 2 500 dépôts par GitHub a révélé que le manque de précision est la principale cause d’échec.21
Patterns de production
La quality loop
Un processus de revue obligatoire pour tout changement non trivial :
- Implémenter — Écrire le code
- Relire — Relire chaque ligne. Repérer les coquilles, erreurs de logique, passages obscurs
- Évaluer — Exécuter l’evidence gate. Vérifier les patterns, cas limites, couverture de tests
- Affiner — Corriger chaque problème. Ne jamais reporter à « plus tard »
- Prendre du recul — Vérifier les points d’intégration, les imports, le code adjacent pour détecter les régressions
- Répéter — Si un critère de l’evidence gate échoue, revenir à l’étape 4
- Rapporter — Lister ce qui a changé, comment cela a été vérifié, citer des preuves concrètes
L’evidence gate
« Je pense que » et « ça devrait » ne constituent pas des preuves. Citez des chemins de fichiers, des sorties de tests ou du code spécifique.
| Critère | Preuve requise |
|---|---|
| Suit les patterns du codebase | Nommer le pattern et le fichier où il existe |
| Solution fonctionnelle la plus simple | Expliquer quelles alternatives plus simples ont été écartées et pourquoi |
| Cas limites traités | Lister les cas limites spécifiques et comment chacun est géré |
| Tests réussis | Coller la sortie de test montrant 0 échec |
| Pas de régressions | Nommer les fichiers/fonctionnalités vérifiés |
| Résout le problème réel | Énoncer le besoin de l’utilisateur et comment la solution y répond |
Si vous ne pouvez pas fournir de preuve pour une ligne, revenez à l’étape Affiner.22
Patterns de gestion des erreurs
Écritures de fichiers atomiques. Plusieurs agents écrivant simultanément dans le même fichier d’état corrompent le JSON. Écrivez dans des fichiers .tmp, puis déplacez-les avec mv de manière atomique. Le système d’exploitation garantit que mv est atomique sur le même système de fichiers.17
# Atomic state update
jq --argjson d "$new_depth" '.depth = $d' "$STATE_FILE" > "${STATE_FILE}.tmp"
mv "${STATE_FILE}.tmp" "$STATE_FILE"
Récupération après corruption d’état. Si l’état est corrompu, le pattern de récupération recrée à partir de valeurs par défaut sûres au lieu de planter :16
if ! jq -e '.depth' "$RECURSION_STATE_FILE" &>/dev/null; then
# Corrupted state file, recreate with safe defaults
echo '{"depth": 0, "agent_id": "root", "parent_id": null}' > "$RECURSION_STATE_FILE"
echo "- Recursion state recovered (was corrupted)"
fi
Le piège ((VAR++)) en bash. ((VAR++)) retourne le code de sortie 1 lorsque VAR vaut 0 car 0++ s’évalue à 0, que bash interprète comme faux. Avec set -e activé, cela tue le script. Utilisez VAR=$((VAR + 1)) à la place.16
Classification du rayon d’impact
Classifiez chaque action de l’agent par rayon d’impact et appliquez les contrôles correspondants :2
| Classification | Exemples | Contrôle |
|---|---|---|
| Locale | Écritures de fichiers, exécution de tests, linting | Approbation automatique |
| Partagée | Commits git, création de branches | Avertissement + poursuite |
| Externe | Git push, appels API, déploiements | Approbation humaine requise |
Remote Control (connexion à Claude Code local depuis n’importe quel navigateur ou application mobile) transforme le contrôle « Externe » d’une attente bloquante en une notification asynchrone. L’agent continue de travailler sur la tâche suivante pendant que vous examinez la précédente depuis votre téléphone.2
Spécification de tâches pour les exécutions autonomes
Les tâches autonomes efficaces comportent trois éléments : objectif, critères de complétion et pointeurs de contexte :16
OBJECTIVE: Implement multi-agent deliberation with consensus validation.
COMPLETION CRITERIA:
- All tests in tests/test_deliberation_lib.py pass (81 tests)
- post-deliberation.sh validates consensus above 70% threshold
- recursion-guard.sh enforces spawn budget (max 12 agents)
- No Python type errors (mypy clean)
CONTEXT:
- Follow patterns in lib/deliberation/state_machine.py
- Consensus thresholds in configs/deliberation-config.json
- Spawn budget model: agents inherit budget, not increment depth
Les critères doivent être vérifiables par machine : réussite/échec des tests, sortie du linter, codes HTTP, vérifications d’existence de fichiers. Une tâche initiale demandant à l’agent d’« écrire des tests qui passent » a produit assert True et assert 1 == 1. Techniquement correct. Pratiquement inutile.16
| Qualité des critères | Exemple | Résultat |
|---|---|---|
| Vague | « Les tests passent » | L’agent écrit des tests triviaux |
| Mesurable mais incomplet | « Les tests passent ET couverture > 80 % » | Les tests couvrent les lignes mais ne testent rien de significatif |
| Complet | « Tous les tests passent ET couverture > 80 % ET aucune erreur de type ET linter propre ET chaque classe de test couvre un module distinct » | Sortie de qualité production |
Modes d’échec à surveiller
| Mode d’échec | Description | Prévention |
|---|---|---|
| Spirale de raccourcis | Sauter des étapes de la quality loop pour terminer plus vite | L’evidence gate exige une preuve pour chaque critère |
| Mirage de confiance | « Je suis confiant » sans avoir exécuté de vérification | Interdire le langage évasif dans les rapports de complétion |
| Vérification fantôme | Affirmer que les tests passent sans les avoir exécutés lors de cette session | Le hook Stop exécute les tests indépendamment |
| Dette reportée | TODO/FIXME/HACK dans le code commité | Le hook PreToolUse sur git commit analyse le diff |
| Pollution du système de fichiers | Artefacts de tentatives abandonnées | Étape de nettoyage dans les critères de complétion |
Trace concrète d’une session
Trace d’une session autonome traitant un PRD comportant 5 stories :2
-
SessionStart se déclenche. Le dispatcher injecte : date courante, détection du projet, contraintes philosophiques, initialisation du suivi des coûts. Cinq hooks, 180 ms au total.
-
L’agent lit le PRD, planifie la première story.
UserPromptSubmitse déclenche. Le dispatcher injecte : contexte du projet actif, référence de dérive de session. -
L’agent appelle Bash pour exécuter les tests.
PreToolUse:Bashse déclenche. Vérification des identifiants, validation du sandbox, détection du projet. 90 ms. Les tests s’exécutent.PostToolUse:Bashse déclenche : heartbeat d’activité enregistré, vérification de dérive. -
L’agent appelle Write pour créer un fichier.
PreToolUse:Writese déclenche : vérification du périmètre de fichier.PostToolUse:Writese déclenche : vérification du lint, suivi des commits. -
L’agent termine la story.
Stopse déclenche. Contrôles qualité : l’agent a-t-il cité des preuves ? Langage évasif ? Commentaires TODO dans le diff ? Si un contrôle échoue, code de sortie 2 et l’agent continue. -
Vérification indépendante : un agent neuf exécute la suite de tests sans faire confiance à l’auto-rapport de l’agent précédent.
-
Trois agents de revue de code se lancent en parallèle. Chacun examine le diff indépendamment. Si un réviseur signale un problème CRITICAL, la story retourne dans la file d’attente.
-
La story est validée. La story suivante se charge. Le cycle se répète pour les 5 stories.
Total de hooks déclenchés sur 5 stories : environ 340. Temps total passé dans les hooks : environ 12 secondes. Cette surcharge a empêché trois fuites d’identifiants, une commande destructrice et deux implémentations incomplètes lors d’une seule exécution nocturne.
Considérations de sécurité
Le bac à sable
Claude Code s’exécute dans un bac à sable qui restreint l’accès réseau et les opérations sur le système de fichiers. Ce bac à sable empêche le modèle d’effectuer des requêtes réseau arbitraires ou d’accéder à des fichiers en dehors du répertoire du projet.13
Périmètres de permissions
Le système de permissions contrôle les opérations à plusieurs niveaux :
| Niveau | Contrôle | Exemple |
|---|---|---|
| Permissions d’outils | Quels outils peuvent être utilisés | Restreindre un subagent à Read, Grep, Glob |
| Permissions de fichiers | Quels fichiers peuvent être modifiés | Bloquer l’écriture sur .env, credentials.json |
| Permissions de commandes | Quelles commandes bash peuvent s’exécuter | Bloquer rm -rf, git push --force |
| Permissions réseau | Quels domaines sont accessibles | Liste blanche pour les connexions au serveur MCP |
Défense contre l’injection de prompt
Les skills et les hooks offrent une défense en profondeur contre l’injection de prompt :
Les skills avec restrictions d’outils empêchent un prompt compromis d’obtenir un accès en écriture :
allowed-tools: Read, Grep, Glob
Les hooks PreToolUse valident chaque appel d’outil, quel que soit le contenu du prompt :
# Block credential file access regardless of prompt
if echo "$FILE_PATH" | grep -qE "\.(env|pem|key|credentials)$"; then
echo "BLOCKED: Sensitive file access" >&2
exit 2
fi
L’isolation par subagent limite le rayon d’impact. Un subagent avec permissionMode: plan ne peut effectuer aucune modification, même si son prompt est compromis.
Sécurité des hooks
Les hooks HTTP qui interpolent des variables d’environnement dans les en-têtes nécessitent une liste allowedEnvVars explicite pour empêcher l’exfiltration arbitraire de variables d’environnement :13
{
"type": "http",
"url": "https://api.example.com/notify",
"headers": {
"Authorization": "Bearer $MY_TOKEN"
},
"allowedEnvVars": ["MY_TOKEN"]
}
La répartition des responsabilités humain-agent
La sécurité dans les architectures d’agents exige une répartition claire entre les responsabilités humaines et celles de l’agent :17
| Responsabilité humaine | Responsabilité de l’agent |
|---|---|
| Définition du problème | Exécution du pipeline |
| Seuils de confiance | Exécution dans les limites des seuils |
| Exigences de consensus | Calcul du consensus |
| Critères des quality gate | Application des quality gate |
| Analyse des erreurs | Détection des erreurs |
| Décisions d’architecture | Propositions d’architecture |
| Injection de contexte métier | Génération de documentation |
Le principe : les humains prennent les décisions qui nécessitent un contexte organisationnel, un jugement éthique ou une orientation stratégique. Les agents prennent les décisions qui requièrent une exploration computationnelle d’espaces de possibilités vastes. Les hooks matérialisent cette frontière.
Application récursive des hooks
Les hooks se déclenchent aussi pour les actions des subagents.13 Si Claude lance un subagent via l’Agent tool, vos hooks PreToolUse et PostToolUse s’exécutent pour chaque outil utilisé par le subagent. Sans application récursive des hooks, un subagent pourrait contourner vos garde-fous de sécurité. L’événement SubagentStop permet d’exécuter un nettoyage ou une validation à la fin d’un subagent.
Ce n’est pas facultatif. Un agent qui lance un subagent sans vos hooks de sécurité est un agent capable de faire un force-push sur main, de lire des fichiers d’identifiants ou d’exécuter des commandes destructrices pendant que vos garde-fous surveillent la conversation principale sans rien faire.
Le coût comme architecture
Le coût est une décision architecturale, pas une considération opérationnelle après coup.2 Trois niveaux :
Au niveau des tokens. Compression du prompt système. Supprimez les exemples de code tutoriels (le modèle connaît déjà les API), fusionnez les règles dupliquées entre fichiers, et remplacez les explications par des contraintes. « Rejeter les appels d’outils correspondant à des chemins sensibles » fait le même travail qu’une explication de 15 lignes sur les raisons pour lesquelles les identifiants ne doivent pas être lus.
Au niveau de l’agent. Des lancements frais plutôt que de longues conversations. Chaque story d’une exécution autonome obtient un nouvel agent avec un contexte vierge. Le contexte ne gonfle jamais car chaque agent démarre à zéro. Le briefing plutôt que la mémoire : les modèles exécutent un briefing clair mieux qu’ils ne naviguent dans 30 étapes de contexte accumulé.
Au niveau de l’architecture. Privilégier CLI plutôt que MCP lorsque l’opération est sans état. Un appel claude --print pour une évaluation ponctuelle coûte moins cher et n’ajoute aucune surcharge de connexion. MCP est pertinent quand l’outil nécessite un état persistant ou du streaming.
Cadre de décision
Quand utiliser chaque mécanisme :
| Problème | Utiliser | Pourquoi |
|---|---|---|
| Formater le code après chaque modification | Hook PostToolUse | Doit se produire à chaque fois, de manière déterministe |
| Bloquer les commandes bash dangereuses | Hook PreToolUse | Doit bloquer avant l’exécution, code de sortie 2 |
| Appliquer des patterns de revue de sécurité | Skill | Expertise métier qui s’active automatiquement selon le contexte |
| Explorer le codebase sans polluer le contexte | Subagent Explore | Contexte isolé, ne renvoie qu’un résumé |
| Exécuter un refactoring expérimental en toute sécurité | Subagent isolé en worktree | Les modifications peuvent être abandonnées en cas d’échec |
| Réviser le code sous plusieurs angles | Subagents parallèles ou Agent Team | L’évaluation indépendante prévient les angles morts |
| Décider d’une architecture irréversible | Délibération multi-agents | Seuil de confiance + validation par consensus |
| Persister les décisions entre sessions | MEMORY.md | Le système de fichiers survit aux limites de contexte |
| Partager les standards d’équipe | CLAUDE.md de projet + .claude/rules/ | Distribué via Git, chargé automatiquement |
| Définir les commandes build/test du projet | CLAUDE.md | Instructions orientées commandes que l’agent peut vérifier |
| Exécuter un développement autonome prolongé | Boucle Ralph (itération à contexte frais) | Budget de contexte complet par itération, état du système de fichiers |
| Notifier Slack en fin de session | Hook Stop asynchrone | Non bloquant, ne ralentit pas la session |
| Valider la qualité avant le commit | Hook PreToolUse sur git commit | Bloquer le commit si le lint/les tests échouent |
| Imposer des critères de complétion | Hook Stop | Empêcher l’agent de s’arrêter avant la fin de la tâche |
Skills vs Hooks vs Subagents
| Dimension | Skills | Hooks | Subagents |
|---|---|---|---|
| Invocation | Automatique (raisonnement du LLM) | Déterministe (événementiel) | Explicite ou auto-délégué |
| Garantie | Probabiliste (le modèle décide) | Déterministe (se déclenche toujours) | Déterministe (contexte isolé) |
| Coût en contexte | Injecté dans le contexte principal | Zéro (s’exécute en dehors du LLM) | Fenêtre de contexte séparée |
| Coût en tokens | Budget de description (2 % de la fenêtre) | Zéro | Contexte complet par subagent |
| Idéal pour | Expertise métier | Application de politiques | Travail ciblé, exploration |
FAQ
Combien de hooks est-ce trop ?
C’est la performance qui compte, pas le nombre. Chaque hook s’exécute de manière synchrone ; le temps d’exécution total s’ajoute donc à chaque appel d’outil correspondant. 95 hooks répartis entre les paramètres utilisateur et projet s’exécutent sans latence perceptible tant que chaque hook se termine en moins de 200 ms. Le seuil à surveiller : si un hook PostToolUse ajoute plus de 500 ms à chaque modification de fichier, la session devient poussive. Profilez vos hooks avec time avant de les déployer.14
Les hooks peuvent-ils empêcher Claude Code d’exécuter une commande ?
Oui. Les hooks PreToolUse bloquent toute action d’outil en sortant avec le code 2. Claude Code annule l’action en attente et affiche la sortie stderr du hook au modèle. Claude voit la raison du rejet et propose une alternative plus sûre. Le code de sortie 1 est un avertissement non bloquant : l’action se poursuit malgré tout.3
Où placer les fichiers de configuration des hooks ?
Les configurations de hooks vont dans .claude/settings.json pour les hooks au niveau du projet (committés dans votre dépôt, partagés avec votre équipe) ou dans ~/.claude/settings.json pour les hooks au niveau utilisateur (personnels, appliqués à tous les projets). Les hooks de projet ont la priorité lorsque les deux existent. Utilisez des chemins absolus pour les fichiers de scripts afin d’éviter les problèmes liés au répertoire de travail.14
Chaque décision nécessite-t-elle une délibération ?
Non. Le module de confiance évalue les décisions selon quatre dimensions (ambiguïté, complexité, enjeux, dépendance au contexte). Seules les décisions dont le score de confiance global est inférieur à 0,70 déclenchent une délibération, soit environ 10 % des décisions totales. Les corrections de documentation, les renommages de variables et les modifications de routine passent directement. Les décisions d’architecture de sécurité, les modifications de schéma de base de données et les déploiements irréversibles la déclenchent systématiquement.7
Comment tester un système conçu pour produire du désaccord ?
Testez à la fois les chemins de succès et les chemins d’échec. Succès : les agents sont en désaccord de manière productive et parviennent à un consensus. Échec : les agents convergent trop vite, ne convergent jamais, ou dépassent les budgets de spawn. Les tests de bout en bout simulent chaque scénario avec des réponses d’agents déterministes, vérifiant que les portes de validation détectent chaque mode de défaillance documenté. Un système de délibération en production exécute 141 tests sur trois couches : 48 tests d’intégration bash, 81 tests unitaires Python, et 12 simulations de pipeline de bout en bout.7
Quel est l’impact de la délibération sur la latence ?
Une délibération à 3 agents ajoute 30 à 60 secondes de temps réel (les agents s’exécutent séquentiellement via l’Agent tool). Une délibération à 10 agents ajoute 2 à 4 minutes. Les hooks de consensus et de pride check s’exécutent chacun en moins de 200 ms. Le principal goulot d’étranglement est le temps d’inférence du LLM par agent, pas la surcharge d’orchestration.7
Quelle longueur pour un fichier CLAUDE.md ?
Gardez chaque section sous 50 lignes et le fichier total sous 150 lignes. Les fichiers longs sont tronqués par les fenêtres de contexte ; placez donc les instructions les plus critiques en premier : commandes et définitions de closures avant les préférences de style.21
Cela fonctionne-t-il avec d’autres outils que Claude Code ?
Les principes architecturaux (hooks comme portes déterministes, skills comme expertise métier, subagents comme contextes isolés, système de fichiers comme mémoire) s’appliquent conceptuellement à tout système agentique. L’implémentation spécifique utilise les événements de cycle de vie, les patterns de matcher et l’Agent tool de Claude Code. AGENTS.md transporte ces mêmes patterns vers Codex, Cursor, Copilot, Amp et Windsurf.21 Le pattern du harness est agnostique vis-à-vis de l’outil, même si les détails d’implémentation sont spécifiques.
Carte de référence rapide
Configuration des hooks
{
"hooks": {
"PreToolUse": [{"matcher": "Bash", "hooks": [{"type": "command", "command": "script.sh"}]}],
"PostToolUse": [{"matcher": "Write|Edit", "hooks": [{"type": "command", "command": "format.sh"}]}],
"Stop": [{"matcher": "", "hooks": [{"type": "agent", "prompt": "Verify tests pass. $ARGUMENTS"}]}],
"SessionStart": [{"matcher": "", "hooks": [{"type": "command", "command": "setup.sh"}]}]
}
}
Frontmatter des skills
---
name: my-skill
description: What it does and when to use it. Include trigger phrases.
allowed-tools: Read, Grep, Glob
---
Définition d’un subagent
---
name: my-agent
description: When to invoke. Include PROACTIVELY for auto-delegation.
tools: Read, Grep, Glob, Bash
model: opus
permissionMode: plan
---
Instructions for the subagent.
Codes de sortie
| Code | Signification | Utilisation |
|---|---|---|
| 0 | Succès | Autoriser l’opération |
| 2 | Blocage | Portes de sécurité, quality gates |
| 1 | Avertissement non bloquant | Journalisation, messages consultatifs |
Commandes principales
| Commande | Fonction |
|---|---|
/compact |
Compresser le contexte, préserver les décisions |
/context |
Afficher l’allocation de contexte et les skills actifs |
/agents |
Gérer les subagents |
claude -c |
Reprendre la session la plus récente |
claude --print |
Invocation CLI en une seule passe (sans conversation) |
# <note> |
Ajouter une note au fichier mémoire |
/memory |
Afficher et gérer l’auto-memory |
Emplacements des fichiers
| Chemin | Fonction |
|---|---|
~/.claude/CLAUDE.md |
Instructions globales personnelles |
.claude/CLAUDE.md |
Instructions du projet (partagées via git) |
.claude/settings.json |
Hooks et permissions du projet |
~/.claude/settings.json |
Hooks et permissions utilisateur |
~/.claude/skills/<name>/SKILL.md |
Skills personnels |
.claude/skills/<name>/SKILL.md |
Skills du projet (partagés via git) |
~/.claude/agents/<name>.md |
Définitions personnelles de subagents |
.claude/agents/<name>.md |
Définitions de subagents du projet |
.claude/rules/*.md |
Fichiers de règles du projet |
~/.claude/rules/*.md |
Fichiers de règles utilisateur |
~/.claude/projects/{path}/memory/MEMORY.md |
Auto-memory |
Journal des modifications
| Date | Modification |
|---|---|
| 2026-03-24 | Publication initiale |
Références
-
Andrej Karpathy sur les « claws » comme nouvelle couche au-dessus des agents LLM. Discussion HN (406 points, 917 commentaires). ↩
-
Implémentation de l’auteur. 84 hooks, 48 skills, 19 agents, environ 15 000 lignes d’orchestration. Documenté dans Claude Code as Infrastructure. ↩↩↩↩↩↩↩↩
-
Anthropic, « Claude Code Hooks : Exit Codes. » docs.anthropic.com. Exit 0 autorise, exit 2 bloque, exit 1 avertit. ↩↩↩↩↩
-
Anthropic, « Extend Claude with Skills. » code.claude.com/docs/en/skills. Structure des skills, champs du frontmatter, correspondance basée sur LLM, budget de contexte de 2 %. ↩↩↩↩↩↩↩
-
Anthropic, « Claude Code Sub-agents. » code.claude.com/docs/en/sub-agents. Contexte isolé, support worktree, équipes d’agents. ↩↩↩↩↩
-
Anthropic, « Claude Code Documentation. » docs.anthropic.com/en/docs/claude-code. Fichiers mémoire, CLAUDE.md, auto-memory. ↩↩↩↩↩
-
Système de délibération multi-agents de l’auteur. 10 personas de recherche, machine à états à 7 phases, 141 tests. Documenté dans Multi-Agent Deliberation. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Simon Willison, « Writing code is cheap now. » Agentic Engineering Patterns. ↩
-
Laban, Philippe, et al., « LLMs Get Lost In Multi-Turn Conversation », arXiv:2505.06120, mai 2025. Microsoft Research et Salesforce. 15 LLMs, plus de 200 000 conversations, baisse moyenne de performance de 39 %. ↩↩↩
-
Mikhail Shilkov, « Inside Claude Code Skills : Structure, Prompts, Invocation. » mikhail.io. Analyse indépendante de la découverte des skills, de l’injection de contexte et de la section
available_skillsdu prompt. ↩ -
Source Claude Code,
SLASH_COMMAND_TOOL_CHAR_BUDGET. github.com/anthropics/claude-code. ↩ -
Anthropic, « Skill Authoring Best Practices. » platform.claude.com. Limite de 500 lignes, fichiers complémentaires, conventions de nommage. ↩
-
Anthropic, « Claude Code Hooks : Lifecycle Events. » docs.anthropic.com. 22 événements de cycle de vie, types de hooks, hooks asynchrones, hooks HTTP. ↩↩↩↩↩↩
-
Tutoriel hooks Claude Code de l’auteur. 5 hooks de production créés de zéro. Documenté dans Claude Code Hooks Tutorial. ↩↩↩↩↩
-
Gestion de la fenêtre de contexte par l’auteur sur 50 sessions. Documenté dans Context Window Management. ↩↩↩↩↩
-
Implémentation du Ralph Loop par l’auteur. Itération à contexte vierge avec état du système de fichiers, budgets de spawn. Documenté dans The Ralph Loop. ↩↩↩↩↩↩↩
-
Architecture du système de délibération de l’auteur. 3 500 lignes de Python, 12 modules, déclencheur de confiance, validation par consensus. Documenté dans Building AI Systems : From RAG to Agents. ↩↩↩
-
Nemeth, Charlan, In Defense of Troublemakers: The Power of Dissent in Life and Business, Basic Books, 2018. ↩
-
Wu, H., Li, Z., et Li, L., « Can LLM Agents Really Debate? » arXiv:2511.07784, 2025. ↩
-
Liang, T. et al., « Encouraging Divergent Thinking in Large Language Models through Multi-Agent Debate », EMNLP 2024. ↩
-
Analyse des AGENTS.md dans des dépôts réels par l’auteur. Documenté dans AGENTS.md Patterns. Voir aussi : GitHub Blog, « How to Write a Great agents.md: Lessons from Over 2,500 Repositories. » ↩↩↩↩↩↩↩↩
-
Méthodologie quality loop et evidence gate de l’auteur. Fait partie du système Jiro Craftsmanship. ↩