Trazado y auditoría
Cada petición que hace un espacio de trabajo — las llamadas del agente a los proveedores de LLM, las descargas de paquetes, el tráfico de kubectl y aws, las peticiones web ordinarias — pasa por el proxy MITM del lado del anfitrión de Bromure Agentic Coding. Como el proxy ya se sitúa en ese límite de red, puede registrar lo que lo atraviesa: qué anfitriones contactó el agente, qué envió, qué recibió como respuesta, si se intercambió o se filtró alguna credencial y — para el tráfico de IA — la conversación completa, las llamadas a herramientas y los comandos de shell que el modelo impulsó.
Ese registro es la traza de sesión del espacio de trabajo. Existe por un único motivo: para que puedas responder, a posteriori, "¿qué hizo realmente el agente?" — hasta el prompt individual, el rm -rf individual, la petición saliente individual. Todo se registra en tu Mac, se cifra en reposo y (para usuarios individuales) nunca lo abandona.
Este capítulo cubre todo el sistema: qué captura una traza, cómo se almacena y se depura por antigüedad, la ventana del Inspector de trazas, la línea de comandos bromure-cli trace, cómo recuperar los datos y el límite de privacidad entre la auditoría local y la telemetría que los Mac inscritos transmiten a una organización. La referencia campo por campo de la configuración del panel está en Configuración de Trazado.
Qué registra una traza
El trazado es por espacio de trabajo, controlado por el selector Traza de sesión en el panel Trazado de la ventana Editar espacio de trabajo. Tiene cuatro niveles, cada uno un superconjunto del anterior:
| Nivel | Qué se registra |
|---|---|
| Desactivado | Nada. |
| Solo actividad | Un registro de metadatos por petición — sin cuerpos. |
| Detalles de peticiones de IA (predeterminado) | Metadatos de cada petición, más los cuerpos completos de petición y respuesta para los anfitriones LLM conocidos. |
| Todo | Metadatos de cada petición, más los cuerpos de cada anfitrión. |
Los nuevos espacios de trabajo tienen como valor predeterminado Detalles de peticiones de IA, de modo que las conversaciones del agente son auditables de fábrica sin almacenar en disco los cuerpos de tráfico no relacionado (descargas de paquetes, pings de telemetría).
Nota: El enum de nivel de traza tiene como valor predeterminado Desactivado en el formato de perfil, por lo que un espacio de trabajo cuyo JSON almacenado sea anterior a este ajuste se decodifica como Desactivado. El valor predeterminado Detalles de peticiones de IA solo se aplica a los espacios de trabajo creados a partir de la plantilla actual. Elige el nivel deliberadamente cuando la auditoría importe.
El registro de metadatos
En Solo actividad y niveles superiores, el proxy escribe un registro de traza por petición. Cada registro — sin importar el nivel — lleva los metadatos:
- Marca de tiempo, anfitrión, puerto, método HTTP y ruta.
- Código de estado y latencia, medida desde el
CONNECTque abrió el túnel hasta la respuesta. - Bytes de petición (medidos antes de cualquier intercambio de credenciales) y bytes de respuesta.
- El informe de intercambio de tokens — qué credenciales sustituyó el proxy a la salida (véase Intercambios y fugas de credenciales).
- Advertencias de fuga de credenciales — tokens de tipo bearer en la petición saliente que Bromure no emitió.
- Bajo enrutamiento de modelo local o híbrido, qué backend atendió el turno (véase Modelos locales).
Esto es suficiente para reconstruir el panorama completo de con quién habló el agente y cuándo sin conservar un solo byte de texto de prompt o respuesta en disco. Cuando quieras el rastro de auditoría — dominios contactados, gestión de credenciales, latencia — pero no el contenido, Solo actividad es el nivel que hay que elegir.
Cuerpos capturados y conversaciones analizadas
En Detalles de peticiones de IA, el proxy almacena adicionalmente los cuerpos completos de petición y respuesta para los anfitriones LLM conocidos: Anthropic, OpenAI / ChatGPT, Google, Cohere, Mistral, Perplexity, x.ai / Grok, Groq, Replicate y HuggingFace, más el anfitrión de inferencia local cuando un espacio de trabajo enruta a un modelo local. En Todo, se conservan los cuerpos de cada anfitrión.
Un cuerpo de IA capturado no solo se almacena — se analiza. El Inspector de trazas lo representa como una vista de conversación: el prompt del sistema, cada turno del usuario, las respuestas del asistente y los bloques estructurados que emitió el modelo. Esos bloques son exactamente lo que hace útil la traza de un agente de codificación:
- Llamadas a herramientas — cada bloque
tool_useque produjo el modelo, con su entrada. - Comandos de shell — las llamadas a las herramientas
Bash/Shell, es decir, los comandos que el agente ejecutó en la VM. - Lecturas y escrituras de archivos — las llamadas a las herramientas
Read/ViewyWrite/Edit/MultiEdit, con las rutas que tocaron.
Así, un único registro de petición de IA responde "qué decidió hacer el modelo en este turno" — leer este archivo, ejecutar aquel comando, llamar a esta API — extraído del cuerpo bruto de la API. La misma estructura es la que la derivación de eventos en tiempo real convierte en eventos de auditoría en los Mac inscritos.
Intercambios y fugas de credenciales
Dos hechos sobre la gestión de credenciales se registran en cada petición y se muestran de forma destacada, porque son los que importan para una revisión de seguridad:
- Intercambios de tokens. Cuando el proxy reemplaza la credencial señuelo que tiene la VM por la real en la red, el registro lo anota — como vistas previas del primer y el último carácter de los valores falso y real (
sk-a…f9q3), nunca los bytes del secreto. Este es el caso normal y saludable: confirma que el sistema de intercambio está haciendo su trabajo. - Fugas. Cuando una petición saliente lleva un token de tipo bearer que Bromure no emitió — un secreto real pegado directamente en la VM, eludiendo el sistema de intercambio — el registro lo marca como una posible fuga, de nuevo solo como vista previa, etiquetada con una clase de sospecha:
knownPrefix(un prefijo de secreto reconocido que Bromure no emitió) uopaqueToken(un valor de autenticación opaco y largo). Una marca de fuga es una invitación a investigar; la mecánica completa de las credenciales señuelo y la detección de compromisos está en Credenciales.
Cifrado en reposo y retención
Las trazas residen en ~/Library/Application Support/BromureAC/traces/, organizadas por día:
- Los metadatos se anexan como una línea JSON por petición en
traces/YYYY-MM-DD/<sessionID>.jsonl. - Los cuerpos capturados se almacenan junto a ellos como
traces/YYYY-MM-DD/<sessionID>/<recordID>.req.ency.res.enc— sellados con AES-GCM mediante la clave maestra de SecretsVault, la misma clave guardada en el Keychain que cifra los secretos de tu espacio de trabajo. Los permisos de archivo son0600.
Antes de escribir nada, el registro se sanea:
- Las cabeceras sensibles se redactan.
Authorization,Proxy-Authorization,Cookie,Set-Cookie,x-amz-security-token,api-keyy cualquier cabecera que termine en-api-keyse reescriben como<redacted>. - Los secretos se almacenan solo como vistas previas. Los intercambios de tokens y las presuntas fugas conservan vistas previas del primer y el último carácter — los bytes reales del secreto nunca entran en un registro de traza, esté cifrado o no.
La retención es automática y se ejecuta de forma diferida (una pasada de limpieza cada 200 anexados):
| Límite | Comportamiento al superarse |
|---|---|
| 100 MB de cuerpos por sesión | Se expulsan los archivos de cuerpo .enc más antiguos de esa sesión. Las líneas de metadatos permanecen — conservas el rastro de auditoría, solo pierdes el texto capturado más antiguo. |
5 GB en todo el directorio traces/ | Se eliminan primero los directorios de día más antiguos. |
Por separado, la app conserva los últimos 5.000 registros en un anillo en memoria para la vista en vivo; los registros más antiguos permanecen en disco dentro de los límites anteriores.
Advertencia: En Detalles de peticiones de IA y Todo, el texto completo de prompt y respuesta de los intercambios de IA está en disco — cifrado, pero presente. Como los cuerpos se sellan con la clave maestra de SecretsVault, rotar esa clave hace indescifrables los cuerpos capturados previamente; el Inspector de trazas muestra entonces
(not captured / decryption failed)donde estaría el cuerpo.
La ventana del Inspector de trazas
El Inspector de trazas es el visor en vivo y filtrable de cada intercambio registrado en todos los espacios de trabajo. Lee los mismos registros que la CLI y se actualiza en tiempo real a medida que fluyen nuevas peticiones.
Abrir la ventana
Ábrela desde Ventana → Inspector de trazas… (⇧⌘I). También se abre prefiltrada a un espacio de trabajo desde la barra de herramientas de una ventana de sesión, de modo que puedes saltar directamente de un agente en ejecución a su propio tráfico. Al abrirse, el anillo en memoria se precarga desde el disco — leyendo únicamente los directorios de día de hoy y ayer, para que un arranque en frío sea rápido. Los registros más antiguos permanecen en disco y aparecen una vez que pulsas el botón de recarga mientras están en rango, o al leerlos con la CLI.
La lista de peticiones
El panel izquierdo es una lista de registros de más nuevo a más antiguo. Cada fila muestra, de izquierda a derecha:
- Un punto de estado codificado por color según la clase de respuesta: verde para 2xx, azul para 3xx, naranja para 4xx, rojo para 5xx, gris en los demás casos.
- El método y el anfitrión (la ruta se muestra debajo, truncada por el medio).
- Insignias, cuando corresponden: un triángulo de advertencia naranja para credenciales sin intercambiar (una posible fuga), flechas de intercambio azules para los intercambios de tokens y un icono de documento cuando se capturó un cuerpo para ese registro.
- El código de estado y la latencia a la derecha.
El pie muestra N records (last M in memory) y lleva un botón Recargar desde disco (el icono de flecha circular). La lista tiene navegación completa por teclado — ↑ / ↓ para avanzar paso a paso, RePág / AvPág para saltar de diez en diez, Inicio / Fin para llegar a los extremos — con la fila recién seleccionada desplazada a la vista.
Filtrado
Una barra de filtros se sitúa sobre la lista:
| Control | Efecto |
|---|---|
| Selector Espacio de trabajo | Restringe a un espacio de trabajo, o Todos los espacios de trabajo. |
| Solo fugas | Muestra solo los registros con una advertencia de credencial sin intercambiar. |
| Solo conversaciones | Muestra solo los registros que el proxy analizó como un intercambio de chat de IA. |
| Filtro de anfitrión | Una coincidencia de subcadena contra el anfitrión. |
Nota: Solo conversaciones depende de una marca establecida cuando se escribió el registro. Los registros capturados antes de que esa marca existiera cuentan como no conversaciones y quedan ocultos por este filtro hasta que se vuelvan a registrar.
El panel de detalle
Al seleccionar una fila se llena el panel derecho. Su cabecera muestra el método, la URL completa, el estado y una fila de celdas de metadatos — Espacio de trabajo, Latencia, tamaños de Petición y Respuesta, y Hora — más un conmutador segmentado Conversación / Bruto.
- Conversación representa el chat de IA analizado: prompt del sistema, turnos, llamadas a herramientas y resultados, formateado para su lectura. Solo está disponible cuando se capturó un cuerpo y el intercambio se analizó como una conversación de IA; de lo contrario, el conmutador recae en Bruto por sí solo.
- Bruto muestra los componentes del registro en secciones: Credenciales sin intercambiar (posibles fugas), Intercambios de tokens (cada uno como vistas previas
fake → real), Cuerpo de la petición y Cuerpo de la respuesta. Los cuerpos se descifran bajo demanda cuando seleccionas el registro.
Cada sección de cuerpo tiene un botón de copia que coloca el cuerpo completo en el portapapeles — el texto íntegro incluso más allá del truncamiento en pantalla, y una cadena hexadecimal para los cuerpos binarios. Cuando no se almacenó ningún cuerpo, o la clave maestra ya no puede descifrarlo, la sección muestra (not captured / decryption failed).
Sin nada seleccionado, el panel muestra un marcador de posición: Elige una petición — Selecciona una fila a la izquierda para inspeccionar cabeceras, intercambios y (si se capturaron) cuerpos.
Sesiones de WebSocket
Las actualizaciones a WebSocket de larga duración a través del proxy — OpenAI Realtime, el responses_websockets de Codex y similares — se trazan como un único registro por sesión de WS en lugar de perderse como binario opaco. Cuando el nivel de traza del espacio de trabajo captura cuerpos para ese anfitrión, ambas direcciones se analizan por tramas (RFC 6455): se elimina el enmascaramiento, se desfragmentan las tramas de continuación y se descomprimen las cargas útiles permessage-deflate (RFC 7692), de modo que las tramas de texto sean legibles en lugar de basura comprimida.
Al cerrarse, el proxy anexa una transcripción cronológica después de la respuesta del handshake ascendente y la almacena como el cuerpo de respuesta del registro, de modo que el Inspector de trazas la representa a través de la ruta de cuerpo ordinaria — incluida la vista de conversación cuando se analiza como un intercambio de IA. Una entrada de transcripción tiene este aspecto:
--- WebSocket session transcript ---
>>> [2026-07-13T15:30:05Z] TEXT 1234B
<<< [2026-07-13T15:30:06Z] TEXT 5678B (truncated, total 40000 bytes)
Los límites mantienen acotada una sesión parlanchina: 1 MB conservado por mensaje, 4.096 mensajes por sesión, una trama máxima de 64 MB y un mensaje descomprimido máximo de 32 MB; todo lo que supere un límite se marca como (truncated, total N bytes). Los fallos de análisis degradan solo la transcripción — el túnel en vivo bombea bytes en bruto y nunca queda bloqueado ni corrompido por el trazado.
La CLI de trazas
El grupo de comandos bromure-cli trace te da los mismos datos de traza en la terminal. Es un cliente ligero: se comunica con la app en ejecución a través del socket de control local, por lo que la app de la interfaz gráfica debe estar en ejecución (el cliente enriquecido tuneliza el protocolo idéntico sobre SSH para alcanzar una instancia remota).
| Comando | Qué hace |
|---|---|
bromure-cli trace ls [workspace] [--limit N] | Lista las peticiones recientes, de más nueva a más antigua (50 filas por defecto). Columnas: TIME, HOST, METHOD, STATUS, REQ, RESP, LAT y FLAGS (swap×N, LEAK×N, conv). |
bromure-cli trace summary [workspace] | Vista agregada: recuentos de peticiones y anfitriones, bytes de subida/bajada, un histograma por clase de estado, recuentos de intercambio/fuga/conversación y los 10 anfitriones principales. |
bromure-cli trace hostnames [workspace] | Cada anfitrión distinto contactado, con recuentos de peticiones. |
bromure-cli trace leaks [workspace] | Solo las peticiones con una posible fuga de credenciales — cabecera, vista previa del valor y clase de sospecha. Imprime No leaks detected. ✓ cuando está limpio. |
bromure-cli trace clear [-f] | Borra todo el historial de trazas — el anillo en memoria y los archivos en disco — tras una confirmación y/N (omítela con -f). Informa de cuántos registros se borraron. |
El argumento opcional workspace filtra por id o nombre. Si el trazado está desactivado para el espacio de trabajo (o aún no se ha registrado nada), trace ls imprime No trace records. (Tracing is per-workspace — enable it in the workspace's settings.); si la app no está en ejecución, cada subcomando imprime No bromure-cli agent running. La CLI completa está documentada en Automatización y CLI.
Exportar una traza
No hay un único botón de "Exportar" — los datos de traza salen del inspector por las rutas que mantienen intacto el límite de cifrado:
- Desde el Inspector de trazas. En modo Bruto, el botón de copia en Cuerpo de la petición o Cuerpo de la respuesta copia el cuerpo descifrado completo al portapapeles, más allá de cualquier truncamiento en pantalla. La URL de la cabecera es texto seleccionable. Esta es la forma de extraer un intercambio — un par completo de prompt/respuesta — para un informe o para presentar un error.
- Desde la CLI. Redirige cualquier subcomando
tracea un archivo, por ejemplobromure-cli trace summary my-workspace > audit.txtobromure-cli trace ls my-workspace --limit 500 > requests.txt. Esta es la forma de capturar el rastro de metadatos de muchas peticiones a la vez. - Desde el disco. El JSONL de metadatos en
traces/YYYY-MM-DD/es texto plano (con los secretos ya redactados a vistas previas) y se puede leer directamente. Los archivos de cuerpo.encestán sellados con AES-GCM mediante la clave maestra de SecretsVault y solo se pueden descifrar dentro de la app — cópialos desde el inspector, no del disco.
Qué nunca abandona tu Mac
Para una instalación individual y no gestionada, el trazado es enteramente local:
- Las trazas se escriben en el directorio Application Support de tu Mac y se cifran con una clave guardada en tu Keychain de inicio de sesión.
- Ningún registro de traza, cuerpo ni resumen se sube a ningún lugar. El proxy no tiene ningún endpoint de analítica conectado para usuarios individuales.
- Los clasificadores de inyección de prompts que también alimentan el Registro de seguridad se ejecutan en el dispositivo; véase Detección de inyección de prompts y salvaguardas. Nada sobre tu tráfico se envía a un servicio en la nube para su análisis.
Las reglas de redacción y vista previa anteriores implican que ni siquiera los datos en reposo contienen jamás un secreto utilizable. El trazado es un registro de auditoría privado, no una llamada a casa.
Modo privado y telemetría empresarial
El único caso en el que datos derivados de la traza abandonan la máquina es un Mac inscrito en un espacio de trabajo de bromure.io. La inscripción convierte el registro de auditoría local en uno visible para la organización — y te da un interruptor para excluir de nuevo un espacio de trabajo individual. Lo que ven los administradores, y cómo funciona la inscripción, se cubre en Empresa; esta sección describe el límite desde el lado del trazado.
El flujo de eventos
En un Mac inscrito, las sesiones transmiten eventos en la nube estructurados al espacio de trabajo de administración de la organización, extraídos del mismo tráfico de IA que captura el trazado:
llm.request— por intercambio: proveedor, anfitrión, ruta, estado, latencia, modelo, recuentos de tokens de entrada/salida y ambos contadores de caché de Anthropic (cache_creation_input_tokens,cache_read_input_tokens, analizados incluso a partir de flujos SSE; también se admite elcached_tokensde OpenAI).tool.use— cada llamada a herramienta, con un resumen de entrada limitado a 240 caracteres.file.read/file.write— la ruta extraída y el nombre de la herramienta.command.run— el comando de shell, limitado a 500 caracteres.credential.token_swap— uno por intercambio en la red, solo vistas previas.prompt_injection.detection— reenviado cuando se dispara un detector, llevando el fragmento marcado completo (limitado a 20 KB), a diferencia de la vista previa de 160 caracteres del Registro de seguridad local.
Solo se recorre el turno más nuevo del asistente, de modo que el historial reenviado nunca se cuenta dos veces, y los prompts en bruto nunca se emiten — la telemetría responde "qué hizo la IA", no "qué preguntó el usuario".
La derivación de eventos en tiempo real
Para las sesiones de WebSocket de larga duración, esperar hasta que el socket se cierre para extraer los eventos dejaría a ciegas a un administrador durante toda la sesión. En su lugar, una derivación de eventos en tiempo real observa las tramas del servidor y emite los mismos eventos llm.request / tool.use / file.read / file.write / command.run en cada response.completed, de modo que una sesión de Realtime en ejecución informa sobre la marcha (la extracción al cierre se omite entonces para evitar la doble contabilización). La derivación solo se adjunta cuando el nivel de traza del espacio de trabajo ya captura cuerpos para ese anfitrión — viaja sobre la misma ruta de captura de cuerpos que todo lo demás en este capítulo, y no tiene interfaz local propia.
Modo privado
El modo privado es un interruptor por espacio de trabajo en el panel Trazado, mostrado solo en los Mac inscritos. Cuando se activa, ese espacio de trabajo deja de transmitir los metadatos de sesión y los eventos anteriores al espacio de trabajo de bromure.io — ni el indicador de la barra de título ni la lista de sesiones del administrador ven nada de él. El trazado local y el Inspector de trazas no se ven afectados: sigues teniendo la traza cifrada completa en tu propia máquina.
Existe exactamente para el caso en que la auditoría local y la telemetría organizacional deben divergir — por ejemplo, un espacio de trabajo donde usas una clave de API personal y no quieres esa actividad en los paneles de tu organización. En un Mac no inscrito no se transmite nada, por lo que el interruptor queda oculto por completo.
Nota: El modo privado también suprime los eventos
prompt_injection.detection, de modo que en un espacio de trabajo privado una inyección sigue registrándose localmente en el Registro de seguridad (y se aplica según tu acción de detección) pero no se reenvía a tu organización. Consulta Configuración de Trazado para el interruptor en sí y Empresa para lo que transmite la inscripción.