What xAI Grok Build CLI actually sends to xAI - a wire-level analysis (grok 0.2.93) Independent AI safety researcher @cereblab has published a wire-level analysis showing that xAI's Grok Build CLI (version 0.2.93) transmits the entire repository contents, including files the agent was told not to read, to xAI's Google Cloud Storage bucket 'grok-code-session-traces' via POST /v1/storage. The upload occurs independently of what the agent reads, and disabling 'Improve the model' does not stop it. On a 12 GB repo, 5.10 GiB was uploaded while only 192 KB was sent via the model-turn channel. Update — 2026-07-14:This is the original wire-level analysis grok 0.2.93 . Since publishing: xAI disabled the upload server-side disable codebase upload: true ; added a /privacy opt-out — which I wire-tested and found to be a data-retentionsetting, not a block on what'ssent; and Elon Musk publicly committed to deleting all previously-uploaded data not yet confirmed complete . Full, maintained story + evidence:· https://cereblab.com https://github.com/cereblab/grok-build-exfil-repro By @cereblab — Independent AI Safety Checker. Reproduce it yourself: github.com/cereblab/grok-build-exfil-repro A measured, reproducible teardown. Findings are backed by captured artifacts endpoint, HTTP method, status code, byte size, host and repro commands; where an observation was seen live but not retained as a file, §7 says so explicitly. Section 8 is an evidence appendix with SHA-256s and a "what we did not prove" list. All captures are of my own traffic on my own machine, using a throwaway repository containing fake "canary" secrets — no real credentials were exposed. xAI's official Grok Build coding CLI grok , on a normal consumer login, does three things worth documenting precisely: It transmits the contents of files it reads — including a The secret appears in .env secrets file — to xAI, verbatim and unredacted. two channels: the live model turn POST /v1/responses and a session state archive uploaded and accepted HTTP 200 via POST /v1/storage — the endpoint the binary routes to the grok-code-session-traces GCS bucket see §5 . It uploads the Grok packages the workspace and uploads it via whole repository — every tracked file's content plus git history — independent of what the agent reads. POST /v1/storage . Proven directly: on a real codebase, with the prompt "reply OK, do not read any files" , Grok uploaded the entire repo as a git bundle POST /v1/storage → 200 ; git clone -ing the captured bundle recovers a file the agent was told not to open — src/ probe/never read canary.txt — with its unique marker verbatim , plus the full git history appendix uploaded repo.bundle . And it scales: on a 12 GB repo of never-read random files, /v1/storage moved 5.10 GiB, all HTTP 200 truncated mid-stream , while the model-turn channel moved just 192 KB — a ~27,800× ratio that pins the upload to the codebase, not to what was read. No storage upload failed; the only non-200s were a model-usage quota 402/429 on /v1/responses and one unrelated 404 — not a storage size cap. The storage destination is a Google Cloud Storage bucket, not AWS S3 — named verbatim in the binary and in a captured grok-code-session-traces metadata.json gs://grok-code-session-traces/… . I did not find this mechanism surfaced in the CLI's install/quickstart materials not an exhaustive docs audit — §7 , it is active by default, and disabling "Improve the model" does not turn it off /v1/settings still returned trace upload enabled: true ; §6 . None of this proves xAI trains on the data — that is a policy question addressed in §6. What is proven is transmission, acceptance, and storage. Install: curl -fsSL https://x.ai/cli/install.sh | bash → ~/.grok/bin/grok Auth: first launch opens a browser → login to X / SuperGrok consumer account, not an API key Binary identity repro: file $ readlink -f ~/.grok/bin/grok ; ~/.grok/bin/grok --version; shasum -a 256 $ readlink -f ~/.grok/bin/grok : php ~/.grok/bin/grok - ../downloads/grok-macos-aarch64 Mach-O 64-bit executable arm64 grok 0.2.93 f00f96316d4b SHA-256: 2a97ba675bd992aa9b981e2e83776460d94f469b510c0b8efe28b50d236d767c The upload machinery is a first-party Rust crate. strings on the binary yields these source paths and constants repro: strings