O Agente que Não Inventa Verbos

· 17 min read · atualizado

Uma comunicação chega a um escritório jurídico. Pode criar um prazo. Pode exigir uma tarefa. Pode precisar ser roteada para outra mesa. Ou pode não exigir nada além de um reconhecimento fundamentado e encerramento.

Um agente de IA a lê. Ele pode resumir, pode raciocinar sobre o que deveria acontecer a seguir, pode redigir uma resposta. Mas neste sistema há uma coisa que ele não pode fazer: inventar um verbo. Toda ação que ele pode propor já deve existir como um playbook nomeado, revisado e endereçado por conteúdo em disco. Alinhamento, aqui, não é uma propriedade escondida nos pesos do modelo. É uma propriedade de um diretório.

Há um arquivo em um laptop em algum lugar — talvez em Porto Velho, talvez alhures — chamado playbooks/tier1/receber_expediente_com_prazo__a1b2c3d4.feature. Os oito caracteres hexadecimais após o duplo sublinhado não são decoração. Eles são o prefixo de um UUIDv5 calculado sobre o conteúdo normalizado do arquivo. O arquivo não carrega um nome ao qual um hash está anexado. O nome do arquivo é o hash.

Esse é um pequeno compromisso com consequências. Mude um caractere — uma vírgula adicionada, uma palavra-chave Gherkin recapitalizada — e o hash muda, e o nome do arquivo muda, e o arquivo como coisa identificável no mundo deixa de ser esse arquivo e se torna outro. Não há edição silenciosa. O ato de editar é, estruturalmente, um ato de substituição.

Dentro, após um comentário de cabeçalho que repete o UUID completo para legibilidade, há um parágrafo de português que parece um documento judicial e se analisa como um programa:

@tier1 @receber-expediente @com-prazo
Funcionalidade: Receber expediente que cria prazo processual

  Cenário: Garantir que prazo seja registrado e roteado
    Dado que existe expediente <expediente_id> com prazo <prazo>
    Quando o agente reflete sobre o expediente <expediente_id>
    Então o prazo <prazo> deve estar registrado no expediente
      E a pasta <pasta_id> deve ter rota de trabalho clara

A palavra Então está fazendo três trabalhos. Para um revisor jurídico lendo em voz alta, então — a virada retórica antes de uma conclusão. Para o parser do Gherkin, uma palavra-chave de passo. Para a biblioteca de passos uma camada abaixo, um nome de função que despacha para uma ação executável ou uma asserção no-op. As mesmas letras, três leituras.

O catálogo é o vocabulário

Esse arquivo vive em um diretório chamado playbooks/, ao lado de seus irmãos e descendentes. Juntos formam um cânone curado, finito e monotonicamente crescente de cenários jurídicos. Um agente de IA operando neste sistema não inventa ações. Ele escolhe um cenário do cânone e preenche seus placeholders com valores concretos de um caso. Isso, mais uma etapa de aprovação humana, mais o ato de execução, é o que o agente está autorizado a fazer. Ponto.

A maior parte do discurso público sobre alinhamento de IA acontece nos pesos — interpretabilidade via sondagem, alinhamento via treinamento, supervisão via filtragem post-hoc. Aqui acontece em um diretório. O espaço de ação do agente é enumerado; a enumeração é legível por humanos; a enumeração cresce apenas quando humanos aprovam adições; e o ato de aprovar uma adição é um commit git. Não é necessária sondagem, porque não há nada insondável: o vocabulário do agente está em disco, numa linguagem que o advogado lendo o arquivo já conhece.

Isso é alinhamento por restrição de affordance. É o que o harness, reclamado parece ao nível de um vocabulário de ação concreto: não uma gaiola em torno de um motor cognitivo, mas a estrutura que constitui o que o motor tem permissão de significar. Funciona não porque um modelo foi treinado para recusar, mas porque a sintaxe do que o agente pode fazer é ela própria restrita, e as restrições são escritas em prosa que um não-engenheiro pode auditar. A técnica é velha o suficiente para parecer trapaça. Sistemas especialistas dos anos 1980 faziam algo semelhante; também as codificações doutrinárias, remontando ainda mais. O que é novo é o reconhecimento de que um LLM, dado um catálogo, pode escolher a partir dele e se comprometer com ele de forma competente — e que isso é suficiente, no domínio certo, para entregar comportamento útil sem ceder o catálogo.

