8 min de leitura

Controle local de ações em fluxos de programação com IA: onde ele se encaixa

O controle local de ações ajuda agentes de programação com IA a agir sem expor segredos. Saiba quando aprovações do desenvolvedor fazem sentido e quando os controles no servidor devem decidir.

Controle local de ações em fluxos de programação com IA: onde ele se encaixa

O controle local de ações se encaixa em um fluxo de programação com IA quando um desenvolvedor é responsável pelo computador, permanece presente o suficiente para autorizar uma execução e precisa que um agente aja fora do repositório sem receber os segredos subjacentes. Ele resolve um problema específico e comum: um agente consegue editar o código com segurança razoável em um workspace, mas também precisa consultar uma API, buscar um artefato privado ou executar um comando por SSH.

Ele é uma solução ruim quando a equipe tenta transformá-lo em autorização para toda a frota. Uma aprovação no Mac pode estabelecer que determinado processo local pode agir com uma credencial. Ela não pode dizer a um serviço de produção qual tenant, ambiente, janela de mudança ou regra de negócio deve permitir a solicitação resultante. Essas decisões pertencem ao local onde o recurso está.

A fronteira útil é simples: o controle local protege as credenciais e recupera a intenção humana no computador do desenvolvedor. O controle no servidor protege recursos compartilhados e continua funcionando quando nenhum desenvolvedor está diante daquela máquina. As equipes têm problemas quando pedem a um lado que faça o trabalho do outro.

O controle local pertence a um ponto de execução de propriedade de uma pessoa

O controle local de ações faz sentido quando o computador que inicia o agente tem um responsável claro, capaz de reconhecer o trabalho e interrompê-lo. Isso normalmente significa um Mac de desenvolvedor executando uma sessão interativa de programação, não um worker de build sem supervisão com um hostname amigável.

A questão da propriedade parece óbvia até que a equipe observe como o trabalho realmente é executado. Um laptop pode estar atribuído a uma pessoa, mas ser acessado regularmente por desktop remoto. Um Mac de laboratório compartilhado pode ter vários engenheiros conectados ao longo da semana. Um host de build gerenciado pode executar sob a conta de um desenvolvedor, mas rodar jobs acionados por um pull request. Nenhum desses fatos, por si só, cria um controle humano significativo.

Faça quatro perguntas concretas antes de adicionar aprovações locais:

  • Quem pode desbloquear fisicamente o computador e aprovar uma solicitação?
  • Qual executável inicia o agente e o responsável consegue identificar sua autoridade de assinatura de código?
  • O trabalho do agente permanece em uma sessão interativa ou pode continuar depois que a pessoa se afasta?
  • Se o computador for comprometido, o que limita o alcance da credencial no serviço remoto?

As duas primeiras perguntas mostram se a aprovação tem um sujeito humano. As duas últimas mostram se ela tem um raio de impacto razoável. Se um desenvolvedor clicar em aprovar para um processo que pode funcionar durante a noite e fazer deploy em todos os ambientes, esse clique terá muito mais autoridade do que a pessoa provavelmente pretendia conceder.

Um gateway local deve guardar o segredo e executar a ação de saída por conta própria. Entregar um token ao agente por meio de uma variável de ambiente, arquivo de configuração ou resposta de ferramenta torna a barreira local quase cerimonial. O agente pode repeti-lo em uma transcrição, gravá-lo em um patch, colocá-lo no histórico do shell ou enviá-lo para outra ferramenta. Não é possível recuperar uma credencial com confiabilidade depois que ela entrou no contexto do agente.

Por isso, um arranjo semelhante a um proxy não basta por si só. Um proxy HTTP pode encaminhar o tráfego, mas o encaminhamento não prova que os segredos nunca entram no processo cliente. O projeto precisa garantir que o agente solicite uma ação, o componente local insira a credencial e o agente receba apenas o resultado remoto.

A propriedade do computador é mais do que um nome de login

O nome da conta do desenvolvedor não prova que o processo aprovado é o processo que está realizando o trabalho. No macOS, um agente de programação pode ser iniciado por um terminal, uma extensão do editor, um processo auxiliar ou um script gravado no repositório. Essas origens têm níveis de confiança muito diferentes.

