Na semana passada publicamos o framework. Esta semana provamos que funciona no menor modelo que tínhamos disponível.

Quando publicamos o Operational Ontology Framework, uma das críticas mais honestas que fizemos a nós mesmos foi a seção 11.1 do documento: "Lacuna Empírica Declarada". Seis meses de operação, cinco agentes em produção, zero perda de estado entre transições de provider. Mas a evidência era operacional e anedótica. Faltava algo mais concreto.

Esta semana fechamos parte dessa lacuna. Pegamos o framework, implementamos o ciclo completo num Gemma 2B (o menor modelo que temos) rodando localmente via Ollama, e colocamos pra operar como agente comercial da FSTech via WhatsApp.

Custo de API: zero. Custo de infraestrutura: um notebook Dell com 16GB de RAM que já existia.

O Que Significa "Ciclo Completo"

O framework define 5 artefatos e um ciclo. Na teoria, qualquer agente que implemente os 5 artefatos e execute o ciclo está operando segundo o framework. Na prática, a pergunta era: um modelo de 2B parâmetros consegue fazer isso?

A resposta curta: sim, se a inteligência estiver no lugar certo.

Os 5 artefatos implementados:

  • Pin — regras imutáveis do agente, carregadas no boot. Definem quem ele é, o que pode fazer, limites de acesso.
  • Spec — estado atual dos projetos. Tarefas pendentes, bloqueadas, concluídas. Lido e escrito pelo agente em tempo real.
  • Log — registro estruturado de toda interação. JSONL com timestamp, ator, tipo, conteúdo, latência. Auditável via git.
  • Skill — funções determinísticas que executam sem passar pelo modelo. Consulta de pipeline, detalhe de lead, atividade recente. Latência: 0ms.
  • Handoff — resumo estruturado gerado quando a sessão encerra. A próxima sessão carrega o handoff e sabe o que aconteceu antes.

O ciclo: Boot (carrega Pin + Spec + Pipeline + Handoff anterior) → Execute (Skill ou modelo) → Write-back (detecta eventos comerciais, registra no log) → Handoff (preserva contexto para a próxima sessão).

O Truque: Código Orquestra, Modelo Conversa

Um modelo de 2B parâmetros não consegue gerenciar artefatos. Não produz JSON confiável. Não faz raciocínio multi-step. Se você pedir pra ele atualizar um arquivo markdown com o status de um lead, ele vai inventar dados que não existem.

O que um modelo de 2B consegue: responder perguntas sobre dados que ele recebeu no contexto. Manter tom consistente. Ser conciso.

A arquitetura que funciona separa responsabilidades:

Responsabilidade Quem faz Por quê
Ler/escrever artefatos JavaScript Determinístico, sem alucinação
Detectar comandos (/pipeline, /lead) JavaScript (regex) Instantâneo, 0ms
Buscar dados de um lead JavaScript Lê do JSONL/pipeline real
Detectar evento comercial JavaScript (padrões) "Francielli respondeu" → log automático
Gerar handoff JavaScript Extração de tópicos por keyword, não por modelo
Responder ao humano Modelo (Gemma 2B) Humaniza dados reais que recebeu no contexto

O modelo não é a fonte dos dados. Ele é o formatador. Os dados vêm do código. O código lê os artefatos, busca os registros, injeta no prompt. O modelo recebe "Francielli: proposta R$10K, 3 fases, aguardando aprovação" e responde com linguagem natural usando esses dados. Não precisa inventar porque já tem tudo.

O Problema da Alucinação (E Como Resolvemos)

Na primeira versão, o modelo recebia o contexto genérico do pipeline e respondia perguntas sobre leads específicos. Resultado: inventava valores, status e datas que não existiam.

A correção foi o que chamamos de pre-inject. Quando o código detecta que a mensagem menciona um lead (por nome ou empresa), ele busca os dados reais desse lead nos logs comerciais e injeta diretamente no prompt, antes do modelo processar.

Antes: "Qual o status da Francielli?" → modelo inventa "Proposta Aceita, R$25.000"

Depois: "Qual o status da Francielli?" + [dados: call 09/04, proposta R$10K, 3 fases, aguardando] → modelo responde com dados reais

A diferença não é sutil. É a diferença entre um agente que parece inteligente e um que é confiável.

Números Reais

Operação Latência Precisão
Comandos (/pipeline, /lead, /log) 0ms 100% (JavaScript direto)
Saudação simples ~20 segundos OK
Query sobre lead (com pre-inject) ~50 segundos Dados reais, zero alucinação
Write-back automático 0ms (+ tempo do modelo) Lead e ação corretos

20 a 50 segundos não é rápido. É o limite de um Gemma 2B num notebook com 16GB de RAM. Mas é funcional, é gratuito, e os dados estão corretos. Para um agente comercial que consulto pelo celular algumas vezes por dia, a troca vale.

O Que Isso Prova

Três coisas:

  1. O framework é independente do modelo. O mesmo ciclo (Pin, Spec, Log, Skill, Writeback, Handoff) que opera com Claude Opus 4.6 no terminal funciona com um Gemma 2B de 3.4GB via WhatsApp. Os artefatos são markdown e JSONL. O ciclo é código. O modelo é intercambiável.
  2. A inteligência não precisa estar no modelo. Skills como funções determinísticas, write-back por detecção de padrões, handoff por extração de keywords. O modelo faz o que faz bem (conversar) e o código faz o resto.
  3. Soberania de memória funciona na prática. O estado do agente vive em arquivos no filesystem. Se amanhã eu trocar o Gemma por um Llama, por um Haiku, ou por qualquer outro modelo, o agente não perde o que aprendeu. Porque nunca esteve no modelo.

Como Começar

O framework está publicado, licença CC BY 4.0. O código de referência tem 44 testes e adapters para Anthropic, OpenAI e Ollama.

Se você opera qualquer processo recorrente (comercial, financeiro, atendimento), pode implementar o ciclo com o modelo que já tem disponível. Não precisa de GPU enterprise. Não precisa de API cara. Precisa de 3 arquivos markdown e disciplina de write-back.