Documentação

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.