<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Renzo Tognella</title>
    <description>The latest articles on DEV Community by Renzo Tognella (@renzotognella).</description>
    <link>https://dev.to/renzotognella</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4082360%2Fa84a6c3b-bde1-40be-9652-648472698974.jpg</url>
      <title>DEV Community: Renzo Tognella</title>
      <link>https://dev.to/renzotognella</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renzotognella"/>
    <language>en</language>
    <item>
      <title>Vetores não são memória: como o DecisionsSearch governa conhecimento que muda</title>
      <dc:creator>Renzo Tognella</dc:creator>
      <pubDate>Tue, 18 Aug 2026 20:20:45 +0000</pubDate>
      <link>https://dev.to/renzotognella/vetores-nao-sao-memoria-como-o-decisionssearch-governa-conhecimento-que-muda-5fn9</link>
      <guid>https://dev.to/renzotognella/vetores-nao-sao-memoria-como-o-decisionssearch-governa-conhecimento-que-muda-5fn9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Uma análise metodológica de grafos, RAG híbrido, evidência e versionamento para agentes de IA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uma regra antiga pode continuar sendo o resultado mais parecido com uma pergunta, mesmo depois de ter sido substituída.&lt;/p&gt;

&lt;p&gt;Esse é o problema que o DecisionsSearch tenta investigar: para um agente de IA, lembrar não é apenas encontrar texto semelhante. É saber qual decisão existe, por que ela foi aceita, a qual projeto pertence, o que mudou e qual versão ainda pode ser considerada válida.&lt;/p&gt;

&lt;p&gt;O DecisionsSearch é um projeto experimental de engenharia. Ele ainda não é uma autoridade histórica validada em produção. O objetivo é testar, com código e regressões locais, uma hipótese:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Memória para agentes precisa combinar contexto, evidência, histórico temporal, relações e recuperação — não apenas incorporações vetoriais.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O problema: similaridade não é validade
&lt;/h2&gt;

&lt;p&gt;Uma incorporação vetorial transforma um texto em uma representação numérica. Isso permite encontrar textos próximos por significado aproximado.&lt;/p&gt;

&lt;p&gt;É útil quando alguém pergunta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Como o sistema costuma tratar esse tipo de erro?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;e a memória registrada usa palavras diferentes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A correção adotada no PR alterou o fluxo de validação para evitar a duplicidade.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mas a similaridade não responde sozinha:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pergunta&lt;/th&gt;
&lt;th&gt;O vetor ajuda?&lt;/th&gt;
&lt;th&gt;O que ainda é necessário&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Encontrar algo parecido&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Similaridade semântica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saber se a regra ainda vale&lt;/td&gt;
&lt;td&gt;Parcialmente&lt;/td&gt;
&lt;td&gt;Estado, validade e versão atual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saber o que mudou&lt;/td&gt;
&lt;td&gt;Não por si só&lt;/td&gt;
&lt;td&gt;Revisões, diferenças e linhagem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saber por que acreditar&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Evidência e origem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saber a qual projeto pertence&lt;/td&gt;
&lt;td&gt;Não necessariamente&lt;/td&gt;
&lt;td&gt;Contexto e escopo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impedir uma sobrescrita concorrente&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Proposta, aprovação e CAS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O ponto central é este: recuperação encontra candidatos; governança decide o que pode virar conhecimento compartilhado.&lt;/p&gt;

&lt;h2&gt;
  
  
  A escolha arquitetural central: ledger para governar, índice para recuperar
&lt;/h2&gt;

&lt;p&gt;O DecisionsSearch separa duas responsabilidades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o ledger mantém identidade, histórico, estado, validade, evidências e decisões de mudança;&lt;/li&gt;
&lt;li&gt;o Qdrant mantém uma projeção derivada para tornar a recuperação rápida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No caminho persistente projetado, o Neo4j é o adaptador canônico. O Qdrant não é a autoridade da memória; ele materializa os heads publicados para busca.&lt;/p&gt;

&lt;p&gt;Essa separação resolve um problema comum de arquiteturas RAG: o índice de busca pode atrasar, falhar ou precisar ser reconstruído. Se a história estiver no índice, uma falha de materialização pode parecer perda de conhecimento. Se a história estiver no ledger, a projeção pode ser refeita.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2g3huycgzh505y91mdy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2g3huycgzh505y91mdy1.png" alt="Arquitetura do DecisionsSearch: ledger canônico, outbox, projeção Qdrant e busca" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A ideia é parecida com a diferença entre um arquivo histórico e um catálogo: o catálogo acelera a localização; ele não substitui o arquivo original.&lt;/p&gt;

