Aller au contenu principal

Hooks d'enforcement

Rules in CLAUDE.md → intentions. Hooks → guarantees.

Les hooks sont des scripts shell exécutés automatiquement par le harness Claude Code. Ils ne dépendent pas du raisonnement de Claude — ils s'exécutent inconditionnellement.


Cockpit §1 — heads-up display

Chaque réponse Claude s'ouvre sur une ligne d'en-tête générée par les hooks :

`[2026-04-20 15:12 | claude-sonnet-4-6] 🟢 M | 🦙❌ | 🔌❌`
ChampValeursSignification
timestampYYYY-MM-DD HH:MM:SSHorodatage machine
modelclaude-sonnet-4-6Modèle actif (extrait du transcript live)
Pastille🟢 optimal · ⬆️ upgrade · ⬇️ downgradeFit modèle/complexité (METRICS)
ModeM Anthropic direct · A proxy actifBasé sur healthcheck :4000/health réel
Ollama🦙✅ qwen3.5 · 🦙⚡ qwen3.5 · 🦙❌Intercept total · triage dynamique · off
Proxy🔌✅ · 🔌❌Port 4000 répond ou non

Un vrai tableau de bord pilote : modèle, coût, routage, infrastructure — en un coup d'œil.


Les rails actifs

#HookÉvénementCe qu'il fait
1routing-check.shUserPromptSubmitRouting modèle (live > transcript > cache), détection stack, diagnostic throttled 30 min, longueur session, §1 instruction cockpit
2model-metrics.shUserPromptSubmitAnalyse 5 derniers tours assistant → pastille 🟢/⬆️/⬇️ → §1 ENTÊTE FINAL avec vraie pastille + mode/Ollama/proxy
3detect-design-need.shUserPromptSubmitDétecte besoin UI/UX/design → propose Séréna 🎨
4guard-no-sign.shPreToolUse (commit)Bloque Co-Authored-By, --signoff
5guard-commit-french.shPreToolUse (commit)Bloque messages purement anglais
6guard-tests-before-push.shPreToolUse (push)Exige npm test vert avant push
7guard-review-auto.shPostToolUse (commit)Challenger : 100+ lignes, feat, 10 commits, archi
8guard-anti-loop.shPostToolUseDétecte 3+ tentatives identiques → STOP
9guard-hooks-reload.shPostToolUse (Edit/Write)Rappel rechargement si hooks/settings modifiés
10guard-qmd-first.shPreToolUse (Read)Redirige .md vers QMD avant lecture complète
11session-model.shSessionStartCache le modèle de session pour routing cross-hooks
12guard-no-force-push.shPreToolUse (push)Bloque git push --force

Principe de fonctionnement

Utilisateur envoie un message

UserPromptSubmit hooks (routing-check, model-metrics, detect-design)

Claude raisonne + choisit un outil

PreToolUse hooks s'exécutent
Exit 0 → l'outil s'exécute
Exit 2 → bloqué, message injecté dans le contexte

PostToolUse hooks s'exécutent

Mode A/M — logique de routage

Le mode est déterminé par un healthcheck réel, pas par la variable d'environnement ANTHROPIC_BASE_URL :

État proxyModeEn-tête
curl :4000/health répondA — Auto (proxy actif)🦙✅/🦙⚡ | 🔌✅
curl :4000/health timeoutM — Manuel (Anthropic direct)🦙❌ | 🔌❌

ANTHROPIC_BASE_URL=localhost:4000 + proxy éteint → affiche M de fait. La config ne ment pas.


Pastille METRICS — fit modèle/complexité

model-metrics.sh analyse les 5 derniers tours assistant et classe chaque outil utilisé :

CatégorieOutils
lowRead, Glob, Grep, NotebookRead
highAgent, WebSearch, WebFetch
mediumtout le reste (Edit, Write, Bash…)

Si 60%+ des tours sont high → complexité high. Si 60%+ sont low → complexité low. Sinon medium.

Complexité + ModèleVerdictPastille
high + opusoptimal🟢
high + sonnetlimite⬆️
medium + sonnetoptimal🟢
medium + opusléger surplus⬇️
low + haikuoptimal🟢
low + sonnetléger surplus⬇️

Challenger — le garde-fou automatique

Le hook guard-review-auto.sh détecte 5 situations :

TriggerSignalAction proposée
100+ lignes modifiéesVolume élevé/review-copilot ou /angle-mort
Commit feat: / refactor:Feature terminée/angle-mort avant de continuer
10 commits sans reviewEndurance/angle-mort pause minimale
Fichier architecturant crééChoix structurant/review-copilot validation
3+ tentatives échouéesBoucleSTOP, changer d'approche

Le Challenger propose, il ne bloque pas. Exit code 0 toujours.


Tests des hooks

npm test

Amine 🧪 (test/hooks.js) — 58 tests couvrant routing, METRICS, mode M/A, Ollama, race condition inter-hooks, gate handoff. Doit passer avant tout push.