Rastreio e Auditoria

Todos os pedidos que um espaço de trabalho faz — as chamadas do agente a fornecedores de LLM, transferências de pacotes, tráfego de kubectl e aws, requisições web comuns — passam pelo proxy MITM do lado do anfitrião do Bromure Agentic Coding. Como o proxy já se encontra nessa fronteira de transmissão, pode registar o que a atravessou: que anfitriões o agente contactou, o que enviou, o que recebeu de volta, se alguma credencial foi trocada ou fugiu e — para o tráfego de IA — a conversa completa, as chamadas de ferramentas e os comandos de shell que o modelo conduziu.

Esse registo é o rastreio de sessão do espaço de trabalho. Existe por uma única razão: para que possa responder, a posteriori, "o que é que o agente realmente fez?" — até ao prompt individual, ao rm -rf individual, ao pedido de saída individual. Tudo é registado no seu Mac, cifrado em repouso e (para utilizadores individuais) nunca sai dele.

Este capítulo abrange todo o sistema: o que um rastreio captura, como é armazenado e expira, a janela do Inspetor de Rastreios, a linha de comandos bromure-cli trace, como voltar a extrair os dados e a fronteira de privacidade entre a auditoria local e a telemetria que os Macs inscritos transmitem a uma organização. A referência de definições campo a campo para o painel encontra-se em Definições de rastreio.

O que um rastreio regista

O rastreio é por espaço de trabalho, controlado pelo seletor Rastreio de sessão no painel Rastreio da janela Editar espaço de trabalho. Tem quatro níveis, cada um um superconjunto do anterior:

O painel Rastreio da janela Editar espaço de trabalho, com o seletor Rastreio de sessão definido para Detalhes de pedidos de IA
NívelO que é registado
DesligadoNada.
Apenas atividadeUm registo de metadados por pedido — sem corpos.
Detalhes de pedidos de IA (predefinição)Metadados para todos os pedidos, além dos corpos completos de pedido e resposta para anfitriões de LLM conhecidos.
TudoMetadados para todos os pedidos, além dos corpos de todos os anfitriões.

Os novos espaços de trabalho assumem por predefinição Detalhes de pedidos de IA, para que as conversas do agente sejam auditáveis logo de início, sem armazenar em disco os corpos de tráfego não relacionado (transferências de pacotes, pings de telemetria).

Nota: O enum de nível de rastreio assume por predefinição Desligado no formato de perfil, portanto um espaço de trabalho cujo JSON armazenado é anterior a esta definição descodifica como Desligado. A predefinição Detalhes de pedidos de IA aplica-se apenas a espaços de trabalho criados a partir do modelo atual. Escolha o nível deliberadamente quando a auditoria for importante.

O registo de metadados

Em Apenas atividade e acima, o proxy escreve um registo de rastreio por pedido. Todos os registos — independentemente do nível — transportam os metadados:

  • Data/hora, anfitrião, porta, método HTTP e caminho.
  • Código de estado e latência, medida desde o CONNECT que abriu o túnel até à resposta.
  • Bytes do pedido (medidos antes de qualquer troca de credencial) e bytes da resposta.
  • O relatório de troca de tokens — que credenciais o proxy substituiu à saída (ver Trocas e fugas de credenciais).
  • Avisos de fuga de credenciais — tokens do tipo bearer no pedido de saída que o Bromure não emitiu.
  • Sob encaminhamento de modelo local ou híbrido, qual o backend que serviu o turno (ver Modelos locais).

Isto é suficiente para reconstruir o panorama completo de com quem o agente falou e quando sem manter em disco um único byte de texto de prompt ou resposta. Quando quer o rasto de auditoria — domínios contactados, gestão de credenciais, latência — mas não o conteúdo, Apenas atividade é o nível a escolher.

Corpos capturados e conversas analisadas

Em Detalhes de pedidos de IA, o proxy armazena adicionalmente os corpos completos de pedido e resposta dos anfitriões de LLM conhecidos: Anthropic, OpenAI / ChatGPT, Google, Cohere, Mistral, Perplexity, x.ai / Grok, Groq, Replicate e HuggingFace, além do anfitrião de inferência local quando um espaço de trabalho encaminha para um modelo local. Em Tudo, os corpos são mantidos para todos os anfitriões.

