MODULO 3.5

⚑ Hooks sincronos vs assincronos

Quando o hook bloqueia Claude e quando nao. Decisao arquitetural que afeta experiencia e correcao.

6
Topicos
35
Minutos
Tecnico
Nivel
Arquitetura
Tipo
1

πŸ”’ 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.
2

🏎️ 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.
3

πŸ› οΈ 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.

4

πŸ“ 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.

5

πŸ”„ 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.
6

πŸ“ 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

βœ“
Hooks sincronos bloqueiam β€” Claude espera resposta antes de seguir.
βœ“
Async e fire-and-forget β€” nohup + & para tarefas pesadas.
βœ“
SessionEnd quase sempre async β€” libera a proxima sessao rapido.
βœ“
Cap de 100ms para sync β€” acima disso usuario sente lag.

Proximo:

3.6 β€” Depuracao e logging de hooks