Descomplica Ads
Marketing Digital

Memória Permanente no Claude Code: o Hook que Resolve o Esquecimento

Anna Clara Por Anna Clara · Publicado em 23/08/2026 · 9 min de leitura
⚡ Resposta rápida: O Claude Code esquece tudo ao fechar o terminal e o CLAUDE.md só carrega na pasta certa. Veja o hook SessionStart que carrega contexto, princípios e memórias sozinho — com o código pronto para copiar.
Memória Permanente no Claude Code: o Hook que Resolve o Esquecimento

O Claude Code esquece tudo quando você fecha o terminal

Você explica o projeto, ele entende, resolve, entrega. No dia seguinte você abre e ele não sabe mais nada — nem o que é o projeto, nem o que vocês decidiram, nem o erro que você já mandou ele não repetir três vezes.

Se você usa o Claude Code no dia a dia, já passou por isso. E a resposta que todo mundo dá — "usa o CLAUDE.md" — resolve pela metade, por um motivo que quase ninguém explica.

Neste artigo eu mostro por que o CLAUDE.md falha justamente quando você mais precisa, e o hook de 40 linhas que faz o Claude carregar tudo sozinho, antes da sua primeira palavra, venha a sessão de onde vier. O código está pronto para copiar.

Por que o CLAUDE.md não é suficiente

O CLAUDE.md é o arquivo de contexto do projeto. Você escreve nele o que o Claude precisa saber e ele carrega no começo da sessão. Funciona — quando o terminal abre na pasta certa.

E é aí que mora o problema. Ninguém abre o terminal na pasta certa toda vez. Você abre onde parou ontem, ou clica num atalho, ou o editor abre por você numa subpasta. O arquivo existe, está bem escrito, e simplesmente não carrega.

Cansado de decidir campanha no achismo? As 10 ferramentas da Central Ads — calculadoras, diagnósticos e simuladores — fazem a conta por você.

A parte que quase ninguém sabe: o Claude Code guarda a memória automática por diretório. Abrir em ~/projeto e em ~/projeto/sub cria duas memórias completamente separadas. Você jura que ele esqueceu tudo — na verdade ele está lendo a memória errada, que está vazia.

O dia que eu perdi por causa de um ponto

Descobri isso do jeito mais caro possível. Passei um dia inteiro construindo um sistema de agendamento de posts para o Instagram: fila de aprovação, publicador via API, guia de credenciais, exportação de arquivos.

No fim do dia descobri que eu já tinha esse app pronto. Funcionando, no ar, conectado havia semanas.

O Claude não sabia que existia porque a sessão tinha aberto em Documents/.claude — com um ponto na frente — em vez de Documents/claude. Duas pastas, duas memórias. A que ele leu tinha 9 notas; a real tinha 42.

E o pior nem foi o app. Quando fui olhar a memória certa, todos os erros daquele dia já estavam documentados lá dentro: a regra de usar o app próprio, o checklist de automação, até o detalhe de que o sistema já normaliza acentos. Um dia inteiro redescobrindo, na marra, o que já estava escrito.

A solução: um hook que roda sempre

O Claude Code tem um evento chamado SessionStart. Ele dispara quando a sessão começa, antes da sua primeira mensagem — e, ao contrário do CLAUDE.md, não depende do diretório.

Um script conectado nesse evento lê os arquivos que você quiser e injeta o conteúdo direto no contexto. O resultado é este, abrindo de qualquer pasta:

▐▛███▛█ Claude Code v2.1.241
▝▜██████▀ Opus 5 (1M context)

✓ Contexto carregado: 41 memórias, princípios e contexto operacional.

Você não digita nada. Não escolhe pasta. Não confere.

O código do hook

Salve como ~/.claude/hooks/contexto.py. A única coisa que você precisa mexer é o bloco CONFIGURE AQUI, apontando para os seus arquivos.

contexto.py
# -*- coding: utf-8 -*-
import io, json, os, sys

# O stdout do Windows e cp1252 e quebra em emoji. Sem isto o hook
# morre calado e a sessao comeca sem contexto.
try:
    sys.stdout.reconfigure(encoding="utf-8")
except Exception:
    pass

# ===================== CONFIGURE AQUI =====================
BASE    = os.path.expanduser("~/meu-projeto")
MEMORIA = os.path.expanduser("~/meu-projeto/memoria")

# (rotulo, caminho, limite de caracteres)
FONTES = [
    ("COMO TRABALHAR",       os.path.join(BASE, "PRINCIPIOS.md"), 6000),
    ("INDICE DO QUE EU SEI", os.path.join(MEMORIA, "INDICE.md"),  8000),
    ("CONTEXTO DO PROJETO",  os.path.join(BASE, "CONTEXTO.md"),   9000),
]
# ==========================================================

def ler(caminho, limite):
    try:
        with io.open(caminho, encoding="utf-8") as f:
            txt = f.read().strip()
    except Exception:
        return None
    if len(txt) > limite:
        txt = txt[:limite] + "\n\n[...truncado]"
    return txt

