Quand les notifications de Claude Code cessent de fonctionner, la cause est presque toujours l'une de ces quatre : le hook n'est pas chargé, le hook s'exécute mais échoue, l'événement sur lequel tu comptes ne se déclenche pas au moment prévu, ou le système d'exploitation masque l'alerte. Lance /hooks dans Claude Code pour voir ce qui est chargé, démarre une session avec claude --debug pour voir ce que chaque hook a vraiment fait, puis vérifie les réglages de notification de ton ordinateur ou de ton téléphone. Si tu utilises Claude Code Notifier, ccn doctor et ccn test couvrent l'essentiel en deux commandes.
La checklist ci-dessous va de la cause la plus fréquente à la plus rare. Elle s'applique sur Mac, Windows et Linux.
011. Vérifie que Claude Code a chargé le hook
Tape /hooks dans le prompt de Claude Code. C'est un navigateur en lecture seule de tous les hooks chargés par Claude Code, avec pour chacun sa provenance : paramètres utilisateur, paramètres du projet, paramètres locaux, un plugin ou la session en cours. Sélectionne un hook pour voir la commande exacte et le fichier où il est défini.
Si ton hook n'est pas dans la liste :
- Le JSON est invalide. Les fichiers de paramètres sont en JSON strict. Une virgule finale ou un commentaire
//casse le fichier, et Claude Code affiche une Settings Error au démarrage suivant. Lanceclaude doctorpour voir les entrées rejetées par Claude Code. - Le fichier n'est pas au bon endroit. Les hooks personnels vont dans
~/.claude/settings.json(sous Windows,%USERPROFILE%\.claude\settings.json). Les hooks de projet vont dans.claude/settings.jsonà l'intérieur du projet. Lance/statuset regarde la ligneSetting sourcespour savoir quels fichiers ont été chargés. - Le nom de l'événement est faux. Les noms d'événements sont sensibles à la casse :
Notification,Stop,PermissionRequest. Un nom d'événement inconnu apparaît en Settings Warning et est ignoré. - Les hooks sont désactivés.
"disableAllHooks": truedans n'importe quel fichier de paramètres désactive tous les hooks. Si/hooksafficheOnly hooks from managed settings run here, ton organisation a activéallowManagedHooksOnlyet tes propres hooks ne s'exécuteront pas. - La modification n'a pas été prise en compte. Claude Code recharge normalement les paramètres tout seul. Si le hook n'apparaît pas au bout de quelques secondes, redémarre la session.
022. Accepte la confiance de l'espace de travail
En session interactive, Claude Code bloque les hooks de tous les fichiers de paramètres, y compris ton propre ~/.claude/settings.json, tant que tu n'as pas accepté la boîte de dialogue de confiance pour le dossier. Si tu l'as fermée, ou si tu es dans un dossier où tu n'as jamais ouvert Claude Code, tes hooks n'y tourneront pas. Lance claude dans ce dossier et accepte la boîte de dialogue.
033. Vérifie que l'événement se déclenche au moment où tu le crois
Beaucoup de notifications « cassées » sont en fait une question de timing. D'après la référence des hooks d'Anthropic :
Notification avec permission_promptUne demande de permission attend depuis environ six secondes sans que tu aies tapé quoi que ce soit. Chaque frappe remet le compteur à zéro.Notification avec idle_promptEnviron 60 secondes après que Claude a terminé, si tu n'as rien tapé et qu'aucun agent en arrière-plan ne tourne encore.StopÀ chaque fois que Claude finit de répondre. Pas en cas d'interruption. Les erreurs d'API déclenchent StopFailure à la place.PermissionRequestAu moment où Claude Code s'apprête à te demander une permission.Donc si tu testes un hook Notification en tapant dans le terminal, il risque de ne jamais se déclencher. Passe sur une autre fenêtre et attends. Pour une alerte dès la fin d'un tour, utilise Stop ; le guide du Stop hook explique tout.
Vérifie aussi ton mode de permission. Les versions récentes de Claude Code démarrent les sessions interactives en mode auto, où un classifieur approuve la plupart des actions sans demander. Pas de demande, donc pas de notification permission_prompt ni de hook PermissionRequest. Pour tester les alertes de permission, appuie sur Shift+Tab jusqu'à ce que la barre d'état affiche le mode manuel, puis demande à Claude de faire quelque chose qui nécessite une validation. Les modes de permission expliqués donne tous les détails.
Les matchers sont aussi sensibles à la casse. Un matcher PermissionRequest sur bash ne correspondra pas à l'outil Bash.
044. Lance la commande du hook toi-même
Copie la commande depuis /hooks et lance-la dans un terminal avec une entrée d'exemple :
echo '{"hook_event_name":"Stop","cwd":"/tmp","last_assistant_message":"done"}' | ./my-hook.sh
echo $?
Échecs fréquents :
command not found: utilise un chemin absolu vers le script, ou${CLAUDE_PROJECT_DIR}pour les scripts du projet.- Le script ne fait rien du tout : rends-le exécutable avec
chmod +x ./my-hook.sh. jq: command not found: installejq, ou parse le JSON avec Python ou Node.js.
055. Lis le log de debug
Lance Claude Code avec claude --debug. Rien de plus ne s'affiche dans le terminal ; le log va dans ~/.claude/debug/<session-id>.txt. Pour choisir le chemin, utilise claude --debug-file /tmp/claude.log et lance tail -f /tmp/claude.log dans un autre terminal. Si la session tourne déjà, /debug active les logs et t'indique où se trouve le fichier.
Cherche les lignes qui commencent par Hooks:. Chacune indique l'événement, la commande, comment elle s'est terminée (finished with status 0, timed out, failed to start) et sa durée. Pour plus de détails sur le matching, définis CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose.
Deux problèmes n'apparaissent qu'ici :
- Ton profil shell affiche quelque chose. Si
~/.bashrcou~/.zshrcexécute unechoet que le shell le charge, ce texte se retrouve devant la sortie JSON de ton hook, et Claude Code traite la sortie comme du texte brut. ChercheHook output does not start with {dans le log. Entoure la sortie du profil avecif [[ $- == *i* ]]; then ... fipour qu'elle ne s'exécute que dans les shells interactifs. - Aucun terminal où écrire. Sur Mac et Linux, les hooks de commande tournent sans terminal de contrôle. Un hook qui essaie de faire sonner la cloche ou d'écrire des séquences d'échappement dans
/dev/ttyéchoue en silence. Utilise plutôt une commande de notification de bureau, ou le paramètrepreferredNotifChannelde Claude Code, décrit dans le guide de la cloche du terminal.
066. Vérifie le système d'exploitation
Si le log de debug indique que le hook s'est terminé avec le statut 0 et que tu n'as quand même rien vu, c'est le système d'exploitation qui l'a masquée. Vérifie que l'app qui affiche l'alerte a le droit d'envoyer des notifications, et que Concentration (Mac), Ne pas déranger (Windows) ou l'option Ne pas déranger de ton bureau Linux est désactivé. Sous Linux, un daemon de notifications doit tourner.
Les commandes propres à chaque plateforme sont dans les guides pour macOS, Windows et Linux.
07Si tu utilises Claude Code Notifier
Claude Code Notifier est un outil indépendant (pas développé par Anthropic) qui installe un petit programme, ccn, sous forme de hooks Claude Code. Tout ce qui précède reste valable, car ccn est un hook comme un autre. Commence par ses propres vérifications :
ccn doctorvérifie les hooks, les identifiants, la connexion au serveur et la détection de présence. Corrige d'abord tout ce qu'il signale.ccn testenvoie une notification de test. Si elle arrive, le problème vient de l'événement ou d'un réglage, pas de la chaîne d'envoi.ccn devicesliste les téléphones appairés avec cet ordinateur. S'il n'y en a aucun, refais l'appairage avecccn pair; le guide d'appairage t'explique tout.ccn config showaffiche les réglages effectifs. Vérifie quenotify_on_done,notify_on_permissionetnotify_on_questionsont activés, et quequiet_hoursne couvre pas l'heure actuelle. Les réglages modifiés sur le téléphone arrivent sur l'ordinateur avecccn sync.
Certains comportements ressemblent à des bugs mais sont voulus :
- Tu es devant ton clavier. Si tu as tapé quelque chose dans les 30 dernières secondes, rien n'attend le téléphone et le terminal pose la question comme d'habitude. Avec
quiet_when_presentactivé (par défaut), le téléphone ne reçoit rien tant que tu es dans le terminal où tourne Claude, et une simple carte d'info si tu es actif dans une autre app. - Alertes en double ou manquantes sur Mac. Ne fais pas tourner l'ancienne app de barre de menus Mac et
ccnsur le même Mac. - Une longue absence. Si un téléphone ou un ordinateur n'est pas utilisé pendant 60 jours, le serveur supprime son appairage : il faut alors refaire l'appairage.
Sur le téléphone, vérifie que les notifications sont autorisées pour l'app, et que Concentration (iPhone) ou Ne pas déranger (Android) ne la rend pas silencieuse. Sur Android, l'optimisation de la batterie peut retarder les notifications de certaines apps ; si les alertes arrivent en retard, autorise l'app à fonctionner sans restriction dans ses paramètres de batterie. Si tu as modifié settings.json à la main, ccn doctor te dit si ses hooks sont toujours en place. ccn upgrade met à jour vers la dernière version.
08FAQ
Pourquoi mon Notification hook ne se déclenche-t-il que de temps en temps ?
Les types permission_prompt et idle_prompt se déclenchent quand tu sembles absent. permission_prompt attend environ six secondes sans frappe, et idle_prompt environ 60 secondes après que Claude a terminé. Si tu es en train de taper, ils sont différés. Utilise PermissionRequest ou Stop pour un signal immédiat.
Où se trouve le log de debug de Claude Code ?
Lance claude --debug et le log est écrit dans ~/.claude/debug/<session-id>.txt. Utilise claude --debug-file <path> pour choisir l'emplacement, ou /debug dans une session en cours.
ccn test fonctionne mais les vraies notifications n'arrivent pas. Pourquoi ?
La chaîne d'envoi fonctionne, donc regarde du côté des réglages et du timing. Vérifie notify_on_* et quiet_hours dans ccn config show, rappelle-toi que rien n'est envoyé quand tu es dans le terminal avec quiet_when_present activé, et vérifie le mode de permission dans Claude Code.