
Yurumi: a memória que precisava esquecer
Quatro camadas de memória com prazos diferentes, um TTL que nunca expirava de verdade e a decisão que resolveu: dormir não é apagar. Como o ciclo de vida da memória deixou de ser um campo solto no payload.
8 posts

Quatro camadas de memória com prazos diferentes, um TTL que nunca expirava de verdade e a decisão que resolveu: dormir não é apagar. Como o ciclo de vida da memória deixou de ser um campo solto no payload.

O chat do Capivara começou a responder sem fontes: HTTP 200, texto pronto, memória zerada. Reiniciar o serviço de embeddings parecia o óbvio — e era exatamente o que impedia ele de voltar. Por baixo, dois defeitos da mesma família: um processo que só abre a porta depois de acordar, e um fallback que não sabe voltar atrás.

O embedder nao estava quebrado, estava carregando. Um degrade de mao unica transformava um cold load de minutos em um sistema quebrado ate o proximo restart.

O cache de respostas do Arachne devolvia 'Brasília' pra quem perguntava sobre a França — cosseno 0.8531 contra threshold 0.85. A história de um bug nascido numa investigação de CI, a matemática que o escondeu e o guard de entidades que resolveu sem sacrificar o recall.

O Yurumi nasceu como um substituto local pro mem0 — armazenar memórias de conversas. Em duas semanas, ganhou intenção, ações, aprendizado, identidade própria e um grafo de conhecimento. A jornada de uma simples store a um sistema agêntico completo.

O Capivara guardava as memórias dele num ChromaDB local, com embedder próprio e camadas L1-L4. O Yurumi guardava a memória do ecossistema inteiro num Qdrant. Duas memórias separadas significavam um cérebro que não conversava com o resto do corpo. A unificação em 28/08 migrou 182/182 memórias sem perder uma: dedup por hash, backup antes de deletar e um gate --apply que separa o plano da execução.

Os AGENTS.md de cada projeto eram as instruções oficiais do ecossistema, mas viviam fora da memória do Yurumi — o ingest só rodava quando alguém lembrava. A solução foi um watcher por assinatura (mtime+size) que re-ingere só o que mudou. No caminho, um first_run que rodava ingest completo todo dia, um stat que travava quando o WSL wedgava e a lição de nunca confiar em junction.

O Yurumi guardava a memória com um único embedder treinado em português. Funcionava, até a primeira pergunta em inglês. A solução não foi trocar de modelo — foi rodar dois ao mesmo tempo e fundir os rankings com RRF. Os números de uma corrida LoCoMo depois, o recall subiu de 0.139 para 0.1614.