Um corpo de IA capturado não é apenas armazenado — é analisado. O Inspetor de Rastreios apresenta-o como uma vista de Conversa: o prompt de sistema, cada turno do utilizador, as respostas do assistente e os blocos estruturados que o modelo emitiu. Esses blocos são exatamente o que torna útil um rastreio de agente de programação:

  • Chamadas de ferramentas — todos os blocos tool_use que o modelo produziu, com a respetiva entrada.
  • Comandos de shell — as chamadas de ferramenta Bash / Shell, ou seja, os comandos que o agente executou na VM.
  • Leituras e escritas de ficheiros — as chamadas de ferramenta Read / View e Write / Edit / MultiEdit, com os caminhos que tocaram.

Assim, um único registo de pedido de IA responde "o que o modelo decidiu fazer neste turno" — ler este ficheiro, executar aquele comando, chamar esta API — extraído do corpo bruto da API. A mesma estrutura é o que o tap de eventos em tempo real transforma em eventos de auditoria nos Macs inscritos.

Trocas e fugas de credenciais

Dois factos relativos à gestão de credenciais são registados em todos os pedidos e apresentados de forma proeminente porque são os que importam para uma revisão de segurança:

  • Trocas de tokens. Quando o proxy substitui a credencial-engodo que a VM detém pela credencial real na transmissão, o registo anota-o — como pré-visualizações do primeiro/último caractere dos valores falso e real (sk-a…f9q3), nunca os bytes do segredo. Este é o caso normal e saudável: confirma que o sistema de trocas está a fazer o seu trabalho.
  • Fugas. Quando um pedido de saída transporta um token do tipo bearer que o Bromure não emitiu — um segredo real colado diretamente na VM, contornando o sistema de trocas — o registo assinala-o como uma potencial fuga, novamente apenas como pré-visualização, etiquetado com uma classe de suspeita: knownPrefix (um prefixo de segredo reconhecido que o Bromure não emitiu) ou opaqueToken (um valor de autenticação opaco e longo). Uma marca de fuga é um convite a investigar; a mecânica completa das credenciais-engodo e da deteção de comprometimento encontra-se em Credenciais.

Cifra em repouso e retenção

Os rastreios residem em ~/Library/Application Support/BromureAC/traces/, organizados por dia:

  • Os metadados são anexados como uma linha JSON por pedido a traces/YYYY-MM-DD/<sessionID>.jsonl.
  • Os corpos capturados são armazenados ao lado como traces/YYYY-MM-DD/<sessionID>/<recordID>.req.enc e .res.enc — selados com AES-GCM usando a chave-mestra do SecretsVault, a mesma chave guardada no Keychain que cifra os segredos do seu espaço de trabalho. As permissões de ficheiro são 0600.

Antes de qualquer coisa ser escrita, o registo é higienizado:

  • Os cabeçalhos sensíveis são redigidos. Authorization, Proxy-Authorization, Cookie, Set-Cookie, x-amz-security-token, api-key e qualquer cabeçalho terminado em -api-key são reescritos para <redacted>.
  • Os segredos são armazenados apenas como pré-visualizações. As trocas de tokens e as suspeitas de fuga mantêm pré-visualizações do primeiro/último caractere — os bytes reais dos segredos nunca entram num registo de rastreio, cifrado ou não.

A retenção é automática e corre de forma preguiçosa (uma passagem de limpeza a cada 200 anexações):

LimiteComportamento ao ser excedido
100 MB de corpos por sessãoOs ficheiros de corpo .enc mais antigos dessa sessão são removidos. As linhas de metadados permanecem — mantém o rasto de auditoria, perde apenas o texto capturado mais antigo.
5 GB em todo o diretório traces/Os diretórios de dia mais antigos são eliminados primeiro.

Separadamente, a aplicação mantém os últimos 5000 registos num anel em memória para a vista ao vivo; os registos mais antigos permanecem em disco dentro dos limites acima.

Aviso: Em Detalhes de pedidos de IA e Tudo, o texto completo dos prompts e respostas das trocas de IA está em disco — cifrado, mas presente. Como os corpos são selados com a chave-mestra do SecretsVault, rodar essa chave torna indecifráveis os corpos previamente capturados; o Inspetor de Rastreios mostra então (not captured / decryption failed) onde o corpo estaria.

A janela do Inspetor de Rastreios