Meme galaxy brain com quatro painéis de brilho crescente, rotulados: 'Treinar o modelo para recusar', 'Filtrar saídas depois do fato', 'Sondar ativações para interpretabilidade', 'Dar a ele um diretório finito'.
A escalada termina não numa técnica inteligente mas num diretório de arquivos .feature. A maioria das ideias de alinhamento vive nos três primeiros painéis; a trapaça acontece no quarto.

Doutrina, procedimento, encerramento

O cânone estratifica. O Tier 1 declara resultado — o que conta como resultado legítimo neste tipo de situação. O Tier 2 e abaixo declaram ação — passos concretos que, se executados, produzem tal resultado. As cláusulas Então do Tier 1 são no-ops em tempo de execução; são asserções sobre como o mundo deveria parecer, não instruções sobre o que fazer. O Tier 2 em diante mapeia cada Então para um escritor real no sistema de registro.

A divisão é a antiga entre valores e políticas instrumentais, tornada operacional. O agente pode propor novas concretizações livremente — um Tier 3 que especializa um Tier 2 para um caso limite, com o lint apropriado passando — mas estender a camada doutrinária requer confirmação explícita sob uma flag que nomeia o que está acontecendo (--i-am-introducing-new-doctrine), e a proposta vai para uma fila separada, e operações em lote a excluem. O gradiente é estrutural: adição procedimental é barata; adição doutrinária é cara por design.

Hierarquia de tiers no cânone de playbooks
<rect x="280" y="30" width="240" height="92" class="box" />
<text x="400" y="55" text-anchor="middle" class="label" font-weight="600">Tier 1 — resultado</text>
<text x="400" y="78" text-anchor="middle" class="tier-tag">receber_expediente_com_prazo</text>
<text x="400" y="95" text-anchor="middle" class="small">__a1b2c3d4</text>
<text x="400" y="112" text-anchor="middle" class="small">@receber-expediente @com-prazo</text>

<rect x="80" y="200" width="240" height="92" class="box" />
<text x="200" y="225" text-anchor="middle" class="label" font-weight="600">Tier 2 — ação</text>
<text x="200" y="248" text-anchor="middle" class="tier-tag">citacao_eletronica</text>
<text x="200" y="265" text-anchor="middle" class="small">__5f8a3b2c</text>
<text x="200" y="282" text-anchor="middle" class="small">@concretiza:a1b2c3d4 @contestacao</text>

<rect x="480" y="200" width="240" height="92" class="box" />
<text x="600" y="225" text-anchor="middle" class="label" font-weight="600">Tier 2 — ação</text>
<text x="600" y="248" text-anchor="middle" class="tier-tag">ciencia_sem_prazo</text>
<text x="600" y="265" text-anchor="middle" class="small">__7c1e9f3a</text>
<text x="600" y="282" text-anchor="middle" class="small">@concretiza:a1b2c3d4 @ciencia</text>

<rect x="80" y="370" width="240" height="92" class="box" />
<text x="200" y="395" text-anchor="middle" class="label" font-weight="600">Tier 3 — folha</text>
<text x="200" y="418" text-anchor="middle" class="tier-tag">citacao_eletronica_sem_caixa</text>
<text x="200" y="435" text-anchor="middle" class="small">__9e7d6c5b</text>
<text x="200" y="452" text-anchor="middle" class="small">@concretiza:5f8a3b2c @sem-caixa</text>

<line x1="240" y1="200" x2="340" y2="122" class="edge" />
<line x1="560" y1="200" x2="460" y2="122" class="edge" />
<line x1="200" y1="370" x2="200" y2="292" class="edge" />
O Tier 1 declara resultado; o Tier 2 concretiza via @concretiza:<uuid>; o Tier 3 adiciona especialização situacional. Folhas — nós sem filhos — são os únicos playbooks que um agente pode vincular diretamente.

