Maîtriser Claude Code — De zéro à 10x — 5. Pose un garde-fou : les hooks

17 min read min de lecture
Chapitre 05

Pose un garde-fou : les hooks

Chapitre 5 sur 10 · 50%

Objectifs de ce chapitre

  • Comprendre ce qu’est un hook et quand il se déclenche
  • Distinguer les 3 types de hooks
  • Construire un quality gate qui bloque les publications non conformes

Le risque : publier une erreur

Ton skill rédige et publie. Mais que se passe-t-il si un post contient un tiret long que tu détestes, dépasse la limite de caractères de la plateforme, ou part sur Instagram sans image ? Pour l'instant, rien ne l'arrête. Tu pourrais relire chaque post à la main — mais alors à quoi bon automatiser ? Tu pourrais ajouter « vérifie bien avant de publier » dans le skill — mais une instruction dans un prompt reste probabiliste : le modèle la suit presque toujours, et « presque » ne suffit pas quand l'erreur est publique et instantanée.

Il te faut un garde-fou d'une autre nature : une vérification qui s'exécute systématiquement, que Claude ne peut ni oublier ni contourner. C'est exactement ce que sont les hooks.

C'est quoi un hook ?

Un hook exécute du code à des moments clés du cycle de vie de Claude Code. Il se déclenche automatiquement : tu n'as pas à penser à l'appeler, et Claude n'a pas à penser à le respecter — il s'impose à lui. Un hook peut formater des fichiers après modification, bloquer une commande avant son exécution, injecter du contexte au démarrage d'une session, ou notifier quand une tâche se termine.

Les moments de déclenchement (les « événements ») couvrent tout le cycle de vie : avant qu'un outil s'exécute (l'événement PreToolUse — c'est lui qui nous intéresse pour bloquer une publication), après son exécution (PostToolUse — parfait pour reformater un fichier modifié), à la soumission de ton message, au démarrage de la session, ou quand Claude termine sa réponse. Chaque hook est associé à un événement et, optionnellement, à un filtre (par exemple : seulement les commandes Bash qui contiennent « publish »).

La différence cruciale avec une instruction de prompt : une instruction est probabiliste (suivie presque toujours), un hook est déterministe (exécuté toujours). Pour tout ce qui est non négociable — qualité, sécurité, conformité — c'est un hook qu'il faut, pas une consigne.

Les trois façons de valider

Command hookLance un script shell. Rapide, déterministe et gratuit en tokens — mais la logique doit être programmable simplement. Idéal pour : limites de caractères, mots bannis, fichiers manquants.
Prompt hookUn LLM lit la commande et son contexte, comprend le contenu nativement et rend une décision pass/fail. Idéal pour les critères flous : « ce post est-il dans le ton de la marque ? »
Agent hookUn subagent multi-tours qui peut lire des fichiers, exécuter des commandes et raisonner sur une validation en plusieurs étapes. Le plus puissant et le plus coûteux : pour les vérifications complexes.

La règle de choix : prends le moins puissant qui suffit. Vérifier une limite de caractères avec un agent hook, c'est sortir le bulldozer pour planter une salade — lent, cher, et plus fragile. Notre quality gate combine des règles simples et objectives : un command hook est le bon outil.

Où vivent les hooks

Les hooks se configurent dans tes fichiers de réglages (.claude/settings.json pour les partager avec le projet, ou settings.local.json pour toi seul). La structure associe un événement, un filtre (« matcher ») et la commande à lancer. Voici la forme générale d'un hook qui se déclenche avant les commandes Bash :

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "node .claude/hooks/quality-gate.js"
          }
        ]
      }
    ]
  }
}

Le mécanisme de blocage est élégant de simplicité : le script du hook reçoit les détails de l'action en entrée, et son code de sortie décide de la suite. Sortie 0 : tout va bien, l'action continue. Sortie 2 : l'action est bloquée, et ce que le script a écrit sur la sortie d'erreur est renvoyé à Claude — qui le lit et corrige. Le hook ne se contente donc pas de dire non : il explique pourquoi, et Claude utilise cette explication pour réparer.

Comme pour les skills, tu n'écris pas cette configuration à la main : tu décris le garde-fou voulu et Claude crée le script et la configuration. Mais comprendre le mécanisme (événement → script → code de sortie) te permet de déboguer en deux minutes au lieu de deux heures.

Construire le quality gate

On crée un hook qui se déclenche avant toute publication et vérifie le contenu. S'il échoue, la commande est bloquée et Claude voit précisément quoi corriger :

PROMPT
crée un command hook qui se déclenche avant toute commande Bash de publication.

le hook vérifie le contenu du post :
- tirets longs (à remplacer par « ... »)
- dépassement de la limite de caractères de la plateforme
- média manquant pour les plateformes qui en exigent un
- mots bannis de mon guide de voix de marque

si une vérification échoue : bloque la commande et affiche précisément quoi corriger.
flowchart TD
  P["Tentative de publication"] --> H{"Hook : quality gate"}
  H -->|"Conforme"| OK["Publication"]
  H -->|"Non conforme"| KO["Bloqué + liste des corrections"]
  KO --> F["Claude corrige le contenu"]
  F --> P
