MODULO 3.6

๐Ÿ› Depuracao e logging de hooks

Como saber se seu hook disparou, o que ele recebeu e o que retornou. Runbook de 10 bugs mais comuns.

6
Topicos
35
Minutos
Tecnico
Nivel
Operacional
Tipo
1

๐Ÿ“ Log para arquivo em append

A primeira linha de qualquer hook seu deve ser um log. Unica linha resolve 90% dos 'nao disparou'.

๐Ÿ“ Padrao de log

#!/usr/bin/env bash
# Hook com log de disparo

LOG="$HOME/.claude/hook.log"
INPUT=$(cat)

echo "$(date '+%Y-%m-%d %H:%M:%S') [$(basename $0)] fired" >> "$LOG"
echo "  input: $(echo $INPUT | tr -d '\n' | head -c 200)" >> "$LOG"

# ... resto do hook

๐Ÿ’ก Rotacao simples

Uma vez por mes, mv hook.log hook.log.$(date +%Y-%m). Evita arquivo gigante.

2

๐Ÿ” tail -f no log

Com o log em lugar, terminal dedicado para tail vira seu monitor.

๐Ÿ“ Setup de monitoramento

# Terminal 1: seu Claude Code rodando

# Terminal 2: monitor de hooks
tail -f ~/.claude/hook.log

# Cada disparo aparece instantaneo:
# 2026-04-23 10:15:32 [session_start.sh] fired
#   input: {"cwd":"/home/user/proj",...}
# 2026-04-23 10:16:45 [user_prompt.sh] fired
#   input: {"user_message":"Como deploy?",...}

๐Ÿ’ก Filtrar por hook

tail -f hook.log | grep session_start para isolar um hook especifico.

3

๐Ÿšจ stderr para mensagens

stderr do hook aparece no Claude. Use para debug inline, sem trocar de janela.

๐Ÿ’ฌ Mensagens inline

Como usar:

  • โ€ขecho 'debug info' >&2 na bash.
  • โ€ขsys.stderr.write('info\n') em Python.
  • โ€ขClaude exibe como aviso na sessao, nao afeta a logica.
  • โ€ขUso: notificar 'hook disparou', 'API cai, usando fallback', 'memoria injetada: 400 tokens'.
4

๐Ÿงช Teste isolado: mock input

Reproduza exatamente o que Claude Code manda. Em 5 segundos voce sabe se o hook funciona.

๐Ÿ“ Mock input files

# Mocks organizados por evento
mkdir -p ~/.memory/test-mocks

# session_start.json
cat > ~/.memory/test-mocks/session_start.json < ~/.memory/test-mocks/user_prompt.json <

๐Ÿ’ก Versione os mocks

Adicione ao git. Outros no time rodam os mesmos testes. Base para regression.

5

๐Ÿ“Š Metricas: quantas vezes disparou

Contador simples revela padroes inesperados. Exemplo: PreCompact disparando mais do que voce achava.

๐Ÿ“ Contador simples

#!/usr/bin/env bash
# Hook que conta disparos

COUNTER="$HOME/.memory/counters/$(basename $0).count"
mkdir -p $(dirname $COUNTER)

# Incrementa atomico
(flock 9; echo $(($(cat $COUNTER 2>/dev/null || echo 0) + 1)) > $COUNTER) 9<>$COUNTER.lock

# Resto do hook...

# Ver metricas
# $ ls -1 ~/.memory/counters/
#   session_start.sh.count: 42
#   pre_compact.sh.count: 7
#   user_prompt.sh.count: 128

๐Ÿ“Š O que medir

  • Disparos por dia: alinha com volume de uso
  • Taxa de PreCompact: indica quanto suas sessoes crescem
  • Ratio user_prompt / session_start: mensagens por sessao
  • Falhas (exit >0): hooks quebrando silenciosamente
6

๐Ÿฉน Os 10 bugs mais comuns

Checklist direto. Percorra quando seu hook nao disparar ou disparar errado.

๐Ÿ“ Runbook

1. Script nao executavel     โ†’ chmod +x
2. Shebang errado            โ†’ #!/usr/bin/env bash no topo
3. Path relativo             โ†’ usar $CLAUDE_PROJECT_DIR ou ~
4. JSON invalido no output   โ†’ validar com jq
5. Permissao nao concedida   โ†’ settings 'permissions.allow'
6. Nome de evento errado     โ†’ case-sensitive (SessionStart)
7. Matcher nao bate          โ†’ '' para sempre, ou regex especifico
8. Timeout estourado         โ†’ usar nohup+& para trabalho pesado
9. stderr poluido            โ†’ so avisos uteis, nao prints de debug
10. Concurrency em arquivo   โ†’ flock ou atomic write

๐Ÿ’ก Quando travar

Abra 3 terminais: 1) Claude Code, 2) tail -f hook.log, 3) echo input | hook.sh. Uma fonte de informacao em cada. Debug vai rapido.

๐Ÿ“ Resumo do Modulo

โœ“
Log em append โ€” uma linha resolve 90% dos 'por que nao disparou?'.
โœ“
tail -f no log โ€” feedback de 1 segundo.
โœ“
stderr aparece no Claude โ€” use para debug inline.
โœ“
10 bugs comuns โ€” checklist economiza horas.

Proximo:

Trilha 4 โ€” Os 3 hooks criticos