&lt;h2&gt;
  
  
  O contrato mínimo de uma memória
&lt;/h2&gt;

&lt;p&gt;Para explicar o modelo sem transformar o artigo em um catálogo de classes, quatro conceitos são suficientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Família: a identidade contínua
&lt;/h3&gt;

&lt;p&gt;Uma família representa a entidade lógica da memória.&lt;/p&gt;

&lt;p&gt;Se o texto de uma decisão muda, isso não deveria criar automaticamente outra decisão sem relação com a anterior. A família mantém essa identidade estável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Revisão: um instantâneo imutável
&lt;/h3&gt;

&lt;p&gt;Cada publicação cria uma revisão com conteúdo, hash, autor, motivo, revisões-pai, evidências e janela de validade.&lt;/p&gt;

&lt;p&gt;A revisão é imutável. Uma correção não reescreve o instantâneo anterior; cria outro instantâneo ligado a ele.&lt;/p&gt;

&lt;h3&gt;
  
  
  Head: o que está publicado agora
&lt;/h3&gt;

&lt;p&gt;O head, ou ponteiro atual, aponta para a revisão atualmente publicada dentro de um escopo e uma ramificação.&lt;/p&gt;

&lt;p&gt;Isso permite separar duas perguntas diferentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;qual versão vale agora?&lt;/li&gt;
&lt;li&gt;quais versões já valeram antes?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Evidência: a origem de uma afirmação
&lt;/h3&gt;

&lt;p&gt;A evidência guarda informações como fonte, localizador, hash, autor, modelo de extração, confiabilidade e estado de verificação.&lt;/p&gt;

&lt;p&gt;Ela não prova automaticamente que a afirmação é verdadeira. Ela torna a origem inspecionável e permite distinguir uma informação sustentada, contradita, não verificada ou indisponível.&lt;/p&gt;

&lt;h2&gt;
  
  
  O grafo não é decoração
&lt;/h2&gt;

&lt;p&gt;Podemos representar o conhecimento como um grafo G = (V, E):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;V são os vértices: projetos, famílias, revisões, evidências e outros objetos do domínio;&lt;/li&gt;
&lt;li&gt;E são as arestas: relações tipadas entre esses objetos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma distância vetorial pode dizer que duas memórias são parecidas. Uma aresta pode dizer algo muito mais específico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RELATED_TO: existe relação, mas sem uma direção semântica forte;&lt;/li&gt;
&lt;li&gt;DEPENDS_ON: uma memória depende de outra;&lt;/li&gt;
&lt;li&gt;REFINES: uma decisão refina outra;&lt;/li&gt;
&lt;li&gt;DEPRECATES: uma versão substitui uma anterior;&lt;/li&gt;
&lt;li&gt;CONFLICTS_WITH: duas afirmações entram em conflito;&lt;/li&gt;
&lt;li&gt;EVOLVES_FROM: uma memória evoluiu de outra.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa tipagem é importante. Tratar todas as relações como “parecido com” elimina direção, intenção e semântica.&lt;/p&gt;

&lt;p&gt;Esses tipos fazem parte do modelo que o projeto suporta; eles não significam que todos já tenham sido exercitados no benchmark. Na execução v10, o ledger registrou apenas duas relações, ambas do tipo &lt;code&gt;REFINES&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O diagrama abaixo é um modelo conceitual. No ledger, o projeto também funciona como escopo estruturado do conteúdo, e algumas relações são representadas por asserções reificadas. Nem toda seta do desenho corresponde a uma aresta direta no Neo4j.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3cskrahc6ydtbc5fjmtn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3cskrahc6ydtbc5fjmtn.png" alt="Grafo conceitual de projeto, família, revisões, evidências e relações tipadas" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Três usos diferentes do grafo
&lt;/h3&gt;

&lt;p&gt;No DecisionsSearch, o grafo cumpre três papéis.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Modelar contexto e linhagem
&lt;/h4&gt;

&lt;p&gt;As evidências ligadas à revisão identificam o PR ou documento de origem. As relações tipadas preservam como uma decisão se conecta a outra, o que foi refinado, substituído, desenvolvido ou colocado em conflito.&lt;/p&gt;

