O que tem de 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 mais longe: algumas verificações não devem sequer ser pedidas ao modelo.
A afirmação de fronteira mais forte em público
A linha mais dura vem de uma implementação de ciclo de agente:
Uma chamada de ferramenta com uma pontuação de risco alta força autorização humana, e nenhuma probabilidade pode anulá-la.
«Nenhuma probabilidade pode anulá-la» merece ser destacado. Não diz «a confiança tem de ser muito alta» — diz esta regra não está no espaço das probabilidades. A distinção importa:
- «Aprovar automaticamente com ≥ 0.95» é uma regra de limiar — em princípio alguma probabilidade suficientemente alta passá-la-ia.
- «Risco elevado exige aprovação humana» é uma regra estrutural — verdadeira independentemente do que o modelo diz.
Não são igualmente fiáveis. O teu sistema deve ser explícito sobre quais verificações são de que tipo, e deve haver tantas regras estruturais quanto possível.
Corre primeiro as regras determinísticas, dá ao modelo só a zona cinzenta
Outra formulação do mesmo padrão:
Corre primeiro as regras determinísticas: tudo o que pode ser decidido é bloqueado ou permitido de imediato, e o modelo é apenas um backend opcional. Os comandos de rotina são decididos localmente e nunca chegam a ser enviados ao modelo.
Correr as regras primeiro tem um benefício subestimado: reduz a superfície de ataque. Um juiz que depende puramente do modelo comporta-se de forma imprevisível sob injeção de prompt; um juiz que corre regras primeiro confina a injeção à pequena fatia que as regras não conseguem decidir.
Um teste de injeção publicado reporta 300 tentativas de injeção e diz claramente o que a barreira apanhou e o que passou. Isso é muito mais útil do que uma afirmação crua de «proteção contra injeção».
Segredos e dados sensíveis: bloquear localmente primeiro
Um detetor de segredos expõe a ordem com clareza:
| Caso | Tratamento |
|---|---|
| Formatos de segredo conhecidos | Bloqueados localmente, nunca enviados ao modelo |
| Cadeias de alta entropia desconhecidas | Mascaradas primeiro, depois o texto mascarado vai para o modelo |
| O modelo diz ≥ 0.80 | Bloquear |
| O modelo diz ≥ 0.30 | Perguntar a uma pessoa |
| Modelo indisponível | Perguntar a uma pessoa mesmo assim |
Duas decisões a recordar:
- Mascarar vem primeiro. Não podes enviar algo a um serviço externo para descobrir se é um segredo. A própria verificação vaza.
- Um modelo morto continua a perguntar a uma pessoa, em vez de permitir. Isto é fail-closed em forma concreta — a indisponibilidade de um serviço não é razão para baixar silenciosamente o nível de segurança.
Medido: 6/6 segredos bloqueados, 0/6 entradas benignas falsamente bloqueadas.
Tetos de orçamento, recibos assinados, auditoria
Algumas verificações não têm nada a ver com o que o modelo diz, mas têm de viver no mesmo sistema:
- Um runtime dá bloqueio de comandos perigosos e tetos de orçamento a código determinístico, e regista cada veredicto numa cadeia de recibos assinados com Ed25519.
- Outro confina a pontuação de risco a uma escala de 0–100 controlada pelo código e assina cada veredicto com ES256 (540 chamadas, 99.76% e 0 falsos positivos com um limiar de 65–75).
O objetivo de assinar não é proteger contra o modelo — é que depois consigas dizer o que aconteceu. Quando uma decisão automática causa um incidente, «o que o modelo disse e o que o código fez com isso» tem de ser verificável de forma independente, e não uma questão de confiar nos registos.
Filtrar injeções em dois sítios
A conceção de uma camada de guardrail merece menção própria porque nomeia dois pontos fáceis de esquecer:
Filtra uma vez antes de uma chamada de ferramenta correr, e outra vez antes de um resultado de ferramenta ser lido pelo agente.
O segundo é o que as pessoas esquecem. Filtra só a entrada e um ataque pode esconder-se naquilo que a ferramenta devolve — uma página obtida, o conteúdo de um ficheiro — que entra no contexto tendo contornado completamente a verificação do lado da entrada.
Uma regra relacionada de uma implementação com recuperação aumentada: nunca produzas 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 explosão: caminhos protegidos passam sempre por confirmação humana; a execução do agente corre em espaços de trabalho isolados (uma implementação usa Docker); as permissões dos 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 risco elevado | Regra estrutural | Negar (uma pessoa tem de aprovar) |
| Aprovar automaticamente comandos só de leitura | Regra de limiar | Recorrer ao prompt |
| Injeção dentro da saída de uma ferramenta | Filtro determinístico + modelo | Bloquear |
| «O agente já acabou?» | Barreira de eficiência | Permitir (fail-open) |
| Verificações de formato e estilo | Barreira de eficiência | Permitir |
A coluna do meio é o ponto: quanto mais perto do topo, menos o modelo deve estar envolvido.
Numa frase
Uma verificação que pode ser anulada por uma probabilidade acabará por ser. Decide primeiro que verificações não podem ser anuladas; só depois afina os limiares.