Domaines
D2 · Claude Code Configuration and Workflows
La hiérarchie CLAUDE.md, les portées et permissions de settings.json, les hooks, les Skills, les slash commands, les sous-agents, le plan mode, l’usage headless/CI, la revue multi-passes, les conventions d’équipe et la configuration MCP.
Ce domaine vaut environ 12 des 60 items et correspond aux scénarios Code-Generation et CI/CD. Il évalue votre capacité à configurer Claude Code correctement pour un individu et, surtout, pour une équipe : où vit le contexte, comment les settings et les permissions se résolvent, quand appliquer par des hooks plutôt qu’orienter par des prompts, et comment exécuter Claude Code en headless dans la CI. Le thème récurrent est la précédence et le bon mécanisme pour la bonne tâche.
Objectifs d’apprentissage
À la fin de cette page, vous devriez savoir :
- Ordonner la hiérarchie CLAUDE.md et décider de ce qui appartient à chaque niveau.
- Résoudre les portées de settings.json et la précédence des permissions (allow / deny / ask).
- Configurer des hooks pour chaque événement, utiliser le code de sortie 2 pour bloquer, et lire/écrire du JSON sur stdin/stdout.
- Choisir parmi Skill, CLAUDE.md, slash command, subagent et MCP pour un besoin donné.
- Écrire des slash commands personnalisées avec
$ARGUMENTSet définir des subagents avec des allowlists d’outils et des modèles par agent. - Trancher entre plan mode et exécution directe et exécuter Claude Code en headless dans la CI avec les bons drapeaux et la gestion des codes de sortie.
- Concevoir des conventions à l’échelle de l’équipe : settings de projet versionnés, managed policies, portées de configuration MCP et maîtrise des coûts.
2.1 La hiérarchie CLAUDE.md
Les fichiers CLAUDE.md injectent un contexte de projet persistant dans chaque session. Ils se composent du plus large au plus étroit, les fichiers plus spécifiques se superposant par-dessus.
Managed policy (enterprise, admin-controlled) ← highest authority, cannot be overridden ▼User ~/.claude/CLAUDE.md ← your personal defaults across all projects ▼Project ./CLAUDE.md (checked into git) ← shared team context for this repo ▼Subdirectory ./packages/x/CLAUDE.md ← context specific to a part of the repoCLAUDE.local.md est un fichier personnel ignoré par git pour les notes propres au projet que vous ne voulez pas partager. Utilisez @path/to/file pour importer d’autres fichiers (par ex. @docs/architecture.md) afin que le contexte reste modulaire et DRY.
| Niveau | Portée | À mettre ici | À NE PAS mettre |
|---|---|---|---|
| Managed policy | Toute l’organisation | Standards obligatoires, actions interdites | Préférences personnelles |
User ~/.claude/CLAUDE.md | Tous vos projets | Votre style de code, préférences de shell | Conventions d’équipe |
Project ./CLAUDE.md | Ce repo (partagé) | Commandes de build/test, architecture, conventions | Secrets, notes personnelles |
| Subdirectory | Un package/module | Commandes et particularités propres au module | Règles à l’échelle du repo |
CLAUDE.local.md | Vous, ce repo | Notes de travail, chemins locaux | Tout ce dont l’équipe a besoin |
Restez concis
CLAUDE.md est chargé dans le contexte à chaque session — il coûte des tokens à chaque tour. Gardez-le serré et à fort signal ; déplacez le matériel de référence long dans des fichiers @importés qui ne sont tirés que lorsqu’ils sont pertinents. Ne mettez jamais de secrets dans CLAUDE.md (il est souvent versionné). Des fichiers CLAUDE.md gonflés dégradent à la fois le coût et le respect des instructions.
Signal d’examen
« Une règle que chaque membre de l’équipe doit suivre » → CLAUDE.md de projet (versionné) ou une managed policy si elle est obligatoire. « Ma préférence personnelle » → user ou CLAUDE.local.md. « Cela ne doit pas être partagé / ne doit pas être versionné » → CLAUDE.local.md.
2.2 Portées et précédence de settings.json
settings.json configure les permissions, les hooks, l’environnement et le modèle. Les portées se résolvent du plus au moins autoritaire :
Managed policy settings (admin, cannot be overridden) ▼ overrides.claude/settings.local.json (personal, git-ignored) ▼ overrides.claude/settings.json (project, checked in) ▼ overrides~/.claude/settings.json (user, global default){ "model": "claude-opus-5", "permissions": { "allow": ["Read", "Edit", "Bash(npm test:*)", "Bash(git status)"], "deny": ["Bash(rm -rf:*)", "Read(./.env)", "Read(./secrets/**)"], "ask": ["Bash(git push:*)", "WebFetch"] }, "env": { "NODE_ENV": "test" }}Signal d’examen
Les settings à l’échelle de l’équipe qui doivent s’appliquer à tous vont dans .claude/settings.json versionné ; les règles obligatoires et non contournables vont dans une managed policy. Les surcharges personnelles vont dans settings.local.json (ignoré par git).
2.3 Permissions : allow / deny / ask
| Règle | Effet | Exemple |
|---|---|---|
allow | Auto-approuvé, sans invite | Bash(npm test:*), Read, Edit |
deny | Toujours bloqué | Bash(rm -rf:*), Read(./.env) |
ask | Invite l’utilisateur à chaque fois | Bash(git push:*), WebFetch |
deny l’emporte sur allow. Les motifs correspondent au nom de l’outil et à ses arguments (par ex. Bash(git commit:*)). Préférez une allowlist étroite plus des deny explicites pour les opérations dangereuses ; utilisez ask pour les actions généralement bénignes mais parfois lourdes de conséquences.
2.4 Hooks
Les hooks sont des gestionnaires shell (ou HTTP) déterministes qui se déclenchent sur des événements du cycle de vie. Ils reçoivent le JSON de l’événement sur stdin et peuvent émettre du JSON sur stdout ; le code de sortie 2 bloque l’action (et renvoie stderr à Claude), tandis que le code de sortie 0 l’autorise.
Événements : PreToolUse, PostToolUse, UserPromptSubmit, Stop, SessionStart, Notification, SubagentStop, PreCompact.
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [{ "type": "command", "command": "./.claude/hooks/guard.sh" }] } ] }}#!/usr/bin/env bash# .claude/hooks/guard.sh — lit le JSON de l'appel d'outil sur stdin, bloque les commandes destructrices.input=$(cat)cmd=$(echo "$input" | jq -r '.tool_input.command // ""')if echo "$cmd" | grep -qE 'rm -rf|:(){ :|:& };:'; then echo "Blocked destructive command: $cmd" >&2 exit 2 # le code de sortie 2 bloque l'appel d'outilfiexit 0#!/usr/bin/env bash# Bloque un git commit si la suite de tests échoue. Déterministe — pas une instruction de prompt.input=$(cat)cmd=$(echo "$input" | jq -r '.tool_input.command // ""')if echo "$cmd" | grep -q 'git commit'; then if ! npm test --silent; then echo "Tests failing — commit blocked." >&2 exit 2 fifiexit 0#!/usr/bin/env bash# Après que Claude a édité un fichier, le linter automatiquement et remonter les problèmes à Claude.input=$(cat)file=$(echo "$input" | jq -r '.tool_input.file_path // ""')if [[ "$file" == *.ts || "$file" == *.tsx ]]; then npx eslint --fix "$file" 2>&1 || echo "Lint issues remain in $file" >&2fiexit 0Des hooks, non des prompts, pour les règles critiques
C’est encore l’anti-pattern 3. « Dire à Claude dans CLAUDE.md de toujours exécuter les tests » est probabiliste. Un PreToolUse hook qui sort en 2 quand les tests échouent est déterministe et incontournable. Utilisez des hooks dès lors que la règle doit toujours tenir.
2.5 Skills, CLAUDE.md, slash commands, subagents, MCP — lequel ?
Ces cinq mécanismes se recoupent, et bien choisir est fortement testé.
| Mécanisme | Ce dont il s’agit | À choisir quand |
|---|---|---|
| CLAUDE.md | Contexte de projet toujours chargé | Faits/conventions que chaque tour doit connaître |
| Skill | SKILL.md chargé progressivement à la demande | Capacité réutilisable avec instructions/scripts, chargée seulement quand pertinente |
| Slash command | Gabarit de prompt .claude/commands/*.md | Un prompt répétable que vous invoquez explicitement (/review $ARGUMENTS) |
| Subagent | .claude/agents/*.md avec contexte isolé | Déléguer une sous-tâche à un contexte séparé avec ses propres outils/modèle |
| MCP | Serveur externe exposant outils/ressources | Intégrer un système externe ou une capacité partagée entre clients |
Skills et divulgation progressive
Un Skill vit dans .claude/skills/<name>/SKILL.md avec un frontmatter (name, description) et des scripts optionnels fournis. Claude lit la description pour décider quand le skill est pertinent et ne charge le corps complet qu’à ce moment — la divulgation progressive garde le contexte léger.
---name: pdf-invoice-extractordescription: Extract structured fields from PDF invoices. Use when the user asks to pull totals, dates, or line items from an invoice PDF.---
# PDF Invoice Extractor1. Read the PDF text layer.2. Extract fields into the JSON schema in ./schema.json.3. Validate and report any missing required fields.Signal d’examen
« Capacité réutilisable, nécessaire seulement parfois, pouvant fournir des scripts » → Skill. « Doit toujours être en contexte » → CLAUDE.md. « Un prompt que je déclenche par son nom » → slash command. « Contexte/outils/modèle séparés pour une sous-tâche » → subagent. « Système externe ou capacité inter-clients » → MCP.
2.6 Slash commands personnalisées
Un fichier .claude/commands/review.md devient /review. $ARGUMENTS est substitué par ce qui suit la commande.
---description: Review a pull request for security and style issues.---Review the changes in PR #$ARGUMENTS. Check for injection risks, missing inputvalidation, and deviations from ./CLAUDE.md conventions. Output a table offindings with severity.Invoquez avec /review 482. Les commandes peuvent être de portée projet (.claude/commands/) ou user (~/.claude/commands/).
2.7 Subagents
Un subagent est défini dans .claude/agents/<name>.md avec son propre system prompt, son allowlist d’outils et son modèle. Il s’exécute dans une fenêtre de contexte isolée, protégeant la conversation principale du bruit.
---name: security-reviewerdescription: Reviews diffs for security vulnerabilities. Use proactively before merges.tools: Read, Grep, Bash(git diff:*)model: claude-opus-5---You are a security reviewer. Examine the diff for injection, authz gaps, secretleakage and unsafe deserialisation. Report findings with severity and file:line.Do not modify code.Points de conception clés : donnez à chaque subagent une allowlist d’outils étroite (moindre privilège), choisissez un modèle par agent (un classifieur Haiku bon marché, un relecteur Opus), et rappelez-vous que son contexte est isolé — le parent doit passer le contexte explicitement (même règle qu’au Domaine 1).
2.8 Plan mode vs exécution directe
Le plan mode (Shift+Tab) fait explorer Claude en lecture seule et produire un plan avant de toucher à quoi que ce soit. L’exécution directe le laisse éditer et exécuter immédiatement.
| Choisir le plan mode quand | Choisir l’exécution directe quand |
|---|---|
| Changement volumineux ou dans une base de code inconnue | Édition petite, bien cadrée, réversible |
| Opérations à haut risque / irréversibles | Itération locale de routine |
| Vous voulez revoir l’approche d’abord | Vous avez confiance dans le changement et voulez de la vitesse |
| Refactors multi-fichiers | Correctif mono-fichier |
Signal d’examen
« Grosse PR », « base de code inconnue », « vouloir approuver l’approche d’abord » → plan mode. Un énoncé où Claude édite du code proche de la production sans revue est généralement la mauvaise réponse.
2.9 Usage headless et CI
Exécutez Claude Code de façon non interactive avec claude -p (print mode). C’est le scénario CI/CD.
# Revue headless en CI, sortie lisible par machine, allowlist d'outils étroite, sans invites.claude -p "Review the diff in this PR for security issues and output JSON findings." \ --output-format json \ --allowedTools "Read,Grep,Bash(git diff:*)" \ --permission-mode acceptEdits
echo "exit code: $?" # 0 succès ; non nul en cas d'échec — barrez le pipeline dessus| Drapeau | Objectif |
|---|---|
-p "…" | Mode print (headless) avec un prompt |
--output-format json | Objet résultat JSON unique (à parser en CI) |
--output-format stream-json | Événements JSON en flux (tâches longues, progression) |
--allowedTools | Restreindre les outils pour l’exécution (moindre privilège en CI) |
--permission-mode | par ex. acceptEdits, plan, bypassPermissions — contrôle des invites |
Barrez le pipeline sur le code de sortie ; parsez le JSON pour des découvertes structurées. Gardez l’allowlist d’outils minimale en CI pour qu’une instruction injectée ne puisse pas exécuter de commandes arbitraires.
2.10 Revue de code multi-passes pour les grosses PR
Les grosses PR débordent d’une seule passe de revue. Découpez le travail :
-
Partitionnez le diff par fichier ou module pour que chaque passe tienne confortablement en contexte.
-
Relisez chaque partition dans sa propre passe (ou subagent) avec un prompt ciblé, en émettant des découvertes structurées.
-
Agrégez les découvertes, dédupliquez et classez par sévérité dans une passe finale de synthèse.
Cela reflète orchestrator-workers : des partitions indépendantes relues dans des contextes isolés, puis agrégées. Cela garde aussi chaque contexte assez petit pour que la qualité ne se dégrade pas.
2.11 Conventions à l’échelle de l’équipe
| Enjeu | Réponse à l’échelle de l’équipe |
|---|---|
| Contexte partagé | ./CLAUDE.md versionné dans git |
| Permissions/hooks partagés | .claude/settings.json versionné |
| Règles obligatoires et non contournables | Settings/CLAUDE.md de managed policy |
| Serveurs MCP partagés | .mcp.json à la racine du projet (versionné) |
| Surcharges personnelles | settings.local.json, CLAUDE.local.md (ignorés par git) |
| Maîtrise des coûts | Modèle par subagent, suivi via /cost, modèles moins chers pour les agents simples |
Portées de configuration MCP
| Portée | Fichier / commande | Visible par |
|---|---|---|
| Project | .mcp.json (versionné) | Toute l’équipe, ce repo |
| User | claude mcp add --scope user … | Tous vos projets |
| Local | claude mcp add (local par défaut) | Vous seul, ce projet |
Agent teams, dynamic workflows, routines
Claude Code prend en charge les agent teams (plusieurs subagents coordonnés), les dynamic workflows (étapes composées à l’exécution) et les routines (procédures multi-étapes sauvegardées). Positionnez-les comme une orchestration de plus haut niveau bâtie sur les primitives ci-dessus ; à l’examen, préférez la plus simple qui résout le problème énoncé.
Maîtrise des coûts
Utilisez /cost pour inspecter la dépense, choisissez un modèle par subagent moins cher là où la qualité le permet (Haiku pour la classification, Sonnet pour le travail équilibré, Opus pour le codage difficile), et gardez CLAUDE.md concis pour réduire les tokens par tour. Le prompt caching s’applique au préfixe stable CLAUDE.md/outils.
2.12 Une configuration d’équipe complète et travaillée
L’examen récompense de savoir exactement quel fichier détient quel réglage. Voici une organisation de projet cohérente et versionnée pour le scénario Code-Generation, suivie du raisonnement pour chaque placement.
repo/├── CLAUDE.md # shared: build/test cmds, architecture, conventions (+ @imports)├── CLAUDE.local.md # git-ignored: personal scratch notes, local paths├── .mcp.json # shared: project-scope MCP servers└── .claude/ ├── settings.json # shared: permissions, hooks, model, env ├── settings.local.json # git-ignored: personal overrides ├── agents/ │ └── security-reviewer.md # subagent: isolated context, tool allowlist, model ├── commands/ │ └── review.md # /review $ARGUMENTS ├── skills/ │ └── release-notes/SKILL.md # progressive-disclosure capability └── hooks/ └── guard.sh # PreToolUse guard (exit 2 blocks)CLAUDE.md travaillé (concis, imports pour le volume) :
# Payments ServiceBuild: `pnpm build` · Test: `pnpm test` · Lint: `pnpm lint`Never touch `migrations/` without a reviewed plan.Architecture and coding conventions: @docs/architecture.mdNever put secrets here; use the secret manager. See @docs/security.md.claude/settings.json travaillé :
{ "model": "claude-sonnet-5", "permissions": { "allow": ["Read", "Edit", "Bash(pnpm test:*)", "Bash(pnpm lint:*)", "Bash(git status)"], "deny": ["Bash(rm -rf:*)", "Read(./.env)", "Read(./secrets/**)"], "ask": ["Bash(git push:*)", "WebFetch"] }, "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [{ "type": "command", "command": "./.claude/hooks/guard.sh" }] } ], "PostToolUse": [ { "matcher": "Edit", "hooks": [{ "type": "command", "command": "./.claude/hooks/lint.sh" }] } ] }, "env": { "NODE_ENV": "test" }}| Exigence | Foyer correct | Pourquoi pas ailleurs |
|---|---|---|
| Commandes de build/test dont tout le monde a besoin | CLAUDE.md de projet | Le fichier user est par personne ; le fichier local est ignoré par git |
| Règle d’organisation obligatoire et non contournable | Managed policy | Les settings de projet peuvent être surchargés localement |
| Bloquer une commande destructrice de façon déterministe | PreToolUse hook (exit 2) | La prose de CLAUDE.md est probabiliste (#3) |
| Chemins de machine personnelle | CLAUDE.local.md | Ne doit pas être partagé/versionné |
| Serveur MCP partagé | .mcp.json de projet | La portée user est par personne |
| Secrets | Secret manager / env | CLAUDE.md et settings sont versionnés |
Signal d’examen
Quand un énoncé demande « où doit vivre X », mappez X sur deux axes : partagé vs personnel (versionné vs ignoré par git) et indicatif vs obligatoire (CLAUDE.md/prompt vs hook/managed policy). L’intersection est la réponse.
2.13 Les événements de hook en profondeur et la sémantique des codes de sortie
Chaque hook reçoit le JSON de l’événement sur stdin ; le code de sortie 2 bloque (stderr est renvoyé à Claude), le code 0 autorise, et les autres codes non nuls font remonter une erreur sans nécessairement bloquer. Faire correspondre l’événement à l’objectif est directement testé.
| Événement | Se déclenche | À utiliser pour |
|---|---|---|
PreToolUse | Avant qu’un outil ne s’exécute | Bloquer (exit 2) les actions dangereuses/non autorisées avant qu’elles ne surviennent |
PostToolUse | Après qu’un outil s’est exécuté | Réagir : linter un fichier édité, exécuter un formateur, journaliser |
UserPromptSubmit | Quand l’utilisateur soumet un prompt | Injecter du contexte, expurger des secrets, ajouter des garde-fous au prompt |
SessionStart | La session commence | Amorcer le contexte, afficher des infos d’environnement |
Stop | L’agent principal termine | Vérifications finales, nettoyage, notifications |
SubagentStop | Un subagent termine | Valider/agréger le résultat d’un subagent |
PreCompact | Avant la compaction | Persister vers un état durable tout ce qui doit survivre |
Notification | Claude Code envoie une notification | Router vers Slack/alertes de bureau |
#!/usr/bin/env bash# PreCompact hook: persiste le journal de décisions courant avant que la fenêtre ne soit compactée.input=$(cat)echo "$input" | jq -r '.transcript_summary // ""' >> ./.claude/decision-log.mdexit 0Bloquer avant, réagir après
Pour empêcher une action, vous devez utiliser PreToolUse avec exit 2 — un PostToolUse hook ne se déclenche qu’après que l’action a déjà eu lieu. Les intervertir est un distracteur classique.
2.14 Formats de sortie headless et gating par code de sortie en CI
claude -p prend en charge deux formats de sortie lisibles par machine. Bien choisir compte pour la conception de la CI.
--output-format | Forme | À utiliser quand |
|---|---|---|
json | Un objet résultat à la fin | Tâches courtes ; parser un objet de découvertes unique et barrer sur le code de sortie |
stream-json | Un flux d’événements JSON | Tâches longues ; montrer la progression, consommer au fil de l’eau |
text (par défaut) | Prose | Lecture humaine uniquement — pas pour le gating CI |
set -euo pipefailresult=$(claude -p "Review the diff for security issues; output JSON {findings:[{severity,file,line,note}]}." \ --output-format json \ --allowedTools "Read,Grep,Bash(git diff:*)")# Fait échouer le build si une découverte de sévérité élevée existe.echo "$result" | jq -e '.findings | map(select(.severity=="high")) | length == 0' >/dev/null \ || { echo "High-severity findings — failing build."; exit 1; }Barrez le pipeline sur à la fois le code de sortie du processus et les découvertes structurées parsées ; ne faites jamais de grep sur la prose.
Idées reçues fréquentes
| Idée reçue | Réalité | Pourquoi cela compte à l’examen |
|---|---|---|
| « CLAUDE.md peut faire respecter une règle. » | CLAUDE.md est un contexte indicatif ; l’application exige un hook ou une managed policy. | Hooks-vs-prompt (#3) est testé à répétition. |
| « Les settings de projet gagnent toujours. » | La managed policy surcharge tout et ne peut être surchargée. | Les items de précédence reposent sur le fait que la managed policy est au sommet. |
« allow et deny sont symétriques. » | deny bat toujours allow. | Items de résolution de conflit. |
| « Un PostToolUse hook peut bloquer une action. » | Seul PreToolUse (exit 2) bloque avant l’action ; PostToolUse réagit après. | Distracteur de sélection d’événement. |
| « Les Skills sont toujours chargés. » | Les Skills se chargent progressivement via leur description ; seul le contexte toujours actif appartient à CLAUDE.md. | Items de choix de mécanisme. |
| « Un CLAUDE.md plus gros = plus capable. » | CLAUDE.md coûte des tokens à chaque tour ; le gonflement augmente le coût et nuit au respect des instructions. | Items de maîtrise des coûts. |
« bypassPermissions est acceptable en CI si le repo est de confiance. » | Il supprime la sécurité ; une allowlist --allowedTools minimale est la posture CI correcte. | Items de moindre privilège en CI. |
| « Une slash command et un subagent sont interchangeables. » | Une slash command est un gabarit de prompt invoqué ; un subagent est un contexte isolé avec ses propres outils/modèle. | Distracteur de choix de mécanisme. |
Étude de scénario — standardiser une équipe sur Claude Code en toute sécurité
Situation. Une organisation de 40 ingénieurs adopte Claude Code. La sécurité impose que les fichiers de secrets de production ne soient jamais lisibles et que rm -rf ne soit jamais exécuté — pour tout le monde, sans surcharge locale. L’équipe plateforme veut des commandes de build/test et des conventions d’architecture partagées et disponibles pour tous, un moyen de bloquer les commits quand les tests échouent, une commande de revue de PR répétable, et un assistant de revue de diff qui ne peut jamais éditer ni pousser. Un ingénieur veut des notes personnelles qui restent hors du repo partagé. La CI doit relire les PR en headless et faire échouer les builds sur les problèmes de sévérité élevée sans être détournée par un contenu de diff malveillant.
Trace de raisonnement d’expert.
-
Règles de sécurité non contournables → managed policy. « Pour tout le monde, sans surcharge » est la définition d’une managed policy ; placez-y les règles
denypourRead(./secrets/**)etBash(rm -rf:*)(et étayez le blocage de commande destructrice par un PreToolUse hook managé sortant en 2). Rejetezsettings.local.json(par utilisateur, surchargeable) et la prose CLAUDE.md (#3). -
Conventions partagées →
CLAUDE.mdde projet versionné, gardé concis avec@importpour le volume. Rejetez le fichier user (par personne) etCLAUDE.local.md(ignoré par git). -
Tests-avant-commit → PreToolUse hook sur le commit qui exécute les tests et sort en 2. Rejetez une instruction CLAUDE.md (probabiliste) et une slash command (opt-in).
-
Revue répétable → slash command
.claude/commands/review.mdavec$ARGUMENTS. Rejetez un subagent (c’est pour des contextes délégués isolés, non un prompt nommé à la demande). -
Relecteur de diff qui ne peut pas éditer/pousser → subagent avec une allowlist de moindre privilège (
Read, Grep, Bash(git diff:*)). Rejetez « le lui dire dans le prompt » (style #3, contournable). -
Notes personnelles →
CLAUDE.local.mdignoré par git. -
CI headless →
claude -p --output-format jsonavec un--allowedToolsminimal, barrer sur le code de sortie + les découvertes parsées, jamaisbypassPermissions, pour qu’une instruction injectée dans le diff ne puisse pas exécuter du shell arbitraire.
Décision correcte à l’examen : managed policy + CLAUDE.md/settings versionnés + PreToolUse hooks + slash command + subagent de moindre privilège + fichier local pour les notes personnelles + JSON headless avec une allowlist étroite. Chaque option rejetée est un mécanisme utilisé pour la mauvaise tâche — la forme exacte des distracteurs D2.
Pièges d’examen dans ce domaine
| Piège | Pourquoi c’est faux |
|---|---|
Mettre une règle à l’échelle de l’équipe dans CLAUDE.local.md | Il est ignoré par git et personnel ; utilisez le CLAUDE.md de projet ou une managed policy |
| Appliquer « exécuter les tests avant le commit » via le texte de CLAUDE.md | Probabiliste ; utilisez un PreToolUse hook qui sort en 2 |
| Mettre des secrets dans CLAUDE.md | Il est généralement versionné ; utilisez env/secret manager |
| Donner tous les outils à un subagent | Viole le moindre privilège ; cadrez l’allowlist |
| Utiliser l’exécution directe pour un gros refactor inconnu | Utilisez le plan mode pour revoir l’approche d’abord |
| Toujours se fier au code de sortie 0 en CI | Barrez le pipeline sur le vrai code de sortie ; un code non nul doit faire échouer |
Utiliser bypassPermissions largement en CI | Supprime la sécurité ; utilisez une allowlist --allowedTools minimale |
| Faire un Skill pour quelque chose de nécessaire à chaque tour | Le contexte toujours nécessaire appartient à CLAUDE.md |
| Configurer un serveur MCP partagé à la portée user pour un repo d’équipe | Les serveurs partagés d’équipe vont dans .mcp.json de projet |
| Relire une énorme PR en une seule passe | Déborde le contexte ; partitionnez et agrégez (multi-passes) |
| Utiliser un PostToolUse hook pour bloquer une action | Seul PreToolUse (exit 2) bloque avant l’action |
Utiliser --output-format text et faire un grep en CI | Utilisez json/stream-json et barrez sur le code de sortie + les découvertes parsées |
| Mettre une règle obligatoire dans les settings de projet versionnés | Les settings de projet sont surchargeables localement ; utilisez une managed policy |
| Utiliser un subagent quand vous vouliez un prompt invoqué par son nom | C’est une slash command avec $ARGUMENTS |
Stocker des identifiants dans .claude/settings.json | Il est versionné ; utilisez env/secret manager |
Questions d’entraînement
Q1 · Une équipe veut que chaque ingénieur travaillant dans un repo connaisse les commandes de build et de test et les conventions d’architecture. Où cela devrait-il vivre ? (Sélectionnez une réponse)
A. Le ~/.claude/CLAUDE.md de chaque ingénieur.
B. Le ./CLAUDE.md de projet, versionné dans git.
C. CLAUDE.local.md.
D. Le system prompt de chaque session, saisi manuellement.
Réponse : B. Le contexte partagé et propre au repo appartient au CLAUDE.md de projet versionné. Les fichiers user (A) sont par personne, CLAUDE.local.md (C) est ignoré par git et personnel, et la saisie manuelle (D) ne passe pas à l’échelle.
Q2 · Une politique stipule que les identifiants de base de données de production ne doivent jamais être lisibles par Claude Code, pour tout le monde, sans surcharge. Quel est le mécanisme correct ? (Sélectionnez une réponse)
A. Une note dans le CLAUDE.md de projet demandant à Claude de ne pas les lire.
B. Une règle deny de settings de managed policy (par ex. Read(./secrets/**)), puisque la managed policy ne peut être surchargée.
C. Une règle deny de settings.local.json.
D. Une permission ask pour que l’utilisateur confirme chaque lecture.
Réponse : B. Les règles obligatoires et non contournables appartiennent à la managed policy, et deny l’emporte sur allow. Une note CLAUDE.md (A) est probabiliste. settings.local.json (C) est par utilisateur et surchargeable. ask (D) permet encore les lectures.
Q3 · Quel mécanisme garantit qu’un git commit est bloqué quand la suite de tests échoue ? (Sélectionnez une réponse)
A. Une instruction CLAUDE.md d’exécuter toujours les tests d’abord. B. Un PreToolUse hook correspondant à la commande de commit qui exécute les tests et sort en 2 en cas d’échec. C. Une slash command qui exécute les tests. D. Demander à Claude de penser à tester.
Réponse : B. Le code de sortie 2 d’un PreToolUse hook bloque l’action de façon déterministe. Toutes les options fondées sur le prompt (A, D) sont probabilistes ; une slash command (C) est opt-in et ne bloque pas les commits.
Q4 · Une capacité n’est nécessaire qu’occasionnellement, fournit un script d’aide, et ne devrait pas gonfler le contexte de chaque session. Quel mécanisme convient le MIEUX ? (Sélectionnez une réponse)
A. L’ajouter au CLAUDE.md de projet.
B. Un Skill (SKILL.md) chargé par divulgation progressive quand sa description correspond.
C. Une managed policy.
D. Une règle de permission deny.
Réponse : B. Les Skills se chargent progressivement selon leur description, gardant le contexte léger et permettant des scripts fournis. CLAUDE.md (A) est toujours chargé. Managed policy (C) et règles deny (D) sont sans rapport avec les capacités.
Q5 · Un subagent qui relit les diffs ne devrait jamais pouvoir éditer des fichiers ni pousser. Comment l’imposez-vous ? (Sélectionnez une réponse)
A. Le lui dire dans son system prompt de ne pas éditer.
B. Définir le subagent avec une allowlist d’outils qui exclut Edit et toute commande de push (par ex. tools: Read, Grep, Bash(git diff:*)).
C. Lui donner tous les outils et compter sur son bon comportement.
D. L’exécuter en plan mode manuellement à chaque fois.
Réponse : B. Le moindre privilège via l’allowlist d’outils du subagent est déterministe. Un prompt (A) est contournable, tous-les-outils (C) viole le moindre privilège, et le plan mode manuel (D) n’est pas une application.
Q6 · Un ingénieur doit faire un gros refactor multi-fichiers dans un service inconnu. Quelle est la MEILLEURE première étape dans Claude Code ? (Sélectionnez une réponse)
A. Exécution directe pour aller vite. B. Plan mode : exploration en lecture seule et un plan relisible avant toute édition. C. Supprimer les tests pour éviter les blocages. D. Augmenter max_tokens.
Réponse : B. Un travail volumineux, inconnu et multi-fichiers est exactement le cas où l’exploration en lecture seule et le plan préalable du plan mode réduisent le risque. L’exécution directe (A) saute la revue ; C est destructeur ; D est sans rapport.
Q7 · Un job de CI exécute Claude Code pour relire les PR et doit faire échouer le build en cas de problèmes et produire une sortie lisible par machine. Quelle invocation est correcte ? (Sélectionnez une réponse)
A. claude interactif, puis copier le résultat manuellement.
B. claude -p "…" --output-format json --allowedTools "Read,Grep,Bash(git diff:*)" et barrer le pipeline sur le code de sortie, en parsant le JSON.
C. claude -p "…" --permission-mode bypassPermissions avec tous les outils activés.
D. claude -p "…" sans format de sortie et faire un grep sur la prose.
Réponse : B. Le mode print headless avec sortie JSON, une allowlist d’outils minimale, et un gating sur le code de sortie est le patron correct en CI. L’interactif (A) n’automatise pas ; contourner les permissions avec tous les outils (C) est dangereux ; grep sur la prose (D) n’est pas fiable.
Q8 · Quels DEUX réglages implémentent correctement le moindre privilège pour une revue CI headless qui n’a besoin que de lire le code et les diffs ? (Sélectionnez deux réponses)
A. --allowedTools "Read,Grep,Bash(git diff:*)".
B. --permission-mode bypassPermissions.
C. Une règle deny pour Bash(rm -rf:*) et les écritures vers des chemins protégés.
D. Autoriser toutes les commandes Bash pour la flexibilité.
E. Accorder WebFetch et Edit au cas où.
Réponse : A et C. Une allowlist étroite plus des deny explicites sur les opérations dangereuses impose le moindre privilège. Contourner les permissions (B), autoriser tout Bash (D) et accorder des outils inutiles (E) élargissent tous le rayon d’impact.
Q9 · Une PR de 4 000 lignes doit être relue mais ne tient pas bien dans un seul contexte. Quelle est la MEILLEURE approche ? (Sélectionnez une réponse)
A. Tronquer le diff aux 500 premières lignes. B. Revue multi-passes : partitionner par fichier/module, relire chaque partition dans sa propre passe ou subagent, puis agréger et classer les découvertes. C. Utiliser un seul prompt géant avec tout le diff et espérer le meilleur. D. Sauter la revue pour les grosses PR.
Réponse : B. Partitionner-relire-agréger garde chaque contexte petit et préserve la qualité. La troncature (A) manque du code, un prompt géant (C) dégrade la qualité, et sauter (D) est inacceptable.
Q10 · Une équipe veut un serveur MCP disponible pour tous ceux qui clonent le repo. Où devrait-il être configuré ? (Sélectionnez une réponse)
A. La config MCP de portée user de chaque utilisateur.
B. Un .mcp.json de projet versionné à la racine du repo.
C. settings.local.json.
D. Codé en dur dans la prose de CLAUDE.md.
Réponse : B. Un .mcp.json de portée projet versionné dans le repo rend le serveur disponible pour toute l’équipe. La portée user (A) est par personne, local (C) est ignoré par git, et la prose CLAUDE.md (D) ne configure pas de serveurs.
Q11 · Pour réduire le coût dans un workflow Claude Code multi-subagents sans nuire à la qualité, quelles DEUX actions sont appropriées ? (Sélectionnez deux réponses)
A. Assigner Haiku 4.5 à un subagent de classification simple et réserver Opus 5 au codage difficile.
B. Mettre tout le wiki de l’entreprise dans CLAUDE.md.
C. Garder CLAUDE.md concis et utiliser @import pour le matériel de référence chargé seulement quand pertinent.
D. Désactiver le prompt caching.
E. Utiliser Opus 5 pour chaque subagent quelle que soit la tâche.
Réponse : A et C. Le modèle-par-subagent et un CLAUDE.md concis et compatible avec le cache réduisent le coût sans nuire à la qualité. Gonfler CLAUDE.md (B) augmente le coût par tour, désactiver le caching (D) augmente le coût, et Opus-partout (E) est du gaspillage.
Q13 · Une équipe a besoin d’un linter qui s’exécute automatiquement après que Claude a édité un fichier, et séparément a besoin que les commits soient bloqués quand les tests échouent. Quels événements de hook sont corrects pour chacun ? (Sélectionnez une réponse)
A. PostToolUse pour bloquer le commit ; PreToolUse pour linter. B. PreToolUse sur le commit (exécuter les tests, sortir en 2 en cas d’échec) pour bloquer, et PostToolUse sur Edit pour linter le fichier édité. C. UserPromptSubmit pour les deux. D. SessionStart pour linter et Stop pour exécuter les tests.
Réponse : B. Le blocage doit se faire avant l’action (PreToolUse, exit 2) ; le linting réagit après l’édition (PostToolUse). A intervertit les événements ; C est un événement de soumission de prompt inadapté au gating d’outils ; D se déclenche aux limites de session, non par commit/par édition.
Q14 · La managed policy fixe le modèle par défaut à Sonnet 5 ; un `.claude/settings.json` de projet fixe Opus 5 ; un fichier user fixe Haiku 4.5. Lequel gagne ? (Sélectionnez une réponse)
A. User (Haiku 4.5), parce qu’il est le plus personnel. B. Managed policy (Sonnet 5), parce que la managed policy ne peut être surchargée. C. Project (Opus 5), parce qu’il est le plus proche du code. D. Le fichier édité le plus récemment.
Réponse : B. La managed policy est l’autorité la plus élevée et surcharge local, project et user. A et C inversent la précédence ; D n’est pas la façon dont la résolution fonctionne.
Q15 · Un relecteur CI doit émettre des découvertes lisibles par machine pour une tâche courte et faire échouer le build sur les problèmes de sévérité élevée. Quel format de sortie et quel gating sont corrects ? (Sélectionnez une réponse)
A. --output-format text, puis grep pour « HIGH ».
B. --output-format json, parser les découvertes, et faire échouer sur à la fois un code de sortie non nul et toute découverte de sévérité élevée.
C. --output-format stream-json et ignorer le code de sortie.
D. Mode interactif avec un humain lisant la sortie.
Réponse : B. Un résultat JSON unique plus un gating code-de-sortie-et-découvertes est le patron correct en CI pour une tâche courte. Grep sur la prose (A) n’est pas fiable, ignorer le code de sortie (C) manque les échecs, et le mode interactif (D) n’automatise pas.
Q16 · Avant la compaction sur une longue session Claude Code, un journal de décisions courant doit être préservé vers un stockage durable. Quel événement de hook convient le MIEUX ? (Sélectionnez une réponse)
A. PostToolUse. B. PreCompact — il se déclenche avant la compaction, donc le journal peut être écrit vers un état durable d’abord. C. Notification. D. SessionStart.
Réponse : B. PreCompact est exactement le hook pour persister tout ce qui doit survivre à la compaction. PostToolUse (A) est par outil, Notification (C) est pour les alertes, et SessionStart (D) se déclenche au mauvais moment.
Q17 · Une équipe veut un serveur MCP de docs internes partagé pour tous ceux qui clonent le repo, tandis qu’un ingénieur utilise un serveur MCP personnel uniquement sur sa machine. Quelle configuration est correcte pour LES DEUX ? (Sélectionnez deux réponses)
A. Le serveur partagé dans un .mcp.json de projet versionné.
B. Le serveur partagé dans la config de portée user de chaque utilisateur.
C. Le serveur personnel ajouté à la portée local (claude mcp add, local par défaut).
D. Le serveur personnel dans le .mcp.json versionné.
E. Les deux codés en dur dans la prose de CLAUDE.md.
Réponse : A et C. Le .mcp.json de projet partage avec l’équipe ; la portée local garde un serveur personnel sur une seule machine. B rend le serveur partagé par personne, D partage le personnel avec tout le monde, et E (prose) ne configure pas de serveurs.
Q18 · Un énoncé propose de stocker les identifiants de base de données de production dans le bloc `env` du `.claude/settings.json` versionné pour que Claude Code puisse se connecter. Quelle est la critique correcte ? (Sélectionnez une réponse)
A. C’est bien car settings.json est local.
B. .claude/settings.json est versionné dans git, donc il ne doit jamais contenir de secrets ; utilisez le secret manager / l’injection d’environnement et ajoutez un deny sur la lecture des chemins de secrets.
C. Déplacer plutôt les identifiants dans le CLAUDE.md de projet.
D. Chiffrer les identifiants en base64 dans settings.json.
Réponse : B. Les fichiers versionnés ne doivent jamais porter de secrets ; utilisez un secret manager et refusez les lectures des chemins de secrets. A est faux (il est partagé), CLAUDE.md (C) est aussi versionné, et le base64 (D) est un encodage, non une protection.
Points clés à retenir
- CLAUDE.md se compose managed policy → user → project → subdirectory ; gardez-le concis, ne stockez jamais de secrets, et utilisez
@importpour la modularité. - settings.json se résout managed policy → local → project → user ;
denybatallow; utilisezaskpour les actions parfois lourdes de conséquences. - Les hooks sont déterministes : le code de sortie 2 bloque, JSON sur stdin/stdout, les événements couvrent tout le cycle de vie. Utilisez des hooks (non des prompts) pour les règles critiques, et PreToolUse (non PostToolUse) pour bloquer.
- Choisissez le mécanisme délibérément : CLAUDE.md (contexte toujours actif), Skill (capacité progressive à la demande), slash command (prompt invoqué), subagent (contexte/outils/modèle isolés), MCP (intégration externe).
- Les subagents reçoivent des allowlists d’outils de moindre privilège et un modèle par agent ; plan mode pour le travail volumineux/inconnu/risqué.
- CI headless :
claude -pavec--output-format json(court) oustream-json(long), un--allowedToolsminimal, et un gating du pipeline sur le code de sortie et les découvertes parsées — ne faites jamais de grep sur la prose. - Échelle d’équipe : settings de projet et
.mcp.jsonversionnés, managed policy pour les règles obligatoires,/costet modèles par subagent pour la maîtrise des coûts, revue multi-passes pour les grosses PR. - Mappez chaque question « où doit vivre X » sur deux axes — partagé vs personnel, indicatif vs obligatoire — pour choisir le fichier/mécanisme correct.
- Ne stockez jamais de secrets dans un fichier versionné (CLAUDE.md ou settings.json) ; utilisez un secret manager plus des règles
denysur les chemins de secrets.
Dernière mise à jour le 18 sept. 2026