MODULO 3.4

๐Ÿ“ฌ Payload: stdin, stdout, additionalContext

A interface contratual entre Claude Code e seus hooks. O que entra, o que sai, o que e interpretado como injecao de memoria.

6
Topicos
35
Minutos
Tecnico
Nivel
Interface
Tipo
1

๐Ÿ“ฅ Input via stdin JSON

Todo hook recebe um JSON no stdin. O schema varia por evento, mas a forma e constante.

๐Ÿ“ Input tipico de SessionStart

{
  "hook_event_name": "SessionStart",
  "session_id": "abc-123",
  "cwd": "/home/user/projects/payments-v2",
  "transcript_path": "/home/user/.claude/.../session.jsonl"
}

Input tipico de UserPromptSubmit:
{
  "hook_event_name": "UserPromptSubmit",
  "session_id": "abc-123",
  "cwd": "/home/user/projects/payments-v2",
  "transcript_path": "...",
  "user_message": "Como configuro o webhook da Stripe?"
}

๐Ÿ’ก Parse em bash

INPUT=$(cat); CWD=$(echo "$INPUT" | jq -r '.cwd') โ€” jq resolve 90%. Ou use Python para casos complexos.

2

๐Ÿ“ค Output via stdout JSON

Hook responde escrevendo JSON no stdout. Claude Code le e interpreta os campos conhecidos.

๐Ÿ“ Output para injetar contexto

{
  "hookSpecificOutput": {
    "hookEventName": "SessionStart",
    "additionalContext": "Role: backend eng\nStack: Python, FastAPI"
  }
}

Output para bloquear tool (PreToolUse):
{
  "decision": "block",
  "reason": "Bash command contem 'rm -rf', politica interna bloqueia."
}

Output vazio (sem interferencia):
{}

โš ๏ธ Sempre JSON valido

Hook que retorna string vazia ou texto solto gera warning. Sempre {} se nao quer acao.

3

๐Ÿšจ Exit codes

Alem do stdout, exit codes carregam semantica. Util para gates simples sem precisar gerar JSON.

๐Ÿ”ข Semantica dos exit codes

Convencao:

  • โ€ข0: sucesso. Padrao.
  • โ€ข1: erro recuperavel. Claude loga e continua sem additionalContext.
  • โ€ข2: bloqueio duro (PreToolUse). Cancela a tool call.
  • โ€ข>2: erro critico. Claude pode abortar o hook.

๐Ÿ’ก Exit 2 para compliance

Em PreToolUse, exit 2 e a unica forma deterministica de bloquear uma ferramenta. Envie mensagem em stderr.

4

๐Ÿ“ Injetando texto: additionalContext

90% da Trilha 4 e sobre o que colocar nesse campo. E o canal de injecao de memoria.

๐Ÿ’‰ additionalContext: o que acontece

Quando voce retorna esse campo:

  • โ€ขClaude Code anexa o texto ao system prompt do proximo turno.
  • โ€ขO modelo recebe como se fosse parte das instrucoes do sistema.
  • โ€ขTem prioridade alta de atencao (similar ao CLAUDE.md).
  • โ€ขNao fica visivel para o usuario na interface.

๐Ÿ’ก Formato markdown funciona

Claude parseia markdown bem. Headers, bullets, code blocks โ€” tudo entendido naturalmente.

5

โฑ๏ธ Timeouts e limites

Hooks tem tempo limite. Estoure e voce perde a injecao silenciosamente.

๐Ÿ“Š Timeouts tipicos

  • SessionStart: ~30s (sessao espera)
  • UserPromptSubmit: ~10s (usuario espera)
  • PreCompact: ~20s (compactacao espera)
  • SessionEnd: sem limite se async, ~30s se sync

โš ๏ธ Chamada de API lenta

Script que chama Gemini sem timeout proprio pode estourar. Sempre: timeout=20 < timeout do hook.

6

๐Ÿงช Testando seu hook local

Ciclo de feedback curto = hook que funciona. Teste com echo antes de integrar.

๐Ÿ“ Teste local rapido

# 1. Prepare input de exemplo
cat > /tmp/hook_input.json <

๐Ÿ’ก 10x mais rapido

Testar via Claude Code demora ~10s por tentativa. Testar local demora 0.1s. Use local para iterar.

๐Ÿ“ Resumo do Modulo

โœ“
Input via stdin JSON โ€” sempre, em todos os eventos.
โœ“
Output via stdout JSON โ€” ou exit code para gates.
โœ“
additionalContext e o canal โ€” de injecao de memoria.
โœ“
Teste local com echo โ€” 10x mais rapido que via Claude.

Proximo:

3.5 โ€” Hooks sincronos vs assincronos