hermes approvals test: pergunte ao sistema de aprovações antes de rodar aquele comando

Você está prestes a adicionar um comando de limpeza a um script que o agente vai rodar sem supervisão, e há uma pergunta que você não consegue responder olhando para o código: o Hermes vai deixar isso passar? Adivinhar significa ou um prompt de aprovação no meio da execução sem ninguém para responder, ou um comando que rodou em silêncio quando você esperava que fosse bloqueado. A v0.21.0 inclui a ferramenta óbvia para isso: hermes approvals test faz dry-run de qualquer comando contra as proteções de aprovação reais — a blocklist hardline, suas regras approvals.deny, a detecção de padrões perigosos, a allowlist, até o bypass yolo/off — e imprime o veredito sem executar nada, sem perguntar a ninguém e sem persistir nada.
O veredito em três exit codes
hermes approvals test -- rm -rf /tmp/x
O -- importa: ele interrompe o parsing de flags, para que as próprias flags do comando (como -rf) não sejam engolidas pelo hermes approvals. A saída diz o veredito, qual regra casou e o rastro do comando normalizado — a mesma normalização que o portão real aplica. Scripts recebem a resposta como exit code:
- 0 — permitir
- 2 — pedir aprovação (perguntaria)
- 3 — negar (blocklist hardline ou sua própria regra de deny)
Então você pode ligá-lo a um pre-flight check: um script de deploy que se recusa a continuar se um passo for bloqueado, um cron job que falha ruidosamente antes de rodar um comando que o portão barraria de qualquer forma, ou uma passada de auditoria que faz grep nos seus scripts procurando qualquer coisa que pediria aprovação num contexto sem supervisão.
O que ele avalia de fato
O dry run percorre a mesma cadeia de decisão de um comando real, incluindo:
- a blocklist hardline (comandos negados incondicionalmente),
- seus globs fnmatch
approvals.deny(veja nosso guia de configuração de aprovações inteligentes para o schema), - a detecção de padrões perigosos (deletes recursivos, sudo, gravações em disco, edições de credenciais, …),
- a command allowlist (comandos que você já abençoou),
- e o bypass yolo/off, se você rodar nesses modos (modos yolo explicados).
Duas flags ajustam a verificação: --env-type diz qual backend de terminal avaliar (padrão local; backends de container isolados, como docker, pulam as proteções, então um comando que é tranquilo num container pode pedir aprovação localmente — vale saber antes de escrever o script), e --json dá saída legível por máquina.
O comando bônus: hermes approvals suggest
hermes approvals test responde “o que aconteceria?”; o irmão dele, hermes approvals suggest, responde “o que eu deveria permitir?” Ele minera suas decisões de aprovação passadas no banco de sessões, classifica os padrões recorrentes e propõe entradas de command_allowlist — nada é gravado a menos que você as aplique:
hermes approvals suggest # reveja as propostas numeradas
hermes approvals suggest --apply 1,3,7 # mescle as escolhidas no config.yaml
Opções: --days (quanto voltar no tempo, padrão 90), --min-count (mínimo de aprovações para um padrão, padrão 2), --limit, --db (banco de sessões alternativo), --json. Classes destrutivas (delete recursivo, sudo, gravações em disco, edições de credenciais, …) nunca são propostas — a ferramenta não sugere permitir o que ela existe para barrar. Isso combina bem com aprovações sem supervisão para contextos de cron.
Quando você vai recorrer a isso
Três momentos se destacam. Antes de escrever automação: verifique cada passo arriscado uma vez, e ou o abençoe deliberadamente ou trate do caminho do prompt. Auditoria: hermes approvals test -- <cmd> num comando suspeito diz exatamente qual regra o pega — sem tentativa e erro. Aprendendo o sistema: o rastro normalizado mostra como o Hermes enxerga o seu comando, que é o jeito mais rápido de entender por que um one-liner de shell que você achava inocente dispara o portão. A v0.21.0 também endureceu toda a superfície de aprovações (comandos destrutivos do Windows agora a disparam, arquivos de instrução protegidos sempre exigem aprovação) — as notas do release cobrem o quadro completo em /releases/v0-21-0/.