Comece examinando a árvore real de processos durante uma execução inofensiva. Este comando lista IDs de processos, processos pais, usuários, tempo decorrido e linhas de comando:

ps -axo pid,ppid,user,etime,command | grep -i '[a]gent'

A saída deve mostrar uma cadeia que você reconhece. Por exemplo, um terminal interativo pode aparecer como pai do processo do agente aprovado. Um script de shell dentro de um repositório não confiável, um item de inicialização em segundo plano ou um auxiliar desconhecido deve mudar sua decisão. Não aprove um processo apenas porque a linha de comando contém o nome de uma ferramenta esperada.

Depois, examine o executável em vez de confiar no nome do arquivo:

codesign -dv --verbose=4 /path/to/executable 2>&1 | \
  grep -E '^(Identifier|TeamIdentifier|Authority)='

Um binário assinado ainda pode conter bugs, mas a autoridade de assinatura oferece ao operador algo estável para reconhecer. Um caminho simples dentro de um diretório de projeto gravável não oferece. Uma aprovação de sessão que mostra primeiro a autoridade de assinatura do código é muito melhor do que uma caixa de diálogo que diz apenas «o agente quer acesso». Isso ajuda a pessoa a rejeitar um binário copiado, um wrapper local ou uma atualização inesperada antes que uma ação com credenciais seja executada.

É por isso que aliases do shell e scripts wrapper também merecem atenção. Eles são úteis no trabalho, mas um alias pode iniciar algo diferente do executável que a pessoa acredita ter aprovado. Mantenha os comandos de inicialização do gateway de ações fora dos repositórios graváveis pelo agente. Se um agente puder editar o script que define seu próprio caminho de acesso, a barreira deixará de expressar a decisão do operador.

A especificação do Model Context Protocol define como um cliente e um servidor MCP trocam chamadas de ferramentas. Ela não estabelece que o chamador da ferramenta seja um processo local aprovado. A compatibilidade com MCP responde a uma questão de interface. A identidade do processo, a custódia da credencial e a autorização continuam sendo trabalhos separados.

A aprovação por sessão funciona quando uma execução tem um limite natural

A aprovação por sessão é um padrão prático para uma execução interativa de programação porque solicita confirmação uma vez, quando um novo processo do agente começa, e depois sai do caminho. Ela evita uma caixa de diálogo para cada leitura inofensiva, preservando um momento em que a pessoa pode verificar quem está solicitando acesso.

O limite precisa ser a duração real de um processo, não uma ideia vaga como «o trabalho desta tarde». Uma sessão termina quando o processo é encerrado. Essa regra é fácil de explicar, fácil de revogar e difícil de reinterpretar por um agente. Se o processo reiniciar, ele perguntará novamente. Se uma pessoa revogar a sessão, as chamadas futuras falharão em vez de herdar a confiança de um clique anterior.

A fadiga de aprovação mostra que o limite está errado. Se um desenvolvedor vê uma solicitação cada vez que um agente consulta um rastreador de tarefas, busca um pacote e lê uma API de staging, ele aprovará tudo mecanicamente. Avisos repetidos não produzem decisões melhores. Eles treinam as pessoas a fechar janelas para que o trabalho continue.

Uma aprovação de sessão tem um objetivo mais restrito que um mecanismo de políticas. Ela diz: «Reconheço este processo local e permito que use o caminho de ações autorizado enquanto estiver ativo». Ela não deve tentar inferir se uma consulta SQL é segura, se o título de um chamado parece legítimo ou se o branch atual merece acesso à produção. Essas são decisões de autorização remota ou regras de fluxo de trabalho, e prompts em linguagem natural são um lugar péssimo para armazená-las.

Há casos em que nem uma sessão interativa deve receber uma autorização ampla. Um agente que abre workspaces locais arbitrários, aceita tarefas de chats ou executa plugins de repositórios não revisados tem uma superfície de entrada maior que a de uma sessão restrita a um repositório. Nesse cenário, reduza o conjunto de ações disponível para a execução ou exija aprovação para a credencial específica que traz o risco.

As caixas de diálogo de aprovação também precisam de um comportamento confiável em caso de falha. Se o cofre estiver bloqueado, toda ação deve falhar. Se a interface de aprovação não puder aparecer porque o Mac está bloqueado ou em repouso, toda ação deve falhar. Um fallback oculto que permita solicitações durante um erro da interface transforma uma barreira humana em decoração.

