Pular para o conteúdo

O que o agente escreve

“Essa coisa pode mexer na minha infraestrutura?”

Não. O RootPilot é read-only por construção, com exatamente cinco exceções — e nenhuma delas toca a sua infraestrutura. As cinco escrevem em sistemas de registro: ticket, chat e issue, que é onde um incidente é anotado e comunicado.

Ferramenta Onde escreve Operação executada
create_incident_ticket Jira tickets.createIssue
update_jira_issue Jira tickets.transitionIssue, tickets.addComment
post_slack_message Slack chat.postMessage
create_slack_channel Slack chat.createChannel
create_github_issue GitHub tickets.createGithubIssue

A lista não é arbitrária e não é histórica. Uma escrita entra quando é registro reversível, no lugar onde o seu time já trabalha: ela afirma que algo merece atenção, não altera o que roda em produção, e desfazê-la custa um clique e deixa rastro. A issue do GitHub passa nesse teste pelo mesmo motivo que o ticket do Jira — vários times usam uma onde outros usam o outro.

Pull request não passa, e a recusa é deliberada. Uma PR propõe código, e o valor de propor código está em alguém aceitá-lo — então o modo de falha não é “abriram uma PR à toa”, é alguém mergear um diff escrito sobre uma causa que o agente inferiu. O contra-argumento óbvio (“PR passa por review humano”) é fraco por uma razão que nós medimos: numa leva de cinco achados do nosso próprio loop de melhoria, o sintoma estava certo nos cinco e o mecanismo proposto errado em quatro. Review de PR é gate contra código ruim, não contra causa errada.

AWS, GCP, Magalu e Datadog seguem fora, e agora por um motivo dito em vez de herdado: aquilo é infraestrutura, não registro.

O escopo dessa garantia merece ser dito com precisão, porque é o tipo de frase que um time de segurança vai conferir: o token que o Agent segura não consegue escrever nas suas fontes. Isso não é o mesmo que dizer que nada em nenhum lugar escreve — se o produto abrir um pull request para você, isso acontece por outro caminho, fora do Agent e com outra credencial. O que esta página garante é o que passa pela superfície de agente e pelo Agent que roda na sua infra.

Toda escrita exige confirmação explícita, e a confirmação é verificada duas vezes, em lados diferentes da fronteira.

Camada 1 — control-plane. A ferramenta recebe um parâmetro confirmed. Com confirmed: false (o default), ela devolve um preview e não toca em nada: o canal, o texto, o ticket que seria criado. Só confirmed: true executa.

Camada 2 — o seu Agent. A confirmação viaja no protocolo, junto da chamada. O Agent que roda na sua infra recusa executar qualquer operação marcada como escrita no catálogo se a confirmação não estiver lá, respondendo op_not_authorized.

Duas verificações independentes, ambas antes de qualquer efeito:

  • A permissão mcp:write — de owner e admin. Um token cujo dono é member não escreve; um token sem dono (CLI, ou legado) não escreve nunca. É esta que é fail-closed: usuário inativo, papel que não resolve, erro de consulta — tudo isso nega a escrita em vez de liberá-la.
  • O escopo do token — um token read bloqueia escrita mesmo se o dono for owner. É uma restrição por cima da primeira, não uma segunda chance: ela só sabe bloquear.

A matriz completa está em Tokens MCP. Nenhuma das duas verificações chega a tocar a sua infra: a recusa acontece no control-plane, antes de a chamada existir.

Toda escrita confirmada vira registro na trilha de auditoria da sua organização, com o actor_id da pessoa dona do token — não “o agente”. É o que torna a autonomia auditável em vez de anônima, e é visível em Governança.

O registro tem duas fases, e a ordem é deliberada:

  1. Antes do efeito grava-se a intenção, e isso é fail-closed: se não for possível registrar, a escrita não acontece. A política exige trilha para toda escrita confirmada, e uma escrita sem trilha seria pior do que uma escrita que falhou.
  2. Depois do efeito grava-se o resultado — sucesso ou falha — e esse é best-effort: o efeito já ocorreu, e uma falha de registro aqui não pode desfazê-lo.

O que vai para a trilha é metadado: a ação, o alvo, o tamanho do texto, se houve redação. Não o conteúdo bruto.

A redação de PII canônica acontece na borda do Agent, antes de qualquer dado sair da sua infra (ver Redação de PII). Mas o texto de uma mensagem no Slack é composto pelo modelo — ele não veio de lá, então não passou por lá.

Por isso há uma segunda passada, de alta confiança, sobre o texto que a ferramenta vai enviar: ARN, endereço de e-mail e chave de acesso da AWS são mascarados antes do envio. O preview mostra o texto já redigido — o que você aprova é o que sai —, e a trilha registra que houve redação.

O que ela deliberadamente não mascara: IP, UUID e hash de commit. São a evidência que torna a mensagem útil durante um incidente, e mascará-los transformaria o registro num texto que ninguém consegue usar.

Existem exatamente duas situações em que o RootPilot escreve sem alguém pedir na hora, e um cliente que descobre isso sozinho tem razão em desconfiar. Então:

Quando O que faz
A saúde das integrações da sua frota muda (ou um Agent novo conecta) Posta uma linha no Slack dizendo o novo estado
Uma investigação automática de incidente conclui Posta o diagnóstico no Slack

As duas usam post_slack_message com a confirmação já dada, e as duas têm o mesmo limite duro: elas só reportam. Nunca uma ação corretiva, nunca uma mudança em sistema seu. Postar o resultado de uma leitura é a fronteira, e ela não se move.

O limite não é intenção, e cada uma o sustenta de um jeito: a investigação automática recebe a lista de ferramentas sem nenhuma das cinco de escrita — o modelo que a conduz não tem como pedi-las —, e o aviso de saúde de frota não fala com o seu ambiente de forma alguma: a única saída dele é um texto para um canal.

As duas também são desligadas por padrão e só acontecem com três coisas simultaneamente verdadeiras: o recurso ligado no processo, um canal do Slack configurado, e — no caso da saúde de frota — a sua organização tendo optado por recebê-la. Ambas viram registro na trilha, marcadas com a origem própria (não como escrita de agente), então dá para separar o que uma pessoa pediu do que o sistema reportou.

Quatro caminhos, do mais fino ao mais grosso:

  1. Emita tokens read. Bloqueia escrita mesmo para quem é owner, e é o default do formulário.
  2. Não conceda mcp:write. Sem owner/admin, nenhum token escreve.
  3. Não configure Jira/Slack no Agent. Sem connector servindo essas operações, as ferramentas nem aparecem para o modelo.
  4. Negue por política. A denylist de tools recusa as operações dentro da sua infra, independentemente do que o control-plane peça.

Os dois primeiros são controles nossos; os dois últimos rodam do seu lado da fronteira. Se a sua avaliação de risco exige uma garantia que não dependa de nós, é o terceiro ou o quarto.