&lt;p&gt;Esse é o papel mais importante para perguntas históricas:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Qual decisão levou a esta regra?”&lt;/p&gt;

&lt;p&gt;“O que essa alteração substituiu?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  2. Recuperar vizinhança estrutural
&lt;/h4&gt;

&lt;p&gt;Depois que a busca densa encontra algumas sementes, o sistema pode expandir relações elegíveis por ativação espalhada.&lt;/p&gt;

&lt;p&gt;A implementação atual limita a profundidade e aplica decaimento. Uma memória diretamente relacionada recebe mais ativação; memórias mais distantes recebem menos. Esse recurso é opcional e estava desligado no benchmark v10.&lt;/p&gt;

&lt;p&gt;A escolha é deliberadamente conservadora. Relações de linhagem e governança, como DEPRECATES e CONFLICTS_WITH, não devem simplesmente reintroduzir conhecimento obsoleto na recuperação semântica. A expansão usa um conjunto menor de relações, como RELATED_TO, DEPENDS_ON, REFINES e EVOLVES_FROM.&lt;/p&gt;

&lt;p&gt;Isso não é PageRank, Leiden nem um GraphRAG completo. É uma expansão estrutural limitada, usada como sinal complementar.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Incorporar importância e contexto
&lt;/h4&gt;

&lt;p&gt;O sistema também trabalha com peso efetivo, significância, recência e relações. Esses sinais podem ajudar a ordenar resultados, mas não substituem a relevância da pergunta.&lt;/p&gt;

&lt;p&gt;Por isso, o ramo estrutural recebe menos peso na fusão quando é mais cego ao texto da consulta. Uma memória importante no projeto não deve aparecer no topo apenas porque tem peso alto, ignorando completamente a pergunta.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que não estamos afirmando
&lt;/h3&gt;

&lt;p&gt;O projeto possui serviços e ideias relacionados a agrupamento, propagação de peso e análise de grafo. Porém, o benchmark apresentado neste artigo não valida uma implementação completa de GraphRAG, PageRank personalizado ou detecção de comunidades.&lt;/p&gt;

&lt;p&gt;A formulação correta é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O grafo fornece relações tipadas, linhagem, contexto e expansão estrutural limitada para complementar a recuperação semântica.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Como uma memória entra no sistema
&lt;/h2&gt;

&lt;p&gt;O caminho de escrita é mais longo do que “extrair texto e salvar” porque cada etapa evita um tipo de falha.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1xxhnprjmhta7tlrus5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1xxhnprjmhta7tlrus5.png" alt="Fluxo de escrita: da fonte à proposta, aprovação, CAS e projeção" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Sanitização e extração
&lt;/h3&gt;

&lt;p&gt;O evento pode conter segredo, PII, detalhe efêmero, informação incompleta ou apenas uma hipótese do modelo.&lt;/p&gt;

&lt;p&gt;A sanitização reduz o risco de propagar conteúdo indevido. A extração estruturada transforma a fonte em candidatos com campos definidos, como título, resumo, categoria, projeto, evidências, arquivos, regras e objetivo.&lt;/p&gt;

&lt;p&gt;Uma decisão importante é aceitar explicitamente o resultado NO_MEMORY: nem toda observação merece virar memória durável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema evitado:&lt;/strong&gt; transformar logs, conversas e hipóteses em conhecimento permanente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compromisso:&lt;/strong&gt; o sistema pode descartar algo que seria útil, além de depender da qualidade do extrator.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gates de admissão
&lt;/h3&gt;

&lt;p&gt;A admissão é organizada como uma cadeia de validações:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;projeto;&lt;/li&gt;
&lt;li&gt;evidência;&lt;/li&gt;
&lt;li&gt;duplicidade ou identidade;&lt;/li&gt;
&lt;li&gt;contexto da categoria;&lt;/li&gt;
&lt;li&gt;peso mínimo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A validação contextual muda de acordo com o tipo. Uma regra de negócio precisa de domínio; um padrão de código precisa de exemplos; uma decisão arquitetural precisa de justificativa e alternativas consideradas.&lt;/p&gt;