def main():
    partes, faltando = [], []
    for rotulo, caminho, limite in FONTES:
        txt = ler(caminho, limite)
        if txt is None:
            faltando.append(os.path.basename(caminho))
            continue
        partes.append("=" * 70 + "\n" + rotulo + "\n" + "=" * 70 + "\n\n" + txt)

    if not partes:
        sys.exit(0)   # nada a injetar: sai limpo, sem quebrar a sessao

    contexto = ("CONTEXTO CARREGADO AUTOMATICAMENTE - leia antes de "
                "responder ou construir qualquer coisa.\n\n" + "\n\n".join(partes))

    aviso = "OK Contexto carregado (%d de %d fontes)." % (len(partes), len(FONTES))
    if faltando:
        aviso += "  Nao encontrei: " + ", ".join(faltando)

    print(json.dumps({
        "hookSpecificOutput": {
            "hookEventName": "SessionStart",
            "additionalContext": contexto,
        },
        "systemMessage": aviso,
        "suppressOutput": True,
    }, ensure_ascii=False))

if __name__ == "__main__":
    main()

Como instalar em 3 passos

1

Salve o script

Crie a pasta hooks dentro de ~/.claude/ e salve o arquivo como contexto.py. No Windows o caminho é C:\Users\SEU_USUARIO\.claude\hooks\.

2

Aponte para os seus arquivos

No bloco CONFIGURE AQUI, troque os caminhos pelos seus. Os limites em caracteres existem para o contexto não engolir a janela — três arquivos nesse tamanho dão cerca de 4 mil tokens, o que é barato pelo que resolve.

3

Ligue no settings.json

Abra ~/.claude/settings.json e acrescente o bloco abaixo, sem apagar o que já existe.

~/.claude/settings.json
{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python \"C:\\Users\\SEU_USUARIO\\.claude\\hooks\\contexto.py\"",
            "timeout": 15,
            "statusMessage": "Carregando contexto..."
          }
        ]
      }
    ]
  }
}

No Mac e no Linux, troque o comando por python3 ~/.claude/hooks/contexto.py. Feche o terminal, abra de novo, e a mensagem de contexto carregado deve aparecer.

A outra metade do problema: a escrita

O hook resolve a leitura. Mas as memórias que o Claude cria durante a sessão continuam sendo gravadas na pasta de onde você abriu — ou seja, a armadilha continua de pé, só que ao contrário.

A correção é uma linha no mesmo settings.json:

settings.json — memória fixa
"autoMemoryDirectory": "C:\\Users\\SEU_USUARIO\\meu-projeto\\memoria"

Com o caminho absoluto, ele lê e escreve sempre no mesmo lugar. O diretório de onde você abre deixa de importar — que era o problema inteiro.

O que colocar em cada arquivo

ArquivoO que vai dentro
PRINCIPIOS.mdComo ele deve trabalhar. Entender antes de executar, não complicar o simples, ser cirúrgico, perseguir o objetivo em vez da tarefa. Acrescente os seus erros reais — é isso que separa um arquivo que funciona de uma lista de boas intenções.
INDICE.mdUma linha por assunto, apontando para a nota completa. Ele lê o índice sempre e abre a nota quando o assunto aparece. A linha precisa dizer do que se trata e por que importa, não só o título.
CONTEXTO.mdOs números e regras que você repete toda semana: preços, prazos, o que nunca fazer, onde as coisas moram.

Perguntas frequentes

Isso não gasta muito contexto? Cerca de 4 mil tokens por sessão. Você gasta mais que isso explicando tudo de novo — e explicando pior, porque esquece metade.

Funciona em projeto grande? Sim, por causa dos limites por arquivo. Um índice enxuto apontando para notas completas funciona melhor do que despejar tudo de uma vez.

E se um arquivo não existir? O hook avisa quais faltaram e carrega o resto. Ele nunca quebra a abertura da sessão.

Preciso digitar algum comando? Não. É exatamente esse o ponto: se você precisasse lembrar de digitar, o problema continuaria de pé.

Serve para outros assistentes de código? O evento SessionStart é específico do Claude Code. A ideia — carregar contexto por gancho em vez de depender do diretório — vale para qualquer ferramenta que tenha eventos de ciclo de vida.

O que muda no dia a dia

Depois de instalado, a diferença aparece no primeiro pedido. Em vez de explicar o projeto antes de qualquer coisa, você já começa pedindo o que precisa — e ele responde sabendo o que existe, o que já foi decidido e o que deu errado antes.

No meu caso, o teste real foi abrir de propósito na pasta errada, a mesma que tinha me custado um dia. As 42 memórias carregaram do mesmo jeito.

🔎 Seu custo por compra está alto e você não sabe por quê?

Na MasterClass: Como Reduzir seu Custo por Compra, a Anna mostra em 49 minutos as métricas que dizem se o problema está no anúncio, no site ou no produto, e o que fazer com cada uma.

Quero conhecer a masterclass →

📺 Inscreva-se no canal

Tutoriais novos de tráfego pago toda semana.

Inscrever-se no YouTube →