Um mês atrás eu tinha um bot que tratava um resultado de duas semanas atrás como notícia de última hora.

O contexto: fiz um bolão da Copa pro meu time, todo mundo palpitando placar pelo terminal, via SSH. Daí a gente colocou uma IA pra jogar junto, de brincadeira. Ela apostava, comentava o bolão, provocava quem estava mal. Chamamos ela de BETanIA.

E o problema apareceu no comentário. Toda vez que ela abria a boca, ela redescobria os mesmos fatos com o mesmo espanto. Provocava o mesmo jogador pelo mesmo palpite ruim três dias seguidos, como se fosse novidade. Puxava um resultado de duas semanas atrás pro meio do papo com a empolgação de quem acabou de ver a bola entrar.

A reação intuitiva - e talvez a sua agora - é: dá mais memória pra ela.

Não foi bem por aí que eu fui. Eu já tinha trabalhado num assistente de IA pra médicos veterinários, e foi lá que bati de frente pela primeira vez com essa história de gerenciar contexto e memória de agente. Então a ficha caiu rápido: dar mais memória só ia empurrar o problema com a barriga - o que faltava era arquitetar a memória dela de um jeito mais esperto.

Some a isso um tempo xeretando como o Claude Code lida com contexto em sessões longas, e eu já vinha com uma pulga atrás da orelha: o problema quase nunca é falta de memória, é o que você faz com ela.

A BETanIA não precisava de mais memória. Precisava esquecer direito.

O peixe dourado

Tem um clichê sobre peixe dourado ter três segundos de memória. Não é verdade sobre o peixe, mas é uma descrição perfeita de uma chamada de LLM.

Cada invocação do modelo é uma mente novinha em folha que nunca viu os seus dados. Ela acorda, olha o que você colocou no contexto, responde, e morre. A próxima chamada não lembra de nada.

Então um comentarista que só recebe a classificação atual faz o que um peixe dourado faria: descobre tudo de novo, toda vez. Não é um personagem. É um caça-níquel que paga em piadas repetidas.

Um peixe dourado dentro de um aquário sentado numa bancada de comentarista, na frente de um microfone antigo, dizendo num balão de fala: urgente, a mesma notícia de ontem. Um calendário de mesa mostra que duas semanas já passaram.

Esse é um dos dois abismos da memória de agente. E é o mais óbvio: esquecer o que importa. Amnésia.

Só que existe um segundo abismo, do lado oposto, e esse é muito menos intuitivo.

Funes, o homem que não conseguia pensar

Borges tem um conto chamado Funes, o Memorioso. Um rapaz, Ireneo Funes, cai de um cavalo e, depois do acidente, não consegue mais esquecer nada.

Toda folha de toda árvore que ele já viu. O formato exato de cada nuvem. A palavra exata de uma página lida uma vez. Tudo, permanentemente, em detalhe cheio.

Parece um superpoder, mas é uma maldição.

O ponto do Borges é que Funes não consegue pensar. Pensar é generalizar - é ver um cachorro de perfil às 15h14 e o mesmo cachorro de frente às 15h15 e chamar os dois de “cachorro”.

Pensar é esquecer diferenças, é generalizar, abstrair.

Funes não consegue. Pra ele são duas coisas distintas, incomparáveis, porque de fato são diferentes. Afogado no específico, ele perde a capacidade de abstrair.

Aqui está a parte que interessa pra quem constrói agente: todo agente de longa duração está a caminho de virar o Funes.

O diário da BETanIA crescia um parágrafo por partida. Uma Copa tem mais de cem jogos. Empurre tudo pra frente, pra sempre, e o contexto para de ser um caderno de anotações e vira um palheiro.

Você não quer nenhum dos dois. Nem o peixe dourado que esquece o que importa, nem o Funes que lembra de tudo e trava. O bom design mora no meio, e ele tem um nome.

À esquerda, um robô completamente soterrado por uma avalanche de papéis e pastas empilhados até o teto, com cara de sobrecarregado e travado. À direita, o mesmo tipo de robô, calmo e sorrindo, trabalhando numa mesa limpa com um único caderninho de anotações.

A pergunta certa

Todo projeto de agente uma hora esbarra na pergunta “quanto o meu agente deveria lembrar?”.

É a pergunta errada.

A pergunta certa é: o que é seguro esquecer?

E aqui vem a coisa que eu quero que você leve desse post. Isso não é um detalhe de implementação que você resolve depois. Decidir o que pode ser jogado fora é o projeto da memória. É engenharia de contexto na veia.