O Inspetor de Rastreios é o visualizador ao vivo e filtrável para todas as trocas registadas em todos os espaços de trabalho. Lê os mesmos registos que a CLI e atualiza em tempo real à medida que novos pedidos fluem.

Abrir a janela

Abra-a a partir de JanelaInspetor de Rastreios… (⇧⌘I). Também abre pré-filtrada para um espaço de trabalho a partir da barra de ferramentas de uma janela de sessão, para que possa saltar diretamente de um agente em execução para o seu próprio tráfego. Ao abrir, o anel em memória é preparado a partir do disco — lendo apenas os diretórios de dia de hoje e de ontem, para que um arranque a frio seja rápido. Os registos mais antigos permanecem em disco e aparecem assim que pressiona o botão de recarregar enquanto estiverem no intervalo, ou lendo-os com a CLI.

A lista de pedidos

O painel esquerdo é uma lista de registos, do mais recente para o mais antigo. Cada linha mostra, da esquerda para a direita:

  • Um ponto de estado com código de cor por classe de resposta: verde para 2xx, azul para 3xx, laranja para 4xx, vermelho para 5xx, cinzento para os restantes.
  • O método e o anfitrião (o caminho é mostrado por baixo, truncado ao meio).
  • Distintivos, quando aplicáveis: um triângulo de aviso laranja para credenciais não trocadas (uma potencial fuga), setas de troca azuis para trocas de tokens e um ícone de documento quando foi capturado um corpo para este registo.
  • O código de estado e a latência à direita.

O rodapé indica N records (last M in memory) e traz um botão Recarregar do disco (o ícone de seta circular). A lista tem navegação completa por teclado — ↑ / ↓ para avançar, PgUp / PgDn para saltar dez, Home / End para chegar aos extremos — com a linha recém-selecionada a rolar para a vista.

Filtragem

Uma barra de filtros situa-se acima da lista:

ControloEfeito
Seletor de Espaço de trabalhoRestringir a um espaço de trabalho, ou Todos os espaços de trabalho.
Apenas fugasMostrar apenas os registos com um aviso de credencial não trocada.
Apenas conversasMostrar apenas os registos que o proxy analisou como uma troca de chat de IA.
Filtro de anfitriãoUma correspondência de substring com o anfitrião.

Nota: Apenas conversas depende de uma marca definida quando o registo foi escrito. Os registos capturados antes de essa marca existir contam como não-conversas e ficam ocultos por este filtro até serem re-registados.

O painel de detalhes

Selecionar uma linha preenche o painel direito. O seu cabeçalho mostra o método, o URL completo, o estado e uma fila de células de metadados — Espaço de trabalho, Latência, tamanhos de Pedido e Resposta e Hora — além de um alternador segmentado Conversa / Bruto.

  • Conversa apresenta o chat de IA analisado: prompt de sistema, turnos, chamadas de ferramentas e resultados, formatado para leitura. Só está disponível quando um corpo foi capturado e a troca foi analisada como uma conversa de IA; caso contrário, o alternador recai automaticamente para Bruto.
  • Bruto mostra os blocos constituintes do registo em secções: Credenciais não trocadas (potenciais fugas), Trocas de tokens (cada uma como pré-visualizações fake → real), Corpo do pedido e Corpo da resposta. Os corpos são decifrados sob pedido quando seleciona o registo.

Cada secção de corpo tem um botão de copiar que coloca o corpo completo na área de transferência — o texto integral mesmo para além do truncamento no ecrã, e uma cadeia hexadecimal para corpos binários. Quando nenhum corpo foi armazenado, ou a chave-mestra já não o consegue decifrar, a secção indica (not captured / decryption failed).

Sem nada selecionado, o painel mostra um marcador de posição: Escolha um pedido — Escolha uma linha à esquerda para inspecionar cabeçalhos, trocas e (se capturados) corpos.

Sessões WebSocket

As atualizações WebSocket de longa duração através do proxy — OpenAI Realtime, o responses_websockets do Codex e afins — são rastreadas como um único registo por sessão WS em vez de se perderem como binário opaco. Quando o nível de rastreio do espaço de trabalho captura corpos para esse anfitrião, ambas as direções são analisadas ao nível das tramas (RFC 6455): o mascaramento é removido, as tramas de continuação são desfragmentadas e as cargas úteis permessage-deflate (RFC 7692) são descomprimidas, para que as tramas de texto sejam legíveis em vez de lixo comprimido.

