Pular para o conteúdo

Memória e conhecimento

Sem memória, toda conversa com um agente começa do zero: a mesma convenção precisa ser explicada de novo, a mesma decisão precisa ser debatida de novo, o mesmo beco sem saída precisa ser explorado de novo. A memória é o armazenamento com escopo de espaço de trabalho que sobrevive às execuções e existe para que o conhecimento produzido por um agente possa ser encontrado por outro mais tarde.

Ela tem três camadas, e elas respondem a perguntas diferentes:

  1. Fatos — o que é verdade (uma convenção, um resultado, uma decisão).
  2. Políticas — o que os agentes devem fazer a respeito (uma regra normativa).
  3. Memória de trabalho — o que um agente estava no meio de fazer.

A distinção importa porque elas chegam ao agente por caminhos diferentes. Os fatos são pesquisados. As políticas são empurradas. A memória de trabalho é privada.

Um MemoryFact é uma unidade de conhecimento com escopo de um espaço de trabalho e um domínio.

Atributo O que é
domain O domínio de conhecimento (“conventions”, “decisions”, “codebase”)
topic Um rótulo curto de tópico
content O texto do conhecimento
confidence 0,0–1,0, inicializada pela proveniência e elevada a cada nova menção
memoryType O tipo do fato — determina sua curva de decaimento temporal
veracity Como ele passou a ser conhecido — inicializa a confiança e define o tamanho de cada aumento por nova menção
sourceObservationIds Quais observações levaram a ele
supersededBy O fato mais recente que o substituiu, se houver
validUntil, recallCount, mentionCount Sinais de expiração e de uso usados na recuperação

As duas últimas linhas são as que as pessoas ignoram, e são elas que decidem qual fato aparece. memoryType carrega parâmetros de decaimento de Weibull por tipo, então um compromisso com prazo definido desaparece rápido, enquanto um fato de perfil estável não. veracity registra a proveniência — declarado por um humano (peso 1,0), inferido por um agente (0,7), produzido por uma ferramenta (0,5), importado (0,6) — e esse peso inicializa a confiança inicial do fato.

Fatos nunca são editados no lugar quando são contraditos. Gravar um fato executa a detecção de conflitos contra fatos do mesmo domínio e do mesmo tópico e substitui o perdedor, registrando uma linha de conflito. A trilha de auditoria é o ponto: você sempre pode ver o que se acreditava antes e o que tomou o seu lugar.

Uma MemoryPolicy é uma regra normativa derivada de fatos, com escopo de um espaço de trabalho e um domínio, com um sinalizador de ativação e um requiredRole opcional.

Toda política ativa do espaço de trabalho é injetada em todo despacho, sem filtro — nenhum filtro por domínio, papel, tarefa ou espaço. Vale a pena saber disso antes de escrever sua vigésima política, porque as políticas disputam a mesma janela de contexto que a tarefa. É também por isso que o requiredRole de uma política é apenas indicativo: ele descreve a quem a regra se destina, mas não impede que a regra chegue a todos os demais.

Um MemoryDomain agrupa fatos e políticas dentro de um espaço de trabalho. Os domínios dão estrutura organizacional ao conhecimento e são a unidade sobre a qual as concessões de acesso são gravadas — mas leia o aviso abaixo antes de tratar um domínio como fronteira de confidencialidade.

Um domínio é ou de todo o espaço de trabalho (architecture) ou com escopo de um repositório (repo:<slug>/architecture). O mesmo nome nos dois escopos são dois armazenamentos independentes: um fato que é verdadeiro para uma base de código não sobrescreve o de todo o espaço de trabalho. search_memory e o preâmbulo de despacho classificam primeiro a memória com escopo de repositório quando o agente está trabalhando nesse repositório; eles não filtram o resto. Passe repo em propose_fact / propose_policy / search_memory para gravar ou reforçar esse escopo.

MemoryAccessGrant mapeia um papel de agente e um domínio para um de três níveis de permissão:

Permissão Significado
none Sem acesso
read Pode pesquisar e recuperar fatos
write Exigido por propose_policy. Gravações de fatos (propose_fact, supersede_fact) não são condicionadas a concessão

A assimetria — branda nas leituras, rígida nas gravações de políticas — é uma troca deliberada. A memória é mais útil quando circula, e uma negação de leitura produz um agente que silenciosamente sabe menos, em vez de um que relata um problema. Uma negação de gravação de política, em contrapartida, é ruidosa e corrigível, então é aí que está a aplicação da regra. Um domínio recém-criado inicializa write para todos os papéis; restringi-lo depois é uma edição exclusiva de RPC, porque não há interface de concessões.