O melhor de tudo: você já usa uma ferramenta que faz isso o tempo todo, na sua cara, e provavelmente nem reparou.

O Claude Code esquece de propósito

Abre uma sessão longa no Claude Code. Duas horas, dezenas de chamadas de ferramenta, arquivos lidos, comandos rodados. Em algum momento o contexto encheria e a coisa quebraria.

Não quebra. Porque o Claude Code esquece, em camadas.

A camada mais barata ele chama de microcompact. Aquele resultado de ferramenta de 90 minutos atrás - o log gigante que ele já leu e já analisou - ele não precisa mais do texto cru. Então troca o conteúdo por um [Old tool result cleared to save context] e segue a vida. Custo: zero chamada de modelo.

Quando isso não basta, sobe uma camada: ele chama o modelo pra resumir a conversa inteira e substitui o histórico pelo resumo mais as últimas mensagens.

Repara no que acontece nas duas camadas. Ele joga fora o texto e guarda a conclusão. Esquece o log de 250KB, lembra que “o pool de conexão do banco estava esgotado, reiniciei os pods”. A informação que importa sobrevive; a matéria-prima apodrece.

Um robô numa sessão longa de trabalho joga uma pilha de papéis velhos na lixeira com uma mão enquanto, com a outra, fixa num quadro um único bilhete curto com o resumo daqueles papéis.

Isso não é gambiarra pra economizar token. É a única forma de um agente durar duas horas sem virar o Funes.

Um caderno, não uma fita

Quando tive que construir a memória da BETanIA do zero, caí no mesmo lugar - só que pela força.

Pensa em como um comentarista esportivo de verdade se prepara. Ele não re-assiste a temporada inteira antes de entrar no ar. Ele chega com um caderninho: uma linha por jogo, alguns fatos por jogador, quem está de mal com quem.

A habilidade não é lembrar de tudo. É manter anotações boas o suficiente pra que o passado continue disponível sem ser revivido.

Foi isso que a BETanIA ganhou. Um diário: quando um jogo acaba, uma chamada de modelo condensa tudo - placar, palpite de cada um, os melhores comentários ao vivo - num único parágrafo. A história daquele jogo. O parágrafo fica guardado; o resto pode apodrecer.

E o diário pode ser compactado. Uma chamada lê o diário inteiro e funde tudo numa narrativa só, com peso na recência: as rodadas antigas viram “o caos inicial em que ninguém acertava o Brasil”, os últimos jogos mantêm o detalhe.

No backup final do banco, os 104 jogos da Copa vivem em exatamente três entradas de diário: uma narrativa fundida que carrega o torneio inteiro até as semifinais, mais os dois últimos jogos em detalhe cheio. Um mês de futebol, comprimido, mas nunca perdido.

E “comprimido” aqui não é força de expressão. Naquela primeira entrada, rodadas que já foram dramáticas viram uma oração só. Um trecho real, verbatim do banco (ela escreve em inglês):

The tournament’s most democratic disasters are worth cataloguing: Jul 5 saw Norway eliminate Brazil 1-2 for a thirteen-pick, thirteen-zero collective wipeout; Jun 30 handed all fifteen players unified zeroes on Germany-Paraguay.

Cada um desses foi um jogo inteiro, com placar minuto a minuto e a classificação dançando a cada gol. Sobrou uma frase. É isso que compactar bem parece: some o detalhe, fica a forma.

Um robô opera uma prensa mecânica que comprime uma pilha alta de papéis rotulada 104 jogos em um livrinho fino rotulado 3 entradas: uma narrativa fundida mais os 2 últimos jogos em detalhe.

Um caderno, não uma fita cassete de tudo que já aconteceu. O Funes guarda a fita. E o Funes nunca ganharia o bolão.

Nem tudo pode ser comprimido

Agora, a parte que separa engenharia de gambiarra. É tentador achar que a regra é “comprima tudo o que puder”. Não é.

A BETanIA tem uma segunda compactação, com o contrato oposto - e o contraste é a lição de verdade.

Além do diário, eu anotava fatos sobre os jogadores. Um deles é usuário de Gentoo e compila o próprio kernel. Esse tipo de coisa. Quando essas anotações crescem, elas também compactam - mas o prompt manda, literalmente, “PRESERVE cada fato distinto”. Junta duplicatas, agrupa o que é parecido, mas não pode perder nada.