Le garde-fou : rien ne part tant que le contenu n'est pas conforme.

Observe la boucle dans le diagramme : bloqué ne veut pas dire mort. Claude lit le message d'erreur, corrige le contenu et retente — le plus souvent sans aucune intervention de ta part. Le garde-fou ne ralentit pas le système : il le rend auto-correcteur.

Tester le hook (en provoquant l'échec)

Un garde-fou non testé est un garde-fou décoratif. La méthode : provoquer volontairement chaque type d'échec et vérifier le blocage. C'est le même réflexe qu'un développeur qui teste ses cas d'erreur, pas seulement son chemin heureux :

text
teste le hook sur un tweet qui dépasse la limite de caractères

teste le hook sur un post instagram sans image

teste le hook sur un post contenant le mot "révolutionnaire"

Pour chaque test, la sortie doit indiquer que l'action a été bloquée (« validation échouée ») avec la raison exacte. Si un cas passe alors qu'il devrait bloquer, c'est maintenant qu'on l'apprend — pas le jour où un post non conforme part en production. Parfait : ton pipeline ne publiera jamais un contenu non conforme.

Au-delà du quality gate

Une fois le mécanisme compris, les hooks deviennent un réflexe pour tout ce qui doit être systématique. Quelques usages classiques : reformater automatiquement chaque fichier modifié (PostToolUse), interdire toute commande touchant à un dossier sensible, charger l'état du projet au démarrage de session, ou envoyer une notification quand une longue tâche se termine. La question à se poser est toujours la même : « est-ce que je veux que ça arrive à chaque fois, sans dépendre de la mémoire de qui que ce soit ? » Si oui, c'est un hook.

Pour Léa, ce chapitre change la nature de son système : avant, l'automatisation était rapide mais demandait sa relecture ; maintenant elle est rapide et digne de confiance. C'est ce qui rendra possible le passage à l'échelle des deux prochains chapitres — on ne parallélise que ce qu'on a sécurisé.

🛠️ À toi de jouer

Contexte

Léa a banni le mot « révolutionnaire » de sa communication et exige toujours une image sur Instagram — deux règles non négociables qu'elle ne veut plus jamais vérifier à la main. Tu mets en place le garde-fou, puis tu joues le rôle du testeur méchant : ton objectif est de faire passer un post non conforme. Si tu n'y arrives pas, le garde-fou est bon.

Consignes

  1. Crée le quality gate avec le prompt fourni dans le chapitre.
  2. Ouvre la configuration générée dans .claude/settings.json et repère l’événement, le matcher et le script appelé.
  3. Demande un post Instagram sans image et vérifie qu’il est bloqué avec un message explicite.
  4. Génère un post contenant « révolutionnaire » et vérifie le blocage + le message de correction.
  5. Provoque un dépassement de la limite de caractères Twitter et observe la boucle : blocage → correction par Claude → nouvelle tentative.
  6. Vérifie qu’un post parfaitement conforme passe sans friction.
  7. Ajoute une règle de ton cru (par exemple : interdire les points d’exclamation multiples) et reteste.
Indice — Un command hook est le choix le plus simple pour valider du contenu textuel : règles objectives, exécution rapide, zéro token consommé.

En résumé

  • Une instruction de prompt est probabiliste ; un hook est déterministe : il s’exécute à chaque fois, sans exception.
  • Les hooks s’accrochent aux événements du cycle de vie : avant un outil (PreToolUse), après (PostToolUse), au démarrage de session…
  • 3 types : command (script shell), prompt (décision LLM), agent (validation multi-étapes) — prends le moins puissant qui suffit.
  • La configuration vit dans .claude/settings.json ; un code de sortie 2 bloque l’action et renvoie l’explication à Claude.
  • Le quality gate bloque les publications non conformes et rend le pipeline auto-correcteur : Claude lit l’erreur et répare.
  • Teste un hook en provoquant volontairement chaque échec — un garde-fou non testé est décoratif.
  • Il s’applique à tous tes skills sans configuration supplémentaire, et il s’appliquera aussi aux subagents du chapitre suivant.

Quiz — vérifie ta compréhension

1. Quelle est la caractéristique principale d’un hook ?

Un hook se déclenche tout seul (ex. avant une publication), sans que tu aies à l'appeler.

2. Quel type de hook est le plus simple pour valider du texte ?

Un command hook suffit pour des vérifications de contenu déterministes.

3. Pourquoi un hook plutôt qu’une instruction « vérifie avant de publier » dans le skill ?

Pour le non négociable (qualité, sécurité), il faut une garantie d'exécution systématique — c'est la définition d'un hook.

4. Comment un command hook bloque-t-il une action ?

Code de sortie 0 : l'action continue. Code 2 : action bloquée, et Claude lit l'explication pour corriger puis retenter.

5. Quel événement utilises-tu pour vérifier un contenu AVANT sa publication ?

PreToolUse se déclenche avant l'exécution d'un outil : c'est le bon moment pour inspecter et éventuellement bloquer une commande de publication.

Auteur(s)

R

REHOUMA Haythem

Haythem Rehouma est un ingénieur et architecte IA et cloud, formateur et enseignant technique, avec un profil orienté IA médicale, AWS, MLOps, LLM/RAG et vision par ordinateur.