Cada agente tem uma AgentWorkingMemory: um bloco de anotações em texto livre indexado por espaço de trabalho e por agente. Ela persiste entre execuções, é privada daquele agente e é injetada no prompt dele a cada despacho. É onde vive “eu estava no meio da refatoração da autenticação” — o estado que vale a pena levar para a próxima execução, mas que não vale a pena promover a fato durável.

No despacho, o preâmbulo de memória é montado a partir de exatamente três coisas:

  • Toda política ativa do espaço de trabalho, como linhas - [domain] rule.
  • A própria memória de trabalho do agente, na íntegra.
  • Uma lista curta de fatos correspondentes por palavra-chave para esta tarefa — no máximo cinco, dentro de um orçamento de ~1.200 caracteres e somente quando a descrição da tarefa tem pelo menos 20 caracteres. Tarefas mais curtas não recebem fato nenhum.

A lista curta é somente FTS/palavra-chave e é limitada de propósito. Gerar o embedding de uma consulta é lento, e o caminho de despacho é o único lugar onde a latência é imediatamente visível, então o caminho semântico lento é deliberadamente mantido fora dele. O preâmbulo termina dizendo ao agente para verificar os itens essenciais com search_memory, que é onde vive o modelo completo de recuperação.

Nenhuma concessão de acesso é consultada nesse caminho. O que a lista curta encontrar é o que o agente vê.

A ferramenta search_memory, voltada ao agente, tem três modos e eles são pesquisas genuinamente diferentes:

  • keyword — somente FTS5.
  • semantic — resultados BM25 e vetoriais fundidos por fusão de postos recíprocos.
  • hybrid (o padrão) — recuperação polifônica: quatro vozes classificadas fundidas e depois diversificadas.

As quatro vozes são lexical (FTS), semântica (KNN vetorial), temporal (fatos ativos recentes) e de grafo — uma caminhada de dois saltos pelas arestas episódicas a partir das sementes lexicais e semânticas mais fortes. A voz de grafo é a razão de as arestas episódicas existirem: ela traz à tona o fato que está conectado à sua resposta sem corresponder a nenhuma das suas palavras. As vozes são ponderadas por uma intenção de consulta classificada (a semântica tem o maior peso por padrão, depois o grafo e a lexical, depois a recência), a pontuação de cada candidato é escalada pelo seu decaimento de Weibull, e o conjunto de resultados é diversificado por MMR para que cinco repetições de um fato não suplantem quatro fatos diferentes.

A pesquisa de memória no desktop e na web é um caminho separado e mais simples: a operação RPC memory_fact.search é somente FTS5, porque um cliente leve não consegue enviar um embedding de consulta e o caminho híbrido permanece interno ao host. Então a classificação que você vê no navegador de memória não é a classificação que um agente recebe de search_memory. Isso é esperado, não é um bug, mas significa que “pesquisei e não encontrei” na interface não é prova de que o agente não vai encontrar.

O navegador de memória fica em Configurações → Espaço de trabalho → Memória (/workspaces/<id>/settings/memory), com abas Fatos, Políticas e Grafo de conhecimento.

Há ali uma assimetria que surpreende as pessoas: você pode editar e excluir a memória, mas não pode criá-la. Nem a aba Fatos nem a aba Políticas tem um controle para adicionar. A criação é feita pelo lado do agente, por meio de propose_fact e propose_policy (supersede_fact / supersede_policy para substituí-los). remember grava um item de camada quente limitado à sessão que consolidate_memory pode mais tarde promover a fato; record_observation e update_my_notes gravam o bloco de anotações privado injetado no despacho. O navegador é uma superfície de revisão e correção, não de criação — então, se você quer um fato na memória, a forma de colocá-lo lá é dizer a um agente.

Duas operações de manutenção também são invocadas por um agente, e não agendadas: consolidate_memory mescla e poda os fatos acumulados, e harmonize_memory reconcilia crenças que divergiram entre agentes. list_memory_conflicts mostra o que a detecção de conflitos já registrou. Nada as executa para você em um temporizador. As decisões de reunião são coletadas no domínio decisions quando uma etapa de persistência de reunião as registra; isso não é um temporizador sobre execuções de agente concluídas.