Um caso demorou mais para ficar claro: o encerramento. Em um sistema de tickets — e um sistema de gestão de casos é exatamente isso, com casos em vez de tickets — não fazer nada não é um estado. Todo ticket termina em algum lugar: arquivado com motivo, indeferido com justificativa, encaminhado para outro setor. Mesmo tomar ciência de uma comunicação meramente informativa é, no Kanoê que o PINK lê, um ato — o ato de registrar o reconhecimento e encerrar o expediente. Portanto, o cânone inicial deve incluir Tier 1s cujas cláusulas Então reconhecem o encerramento como resultado legítimo, e que exigem que a razão substantiva do encerramento seja escrita como comentário no expediente antes do fechamento. Sem isso, o catálogo tendencia o agente a propor ação procedimental em casos que só requerem reconhecimento, e perde a chance de capturar a reflexão do agente como artefato que vive, permanentemente, no próprio caso.

A descida é o raciocínio

Como o agente encontra o cenário certo? A primeira resposta que se sugere é correspondência — fornecer ao sistema os dados do caso, fornecer o catálogo, fazê-lo classificar candidatos por sobreposição de tags ou similaridade de pré-condições, apresentar a melhor correspondência. Isso é o que o design originalmente propôs. Estava errado, e o erro é iluminador.

Um matcher embutido na ferramenta rouba o julgamento que deveria pertencer ao sistema de raciocínio acima dele. O design atual não faz correspondência. O PINK expõe o cânone como uma árvore e deixa o agente percorrê-la. O agente mantém o Tier 1 e o Tier 2 no contexto de trabalho — o cânone superior, pequeno o suficiente para caber lá. Para um dado expediente, o agente escolhe um Tier 2 cujas pré-condições descrevem o caso, pede ao PINK seus children, e se a lista não estiver vazia, lê cada filho e escolhe a especialização que se encaixa. O loop termina em uma folha — um nó sem filhos próprios — e a proposta vincula essa folha. Se em qualquer passo da descida nenhum filho se encaixa no caso, o agente propõe um novo Tier N+1 sob o nó atual, carregando @concretiza:<uuid_atual>. Esse é o gradiente de aprendizado do sistema, disciplinado: todo novo cenário aponta por hash de conteúdo para seu pai.

graph LR
  D[Descobrir<br/><i>ler Metabase</i>] --> F[Buscar<br/><i>ler PDFs do Kanoê</i>]
  F --> P[Propor<br/><i>travessia + escrever .md</i>]
  P --> R[Revisar<br/><i>portão humano</i>]
  R --> A[Aplicar<br/><i>escritas Kanoê + comentário expediente</i>]

O pipeline de cinco estágios. Os três primeiros são somente leitura contra o sistema jurídico de registro; o quarto é o portão humano; o quinto é o único estágio que muta o Kanoê, e apenas via primitivas de escrita aprovadas.

O PINK é deliberadamente burro. E isso é uma feature, não um bug. Toda inferência acontece no LLM, onde pertence; toda estrutura vive no PINK, onde pode ser auditada deterministicamente. A cadeia de descida — qual Tier 2, qual Tier 3, qual Tier 4 — é registrada em um campo traversal: na proposta, com o UUID de cada nó visitado. Meses depois, um revisor perguntando por que o agente desceu tão fundo lê a cadeia e reconstrói o raciocínio passo a passo. Interpretabilidade do ato, não dos pesos, mas do artefato.

Dois artefatos, dois leitores, a mesma reflexão

Quando o humano aprova e o sistema aplica, duas coisas acontecem ao mesmo tempo. As ações inscritas nas cláusulas Então da folha disparam em ordem contra o sistema jurídico de registro. Um comentário é postado no expediente com a razão substantiva que o agente encontrou. O prazo é registrado. A pasta é movida para a caixa apropriada. Uma tarefa é criada com o título e data de vencimento adequados.

Esse é um artefato: o comentário no expediente. Ele vive no Kanoê, no caso, para sempre. Qualquer revisor jurídico que abrir esse expediente três anos depois verá, em português, escrito como por um advogado: Tomada ciência. A comunicação não estabelece prazo porque [o raciocínio substantivo]. O comentário está no lugar em que um advogado já estaria olhando, no registro que um advogado já estaria lendo.