&lt;p&gt;A deduplicação usa similaridade para distinguir três situações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uma memória nova;&lt;/li&gt;
&lt;li&gt;uma atualização da mesma identidade;&lt;/li&gt;
&lt;li&gt;um possível refinamento de uma memória parecida, mas diferente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Problema evitado:&lt;/strong&gt; lixo semântico, duplicidade e memórias sem contexto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compromisso:&lt;/strong&gt; os limiares são heurísticos. Um limite alto pode rejeitar variações legítimas; um limite baixo pode misturar identidades diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Proposta antes da mutação
&lt;/h3&gt;

&lt;p&gt;No caminho canônico, o agente não publica diretamente uma memória ativa. Ele cria uma proposta com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;estado anterior;&lt;/li&gt;
&lt;li&gt;estado posterior;&lt;/li&gt;
&lt;li&gt;diferença por campo;&lt;/li&gt;
&lt;li&gt;evidências;&lt;/li&gt;
&lt;li&gt;heads observados;&lt;/li&gt;
&lt;li&gt;motivo da mudança;&lt;/li&gt;
&lt;li&gt;hash da prévia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A proposta permite revisar o que será alterado sem contaminar o ledger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema evitado:&lt;/strong&gt; transformar uma sugestão de agente em conhecimento compartilhado sem revisão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compromisso:&lt;/strong&gt; existe mais latência e uma etapa de governança, mas a mudança fica contestável antes da publicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Aprovação e &lt;code&gt;preview_hash&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A aprovação está vinculada ao conteúdo exato da prévia. Se o conteúdo, as evidências ou os heads esperados mudarem, o hash não corresponde mais.&lt;/p&gt;

&lt;p&gt;Além disso, a barreira local impede que um agente aprove a própria proposta. A regra de separação entre quem propõe e quem aprova depende desse limite local; ela não deve ser lida como uma política universal de identidade ou como autenticação corporativa.&lt;/p&gt;

&lt;p&gt;Essa é uma barreira local de governança. Ela ainda não equivale a autenticação corporativa, autorização externa ou política de múltiplos aprovadores.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. CAS em vez de “a última escrita vence”
&lt;/h3&gt;

&lt;p&gt;Uma proposta carrega os heads esperados.&lt;/p&gt;

&lt;p&gt;Se outro escritor publicar uma revisão entre a prévia e a aplicação, a comparação falha. A proposta fica obsoleta e precisa ser revista.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyvk1wcfo2le7c368p6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyvk1wcfo2le7c368p6m.png" alt="Controle de concorrência: uma proposta que espera v1 falha depois que v2 foi publicada" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema evitado:&lt;/strong&gt; uma alteração antiga sobrescrever silenciosamente uma decisão mais nova.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compromisso:&lt;/strong&gt; conflitos não desaparecem. Eles voltam para revisão, rebase ou mesclagem explícita.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Outbox e projeção derivada
&lt;/h3&gt;

&lt;p&gt;O ledger grava a revisão, o head, as transições, as relações e o evento de outbox na mesma operação canônica.&lt;/p&gt;

&lt;p&gt;Depois, um materializador processa o evento e atualiza o Qdrant. Esse materializador é idempotente, pode tentar novamente falhas e possui caminho de reconstrução.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema evitado:&lt;/strong&gt; uma escrita direta e frágil em duas bases independentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compromisso:&lt;/strong&gt; a busca pode ficar temporariamente atrasada. A consistência entre ledger e índice é eventual, mas o estado do outbox torna o atraso observável e reprocessável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projeto antes da recuperação
&lt;/h2&gt;

&lt;p&gt;Memórias sem contexto podem ser semanticamente parecidas e ainda assim pertencer a sistemas diferentes.&lt;/p&gt;

&lt;p&gt;Por exemplo, “regra de faturamento” pode ter significados, exceções e nomes de módulos completamente distintos em dois repositórios.&lt;/p&gt;

&lt;p&gt;Por isso, o projeto é carregado como campo estruturado da memória e recebido como contexto da consulta. O filtro é aplicado nos ramos de recuperação antes da fusão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qdrant recebe o projeto no filtro dos pontos;&lt;/li&gt;
&lt;li&gt;o ramo estrutural consulta apenas revisões do projeto;&lt;/li&gt;
&lt;li&gt;no caminho baseado no ledger, a ativação espalhada verifica o projeto dos vizinhos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É importante ser preciso: o código não cria necessariamente um único subgrafo temporário antes de todas as buscas. Ele envia o contexto do projeto para cada fonte e só depois combina os resultados.&lt;/p&gt;

