
Te lo digo de frente, porque esto me crispó: si instalaste el CLI oficial de xAI para programar —ese que se llama grok y se baja con curl -fsSL https://x.ai/cli/install.sh | bash— y le diste tu usuario de X o SuperGrok, ya le mandaste a xAI mucho más de lo que crees. No solo el archivo que le pediste leer. Todo el repositorio. Con el .env adentro. Sin avisarte.
No estoy especulando. El ingeniero cereblab publicó un análisis a nivel de wire con capturas hechas con mitmproxy, en un Mac Apple Silicon, usando la versión grok 0.2.93. Tiró el binario contra un proxy local, marcó archivos con canary strings únicos, y vio qué se iba por la red. Los hallazgos son demoledores, y los resumo acá sin adornos.
Tres cosas que el CLI hace y que la documentación no te cuenta
1. Lee archivos y manda su contenido tal cual. Cuando el agente lee un archivo —cualquier archivo, incluyendo un .env con API_KEY=... y DB_PASSWORD=...—, el contenido viaja completo, sin redactar, en el POST /v1/responses del turno del modelo. Aparece serializado dentro del JSON, con la firma "model":"grok-4.5". Es decir, llega al endpoint del modelo. Punto.
2. Sube el repositorio completo aparte. Aunque el agente lea un solo archivo, hay un segundo canal: POST /v1/storage. El binario empaqueta el workspace —todos los archivos tracked más el historial de git— y lo sube a un bucket de Google Cloud Storage que está hardcodeado en el ejecutable: gs://grok-code-session-traces/. La respuesta es HTTP 200. Se aceptó. Quedó guardado.
3. No puedes apagarlo con el switch que aparece en la UI. Desmarcar «Improve the model» no desactiva la subida. El endpoint /v1/settings igual devuelve trace_upload_enabled: true. La subida es opt-out por feature flag interno, no por configuración de usuario.
La prueba que más me molestó
El autor hizo el experimento que cualquier weón con dos dedos de frente harÃa: le dijo al agente «responde OK, no leas ningún archivo». ¿Y sabes qué pasó? Igual subió el repo completo como un git bundle. Hizo git clone sobre el bundle capturado y recuperó src/_probe/never_read_canary.txt con su marcador único, intacto, más todo el historial de git. El agente no lo leyó. xAI igual lo tiene.
Y no es un caso chico. En una prueba con un repo de 12 GB lleno de archivos random que el agente nunca tocó, el canal /v1/storage movió 5.10 GiB con respuestas 200 OK, mientras el canal del modelo (/v1/responses) apenas movió 192 KB. Una proporción de 27.800 a 1. La subida no está atada a lo que el modelo lee; está atada a tu workspace.
Cómo lo encontraron
No es magia. strings sobre el binario entrega los source paths en Rust: crates/codegen/xai-data-collector/src/gcs.rs, storage_client.rs, queue.rs, file_access_tracker.rs. Es código de primera parte, no un módulo opcional. Después, con un mitmproxy + CA confiable en el keychain (no se necesita sudo, porque el binario no hace certificate pinning), se capturan los POST con método, host, path, status y tamaño en bytes. Todo reproducible.
Lo que xAI no está diciendo (y lo que sà está diciendo)
El paper no afirma que xAI entrene con esos datos. Esa es una pregunta de polÃtica, no de tráfico. Lo que sà prueba es transmisión, aceptación y almacenamiento en infraestructura propia de Google Cloud, en un bucket cuyo nombre es explÃcito (grok-code-session-traces). Y lo hace por defecto, con un login de consumidor, sin que la página de instalación lo advierta.
Lo que opino, en una frase
Esto no es un bug, es un modelo de negocio. Los CLIs de los vendors de IA están diseñados para extraer la mayor cantidad de telemetrÃa posible de tu trabajo diario, y la única forma de no participar es no instalarlos o usarlos con cuidado de cartilla. En mi pega no va a entrar grok a ningún repo de cliente, ni con buena intención. Y si tú tienes un .env con secretos de producción en una carpeta donde corres cualquier CLI de IA, asume que esos secretos ya están en un datacenter que no controlas. Cambia las claves, rota los tokens, y deja el repo sensible en otra máquina.
El resto lo decides tú. Pero que sea con los ojos abiertos, no con la consola abierta y un «Improve the model» desmarcado que no hace lo que dice.
Fuente de inspiración: What xAI’s Grok Build CLI Actually Sends to xAI: A Wire-Level Analysis