O outro artefato é o markdown da proposta. Ele vive em .pink/<CNJ>/proposals/<exp_id>.md, endereçado por conteúdo, rastreado pelo git, analisado uma vez por pink propose apply. Ele carrega o frontmatter YAML (qual playbook, qual UUID, qual cadeia de travessia), os bindings (placeholders preenchidos com valores do caso), o bloco Gherkin instanciado (que é o que apply analisa e executa) e o raciocínio narrativo que o agente escreveu para si mesmo sobre por que esse cenário se encaixa nesse caso.

Os dois artefatos carregam o mesmo conteúdo substantivo. O motivo_substantivo preenchido no binding aparece, palavra por palavra, como o texto do comentário no expediente. Não há tradução entre o que o agente raciocinou e o que o registro do caso mostra. A auditoria técnica vive no markdown; a auditoria jurídica vive no Kanoê; a reflexão é um ato, registrado em ambos os registros ao mesmo tempo.

Um diretório que é uma rede Merkle

Os nós do cânone são endereçados por conteúdo via UUIDv5 sobre conteúdo normalizado. A tag @concretiza: — a aresta que diz este cenário especializa aquele — aponta pelo UUID, não pelo caminho. Mover um playbook entre diretórios não quebra a aresta; renomear o slug legível por humanos não quebra a aresta; apenas mudar o conteúdo muda, e mudar o conteúdo significa que o UUID muda, o que significa que o arquivo com o UUID antigo não existe mais. Editar equivale a deletar mais criar. Identidade é conteúdo.

A aciclicidade é por construção. Cada aresta @concretiza: aponta de um tier superior para um tier estritamente inferior. Não há regra que diga sem ciclos porque ciclos são inalcançáveis: as arestas só fluem para baixo. O lint que impõe isso é uma única linha.

O resultado estrutural é um cânone que se parece mais com uma rede Merkle do que com um diretório versionado: cada nó é identificado por um hash de seu conteúdo, as arestas referenciam hashes, e a relação proposta-cânone é apenas mais uma aresta — de um artefato markdown para um nó de hash de conteúdo. O mesmo truque que o Verne usa para identidade de agente — endereçamento de conteúdo como substrato para coisas que devem permanecer reidentificáveis após movimentos e renomeações — aplicado aqui ao vocabulário do agente em vez de sua memória. O git rastreia o histórico do saco de nós; o saco de nós é ele próprio um grafo que o agente navega e o lint verifica. Dois artefatos que fixam o mesmo UUID garantidamente estão falando sobre o mesmo conteúdo, porque o UUID é o conteúdo. A fixação é estrutural, não por convenção.

Pam de The Office segurando uma foto, com legenda 'A empresa precisa que você encontre as diferenças entre esta foto e esta foto: Um diretório versionado / Uma rede Merkle. São a mesma foto.'
Uma vez que as arestas apontam para hashes e a identidade colapsa no conteúdo, o diretório se tornou silenciosamente um tipo diferente de objeto — embora todo editor da equipe ainda o abra como uma pasta.

O que ainda escapa

Nada disso está terminado. Três resíduos honestos merecem ser nomeados.

A relação entre os resultados do Tier 1 e os cenários do Tier 2+ que afirmam realizá-los é imposta pela revisão humana, não pelo código. O lint pode verificar que a tag @concretiza: está presente e que o tier alvo é estritamente menor que o tier fonte. Ele não pode verificar que as cláusulas Então concretas do filho realmente realizam as cláusulas Então de resultado do pai. Essa verificação é semântica; é humana; é a costura mole.

O campo confidence: em cada proposta — o número auto-reportado do agente — não está estratificado. Não há loop de feedback na v1 que vincule resultados passados à calibração por playbook. Um leitor da proposta que lê confidence: 0.82 deveria mentalmente acrescentar auto-relato do agente; não calibrado. O campo é um marcador para trabalho futuro, não um sinal estatístico.