&lt;p&gt;Essa garantia ainda não deve ser tratada como isolamento universal: o caminho legado baseado em nós do Neo4j exige filtros e testes explícitos para assegurar o mesmo comportamento. Além disso, a ativação espalhada não foi habilitada na execução v10.&lt;/p&gt;

&lt;p&gt;Também não é correto tratar isso como autorização ou isolamento de segurança. É escopo de recuperação.&lt;/p&gt;

&lt;p&gt;No hook de pós-commit, o projeto pode ser informado explicitamente; quando não há valor configurado, o script usa o nome da pasta raiz local (&lt;code&gt;repo.name&lt;/code&gt;), que pode não coincidir com o nome do repositório remoto. Nas outras interfaces, o chamador fornece o projeto. Isso significa que a descoberta automática não é universal em todos os caminhos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o RAG combina sinais diferentes
&lt;/h2&gt;

&lt;p&gt;O DecisionsSearch não trata RAG como “vetor mais instrução”. A recuperação é uma sequência de decisões, em que cada mecanismo cobre um tipo de falha.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jsf1thvkd64pf7oovu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jsf1thvkd64pf7oovu3.png" alt="RAG híbrido: filtro por projeto, buscas densa, esparsa e estrutural, RRF e reordenação" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Busca densa: intenção e paráfrase
&lt;/h3&gt;

&lt;p&gt;A busca densa representa o conteúdo da memória em um espaço vetorial. Ela ajuda quando a consulta e a memória usam vocabulário diferente.&lt;/p&gt;

&lt;p&gt;Em algumas rotas de persistência, o texto enviado ao modelo de incorporação vetorial combina título, resumo, objetivo, gatilho, justificativa, regras, detalhes e módulos. Já o materializador canônico usado no benchmark v10 constrói a representação com título, resumo e detalhes. Essa diferença entre caminhos é importante: a composição da representação vetorial é uma decisão de implementação, não uma propriedade universal de toda memória.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escolha:&lt;/strong&gt; usar significado aproximado para recuperar paráfrases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitação:&lt;/strong&gt; o vetor não sabe se a memória é atual, se foi substituída ou se tem evidência suficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Busca esparsa: termos que não podem virar sinônimos
&lt;/h3&gt;

&lt;p&gt;A busca esparsa, baseada em sinais lexicais, protege identificadores, caminhos de arquivo, nomes de módulos, códigos de erro, siglas e classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escolha:&lt;/strong&gt; manter uma rota para correspondência exata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compromisso:&lt;/strong&gt; exige índice e configuração adicionais. No benchmark v10, o ramo esparso estava desabilitado; portanto, os números apresentados não medem ganho de busca densa combinada com busca esparsa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Busca estrutural: estado e relações
&lt;/h3&gt;

&lt;p&gt;O ramo estrutural adiciona informações que não aparecem apenas no texto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;projeto;&lt;/li&gt;
&lt;li&gt;categoria;&lt;/li&gt;
&lt;li&gt;escopo e ramificação;&lt;/li&gt;
&lt;li&gt;estado ativo;&lt;/li&gt;
&lt;li&gt;peso efetivo;&lt;/li&gt;
&lt;li&gt;metadados de estado e, quando habilitada, vizinhança de relações;&lt;/li&gt;
&lt;li&gt;revisões e heads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No caminho canônico, essa etapa é principalmente uma enumeração de revisões ativas filtradas por projeto, categoria, escopo e ramificação. A travessia da vizinhança acontece separadamente, quando a ativação espalhada está habilitada. O ramo estrutural pode ser pouco sensível ao texto da consulta, porque ordenar por peso não significa entender a pergunta. Por esse motivo, ele entra com peso menor na fusão, em vez de dominar a busca.&lt;/p&gt;

&lt;h3&gt;
  
  
  RRF: combinar listas ordenadas, não escalas incompatíveis
&lt;/h3&gt;

&lt;p&gt;Scores de cosseno, BM25, peso e ativação não têm necessariamente a mesma escala. Somá-los diretamente produziria uma combinação difícil de interpretar.&lt;/p&gt;