A aprovação por chamada é para ações com consequências caras

A aprovação por chamada é adequada para uma credencial cujo uso pode criar uma mudança em produção, gastar dinheiro, apagar dados ou cruzar uma fronteira que o desenvolvedor deve considerar ativamente a cada vez. Ela não é adequada para toda credencial com um nome intimidador.

Classifique a ação pela consequência, não pelo protocolo. Um HTTP POST pode apenas criar um registro de pré-visualização descartável. Um comando SSH pode apenas ler um log de deploy. Uma solicitação GET pode exportar todo um conjunto de dados de clientes. O método e o transporte não determinam o modo de aprovação.

Use uma barreira por chamada quando a ação tiver uma ou mais destas características:

  • O serviço remoto não consegue desfazer o resultado de forma confiável.
  • A credencial pode afetar um recurso compartilhado de produção.
  • A solicitação pode transferir dados sensíveis para fora de um destino esperado.
  • A operação é rara o suficiente para que uma confirmação deliberada não se torne rotina.

O quarto ponto é importante. A confirmação por chamada para uma ação de alta frequência produz os mesmos cliques mecânicos de um prompt de sessão excessivo. Separe as credenciais quando possível. Dê ao trabalho rotineiro de desenvolvimento uma credencial limitada aos recursos de desenvolvimento e reserve a credencial com capacidade de produção para o pequeno número de ações que justificam uma interrupção.

Um agente nunca deve decidir quais de suas próprias chamadas precisam de confirmação. Se ele puder rotular uma solicitação como «somente leitura» ou escolher sozinho a classe da credencial, uma injeção de prompt ou um simples erro de implementação poderá conduzi-lo pelo caminho mais fácil. A pessoa responsável pela conta deve definir a exigência de aprovação fora do workspace do agente.

Torne a confirmação legível o suficiente para permitir uma decisão real. A pessoa precisa do nome ou propósito da credencial, do destino, do método da solicitação ou formato do comando e da identidade do processo que iniciou a chamada. Exibir corpos brutos de solicitações pode revelar segredos ou sobrecarregar a pessoa. Mostrar apenas «Aprovar ação?» não oferece contexto útil. Um bom design de confirmação faz menos, mas informa o suficiente para que o operador rejeite uma chamada inesperada.

Manter os segredos locais resolve um problema, não todos

Interrompa uma sessão ativa do agente
Revogue uma execução ativa do agente no diário de sessões, sem esperar o processo terminar.

Um cofre local impede que o agente mantenha chaves de API e chaves privadas SSH em texto simples. Isso reduz muito a divulgação acidental por meio de prompts, transcrições, logs de ferramentas, arquivos copiados e código escrito pelo agente. Também permite que o operador revogue uma execução ativa sem precisar trocar imediatamente a credencial.

Isso não muda o que a credencial remota pode fazer. Se um token de API puder excluir todos os projetos, o serviço aceitará uma solicitação de exclusão depois de uma aprovação local. Se uma conta SSH tiver amplos direitos de sudo, proteger a chave privada não transformará essa conta em uma identidade de deploy restrita. O menor privilégio remoto ainda determina o dano máximo.

Mantenha claras duas distinções:

  1. A custódia da credencial pergunta se o agente pode obter ou reproduzir um segredo. Um cofre local responde bem a isso.
  2. A autorização do recurso pergunta se o serviço deve aceitar uma ação nas condições atuais. A API, o host, o provedor de identidade ou o sistema de deploy deve responder a isso.

As equipes costumam misturar esses conceitos porque os dois aparecem quando um agente chama uma API. A consequência é previsível. Elas instalam um cofre local de segredos e deixam atrás dele um token de administrador de longa duração. O token já não vaza com tanta facilidade, mas o caminho de ação continua amplo demais.

O SSH torna a distinção especialmente clara. O computador local pode proteger a chave privada, mas o host decide o que a conta associada à chave pública pode executar. Sempre que possível, crie contas separadas ou restrições de comando forçado para automações. Limite o acesso aos hosts. Evite usar a chave pessoal de administrador de um engenheiro como chave geral do agente. Chaves pessoais acumulam exceções com o tempo, e são justamente essas exceções que um processo autônomo não deveria herdar.