Ao fechar, o proxy anexa uma transcrição cronológica após a resposta de handshake do servidor de destino e armazena-a como o corpo de resposta do registo, para que o Inspetor de Rastreios a apresente através do caminho de corpo comum — vista de Conversa incluída quando é analisada como uma troca de IA. Uma entrada de transcrição tem o seguinte aspeto:

--- WebSocket session transcript ---
>>> [2026-07-13T15:30:05Z] TEXT 1234B
<<< [2026-07-13T15:30:06Z] TEXT 5678B (truncated, total 40000 bytes)

Os limites mantêm uma sessão tagarela dentro de fronteiras: 1 MB mantido por mensagem, 4096 mensagens por sessão, uma trama máxima de 64 MB e uma mensagem descomprimida máxima de 32 MB; tudo o que ultrapasse um limite é marcado como (truncated, total N bytes). As falhas de análise degradam apenas a transcrição — o túnel ao vivo bombeia bytes brutos e nunca é bloqueado ou corrompido pelo rastreio.

A CLI de rastreio

O grupo de comandos bromure-cli trace dá-lhe os mesmos dados de rastreio no terminal. É um cliente leve: comunica com a aplicação em execução através do socket de controlo local, portanto a aplicação GUI tem de estar em execução (o cliente nativo encaminha o protocolo idêntico por SSH para alcançar uma instância remota).

ComandoO que faz
bromure-cli trace ls [workspace] [--limit N]Lista os pedidos recentes, do mais recente para o mais antigo (predefinição de 50 linhas). Colunas: TIME, HOST, METHOD, STATUS, REQ, RESP, LAT e FLAGS (swap×N, LEAK×N, conv).
bromure-cli trace summary [workspace]Vista agregada: contagens de pedidos e anfitriões, bytes de envio/receção, um histograma de classes de estado, contagens de trocas/fugas/conversas e os 10 principais anfitriões.
bromure-cli trace hostnames [workspace]Todos os anfitriões distintos contactados, com contagens de pedidos.
bromure-cli trace leaks [workspace]Apenas os pedidos com uma potencial fuga de credencial — cabeçalho, pré-visualização do valor e classe de suspeita. Imprime No leaks detected. ✓ quando está limpo.
bromure-cli trace clear [-f]Apaga todo o histórico de rastreio — o anel em memória e os ficheiros em disco — após uma confirmação y/N (ignore-a com -f). Reporta quantos registos foram apagados.

