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.