PROJETO 3.3

🗃️ Projeto 3: memória curada

O agente propõe, você aprova. Neste projeto você para de tratar a memória bruta do Claude como fonte de verdade e monta uma camada de fatos aprovados que Claude, Codex e qualquer outro executor leem do mesmo lugar — reaproveitando o vault que o openpcbotv3 já opera nesta máquina.

6
Tópicos
~40
Minutos
Intermediário
Nível
Projeto
Tipo

🎯 O projeto em uma tela

Objetivo

Ter UM lugar de fatos verificados sobre você e seus projetos, aprovado por você, lido por todos os executores.

Você sai com

3 fatos promovidos da memória do Claude pro context/overview.md de um projeto, com fonte e data; AGENTS.md e CLAUDE.md mandando ler o USER.md do vault.

Critério de aceite

Sessão nova no Claude E no Codex cita um fato pessoal apontando o USER.md como fonte. Nada da memória bruta foi copiado em massa.

1

🧱 A memória do Claude é matéria-prima, não fonte

O diagnóstico desta máquina encontrou 227 pastas de memória e 869 arquivos em ~/.claude/projects/*/memory. Cada arquivo é uma observação que o Claude achou útil guardar: uma preferência, um caminho, um fato de projeto. Nada disso passou por aprovação sua. Boa parte está desatualizada, duplicada ou contradiz outro arquivo escrito semanas depois. E só o Claude lê essa pasta.

Por isso o plano trata essa memória como matéria-prima: uma mina de fatos candidatos, não a verdade. A verdade é o que você aprovou, com fonte e data, num arquivo que qualquer runtime consegue abrir.

✗ Copiar a memória em massa

  • 869 arquivos viram 869 arquivos em outro lugar, com as mesmas contradições.
  • O Codex passa a acreditar em fatos que o Claude gravou errado em maio.
  • Nenhuma fonte, nenhuma data: impossível saber qual versão vale.
  • Segredos e caminhos privados podem ir junto.

✓ Promover fato a fato

  • Você lê a memória do projeto que está tocando e escolhe o que ainda é verdade.
  • Cada fato promovido ganha fonte, data e escopo.
  • O resto fica onde está, como histórico.
  • O resultado cabe numa tela e qualquer modelo lê.

Novo aqui? "Memória" do Claude Code é uma pasta de arquivos Markdown que o próprio agente escreve entre sessões para se lembrar de coisas. "Promover" um fato é copiá-lo, revisado, para um arquivo que você controla. A diferença entre os dois é uma só: aprovação humana.

Conceitos-chave

Matéria-prima

Observações não aprovadas, candidatas a fato.

Fonte de verdade

O que você aprovou, com origem e data.

Promoção

Levar um fato da memória bruta pro overview, revisado.

Cópia em massa

O erro a evitar: transporta ruído e contradição.

2

🗄️ O vault do openpcbotv3 como overview global

Você não precisa inventar a camada de fatos aprovados: ela já existe nesta máquina. O bot openpcbotv3 mantém um vault curado em ~/vault/MEMORY.md e ~/vault/USER.md. O bot propõe entradas; nada é escrito sem você aprovar com /memoria aprovar <id>. E o USER.md entra no prompt de toda conversa do bot. É exatamente o "overview global" que o plano pede.

memória bruta 869 arquivos, sem aprovação proposta o agente sugere um fato aprovação você diz sim ou não overview aprovado USER.md · overview.md · fonte + data

Leia de baixo pra cima: cada degrau filtra o anterior. Só o último degrau, aprovado por você, é lido pelos executores. A memória bruta nunca sobe direto.

📊 O que o v3 já faz (do README, seção Cérebro)

  • Toda mensagem sua vira memória classificada em semantic (durável: "prefiro", "sempre", "moro em") ou episodic. Pergunta nunca vira fato.
  • Busca por palavra-chave (FTS5) mais vetor bge-m3; contexto no prompt limitado a 600 tokens.
  • Vault curado: o bot propõe, você aprova. USER.md entra em todo prompt.
  • Consolidação noturna às 4h, no Ollama, custo zero: funde duplicatas e marca contradições.

💡 Por que reaproveitar em vez de criar

O plano de migração diz: não reinventar. O vault já tem o mecanismo de aprovação, já roda como serviço e já é lido por um executor (o bot). Falta só apontar Claude, Codex e dsh pro mesmo arquivo. Criar um segundo "overview global" seria criar a segunda fonte de verdade que o curso inteiro tenta evitar.

Conceitos-chave

Vault curado

MEMORY.md + USER.md, só entra o que foi aprovado.

USER.md

Fatos sobre você; entra em todo prompt do bot.

Semantic vs episodic

Durável vs "aconteceu uma vez".

Overview global

O arquivo de fatos pessoais que todo executor lê.

3

✅ Fluxo propõe → aprova, aplicado a um projeto

Agora a mão na massa. Escolha um projeto que você já migrou (Projeto 1) e promova 3 fatos da memória bruta do Claude pro context/overview.md dele. Três, não trinta: o objetivo é treinar o gesto, não esvaziar a pasta.

1

Listar a memória bruta do projeto

Objetivo: ver o que o Claude guardou sobre este projeto, com data. Troque o caminho pelo seu.

MEM=~/.claude/projects/-home-nmaldaner-projetos-<meu-projeto>/memory
ls -lt "$MEM" | head -20
# ler só o índice, que resume cada arquivo em uma linha
cat "$MEM/MEMORY.md"

Como verificar: o índice lista os arquivos com um gancho por linha. Se estiver vazio, este projeto não tem memória e você pula pro passo 3 com fatos do próprio CLAUDE.md.

2

Pedir ao agente que PROPONHA, sem escrever

Objetivo: o agente lê a memória e devolve candidatos classificados. Cole no Claude Code ou no Codex, dentro do projeto.

Leia os arquivos em <caminho do memory/ acima>. Não edite nada.
Devolva uma tabela com no máximo 8 candidatos a fato durável sobre este projeto.
Colunas: fato (uma frase), tipo (fato | preferência | hipótese | decisão),
arquivo de origem, data do arquivo, e "ainda parece válido?" (sim / não / não sei).
Descarte perguntas, tarefas passadas e qualquer segredo ou chave.

Como verificar: a tabela cita o arquivo de origem em cada linha. Sem origem, a linha não vale.

3

Aprovar 3 e gravar no overview com fonte e data

Objetivo: você escolhe; o agente escreve só o que você aprovou, no formato do template.

Aprovo os candidatos 2, 5 e 7. Acrescente-os em context/overview.md,
na seção "Fatos verificados", um por linha, no formato:
- <fato> (fonte: memory/<arquivo>, observado em <AAAA-MM-DD>, promovido em 2026-09-14)
Os demais candidatos NÃO entram. Não altere mais nada no arquivo.

Como verificar: git diff context/overview.md mostra exatamente 3 linhas novas, todas com fonte e duas datas.

💡 A mesma coisa no bot

No openpcbotv3 o gesto é idêntico, só que pelo Telegram: o bot manda uma proposta com id, você responde /memoria aprovar <id>, e só então a linha entra em ~/vault/MEMORY.md ou USER.md. O que você acabou de fazer à mão no projeto é a versão manual do mesmo protocolo.

Conceitos-chave

Proposta

Candidato com origem, tipo e data; ainda não vale.

Aprovação explícita

Você nomeia quais entram; o resto não entra.

Duas datas

Quando foi observado e quando foi promovido.

Diff pequeno

Três linhas. Se o diff é grande, algo saiu do protocolo.

4

🕰️ Consolidação com superseded_by: nunca apaga, esconde

O que acontece quando um fato aprovado deixa de ser verdade? O v3 responde com a consolidação noturna: quando detecta duas memórias que se contradizem, a mais antiga recebe o campo superseded_by apontando pra nova. Ela não é apagada, só deixa de entrar no prompt. Você pode voltar e ver o que se acreditava antes.

fato antigo · 2026-07-09 "voz padrão do inemavox é bella" status: superseded · fica no histórico superseded_by fato atual · 2026-09-14 "voz padrão do inemavox é rachel" status: ativo · entra no prompt fonte: ~/.claude/CLAUDE.md, decisão de 2026-07-09

O fato antigo continua existindo, mas tracejado e fora do prompt. O executor só vê o fato atual. Se a decisão nova estava errada, você desfaz sem perder nada.

✓ Como resolver conflito

  • Origem e decisão aceita vencem. Timestamp desempata só entre iguais.
  • A versão vencida ganha superseded_by e sai do prompt.
  • Backup antes de cada rodada de consolidação.

✗ O que quebra a memória

  • "O mais novo sempre vence": um arquivo escrito por engano apaga uma decisão sua.
  • Deletar a versão antiga: some a trilha de por que você mudou.
  • Manter os dois ativos: o executor escolhe um ao acaso.

No overview em Markdown, sem banco: use a mesma ideia à mão. Em vez de apagar a linha antiga, mova-a pra uma seção "Superado" no fim do arquivo com a nota superado por: <linha nova>, em <data>. O agente lê só "Fatos verificados"; o histórico fica pra você.

Conceitos-chave

superseded_by

Ponteiro do fato vencido pro fato que o substituiu.

Esconder ≠ apagar

Sai do prompt, fica no histórico.

Provenance

De onde veio e quem decidiu; vence data.

Consolidação

Rodada periódica que funde e marca; sempre com backup.

5

🔗 Claude, Codex e dsh lendo o mesmo USER.md

O bot já injeta o USER.md em todo prompt porque o código dele faz isso. Claude Code e Codex não têm esse código, e nenhum arquivo é carregado sozinho além do CLAUDE.md e do AGENTS.md. A solução é a mesma do curso inteiro: uma instrução explícita de leitura nesses dois arquivos.

4

Acrescentar a instrução no AGENTS.md global e do projeto

Objetivo: todo executor que lê AGENTS.md aprende onde estão os fatos pessoais aprovados. O CLAUDE.md herda via @AGENTS.md.

cat >> ~/.codex/AGENTS.md <<'EOF'

## Fatos pessoais aprovados
- Antes de assumir qualquer preferência minha (voz, modelo de imagem, conta git, caminhos),
  leia `~/vault/USER.md`. É a única fonte aprovada. Cite o arquivo quando usar um fato dele.
- Não proponha gravar nada lá por conta própria: proponha em texto e eu aprovo.
EOF
# o CLAUDE.md global começa com "@AGENTS.md"? Se não, acrescente essa linha no topo dele.
head -1 ~/.claude/CLAUDE.md

Como verificar: grep -n USER.md ~/.codex/AGENTS.md devolve a linha; head -1 ~/.claude/CLAUDE.md devolve @AGENTS.md.

5

Provar nos dois runtimes

Objetivo: sessão nova cita o USER.md como fonte de um fato pessoal. Sem citar a fonte, não passou.

P='Qual é a voz padrão de narração que eu uso? Responda em uma frase e diga em que arquivo você leu isso. Não edite nada.'
claude -p "$P"
codex exec --skip-git-repo-check "$P"

Como verificar: as duas respostas nomeiam ~/vault/USER.md. Se uma citar a memória do Claude ou "não sei", a instrução não chegou; confira se o AGENTS.md certo está sendo lido.

🐳 E o dsh?

O dsh-sandbox não lê ~/vault porque o container só enxerga o que foi montado. No modo local, ~/projetos está montado; o vault não. Duas saídas: montar ~/vault somente leitura no docker-compose.projetos.yml, ou copiar o USER.md aprovado pro projeto como context/user.md com a data do snapshot. O Projeto 4 trata o dsh em detalhe.

Conceitos-chave

Instrução de leitura

O jeito de "injetar" sem código: mandar ler.

Uma fonte, N leitores

Bot, Claude, Codex e dsh apontam pro mesmo arquivo.

Citar a fonte

O critério de aceite: resposta certa sem fonte não vale.

Snapshot datado

Quando não dá pra ler ao vivo, copia com data e regra de refresh.

6

📦 Arquivar sessões antigas, só depois que o ciclo roda

Nesta máquina há 6.859 sessões JSONL do Claude (2,3 GB) e 209 do Codex. Elas são o histórico bruto de cada conversa. Enquanto seu contexto vivia só lá, apagar era perder memória. Depois que handoff e prime (módulo 2.6) estão rodando, o que importa de cada sessão já foi pra handoffs/latest.md e pro overview. Aí, e só aí, arquivar vira uma faxina segura.

Semana 1: ciclo rodando

Toda sessão termina com handoff. Nova sessão começa pelo prime. Nenhuma sessão é apagada ainda.

Semana 2: promoção de fatos

Nos projetos tocados, 3 a 5 fatos promovidos pro overview (tópico 3). O que era memória bruta relevante já está aprovado.

Semana 3: arquivar, não apagar

Sessões com mais de 90 dias vão pra um arquivo compactado fora de ~/.claude. Se algo faltar, está lá.

Depois: rotina mensal

Um comando por mês. O disco (88% cheio hoje) agradece.

Passo 6: arquivar sessões com mais de 90 dias (reversível)

Objetivo: tirar do caminho sem perder. Primeiro conta e lista; só o segundo bloco move.

# 1) só olhar: quantas e quanto pesam
find ~/.claude/projects -name '*.jsonl' -mtime +90 | wc -l
find ~/.claude/projects -name '*.jsonl' -mtime +90 -print0 | du -ch --files0-from=- | tail -1

# 2) arquivar (move pra um tar.gz datado fora de ~/.claude; nada é apagado)
ARQ=~/projetos/output/arquivo-sessoes-claude-$(date +%Y-%m-%d).tar.gz
find ~/.claude/projects -name '*.jsonl' -mtime +90 -print0 \
  | tar --null -T - -czf "$ARQ" --remove-files
ls -lh "$ARQ"

Como verificar: o primeiro find rodado de novo devolve 0; o tar.gz existe e abre com tar -tzf "$ARQ" | head. Rollback: tar -xzf "$ARQ" -C /.

⚠️ Riscos e rollback do projeto

  • Promover fato errado: o diff é de 3 linhas; git checkout context/overview.md desfaz.
  • Arquivar cedo demais: não arquive antes de ter pelo menos duas semanas de handoffs. O tar.gz é reversível, mas o hábito de ir buscar lá não.
  • Duas fontes de fatos pessoais: se você criar um context/user.md global além do vault, escolha um e aponte o outro pra ele.
  • Segredo no overview: chaves ficam em .env; o overview cita o caminho, nunca o valor.

Conceitos-chave

Arquivar ≠ apagar

Compacta e tira do caminho; volta com um comando.

Pré-condição

Handoff/prime rodando antes de qualquer faxina.

Sessão = histórico

Bruto, útil pra auditoria; não é fonte de contexto.

Rotina

Uma vez por mês, o mesmo comando.

Auto-checagem (opcional): o Claude gravou em maio que "o modelo de imagem padrão é flux2-dev" e em agosto que "é flux2-klein". O que fazer no overview?

🎯 Resumo do projeto

Memória bruta é matéria-prima — 869 arquivos sem aprovação não são fonte; promova fato a fato.
O vault já existe — MEMORY.md e USER.md do openpcbotv3, com aprovação humana, viram o overview global.
Propõe → aprova — 3 fatos com fonte e duas datas; diff de 3 linhas.
superseded_by e arquivar — nunca apaga, esconde; sessões antigas só depois que o ciclo roda.

Próximo projeto:

3.4 — Projeto 4: terceiro executor (dsh-sandbox e modelo local)