Documentação

O que precisa viver no código

A página de gating defendeu que o código deve ser dono do limiar. Esta página vai um nível além: algumas verificações não deveriam ser pedidas ao modelo de forma alguma.

A declaração de fronteira mais forte em público

A linha mais dura vem de uma implementação de loop de agente:

Uma chamada de ferramenta com pontuação de risco alta força autorização humana, e nenhuma probabilidade pode anulá-la.

“Nenhuma probabilidade pode anulá-la” merece destaque. Não diz “a confiança precisa ser muito alta” — diz esta regra não está no espaço de probabilidade. A distinção importa:

  • “Aprovar automaticamente com ≥ 0.95” é uma regra de limiar — em princípio alguma probabilidade suficientemente alta a satisfaria.
  • “Risco alto exige aprovação humana” é uma regra estrutural — verdadeira independentemente do que o modelo diz.

Essas não são igualmente confiáveis. Seu sistema deve ser explícito sobre quais verificações são quais, e deveria haver o máximo possível de regras estruturais.

Rode regras determinísticas primeiro, dê ao modelo apenas a zona cinzenta

Outra formulação do mesmo padrão:

Rode regras determinísticas primeiro: o que puder ser decidido é bloqueado ou permitido de imediato, e o modelo é apenas um backend opcional. Comandos rotineiros são decididos localmente e nunca chegam a ser enviados ao modelo.

Rodar as regras primeiro tem um benefício subestimado: ele encolhe a superfície de ataque. Um juiz que depende puramente do modelo se comporta de forma imprevisível sob injeção de prompt; um juiz que roda regras primeiro confina a injeção à pequena fatia que as regras não conseguem decidir.

Um teste de injeção publicado relata 300 tentativas de injeção e declara claramente o que o gate pegou e o que passou. Isso é muito mais útil do que uma alegação pura de “proteção contra injeção”.

Segredos e dados sensíveis: bloqueie localmente primeiro

Um detector de segredos expõe a ordem claramente:

Caso Tratamento
Formatos de segredo conhecidos Bloqueados localmente, nunca enviados ao modelo
Strings de alta entropia desconhecidas Mascaradas primeiro, depois o texto mascarado vai para o modelo
Modelo diz ≥ 0.80 Bloquear
Modelo diz ≥ 0.30 Pedir a um humano
Modelo indisponível Pedir a um humano mesmo assim

Duas decisões para lembrar:

  • O mascaramento vem primeiro. Você não pode enviar algo a um serviço externo para descobrir se é um segredo. A própria verificação vaza.
  • Um modelo morto ainda pede a um humano, em vez de permitir. Isso é fail-closed em forma concreta — indisponibilidade do serviço não é razão para baixar silenciosamente a barra de segurança.

Medido: 6/6 segredos bloqueados, 0/6 entradas benignas bloqueadas por engano.

Tetos de orçamento, recibos assinados, auditoria

Algumas verificações não têm nada a ver com o que o modelo diz, mas precisam viver no mesmo sistema:

  • Um runtime dá bloqueio de comandos perigosos e tetos de orçamento a código determinístico, e registra cada veredicto numa cadeia de recibos assinada com Ed25519.
  • Outro confina a pontuação de risco a uma escala 0–100 controlada pelo código e assina cada veredicto com ES256 (540 chamadas, 99.76% e 0 falsos positivos num limiar de 65–75).

O objetivo da assinatura não é se proteger do modelo — é para que depois você possa dizer o que aconteceu. Quando uma decisão automatizada causa um incidente, “o que o modelo disse e o que o código fez a respeito” precisa ser verificável de forma independente, em vez de depender de confiar nos logs.

Filtre injeção em dois lugares

O desenho de uma camada de guardrail merece menção própria porque nomeia dois pontos facilmente esquecidos:

Filtre uma vez antes de uma chamada de ferramenta rodar, e de novo antes de um resultado de ferramenta ser lido pelo agente.

O segundo é o que as pessoas esquecem. Filtre apenas a entrada e um ataque pode se esconder no que a ferramenta retorna — uma página buscada, o conteúdo de um arquivo — que entra no contexto tendo contornado inteiramente a verificação do lado da entrada.

Uma regra relacionada de uma implementação com recuperação aumentada: nunca produza um número que não apareça nas fontes citadas.

Sandboxing e permissões

Além de filtrar conteúdo, a outra camada é limitar o raio de impacto: caminhos protegidos sempre passam por confirmação humana; a execução do agente roda em espaços de trabalho isolados (uma implementação usa Docker); as permissões de sub-agentes são separadas das do agente pai.

Uma tabela de referência

Verificação Que tipo Para que lado cai em caso de erro
Formatos de segredo conhecidos Regra determinística Bloquear
Autorização de operação de alto risco Regra estrutural Negar (um humano precisa aprovar)
Aprovar automaticamente comandos somente leitura Regra de limiar Recorrer ao prompt
Injeção dentro da saída de ferramenta Filtro determinístico + modelo Bloquear
“O agente terminou?” Gate de eficiência Permitir (fail-open)
Verificações de formato e estilo Gate de eficiência Permitir

A coluna do meio é o ponto: quanto mais alto, menos o modelo deve estar envolvido.

Em uma frase

Uma verificação que pode ser anulada por uma probabilidade acabará sendo. Decida primeiro quais verificações não podem ser anuladas; só então ajuste os limiares.