O argumento opcional workspace filtra por id ou nome. Se o rastreio estiver desligado para o espaço de trabalho (ou se ainda nada tiver sido registado), trace ls imprime No trace records. (Tracing is per-workspace — enable it in the workspace's settings.); se a aplicação não estiver em execução, cada subcomando imprime No bromure-cli agent running. A CLI completa está documentada em Automatização e CLI.

Exportar um rastreio

Não há um único botão "Exportar" — os dados de rastreio saem do inspetor pelos caminhos que mantêm intacta a fronteira de cifra:

  • A partir do Inspetor de Rastreios. No modo Bruto, o botão de copiar em Corpo do pedido ou Corpo da resposta copia o corpo decifrado completo para a área de transferência, para além de qualquer truncamento no ecrã. O URL no cabeçalho é texto selecionável. Esta é a forma de extrair uma troca — um par completo de prompt/resposta — para um relatório ou o registo de um erro.
  • A partir da CLI. Redirecione qualquer subcomando trace para um ficheiro, por exemplo bromure-cli trace summary my-workspace > audit.txt ou bromure-cli trace ls my-workspace --limit 500 > requests.txt. Esta é a forma de capturar o rasto de metadados de muitos pedidos de uma só vez.
  • A partir do disco. O JSONL de metadados sob traces/YYYY-MM-DD/ é texto simples (com os segredos já redigidos para pré-visualizações) e pode ser lido diretamente. Os ficheiros de corpo .enc são selados com AES-GCM usando a chave-mestra do SecretsVault e só são decifráveis dentro da aplicação — copie-os a partir do inspetor, não do disco.

O que nunca sai do seu Mac

Para uma instalação individual e não gerida, o rastreio é inteiramente local:

  • Os rastreios são escritos no diretório Application Support do seu Mac e cifrados com uma chave guardada no Keychain de início de sessão.
  • Nenhum registo de rastreio, corpo ou resumo é carregado para lado nenhum. O proxy não tem um endpoint de análise ligado para utilizadores individuais.
  • Os classificadores de injeção de prompt que também alimentam o Registo de Segurança correm no dispositivo; ver Deteção de Injeção de Prompt e Salvaguardas. Nada sobre o seu tráfego é enviado para um serviço na nuvem para análise.

As regras de redação e pré-visualização acima significam que mesmo os dados em repouso nunca contêm um segredo utilizável. O rastreio é um registo de auditoria privado, não um mecanismo de comunicação para casa.

Modo privado e telemetria empresarial

O único caso em que dados derivados do rastreio saem da máquina é um Mac inscrito com um espaço de trabalho bromure.io. A inscrição transforma o registo de auditoria local num registo visível para a organização — e dá-lhe um interruptor para excluir novamente um espaço de trabalho individual. O que os administradores veem, e como funciona a inscrição, está abrangido em Empresa; esta secção descreve a fronteira do lado do rastreio.

O fluxo de eventos

Num Mac inscrito, as sessões transmitem eventos de nuvem estruturados para o espaço de trabalho de administração da organização, extraídos do mesmo tráfego de IA que o rastreio captura:

  • llm.request — por troca: fornecedor, anfitrião, caminho, estado, latência, modelo, contagens de tokens de entrada/saída e ambos os contadores de cache da Anthropic (cache_creation_input_tokens, cache_read_input_tokens, analisados mesmo a partir de fluxos SSE; o cached_tokens da OpenAI também é suportado).
  • tool.use — todas as chamadas de ferramenta, com um resumo de entrada limitado a 240 caracteres.
  • file.read / file.write — o caminho extraído e o nome da ferramenta.
  • command.run — o comando de shell, limitado a 500 caracteres.
  • credential.token_swap — um por troca na transmissão, apenas pré-visualizações.
  • prompt_injection.detection — reencaminhado quando um detetor dispara, transportando todo o excerto assinalado (limitado a 20 KB), ao contrário da pré-visualização de 160 caracteres do Registo de Segurança local.

Apenas o turno mais recente do assistente é percorrido, para que o histórico reenviado nunca seja contado em duplicado, e os prompts em bruto nunca são emitidos — a telemetria responde a "o que a IA fez", não a "o que o utilizador pediu".

O tap de eventos em tempo real

Para sessões WebSocket de longa duração, esperar que o socket feche para extrair eventos cegaria um administrador durante toda a sessão. Em vez disso, um tap de eventos em tempo real observa as tramas do servidor e emite os mesmos eventos llm.request / tool.use / file.read / file.write / command.run em cada response.completed, para que uma sessão Realtime em execução reporte à medida que avança (a extração no momento do fecho é então ignorada para evitar contagem em duplicado). O tap só se liga quando o nível de rastreio do espaço de trabalho já captura corpos para esse anfitrião — anda no mesmo caminho de captura de corpos que tudo o resto neste capítulo e não tem interface própria.

Modo privado

O modo privado é um interruptor por espaço de trabalho no painel Rastreio, apresentado apenas em Macs inscritos. Quando ativado, esse espaço de trabalho deixa de transmitir os metadados de sessão e os eventos acima para o espaço de trabalho bromure.io — nem o indicador na barra de título nem a lista de sessões do administrador veem qualquer coisa dele. O rastreio local e o Inspetor de Rastreios não são afetados: continua a obter o rastreio cifrado completo na sua própria máquina.

Existe exatamente para o caso em que a auditoria local e a telemetria organizacional devem divergir — por exemplo, um espaço de trabalho onde usa uma chave de API pessoal e não quer essa atividade nos painéis da sua organização. Num Mac não inscrito não há nada a ser transmitido, portanto o interruptor fica totalmente oculto.

Nota: O modo privado também suprime os eventos prompt_injection.detection, portanto num espaço de trabalho privado uma injeção continua a ser registada localmente no Registo de Segurança (e aplicada de acordo com a sua ação de deteção) mas não é reencaminhada para a sua organização. Ver Definições de rastreio para o próprio interruptor e Empresa para o que a inscrição transmite.