Parcours 2 : Context engineering
Du prompt isolé à un contexte entretenu : la session, les fichiers d'instructions, les règles, les skills, les agents, les serveurs MCP (dont Context7 et Playwright), une carte du dépôt avec Graphify et les permissions, avec les vrais fichiers de configuration. Les exemples sont des configurations valides, vérifiées à la génération de la page. Prérequis : le parcours Culture, ou une bonne pratique d'un assistant d'IA. Pour les exercices : Claude Code ou Codex installé (voir Avant de commencer) et Node.js pour les serveurs MCP. Environ quatre heures, à calibrer en séance.
Parcours pas encore éprouvé avec un groupe : les durées et les exercices sont des estimations de conception, à ajuster après une première séance.
- 1 · Le contexte
- 2 · La session
- 3 · AGENTS.md
- 4 · Règles
- 5 · Skills
- 6 · Agents
- 7 · MCP
- 8 · Context7, Playwright, Graphify
- 9 · Permissions
- 10 · Choisir
Étape 1
Du prompt au contexte
Choisir ce que le modèle voit, au lieu de tout lui montrer.
Le context engineering est l'ensemble des moyens qui sélectionnent et entretiennent ce qui se trouve dans le contexte du modèle pendant le travail : consignes, outils, données externes, historique. Le prompt n'en est qu'une partie. L'objectif tient en une phrase : le plus petit ensemble d'informations très utiles qui produit le résultat voulu.
Dans une session d'agent de code, ce qui entre dans la fenêtre vient de six endroits : les consignes du système, vos fichiers d'instructions, les définitions des outils (y compris ceux des serveurs MCP), la liste des skills, l'historique, et les résultats des outils. Quatre techniques gardent le contexte sain, et chacune a son pendant dans l'outil :
| Technique | Dans Claude Code |
|---|---|
| Charger à la demande plutôt que tout précharger | Une skill n'entre en entier que lorsqu'elle est appelée ; l'agent lit les fichiers au moment du besoin |
| Résumer quand la fenêtre se remplit | La compaction de la conversation |
| Écrire des notes hors de la fenêtre | Les fichiers d'instructions, la mémoire automatique, les notes de session |
| Déléguer à un contexte propre | Les sous-agents, qui renvoient un résumé |
Revoyez l'animation de la fenêtre dans le parcours précédent et repérez les deux postes que vous contrôlez le mieux.
Étape 2
Piloter la session
Une session est un outil qu'on conduit : l'effacer, la résumer, la rejouer.
Tout ce que vous venez de voir se joue pendant une session. Les bonnes pratiques de Claude Code tiennent en une contrainte : la fenêtre se remplit vite et la précision baisse quand elle se remplit. Presque chaque commande de session sert donc à garder le contexte utile.
| Geste | Effet |
|---|---|
Esc | Arrête l'agent en plein travail ; le contexte est conservé, on peut rediriger |
Esc deux fois, ou /rewind | Restaure la conversation, le code, ou les deux, à un point précédent ; permet aussi de résumer à partir d'un message |
/clear | Vide le contexte : à faire entre deux tâches sans rapport |
/compact <consignes> | Résume la conversation en gardant ce que vous précisez (par exemple « les fichiers modifiés et les commandes de test ») |
/context | Montre ce qui occupe la fenêtre et confirme que vos fichiers d'instructions sont chargés |
/btw | Pose une question annexe dont la réponse n'entre pas dans l'historique |
/rename, claude --continue, claude --resume | Nomme une session, reprend la dernière, ou choisit dans une liste : une session se traite comme une branche |
Maj+Tab (mode plan) | Explorer et planifier sans rien modifier, avant d'implémenter |
Le flux recommandé tient en quatre temps : explorer, planifier, implémenter, commiter. Si vous pouvez décrire la modification en une phrase, sautez la planification.
Trois mauvaises habitudes reviennent tout le temps :
- La session fourre-tout : une tâche, puis une question sans rapport, puis on revient à la première. Le contexte est plein de bruit. Remède :
/clearentre deux sujets. - Corriger en boucle : l'agent se trompe, on corrige, il se trompe encore. Le contexte est pollué par les essais ratés. Remède : après deux corrections,
/clearet un prompt meilleur qui reprend ce qu'on a appris. - L'exploration sans limite : « investigue » sans cadrer fait lire des centaines de fichiers. Remède : cadrer, ou déléguer à un sous-agent (étape 6).
Exercice : vous avez corrigé trois fois la même erreur et l'agent recommence. Que faites-vous ?
Piste
Ne pas corriger une quatrième fois. Noter ce qui a manqué (le fichier à suivre en exemple, la contrainte, le résultat attendu), faire /clear, et reformuler la demande avec ces éléments. Une session propre avec un meilleur prompt bat presque toujours une longue session de corrections.
Étape 3
Les fichiers d'instructions
CLAUDE.md et AGENTS.md : du contexte persistant, pas une contrainte.
Chaque session démarre avec une fenêtre vide. Deux mécanismes transmettent la connaissance d'une session à l'autre : les fichiers d'instructions que vous écrivez (CLAUDE.md, ou AGENTS.md que Claude Code peut lire à la place), et la mémoire automatique que Claude écrit lui-même d'après vos corrections.
Deux faits à retenir. D'abord, ces fichiers sont du contexte : l'agent les lit et peut s'en écarter. Pour interdire une action quelle que soit sa décision, il faut un hook (parcours suivant). Ensuite, plus une instruction est précise et courte, plus elle est suivie de manière constante.
Si CLAUDE.md et AGENTS.md existent tous les deux, Claude Code lit CLAUDE.md ; pour partager un seul fichier avec d'autres outils, CLAUDE.md importe l'autre avec une ligne @AGENTS.md. C'est ce que fait ce projet : AGENTS.md porte les consignes, CLAUDE.md n'est qu'un pointeur. Des consignes qui ne concernent qu'une partie du code se rangent à part : c'est l'étape suivante, les règles.
Lequel de ces deux fichiers est le plus utile à un agent qui arrive sur le projet ?
# AGENTS.md
Tu es un expert senior. Écris du code propre, performant et maintenable.
Fais attention à la sécurité. Teste bien ton code. Sois prudent.# AGENTS.md Application web (Next.js, pnpm). Répondre en français. ## Vérifier avant de dire « fait » - `npx tsc --noEmit` puis `pnpm test` : citer le résultat. - `pnpm lint` signale à tort les fichiers générés : lancer `pnpm lint src`. ## Pièges - Le serveur de développement écoute sur le port 4000, fixé dans `.env.example`. - Après un changement de schéma : `pnpm db:migrate:create <nom>` puis `pnpm db:migrate`. ## Interdit - Pas de commit sur main : une branche par sujet, une PR par branche.
Réponse
Le B. Il contient ce que l'agent ne peut pas deviner en lisant le code : les commandes de vérification, les pièges, ce qui est interdit. Le A dit des intentions que n'importe quel modèle suit déjà (« écris du code propre ») sans rien de vérifiable. Une bonne instruction se teste : on peut dire si elle a été suivie.
Exercice : écrivez dix lignes d'AGENTS.md pour un projet que vous connaissez, avec uniquement des commandes, des pièges et des interdits.
Étape 4
Les règles
Des instructions rangées par sujet, chargées au bon moment.
Quand AGENTS.md grossit, tout y est lu à chaque session, même ce qui ne concerne qu'une partie du code. Les règles répondent à ce problème : un fichier Markdown par sujet dans .claude/rules/ (tests.md, api.md, securite.md), découverts récursivement. Elles sont du contexte, comme les fichiers d'instructions : l'agent les lit et peut s'en écarter.
Deux comportements, selon l'en-tête du fichier :
| Règle | Quand elle entre dans le contexte |
|---|---|
Sans paths | Au lancement de la session, avec la même priorité que .claude/CLAUDE.md |
Avec paths (motifs de fichiers) | Seulement quand l'agent lit, écrit ou modifie un fichier qui correspond |
--- paths: - "src/**/*.tsx" --- # Composants React - Tester avec Testing Library, jamais avec Enzyme. - Un composant par fichier, nommé comme le fichier. - Pas de style en ligne : les classes du design system.
Le champ paths accepte des motifs comme src/**/*.{ts,tsx} ; c'est le seul champ que Claude Code lit dans une règle. Vos règles personnelles vont dans ~/.claude/rules/ et s'appliquent à tous vos projets ; elles sont chargées avant celles du projet, et si les deux se contredisent, l'agent peut suivre l'une ou l'autre : gardez-les cohérentes.
Où ranger quoi ? Lisez les cinq cas puis pronostiquez :
| Cas | Où |
|---|---|
« Les tests se lancent avec pnpm test » | Mon pronostic
|
| « Les endpoints valident toute entrée » | Mon pronosticUne règle avec |
| « Pour publier une version, suivre ces onze étapes » | Mon pronosticUne skill : c'est une procédure appelée pour une tâche, pas une consigne permanente. |
« Ne jamais pousser sur main » | Mon pronosticUn hook (parcours Harness) : une interdiction doit être appliquée par l'outil, pas suggérée au modèle. On peut aussi l'écrire en règle pour l'expliquer, mais elle ne suffit pas. |
| « Je préfère des réponses courtes » | Mon pronostic
|
À ne pas confondre : les « règles de permission » (deny, ask, allow) de l'étape 9 sont appliquées par l'outil, dans les réglages. Les règles de cette étape sont des instructions lues par le modèle.
Exercice : prenez votre AGENTS.md et repérez deux paragraphes qui ne concernent qu'un type de fichier. Déplacez-les dans une règle avec paths.
Étape 5
Les skills
Une procédure chargée seulement quand elle sert.
Une skill est un dossier avec un fichier SKILL.md : un en-tête qui dit quand l'appeler, un corps qui dit comment. Claude l'invoque quand la description correspond à la conversation, ou vous la tapez avec /nom.
--- name: release-notes description: Rédiger les notes de version à partir des PR fusionnées. À utiliser quand l'utilisateur demande « les notes de version », « le changelog » ou « qu'est-ce qui part en prod ». --- # Notes de version 1. Lister les PR fusionnées depuis la dernière étiquette : `gh pr list --state merged --search "merged:>=<date>"`. 2. Les classer : nouveautés, corrections, technique. 3. Une ligne par PR, au présent, sans jargon interne. 4. Suivre le gabarit de `modele.md` (dans ce dossier).
Le point clé est le chargement progressif : seule la description reste toujours dans le contexte ; le corps n'est lu qu'à l'appel, et les fichiers annexes seulement au besoin. Une skill volumineuse ne coûte donc rien tant qu'on ne s'en sert pas ; une fois appelée, son corps reste dans la conversation jusqu'à la fin de la session.
| Emplacement | Portée |
|---|---|
~/.claude/skills/<nom>/SKILL.md | Personnel : tous vos projets |
.claude/skills/<nom>/SKILL.md | Ce dépôt, partagé en le versionnant |
| Plugin | Là où le plugin est activé |
Champs utiles : disable-model-invocation: true pour ne la lancer que par commande (le modèle ne la déclenche jamais seul), allowed-tools pour pré-autoriser des outils pendant son exécution.
Exercice : transformez une tâche que vous répétez (relance, compte rendu, revue) en skill. Écrivez d'abord la description : elle doit dire quand, jamais le déroulé.
Étape 6
Les agents
Un second collaborateur avec sa propre fenêtre de contexte.
Un sous-agent est un assistant spécialisé qui travaille dans une fenêtre de contexte isolée, avec ses propres consignes, ses propres outils et éventuellement un autre modèle. Il fait la tâche et ne renvoie qu'un résumé : la lecture de trente fichiers ne pollue pas la conversation principale. C'est la technique « déléguer à un contexte propre » du début du parcours.
Dans un schéma orchestrateur, l'agent principal ne lit pas tout : il distribue à chaque sous-agent le minimum dont il a besoin (la tâche, les critères, les fichiers utiles), puis ne reçoit que des résumés. Comparez les deux modes :
--- name: security-reviewer description: Relit un diff sous l'angle de la sécurité (entrées non validées, secrets, droits). À utiliser avant une PR qui touche l'authentification, les paiements ou les données personnelles. tools: Read, Grep, Glob model: sonnet --- Tu relis un changement sans le modifier. Pour chaque constat : le fichier et la ligne, ce qui peut arriver, comment le reproduire, la gravité. Si rien ne pose problème, dis-le en une phrase : n'invente pas de constat.
Le fichier vit dans .claude/agents/ (projet) ou ~/.claude/agents/ (personnel). Les champs obligatoires sont name et description ; tools restreint ses outils (ici, lecture seule) et hérite de tout si on l'omet. On l'invoque en le nommant (« utilise security-reviewer »), par mention (@agent-security-reviewer relis mon diff, ou @ puis le choisir dans la liste), ou pour toute la session.
Limites à connaître : un sous-agent n'a pas votre conversation et chaque nouvel appel démarre sans mémoire des appels précédents, sauf si l'on demande explicitement de reprendre le même sous-agent, il consomme du quota comme la session principale, et le nombre d'agents simultanés et la profondeur d'imbrication sont bornés.
Exercice : écrivez un agent « relecteur » en lecture seule pour votre projet. Quelles sont les trois informations que vous lui donnez avec sa tâche, puisqu'il n'a pas votre conversation ?
Piste
La demande d'origine et ses critères de réussite, le diff ou les fichiers touchés, et les résultats des vérifications déjà faites. Un agent ne voit que ce qu'on lui envoie : un résumé vague produit une relecture vague.
Étape 7
MCP : brancher des outils
Un protocole commun pour donner à l'agent l'accès à des données et à des services.
Le Model Context Protocol (MCP) permet à l'agent d'utiliser des serveurs externes : base de données, tracker, documentation, navigateur.
Une API, pour un agent
Vous connaissez déjà le principe : un service expose des opérations, un client les appelle. MCP est ce contrat, pensé pour un agent plutôt que pour votre code. Les différences tiennent à une idée : c'est le modèle qui découvre les opérations et décide de les appeler pendant la session, au lieu d'un développeur qui les a codées à l'avance.
Un serveur MCP expose trois choses, chacune déclenchée par quelqu'un de différent :
Des actions : chercher, créer, lancer. Elles sont décrites au modèle, qui décide de les appeler.
Exemples : get_order, browser_click
Des données à lire, désignées par une URI. Dans Claude Code, vous les référencez vous-même avec @.
Exemple : @postgres:schema://users
Des modèles de demande avec des arguments, qui deviennent des commandes que vous tapez.
Exemple : /mcp__github__pr_review 456
Pour aller plus loin : MCP comparé à une API REST, et les messages échangés
| API classique (REST) | Serveur MCP | |
|---|---|---|
| Qui appelle | Votre code, écrit à l'avance | Le modèle, qui décide en cours de session |
| Découverte | Vous lisez la documentation (OpenAPI) avant de coder | Le client demande la liste au serveur, à la connexion (tools/list) |
| Description | Pour un humain : pages de doc, exemples | Pour le modèle : une phrase en langage naturel et un schéma JSON des paramètres |
| Forme d'un appel | GET /orders/42 | tools/call avec le nom de l'outil et ses arguments |
| Données | Des URL de ressources | resources/list et resources/read, par URI |
| Modèles de demande | Aucun | prompts/list et prompts/get |
| Format | Libre (JSON, XML, formulaire) | Toujours du JSON-RPC 2.0 |
| Transport | HTTP | Un processus local en entrée et sortie standard, ou HTTP |
| Authentification | Clé ou OAuth gérés par votre code | En-têtes ou OAuth déclarés dans la configuration du client |
| Résultat | Code HTTP et corps de réponse | Du contenu lisible par le modèle, qui entre dans le contexte |
GET /orders/42 HTTP/1.1 Authorization: Bearer <jeton> 200 OK { "id": 42, "status": "shipped" }
-> {"jsonrpc": "2.0", "id": 1, "method": "tools/list"} <- {"jsonrpc": "2.0", "id": 1, "result": {"tools": [{ "name": "get_order", "description": "Retourne une commande à partir de son numéro.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer"}}, "required": ["id"]} }]}}
-> {"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "get_order", "arguments": {"id": 42}}} <- {"jsonrpc": "2.0", "id": 2, "result": { "content": [{"type": "text", "text": "Commande 42 : expédiée"}], "isError": false}}
Deux conséquences pour vous. Leurs outils coûtent du contexte, mais peu : par défaut, la recherche d'outils ne charge au démarrage que les noms, et les définitions complètes seulement au moment du besoin. Et ils peuvent agir (lire des données, écrire, supprimer) : on n'installe donc que des serveurs de confiance, avec l'accès minimal.
| Portée | Visible | Stockée dans |
|---|---|---|
| Locale (par défaut) | Ce projet, vous seul | ~/.claude.json |
| Projet | Ce projet, toute l'équipe | .mcp.json à la racine, versionné |
| Utilisateur | Tous vos projets, vous seul | ~/.claude.json |
Un fichier .mcp.json de projet :
{ "mcpServers": { "context7": { "type": "http", "url": "https://mcp.context7.com/mcp", "headers": { "Authorization": "Bearer ${CONTEXT7_API_KEY}" } }, "base": { "type": "stdio", "command": "npx", "args": [ "-y", "@bytebase/dbhub" ], "env": { "DSN": "${DB_URL}" } } } }
Remarquez les ${...} : les secrets viennent de variables d'environnement, jamais du fichier versionné. Un serveur de portée projet demande une approbation avant son premier usage.
$ claude mcp add --transport http <nom> <url>
$ claude mcp list$ claude mcp remove <nom>
Dans les règles de permission, un outil MCP se nomme mcp__<serveur>__<outil> (par exemple mcp__notion__* ou simplement mcp__notion pour tous les outils d'un serveur ; une règle mcp__ avec des parenthèses est ignorée).
Exercice : écrivez le .mcp.json d'un serveur en lecture seule sur une base de test. Où va le mot de passe ?
Réponse
Dans une variable d'environnement, référencée par ${NOM}, définie hors du dépôt. Le fichier versionné ne contient aucun secret. Pour la base elle-même, un compte en lecture seule : la permission la plus étroite possible est la première protection.
Étape 8
Context7, Playwright et Graphify
Trois outils qui attaquent trois défauts d'un agent : la doc à jour, un navigateur pour vérifier, une carte du dépôt.
Parmi tous les serveurs MCP possibles, deux changent le quotidien d'un développeur web, parce qu'ils attaquent deux défauts classiques d'un agent : il code avec des API périmées, et il affirme que l'interface marche sans l'avoir vue.
Context7 : la documentation à jour, à la version
Un modèle a été entraîné jusqu'à une date. Une bibliothèque a changé depuis : il écrit alors une API qui n'existe plus, avec assurance (c'est une hallucination, parcours Culture). Context7 est un service qui fournit à l'agent la documentation et des exemples de code de la version voulue. Il expose deux outils : resolve-library-id (trouver l'identifiant d'une bibliothèque à partir de son nom) et query-docs (interroger sa documentation). On l'appelle en ajoutant « use context7 » à la demande, ou en nommant l'identifiant (/supabase/supabase) pour sauter la recherche. Une clé d'API gratuite relève les limites d'usage.
Le plus utile : l'écrire une fois dans AGENTS.md (« pour toute API de bibliothèque, consulter Context7 avant d'écrire du code »), pour ne plus avoir à le demander. Limite à garder en tête : ces documentations sont alimentées par la communauté et ne sont pas garanties exactes ; c'est une source à citer et à vérifier, qui reste du texte non fiable (voir l'injection de prompt).
Playwright : un navigateur que l'agent pilote
Le serveur MCP Playwright donne à l'agent un vrai navigateur : ouvrir une page, cliquer, remplir un formulaire, lire la console et les requêtes réseau, prendre une capture. Il travaille surtout à partir d'instantanés d'accessibilité (l'arbre de la page, en texte), pas de pixels : l'agent n'a pas besoin de « voir » l'image pour agir. La capture sert à montrer le résultat, à vous comme à un agent vérificateur. Outils principaux : browser_navigate, browser_snapshot, browser_click, browser_type, browser_take_screenshot, browser_console_messages, browser_network_requests.
Un fichier .mcp.json avec les deux, plus un second navigateur configuré en mobile (le serveur se lance avec --viewport-size ou --device) :
{ "mcpServers": { "context7": { "type": "http", "url": "https://mcp.context7.com/mcp", "headers": { "Authorization": "Bearer ${CONTEXT7_API_KEY}" } }, "playwright": { "type": "stdio", "command": "npx", "args": [ "@playwright/mcp@latest", "--isolated", "--viewport-size", "1280x720", "--output-dir", "./captures" ] }, "playwright-mobile": { "type": "stdio", "command": "npx", "args": [ "@playwright/mcp@latest", "--isolated", "--device", "iPhone 15", "--output-dir", "./captures" ] } } }
Variante sans serveur MCP : Context7 propose aussi un mode « CLI + skill » (npx ctx7 setup --claude), et Claude Code peut piloter votre navigateur Chrome via son extension. Le principe reste le même : donner à l'agent un moyen de vérifier.
Voici ce que ça donne en pratique. Demandez, avec ces deux serveurs branchés :
Ajoute la pagination à la liste des commandes avec TanStack Query. use context7 Puis ouvre http://localhost:3100/commandes, prends une capture à 1280 px et une en mobile, et liste les erreurs de la console.
L'agent lit la documentation de la bonne version, écrit le code, ouvre la page, capture les deux tailles et rapporte les erreurs. Vous relisez des preuves.
Exercice : branchez les deux serveurs sur un projet jetable, demandez une petite évolution d'interface, et obtenez deux captures (bureau et mobile) sans aucune erreur de console.
Graphify : une carte du dépôt, plutôt que relire les fichiers
Troisième défaut : sur un gros dépôt, l'agent cherche à l'aveugle. Graphify n'est pas un serveur MCP : c'est un outil en ligne de commande, livré avec une skill et un hook pour Claude Code. Pour comprendre « qui appelle quoi », il enchaîne les recherches de texte et relit des fichiers entiers, et chaque lecture remplit la fenêtre de contexte (étape 1). Graphify (open source) construit d'abord une carte du dépôt : un graphe de connaissances où les fonctions, les classes, les fichiers et les concepts sont des nœuds, reliés par leurs appels, leurs imports et leurs références. L'agent interroge la carte et n'ouvre ensuite que les fichiers utiles.
- Le code est analysé sur votre machine, par l'analyseur syntaxique tree-sitter : sans modèle, sans clé, sans que rien ne sorte de la machine.
- La documentation, les PDF et les images passent par un modèle (celui de l'agent, ou une clé d'API) pour en extraire les concepts : c'est payant, et leur contenu sort de la machine.
- Chaque lien porte son origine :
EXTRACTEDs'il est écrit dans le code,INFERREDs'il est déduit par Graphify. Un lien déduit est une hypothèse à vérifier dans le fichier. - Le résultat va dans
graphify-out/:graph.json(le graphe),GRAPH_REPORT.md(les concepts clés et des questions suggérées) etgraph.html, une carte interactive à ouvrir dans un navigateur.
Installation, une fois par machine (le paquet s'appelle graphifyy sur PyPI, avec deux « y » ; les autres paquets graphify* ne sont pas du même projet), puis la skill /graphify pour Claude Code seulement :
$ uv tool install graphifyy$ graphify install --platform claude
Dans une session ouverte sur le projet, /graphify . construit la carte. Ensuite, en ligne de commande ou par l'agent :
graphify query "qu'est-ce qui relie l'authentification à la base ?" graphify path "LoginForm" "users" # le plus court chemin entre deux nœuds graphify explain "useSession" # un nœud et ses voisins, en clair graphify update . # refaire la carte du code, sans modèle
Pour Claude Code, l'installation ajoute aussi un hook qui rappelle à l'agent de consulter la carte avant de chercher ou de lire des fichiers un par un (parcours Harness : un hook est exécuté par l'outil, pas par le modèle).
Exercice : construisez la carte d'un projet que vous connaissez, ouvrez graph.html, puis posez la même question (« d'où vient le titre de la page d'accueil ? ») à l'agent avec et sans la carte. Comparez les fichiers qu'il a lus.
Graphify : ce qu'il faut savoir avant de l'installer
Les gains annoncés (beaucoup moins de jetons par question) viennent des mesures du projet lui-même : mesurez sur votre dépôt. La carte vieillit avec le code : graphify update . la refait pour le code, sans modèle. Les questions posées sont journalisées dans ~/.cache/graphify-queries.log. La commande graphify install sans option vise tous les outils détectés et écrit aussi pour Codex dans AGENTS.md : sur un projet qui a déjà ses fichiers d'instructions (Kwa, par exemple), préférez --platform claude et relisez ce qui a changé. Le graphe d'un dépôt est aussi une carte de son code : ne le publiez pas pour un projet privé.
Sécurité : ce qu'il faut restreindre
Playwright n'est pas une frontière de sécurité. Son outil browser_run_code_unsafe exécute du JavaScript arbitraire côté serveur et équivaut à une exécution de code à distance : refusez-le dans les permissions (mcp__playwright__browser_run_code_unsafe). N'ouvrez que des sites de confiance : une page hostile est une entrée non fiable (injection de prompt). N'exposez jamais le serveur au réseau (--host 0.0.0.0). Pour Context7, la clé d'API se passe par variable d'environnement, jamais en clair dans le fichier versionné.
Étape 9
Permissions et réglages
Ce que l'agent peut faire, décidé hors de son texte.
Contrairement aux fichiers d'instructions, les règles de permission sont appliquées par l'outil, pas suggérées au modèle. Elles vivent dans les fichiers de réglages : .claude/settings.json (projet, partagé), .claude/settings.local.json (vos choix locaux, à garder hors du dépôt), ~/.claude/settings.json (personnel), et des réglages d'organisation qui priment.
{ "permissions": { "allow": [ "Bash(pnpm test *)", "Bash(git status)" ], "ask": [ "Bash(git push *)" ], "deny": [ "Read(.env)", "Read(secrets/**)", "Bash(rm -rf *)", "mcp__playwright__browser_run_code_unsafe" ] } }
Trois listes, évaluées dans cet ordre : deny, puis ask, puis allow. La première qui correspond décide, quelle que soit la précision des règles. Pronostiquez :
| Cas | Résultat |
|---|---|
| allow Bash(aws s3 ls) et deny Bash(aws *) : que se passe-t-il pour aws s3 ls ? | Mon pronosticrefusé Refusé. Une règle d'interdiction large bloque aussi ce qu'une règle d'autorisation plus précise voudrait laisser passer. |
| allow Bash(git push *) et ask Bash(git push *) : que se passe-t-il pour git push origin feat ? | Mon pronosticdemande Une confirmation est demandée. Une règle « demander » l'emporte sur une règle « autoriser ». |
| Un hook PreToolUse répond « autoriser » mais deny Read(.env) existe : lecture de .env ? | Mon pronosticrefusé Refusée. Les règles d'interdiction et de confirmation sont évaluées quel que soit le résultat d'un hook. |
Les modes règlent le niveau d'autonomie : default (le mode « Manuel » dans l'interface : demande à la première utilisation), acceptEdits (accepte les modifications de fichiers), plan (explore sans modifier), auto (un classifieur vérifie les actions), dontAsk (refuse ce qui demanderait), bypassPermissions (aucune demande : réservé aux environnements isolés).
Limite à connaître : une règle sur une commande shell lit le texte que l'agent écrit. Elle couvre la forme habituelle d'un appel, pas toutes ses variantes : ce n'est pas une frontière de sécurité autour d'un programme. Pour bloquer la lecture d'un fichier par les outils de fichiers, on écrit une règle Read sur son chemin.
Ce que les règles ne savent pas dire (« pas de commit sur main », « une PR doit être liée à une issue ») se règle avec des hooks. Un hook est un script que l'outil lance à un moment précis du travail (avant un outil, après une modification, à la fin d'une réponse). Il reçoit du JSON sur son entrée, et s'il termine avec le code 2, l'action est bloquée et son message d'erreur revient à l'agent comme retour. C'est l'objet du parcours Harness, où l'on en écrit un.
Étape 10
Choisir le bon mécanisme
Chaque besoin a son bon support : la synthèse du parcours.
Vous connaissez maintenant les mécanismes, qui ont chacun leur fiche, avec un fichier d'exemple, sur la page Les briques. Le piège classique est d'utiliser le mauvais : tout mettre dans AGENTS.md, ou espérer qu'une instruction tienne lieu d'interdiction. Un critère simple : à quelle fréquence l'agent en a-t-il besoin, et est-ce une suggestion ou une garantie ?
| Besoin | Mécanisme | Coût pour le contexte |
|---|---|---|
| Un fait valable dans toutes les sessions (commandes, pièges) | AGENTS.md | Toujours chargé |
| Une consigne propre à un sujet ou à un type de fichier | Règle, avec ou sans paths | Au lancement, ou à la lecture d'un fichier concerné |
| Une procédure appelée pour une tâche | Skill | Description seule, corps à l'appel |
| Un travail de lecture volumineux ou une revue indépendante | Sous-agent | Fenêtre séparée, un résumé revient |
| Un accès à un service ou à des données (docs, navigateur, base) | Serveur MCP | Noms d'outils, définitions à la demande |
| Une commande ou un fichier toujours interdit | Règle de permission (deny) | Aucun, appliqué par l'outil |
| Une décision qui dépend du contexte (la branche, le contenu) et ne doit jamais dépendre du modèle | Hook | Aucun, appliqué par l'outil |
| Partager le tout avec une équipe | Dépôt versionné, ou plugin qui regroupe skills, hooks, agents et serveurs | Selon ce qu'il contient |
Cas pratique : « les composants React se testent avec Testing Library, jamais avec Enzyme ». Où l'écrire ? Une règle avec paths: src/**/*.tsx, parce que cela ne concerne que ces fichiers. Et « ne jamais supprimer une migration » ? Une permission deny ne lit que le texte de la commande : rm serait bloqué, mais git rm, mv ou un chemin écrit autrement lui échapperaient. Un hook, lui, peut regarder quels fichiers la commande vise et refuser si l'un d'eux est dans migrations/ : il reconnaît bien plus de formes de commande, sans être infaillible. C'est une décision qui dépend du contexte.
Pour la gestion d'équipe, deux compléments existent : les plugins (un paquet installable qui regroupe skills, hooks, sous-agents et serveurs MCP) et les réglages gérés par l'organisation. Le parcours Harness montre comment l'ensemble s'assemble.
Vous avez compris si vous savez
- lister ce qui remplit la fenêtre d'une session d'agent, et la technique qui répond à chaque problème ;
- écrire des instructions vérifiables et dire pourquoi elles ne contraignent pas ;
- ranger une consigne au bon endroit : AGENTS.md, règle avec ou sans paths, skill ou hook ;
- écrire une skill, un sous-agent, et choisir leur emplacement ;
- configurer un serveur MCP sans secret en clair, avec la bonne portée ;
- prédire le résultat de règles deny, ask et allow, et nommer ce qu'elles ne garantissent pas ;
- brancher Context7 et Playwright et obtenir une évolution vérifiée par des captures ;
- construire la carte d'un dépôt avec Graphify et dire ce qui reste sur la machine ;
- choisir, pour une consigne donnée, entre AGENTS.md, règle, skill, sous-agent, MCP et hook.
Sources
Les documentations officielles font foi. Les noms de réglages et les limites évoluent avec les versions : vérifiez avant une séance.
- Instructions, mémoire et règles (CLAUDE.md, AGENTS.md, .claude/rules)
- Skills
- Sous-agents
- MCP : portées et configuration
- Context7
- Playwright MCP
- Graphify
- Graphify sur PyPI (graphifyy)
- Bonnes pratiques de Claude Code (sessions, vérification)
- Choisir entre skills, sous-agents, hooks et MCP
- Permissions
- Effective context engineering for AI agents