&lt;p&gt;O Reciprocal Rank Fusion usa a posição de cada candidato em cada lista:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;RRF(d) = soma de wᵢ / (k + posiçãoᵢ(d))&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No projeto, k começa em 60 e os pesos padrão são ajustáveis. A intenção é premiar memórias que aparecem bem em mais de uma visão, sem fingir que as pontuações brutas são comparáveis.&lt;/p&gt;

&lt;p&gt;O RRF organiza relevância. Ele não decide verdade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Score composto: relevância, recência e importância
&lt;/h3&gt;

&lt;p&gt;Depois da fusão, o score composto combina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relevância;&lt;/li&gt;
&lt;li&gt;recência;&lt;/li&gt;
&lt;li&gt;importância.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando não são substituídos por configuração, os valores padrão dão 50% para relevância, 25% para recência e 25% para importância. A recência usa meia-vida de 90 dias.&lt;/p&gt;

&lt;p&gt;Essa escolha permite que uma memória relevante e recente tenha prioridade, sem tornar a recência o único critério.&lt;/p&gt;

&lt;p&gt;O peso composto é uma política de ordenação, não uma prova causal de que a resposta é correta. Ainda são necessárias ablações para medir quanto cada componente contribui.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reordenação: uma segunda opinião cara
&lt;/h3&gt;

&lt;p&gt;O reordenador recebe os candidatos da primeira etapa e pode melhorar a ordenação usando uma comparação mais profunda entre consulta e documento.&lt;/p&gt;

&lt;p&gt;Na execução v10, foi usado o Qwen via OpenRouter: 78 chamadas de reordenação tiveram sucesso em 79 tentativas.&lt;/p&gt;

&lt;p&gt;Isso mostra que o componente foi exercitado. Não mostra, sozinho, que ele melhorou as métricas, porque não houve uma ablação controlada com a reordenação desligada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reconciliação: o resultado precisa poder voltar à origem
&lt;/h3&gt;

&lt;p&gt;O Qdrant carrega identificadores da família e da revisão, o hash, o projeto e a validade. A busca também aplica filtros de estado e escopo. Isso fornece os elementos para uma verificação posterior, mas o caminho atual não hidrata universalmente cada resultado com o ledger nem verifica, antes de retornar, o head e todas as evidências associadas.&lt;/p&gt;

&lt;p&gt;Portanto, a reconciliação completa é uma camada parcial/planejada, não uma garantia automática da consulta atual. O resultado deveria corresponder a um head canônico ativo e manter ligação com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;família;&lt;/li&gt;
&lt;li&gt;revisão;&lt;/li&gt;
&lt;li&gt;hash;&lt;/li&gt;
&lt;li&gt;projeto;&lt;/li&gt;
&lt;li&gt;validade;&lt;/li&gt;
&lt;li&gt;evidência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se a base não sustenta a resposta, uma política de abstenção ainda precisa ser definida e validada como comportamento formal do agente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correção não é apagamento
&lt;/h2&gt;

&lt;p&gt;Considere uma regra de negócio registrada a partir de um pull request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhixv16vpaeg7ipmygjn6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhixv16vpaeg7ipmygjn6.png" alt="Versionamento: v1 permanece no histórico enquanto o head aponta para v2" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O fluxo é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;o primeiro PR sustenta v1;&lt;/li&gt;
&lt;li&gt;uma nova mudança gera evidência;&lt;/li&gt;
&lt;li&gt;uma proposta compara v1 com a possível v2;&lt;/li&gt;
&lt;li&gt;após aprovação, v2 é publicada como filha de v1;&lt;/li&gt;
&lt;li&gt;o head passa a apontar para v2;&lt;/li&gt;
&lt;li&gt;v1 continua disponível para auditoria, reversão ou pergunta temporal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A versão antiga deixa de ser a atual, mas não precisa desaparecer.&lt;/p&gt;

&lt;p&gt;Isso também vale para invalidação, supersessão, reversão, mesclagem e conflitos. Um conflito não deve ser resolvido silenciosamente escolhendo a frase mais convincente; ele precisa permanecer explícito ou seguir para uma decisão de domínio.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a avaliação local mostra
&lt;/h2&gt;