E apply, o ato de executar o Gherkin contra o sistema jurídico, é best-effort. As primitivas de escrita do Kanoê não são transacionais. Um apply parcial deixa o caso em um estado que pode ser intermediário — três de cinco cláusulas Então executaram; duas falharam porque as pré-condições derivaram. O caminho de retry lida com faça as que ainda não executaram; ele não lida com e o mundo se moveu sob nós desde que as três primeiras executaram. Deriva de estado em cascata entre passos executados é a fronteira honesta.

A pergunta mais difícil

Seria fácil dizer que esse padrão é local — que funciona para automação jurídico-administrativa estreita e mais nada. A pergunta mais difícil e interessante é a inversa: onde isso não se aplicaria? No exame, a maioria dos candidatos cai.

Negociação de alta frequência, a objeção clássica de latência, na verdade não escapa do padrão; ela realoca a aprovação humana. Auditores de risco amostram execuções depois do fato, reguladores como MiFID II já exigem registros estruturados de negociações, e quando algo desvia o artefato semelhante a proposta é o objeto de revisão. Mesmo quando nenhum humano revisa, o ganho de interpretabilidade sozinho — uma forense de flash-crash que começa numa proposta estruturada em vez de um log não estruturado — justifica o artefato. Controle industrial é similar: quanto mais você olha, mais já é esse padrão com vocabulário diferente. O playbook é o controlador; a proposta é a mudança de setpoint; o comentário no expediente é a entrada no log do operador.

As não-aplicabilidades genuínas se revelam ser três questões semânticas, não técnicas. Há uma unidade discreta de ação — algo em que o agente pode decompor o que fez em passos nomeados? Escrita criativa livre não tem tal unidade; uma carta de condolências não é três Entãos. Há um registro onde a reflexão pertence — um caso, um ticket, um prontuário, um livro-razão — que o ator e um revisor futuro ambos consultam? Conversa casual não tem nenhum. O operador quer ser auditável? Jornalismo investigativo com fontes confidenciais, estratégia de litígio interno sob privilégio profissional, dissidência sob um regime autoritário — todos são domínios onde o padrão seria uma armadilha em vez de uma ferramenta.

Quando as três respostas são sim, o padrão se encaixa, com a aprovação humana colocada onde o throughput permite. Quando qualquer uma é não, o padrão falha pela natureza do domínio, não pela escala.

O assessor diligente

A leitura institucional é a mais limpa. O cânone é o corpus de posições doutrinárias que o escritório endossa. A proposta é o memorando preparado por um assessor — bindings, travessia, raciocínio, tudo escrito para o principal ler. O apply é a assinatura do principal no ato. O comentário no expediente é a justificativa institucional que viaja com o ato para sempre no registro do caso.

O agente é o assessor diligente. Não o aprendiz — essa palavra está fazendo trabalho demais, com sua imagem de alguém supervisionado porque ainda está aprendendo. Em outro lugar descrevi isso no registro da delegação cotidiana, onde a disciplina é passar a tarefa adiante sem passar a assinatura adiante. O assessor é tecnicamente competente, muitas vezes expert; supervisionado não por desconfiança mas por design constitucional. A autoridade pertence ao principal porque deve; o assessor prepara o ato, se compromete com ele por escrito, o entrega para cima. O que o assessor não pode fazer é assinar. O que o catálogo adiciona, e o que o endereçamento de conteúdo e a travessia preservam, é a propriedade de que a preparação do assessor é estruturalmente legível: qualquer um com acesso aos registros pode reconstruir exatamente o que foi proposto, por que foi proposto, e se o ato assinado correspondeu à proposta.

O arquivo ainda está no laptop, nomeado pelo seu próprio conteúdo. Dentro dele, um parágrafo de português descreve um resultado que ele não produz. Um leitor chegará, eventualmente.

Para leitura adicional

Tags: #ia, #agentes, #alinhamento, #gherkin, #harness, #engenharia-de-software

🇺🇸 Read in English

Os Três Imperativos em Delfos

Sobre o templo que exigia autoconhecimento, o filósofo que o levou a sério, e a letra na entrada que ninguém conseguia ler.

A API do Jules como Backend do Harness

Explorando a integração da API do Jules no daemon canivete. Como sessões e atividades mapeiam para uma identidade contínua, e as implicações metafísicas da orquestração de agentes.

Comentários

Comentários ainda não configurados.

↑ Top