Por quê? Porque esses fatos são verdade não reproduzível.

Se ela esquecer que fulano compila o próprio kernel, nenhuma quantidade de dado de classificação vai trazer isso de volta. Já um resumo de jogo, se ficar meia-boca, dá pra tolerar - a informação central continua lá.

Mesma operação, dois contratos. Resumo pode perder detalhe. Fato não pode.

E é aqui que a regra inteira se resolve numa frase, que eu deixei escrita na doc do projeto:

Verdade não reproduzível a gente persiste. Apresentação reconstruível a gente joga fora e reconstrói depois.

A classificação do bolão, por exemplo, nunca é guardada. Ela é calculada na hora, a partir dos palpites e resultados. Guardar seria criar uma segunda cópia que pode divergir da verdade. Então: joga fora, reconstrói quando alguém pedir.

Esse critério - guardar ou reconstruir - foi o que organizou a memória inteira da BETanIA numa prateleira, cada tipo com uma regra de quanto tempo vive:

Estante isométrica com cinco prateleiras, uma por tipo de memória, e um robozinho ao lado. De cima pra baixo: volátil (some ao reiniciar), híbrido (snapshot ao desligar), persistente em SQLite, append-only em logs JSONL, e derivado (calculado na leitura).

No fim, só duas prateleiras guardam verdade de fato: a persistente (o diário, os fatos dos jogadores) e o log append-only. O resto é apresentação que ela reconstrói sozinha - e o derivado, tipo a classificação, nem chega a ser guardado.

Decidir qual das suas memórias é fato e qual é apresentação - isso não é implementação. Isso é o design.

Esquecer direito dá trabalho

Não quero te vender que esquecer é só apertar delete. Esquecer bem é datado e deliberado, e eu aprendi os dois na marra, com bug em produção.

O primeiro: data em tudo. As primeiras entradas do diário eram texto sem tempo, então ela tratava um resultado de duas semanas atrás como se fosse de hoje - o problema do começo do post. A correção foi carimbar cada entrada com [22 jun] e abrir todo prompt com uma linha “hoje é…”. O modelo precisa de uma âncora pra calcular o que é “velho”. Dá a âncora, explícita.

O segundo: não reconstruir o passado. Se a memória liga no meio do torneio, ela adota os jogos já terminados como “resolvidos” sem escrever a história de nenhum. Sem isso, o primeiro boot dispara trinta historinhas fresquinhas sobre jogos antigos - e aí você fabricou um Funes com falsas memórias vívidas no dia um.

Ou seja: esquecer não é a ausência de um sistema de memória. Esquecer é o sistema de memória. A parte difícil não é guardar. É decidir o que sai, quando, e o que jamais pode sair.

Funes nunca ganha o bolão

No fim, a BETanIA ganhou a Copa. Terminou em primeiro, 50 pontos à frente do segundo colocado, que era eu, o cara que construiu ela.

Classificação final do BEThoven no terminal: BETanIA em 1o lugar com 370 pontos, Edy Silva (admin) em 2o com 320, helton em 3o com 317, Jeff em 4o com 316, e o resto do bolão abaixo.

Vou ser honesto sobre uma coisa: a memória não é o motivo de ela ter ganhado. Ela ganhou no palpite - busca na web, sem ego, sem time do coração. Um bot sem memória nenhuma teria feito os mesmos pontos.

A memória é o motivo de ninguém ter se importado de perder pra ela. A diferença entre uma ferramenta que cospe resultado e um personagem que compartilha uma história com o time.

E essa continuidade não vem de uma janela de contexto maior. Vem do contrário. Toda técnica desse post é a mesma jogada repetida: condensa a verdade no instante em que ela está pra virar irrecuperável, guarda pequeno, data, e devolve pro modelo só o que a tarefa atual precisa.

O Funes guardava tudo e não conseguia pensar. O peixe dourado não guardava nada e não conseguia lembrar. O seu agente precisa ficar no meio - e ficar no meio é uma decisão de projeto, não um acidente.

Se você está construindo um agente agora, para de perguntar quanto ele deveria lembrar. Pergunta o que ele pode esquecer. É a mesma pergunta que a gente faz sobre a nossa própria cabeça sem perceber - e o Borges já tinha respondido, décadas antes de existir um único token.

O código todo da BETanIA está no GitHub, com o doc de design da memória junto. Se você curte ver as tripas de um bicho desses, é por ali.

Por hoje é só.