π O que e sincrono
Hook sincrono bloqueia Claude ate retornar. Todo hook que retorna additionalContext e sincrono por natureza.
β³ Caracteristicas de sync
Por que bloqueia:
- β’Claude precisa do additionalContext ANTES de gerar proxima resposta.
- β’Nao faz sentido gerar resposta e depois corrigir com contexto.
- β’Latencia e percebida pelo usuario como 'Claude lento'.
- β’OrΓ§amento de latencia deve ser rigoroso: <100ms ideal, <300ms aceitavel.
ποΈ O que e assincrono
Hook assincrono dispara processo em background e retorna imediato. Claude nao espera.
π Quando usar async
Casos tipicos:
- β’SessionEnd: resumir sessao via Gemini (10+ segundos). Nao trava proxima sessao.
- β’PostCompact: logar metricas de compactacao. Observacao pura.
- β’Indexacao: rebuild de embedding de memoria. Pesado mas nao urgente.
- β’Notificacoes externas: Slack, email, webhook. Cada um com seu timeout.
π οΈ Padrao: nohup + desacoplamento
O padrao classico para tornar qualquer hook assincrono: dispare em background e retorne imediatamente.
π Hook sync que dispara async
#!/usr/bin/env bash
# Hook sincrono que roda trabalho pesado em background
set -e
# Dispara trabalho pesado em background
nohup python3 ~/.memory/jobs/heavy_summarizer.py \
> /tmp/summarizer.log 2>&1 &
# Retorna imediato (sync)
echo '{}'π‘ Timeout externo tambem
Dentro do heavy_summarizer.py, use timeout 60 para nao deixar pendurado se API cair.
π OrΓ§amento de latencia
Regra dura: <100ms para sync. Acima disso, sensacao de lag. Acima de 2s, usuario acha que travou.
π Tabela de percepcao
- <100ms: imperceptivel. Usuario nao nota.
- 100-300ms: perceptivel mas aceitavel. Tolerado se ganho claro.
- 300ms-1s: sensivel. Usuario comeca a estranhar.
- 1-3s: lag. Pergunta se quebrou.
- >3s: inaceitavel. Comando vira 'travado'.
π‘ Medicao
Adicione time no inicio e fim do hook. Log da duracao por execucao.
π Lock e concorrencia
Duas sessoes abertas simultaneamente podem escrever no mesmo arquivo. Race condition corrompe memoria.
π Solucoes de locking
Em ordem de simplicidade:
- β’flock:
flock ~/.memory/context.md.lock command. Uma linha. - β’Atomic write: escrever em temp + mv. POSIX garante atomicidade do rename.
- β’Append-only: nunca sobrescrever. Novos eventos sempre no fim.
- β’SQLite: ja trata locking internamente. Use quando escalar.
π Escolhendo sync/async por hook
Regra pratica para decidir no dia-a-dia:
β Sincrono (precisa do output)
- βSessionStart (precisa injetar contexto)
- βPreCompact (precisa antes do squeeze)
- βUserPromptSubmit (precisa antes da resposta)
- βPreToolUse para gates (bloquear ou nao)
β Asincrono (nao precisa esperar)
- βSessionEnd (proxima sessao nao depende)
- βPostToolUse (observacao pura)
- βPostCompact (metricas nao urgentes)
- βStop em tarefas pesadas de analise
π Resumo do Modulo
Proximo:
3.6 β Depuracao e logging de hooks