O Sallyport usa esse modelo local mantendo credenciais de API e SSH em um cofre de aplicativo criptografado e executando a ação HTTP ou SSH sem passar o segredo ao agente. Essa propriedade ajuda em um computador de desenvolvedor, mas as equipes ainda precisam de credenciais restritas e permissões no servidor.

Verifique o caminho da ação antes de confiar nele

Teste um gateway de ações com um endpoint inofensivo e uma credencial temporária antes de conectá-lo a uma capacidade de produção. O teste precisa mostrar três coisas: o agente não recebeu o segredo, o gateway registrou a chamada e o serviço remoto viu a identidade esperada.

Crie uma credencial HTTP temporária capaz de chamar um endpoint não sensível, como um recurso de teste que retorne a identidade do chamador. Peça ao agente para executar apenas essa ação. Examine sua transcrição e o resultado da ferramenta em busca do token literal e de strings semelhantes a tokens. O agente deve receber o corpo da resposta ou um erro ocultando dados, nunca o valor do cabeçalho usado para autenticar a solicitação.

Depois, teste a negação de propósito. Bloqueie o cofre local e repita a ação. Encerre o processo do agente aprovado e inicie um novo. Revogue a sessão ativa se o gateway oferecer revogação e tente novamente a partir do processo original. Cada tentativa deve falhar no limite local. Se as chamadas ainda funcionarem, descubra se outro processo reteve a credencial, se uma variável de ambiente contorna o gateway ou se o serviço remoto tem outro caminho de autorização armazenado em cache.

Um registro de auditoria útil precisa de informações suficientes para reconstruir um evento sem preservar o segredo. Para uma ação HTTP, registre o horário, a identidade do processo ou da sessão, o rótulo da credencial, o destino, o método, o status do resultado e um identificador da solicitação quando o serviço remoto fornecer um. Para SSH, registre o destino, o rótulo da conta, o resultado do comando e uma representação do comando adequada às suas regras de sensibilidade. Não registre valores bearer, chaves privadas ou payloads sensíveis completos apenas para fazer a trilha de auditoria parecer completa.

O encadeamento por hash ajuda a detectar um histórico local reescrito, mas não prova que a ação original foi sensata. Mantenha o registro do gateway junto ao log de auditoria do serviço receptor. Se eles discordarem, trate isso como uma investigação, não como motivo para declarar automaticamente uma das fontes correta.

O Sallyport projeta os diários de sessão e atividade a partir de um log de auditoria criptografado e encadeado por hash, e sp audit verify pode verificar essa cadeia offline sem uma chave do cofre. Execute a verificação durante uma análise de incidente ou uma entrega de release, mas não confunda verificação de integridade com autorização.

Os controles no servidor assumem quando as pessoas estão ausentes ou os recursos são compartilhados

Verifique a cadeia de auditoria
Verifique offline a trilha de auditoria encadeada por hash com sp audit verify, sem abrir o cofre.

Os controles no servidor são necessários quando a ação precisa continuar sem que um desenvolvedor específico esteja disponível para aprová-la. Isso inclui jobs de CI, remediação agendada, agentes hospedados em servidores, runners compartilhados e workers de deploy. Um Mac local não pode ser a autoridade final para um trabalho que precisa sobreviver à bateria de um laptop, a uma viagem, ao modo de repouso ou à saída de uma pessoa da empresa.

Coloque a decisão de autorização perto do recurso protegido quando qualquer uma destas condições se aplicar:

  • Várias pessoas ou sistemas podem acionar o mesmo fluxo.
  • O alvo é produção, dados de clientes, atividade financeira ou um sistema regulado.
  • Um agente é executado em uma infraestrutura, e não em um computador interativo de propriedade de uma pessoa.
  • O serviço precisa aplicar limites de tenant, janelas de mudança, regras de ambiente ou separação de funções.
  • O fluxo precisa de alta disponibilidade sem que uma pessoa aprove uma caixa de diálogo.