&lt;p&gt;A avaliação mais recente usa a execução local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 pull requests públicos do ERPNext;&lt;/li&gt;
&lt;li&gt;1.485 arquivos únicos no corpus;&lt;/li&gt;
&lt;li&gt;87 registros brutos de extração;&lt;/li&gt;
&lt;li&gt;79 candidatos únicos persistidos;&lt;/li&gt;
&lt;li&gt;8 registros classificados como inválidos pelo validador da extração;&lt;/li&gt;
&lt;li&gt;79 consultas de recuperação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os oito inválidos não são “oito memórias rejeitadas pelas barreiras de admissão”. Eles foram classificados antes da persistência por problemas como falta de conhecimento durável, atribuição incorreta ou uma mudança específica demais para ser uma memória reutilizável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métricas da execução
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;Resultado&lt;/th&gt;
&lt;th&gt;Como interpretar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;0,9451&lt;/td&gt;
&lt;td&gt;Posição média do primeiro resultado esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NDCG@10&lt;/td&gt;
&lt;td&gt;0,9593&lt;/td&gt;
&lt;td&gt;Qualidade de ordenação com relevância binária&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precision@1&lt;/td&gt;
&lt;td&gt;0,8987&lt;/td&gt;
&lt;td&gt;Resultado esperado em primeiro em 71 de 79 consultas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall@5&lt;/td&gt;
&lt;td&gt;1,0&lt;/td&gt;
&lt;td&gt;Resultado esperado apareceu até a quinta posição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall@10&lt;/td&gt;
&lt;td&gt;1,0&lt;/td&gt;
&lt;td&gt;Resultado esperado apareceu até a décima posição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latência p50&lt;/td&gt;
&lt;td&gt;924,53 ms&lt;/td&gt;
&lt;td&gt;Mediana observada na execução&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latência p95&lt;/td&gt;
&lt;td&gt;1.611,47 ms&lt;/td&gt;
&lt;td&gt;Percentil observado na execução&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reordenação&lt;/td&gt;
&lt;td&gt;78/79 sucessos&lt;/td&gt;
&lt;td&gt;Chamadas do reordenador&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsd3adlywlg050twzfzgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsd3adlywlg050twzfzgu.png" alt="Gráfico das métricas de recuperação da execução local v10" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Perfil metodológico
&lt;/h3&gt;

&lt;p&gt;A execução usou:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLM de extração OpenAI GPT 5.6 Luna via Codex;&lt;/li&gt;
&lt;li&gt;modelo vetorial &lt;code&gt;text-embedding-3-small&lt;/code&gt; com 512 dimensões;&lt;/li&gt;
&lt;li&gt;Qwen via OpenRouter para reordenação;&lt;/li&gt;
&lt;li&gt;busca esparsa desligada;&lt;/li&gt;
&lt;li&gt;ativação espalhada e HyDE desligados;&lt;/li&gt;
&lt;li&gt;reescritor de consulta local, sem chamada externa;&lt;/li&gt;
&lt;li&gt;InMemoryMemoryLedger;&lt;/li&gt;
&lt;li&gt;Qdrant local em disco;&lt;/li&gt;
&lt;li&gt;aprovação por uma barreira local do benchmark;&lt;/li&gt;
&lt;li&gt;nenhum conjunto independente de teste.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As consultas foram associadas a memórias do próprio conjunto persistido. O conjunto de avaliação excluiu consultas que expunham identificadores óbvios, como número de PR, URL e título exato, mas isso não cria um conjunto de teste independente.&lt;/p&gt;

&lt;p&gt;Portanto, Recall@5 e Recall@10 iguais a 1,0 significam que os alvos apareceram nesses cortes deste corpus controlado. Não significam que o sistema encontrará qualquer memória em qualquer repositório.&lt;/p&gt;