Nesses casos, use uma identidade de carga de trabalho com permissões restritas, validade curta quando o sistema de identidade oferecer esse recurso e registros de auditoria no servidor. Aplique os limites de ambiente no sistema de deploy ou na API. Exija ali um registro de mudança ou aprovação humana se a organização precisar disso. O computador local ainda pode ajudar um desenvolvedor a preparar e revisar uma mudança, mas não pode ser o ponto de aplicação da ação de produção.

A NIST Special Publication 800-207 descreve zero trust como um modelo em que as decisões de acesso se concentram na proteção de recursos, e não na confiança baseada na localização da rede. A lição útil para fluxos com agentes não é que toda ferramenta local precisa de uma linguagem de políticas complexa. É que a API ou o host de produção deve tomar sua própria decisão sobre o chamador e o recurso solicitado. Uma aprovação no Mac não substitui essa decisão.

Não resolva isso encaminhando a credencial local de um desenvolvedor para a CI. Isso transforma uma credencial controlada por uma pessoa em uma credencial de serviço sem supervisão, preservando a clareza de nenhum dos dois modelos. Crie uma identidade de carga de trabalho separada e dê a ela apenas as permissões de que o job precisa.

Não reconstrua um mecanismo de políticas dentro dos prompts de aprovação

Mantenha os segredos fora do contexto
Mantenha os segredos de API e SSH no cofre criptografado do Sallyport, enquanto o agente recebe apenas os resultados das ações.

As equipes costumam pedir regras como «permitir solicitações GET, exceto fora do horário» ou «permitir SSH apenas quando o nome do branch contiver release». A solicitação é popular porque parece reduzir cliques mantendo o controle local. Na prática, ela costuma criar um sistema de políticas frágil que ninguém consegue explicar sob pressão.

O controle local de ações deve ter uma pequena escada de decisão visível: cofre bloqueado ou desbloqueado, sessão aprovada ou não, credencial que exige aprovação por chamada ou não. Cada estado tem uma ação direta do operador. Uma pessoa pode prever o que acontecerá, testar e revogar.

Quando uma ferramenta local começa a analisar nomes de branches, textos de prompts, padrões de URL, rótulos de chamados e a intenção informada pelo agente, ela começa a tomar decisões de autorização com base em entradas que o agente pode influenciar. As regras acumulam exceções. As exceções se tornam permissões. Em pouco tempo, um desenvolvedor construiu no laptop um sistema parcial de autorização do servidor, sem o contexto do serviço necessário para fazer esse trabalho bem.

Mantenha as decisões locais ligadas a fatos que o computador pode estabelecer: se o cofre está aberto, qual processo assinado solicitou uma ação, se sua sessão foi aprovada e se essa credencial precisa de uma confirmação nova. Mantenha as decisões remotas ligadas a fatos que o serviço pode estabelecer: recurso de destino, identidade do chamador, tenant, ambiente atual, conteúdo da solicitação e controles organizacionais.

Essa separação também facilita o diagnóstico de falhas. Uma chamada local negada significa que o cofre, a sessão ou a barreira por chamada a interrompeu. Uma chamada negada pelo servidor significa que a política remota a rejeitou. Quando uma negação pode vir de um labirinto de regras locais sobrepostas, os desenvolvedores desativam os controles em vez de corrigi-los.

Um fluxo misto dá a cada controle uma função definida

A maioria das equipes precisa de controles locais e no servidor. O design prático não é uma escolha entre tudo ou nada.

Um desenvolvedor pode executar localmente um agente interativo para consultar uma API de staging, ler metadados de pacotes privados ou executar diagnósticos SSH restritos. O desenvolvedor aprova a execução depois de verificar a identidade do processo. O cofre local fornece uma credencial que o agente nunca vê. Os registros de atividade permitem uma revisão posterior.

O mesmo agente pode preparar uma mudança de deploy sem receber autoridade para executá-la. Depois, um pipeline no servidor roda com sua própria identidade de carga de trabalho, aplica as restrições de produção e registra o deploy resultante. Se o pipeline precisar de aprovação humana, coloque essa aprovação no sistema responsável pela mudança de produção, onde ela permanecerá visível para as pessoas responsáveis pelo ambiente.

Trate a transferência como uma fronteira que merece ser preservada. O agente local pode produzir um patch, um resultado de teste ou uma solicitação assinada para revisão. Ele não deve transportar a autoridade de sessão de um desenvolvedor para um job sem supervisão. O job no servidor não deve depender de um laptop desbloqueado para concluir o trabalho.