&lt;p&gt;O benchmark mede a ordenação da recuperação. Ele não mede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verdade factual;&lt;/li&gt;
&lt;li&gt;qualidade de toda extração;&lt;/li&gt;
&lt;li&gt;qualidade da resposta final do agente;&lt;/li&gt;
&lt;li&gt;generalização para outros repositórios;&lt;/li&gt;
&lt;li&gt;segurança de aprovação;&lt;/li&gt;
&lt;li&gt;durabilidade em produção;&lt;/li&gt;
&lt;li&gt;isolamento entre projetos;&lt;/li&gt;
&lt;li&gt;qualidade dos relacionamentos;&lt;/li&gt;
&lt;li&gt;efeito causal da busca esparsa, da reordenação ou do ramo estrutural.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decisões e compromissos em uma tabela
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Escolha&lt;/th&gt;
&lt;th&gt;Benefício&lt;/th&gt;
&lt;th&gt;Custo ou limite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ledger versionado&lt;/td&gt;
&lt;td&gt;Preserva histórico, estado e linhagem&lt;/td&gt;
&lt;td&gt;Mais complexidade de escrita&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprovação antes da publicação&lt;/td&gt;
&lt;td&gt;Evita mutação sem revisão&lt;/td&gt;
&lt;td&gt;Menos autonomia e mais latência&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAS&lt;/td&gt;
&lt;td&gt;Protege contra propostas obsoletas&lt;/td&gt;
&lt;td&gt;Conflitos voltam para revisão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qdrant como projeção&lt;/td&gt;
&lt;td&gt;Busca rápida e reconstruível&lt;/td&gt;
&lt;td&gt;Consistência eventual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busca densa&lt;/td&gt;
&lt;td&gt;Recupera intenção e paráfrases&lt;/td&gt;
&lt;td&gt;Pode perder termos exatos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busca esparsa opcional&lt;/td&gt;
&lt;td&gt;Protege identificadores&lt;/td&gt;
&lt;td&gt;Índice adicional; não medido no v10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grafo tipado&lt;/td&gt;
&lt;td&gt;Preserva direção, dependência e conflito&lt;/td&gt;
&lt;td&gt;Relações precisam de qualidade e governança&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RRF&lt;/td&gt;
&lt;td&gt;Combina listas sem normalizar pontuações incompatíveis&lt;/td&gt;
&lt;td&gt;Pesos ainda são ajustáveis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reordenação&lt;/td&gt;
&lt;td&gt;Melhora a ordenação final&lt;/td&gt;
&lt;td&gt;Custo, latência e dependência externa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filtro por projeto&lt;/td&gt;
&lt;td&gt;Reduz mistura de contextos&lt;/td&gt;
&lt;td&gt;Não é autorização nem isolamento de segurança entre clientes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  O que está implementado, testado e ainda é hipótese
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Implementado e parcialmente coberto por regressões locais
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;famílias, revisões, heads e validade;&lt;/li&gt;
&lt;li&gt;evidências ligadas às revisões;&lt;/li&gt;
&lt;li&gt;propostas, diferenças, aprovação local e CAS;&lt;/li&gt;
&lt;li&gt;barreiras de projeto, evidência, duplicidade, contexto e peso;&lt;/li&gt;
&lt;li&gt;outbox, novas tentativas e reconstrução local;&lt;/li&gt;
&lt;li&gt;busca densa, ramo estrutural e RRF;&lt;/li&gt;
&lt;li&gt;busca esparsa e reordenação como capacidades opcionais;&lt;/li&gt;
&lt;li&gt;relações tipadas e ativação limitada;&lt;/li&gt;
&lt;li&gt;testes de atualização, reversão, conflitos, temporalidade e falhas do materializador.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ainda parcial ou planejado
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;reconciliação distribuída, fencing e injeção de falhas;&lt;/li&gt;
&lt;li&gt;políticas de evidência por domínio;&lt;/li&gt;
&lt;li&gt;conjunto de avaliação histórico independente e avaliação entre projetos;&lt;/li&gt;
&lt;li&gt;reconciliação final automática de cada resultado com head e evidências;&lt;/li&gt;
&lt;li&gt;política formal de abstenção do agente;&lt;/li&gt;
&lt;li&gt;teste com projetos maiores;&lt;/li&gt;
&lt;li&gt;teste com projetos desde o início dele.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O DecisionsSearch não tenta resolver memória para agentes adicionando apenas mais um vetor.&lt;/p&gt;

&lt;p&gt;A proposta é separar duas coisas que normalmente são misturadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recuperar algo que parece relevante;&lt;/li&gt;
&lt;li&gt;decidir o que pode continuar sendo conhecimento compartilhado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso ainda é uma hipótese em consolidação, não uma promessa de produção, e nem de reprodutibilidade&lt;/p&gt;

&lt;p&gt;A pergunta que continua guiando o projeto é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Antes de um agente usar uma memória para tomar uma decisão, quais evidências ele deveria ser obrigado a mostrar?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O código e a documentação estão disponíveis no repositório:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Renzo-Tognella/DecisionsSearch" rel="noopener noreferrer"&gt;https://github.com/Renzo-Tognella/DecisionsSearch&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