Comece desenhando cada ação com credenciais em um fluxo atual. Anote o processo que a inicia, o computador que guarda o segredo, o recurso que o recebe, a pessoa que pode interrompê-la e se o job precisa rodar sem essa pessoa. Você encontrará rapidamente as ações que se encaixam no controle local, as que exigem aplicação no servidor e as situações desconfortáveis que hoje não têm nenhum dos dois.

FAQ

Quando devo usar o controle local de ações para um agente de programação com IA?

Use o controle local quando o agente estiver sendo executado em um Mac de um desenvolvedor e precisar chamar um pequeno conjunto de APIs ou destinos SSH com credenciais que devem permanecer fora do contexto do agente. O modelo funciona melhor quando uma pessoa pode aprovar um novo processo do agente e responder caso o computador peça confirmação.

Um cofre local de credenciais torna os agentes de IA seguros?

Um cofre local mantém as credenciais fora do processo do agente, eliminando uma importante via de exposição. Ele não torna confiável um computador de desenvolvedor comprometido e não substitui as regras de autorização aplicadas pelo serviço que recebe a solicitação.

O que devo verificar antes de aprovar uma sessão de agente de IA?

Aprove uma sessão quando você reconhecer o processo que a iniciou, sua autoridade de assinatura e o trabalho que ele fará. Não aprove uma sessão apenas porque o prompt menciona o nome de um projeto conhecido. Prompts não comprovam a identidade do processo.

Quais ações do agente precisam de aprovação a cada uso?

Use aprovação por chamada para credenciais capazes de produzir efeitos irreversíveis, como um token de implantação em produção, uma ação de pagamento ou uma API administrativa destrutiva. Chamadas rotineiras somente de leitura se tornam impraticáveis quando exigem a mesma interrupção todas as vezes.

É seguro usar SSH por meio de um gateway de ações do agente?

Não necessariamente. A execução de comandos SSH só representa controle local quando o destino, a conta, o escopo dos comandos e a confiança no host estão limitados em algum ponto. Uma chave privada protegida ainda pode autorizar um comando perigoso em um host que conceda permissões amplas à conta.

O controle local de ações pode substituir a autorização no servidor?

Não. Contas de serviço, executores de CI, automações de produção e máquinas de build compartilhadas precisam de controles que continuem disponíveis quando nenhum desenvolvedor estiver diante de um Mac. Nesses casos, coloque a autorização e a auditoria perto do serviço ou da carga de trabalho.

Como posso testar se o processo do agente é o processo que aprovei?

Comece com ps para identificar a hierarquia de processos e com codesign para examinar os detalhes de assinatura do executável. Depois, faça uma chamada inofensiva e verifique o que o agente recebe, o que o gateway registra e o que o serviço receptor grava nos logs.

O MCP oferece controles de aprovação para ferramentas de agentes?

Não. Um servidor MCP descreve uma interface de ferramenta e um protocolo de solicitações. Ele não decide onde as credenciais ficam nem se uma pessoa aprova uma ação. Trate a compatibilidade de transporte e a autorização de ações como questões de projeto separadas.

Um log de auditoria à prova de adulteração basta para responsabilizar agentes?

Um registro à prova de adulteração ajuda a detectar alterações no histórico e reconstruir o que foi executado, mas não pode desfazer uma ação nem decidir se ela foi autorizada. Mantenha o diário do gateway, o log de auditoria do serviço e os registros de implantação, pois cada um responde a uma pergunta diferente.

Quais controles locais do agente nunca devem ficar a cargo do próprio agente?

Não permita que o agente escolha o modo de aprovação, o escopo do destino ou a classe da credencial em seu próprio prompt ou configuração. O operador deve definir esses limites fora do workspace gravável pelo agente e testar a negação e a revogação antes de confiar neles.

Sallyport

O Sallyport executa chamadas de API e comandos SSH pelo seu agente de IA. As chaves ficam em um cofre local no seu Mac; você aprova cada execução e toda ação vai para um registro selado.

© 2026 Sallyport · Código aberto sob Apache-2.0 · Oleg Sotnikov