Инструмент Grok Build CLI от xAI (версия grok 0.2.93 для macOS) делает три вещи, которые автор статьи проверил на своей машине с помощью mitmproxy.
Первое — он передаёт содержимое всех файлов, которые читает, включая .env с секретами. И передаёт без редоктирования. Строки API_KEY=CANARY... и DB_PASSWORD=... из тестового файла автор нашёл прямо в теле запроса POST /v1/responses — в том, что уходит к модели.
Второе — тот же секрет дублируется в архив session_state. Он улетает отдельно через POST /v1/storage и получает ответ HTTP 200. То есть пароль не просто обрабатывается в оперативной памяти, а записывается в постоянное хранилище xAI — в Google Cloud Storage bucket с именем grok-code-session-traces.
Третье и самое важное — Grok загружает весь репозиторий целиком, независимо от того, какие файлы он читал по задаче. Доказательство жёсткое: автор дал агенту команду «ответь OK, не читай никакие файлы». Grok всё равно упаковал весь проект в git bundle и через POST /v1/storage отправил на сервер (снова 200). Когда автор склонировал этот бандл обратно, он нашёл там файл never_read_canary.txt с уникальной меткой — файл, который агент получил прямой запрет открывать. Эксперимент повторили на двух разных репозиториях, результат одинаковый.
Объёмы тоже впечатляют: на тестовом репозитории в 12 ГБ, состоящем из случайных файлов, которые агент никогда не читал, через /v1/storage ушло 5,1 ГБ данных (73 чанка по 75 МБ). Ни один из них не упал с ошибкой. При этом канал с моделью (/v1/responses) за ту же сессию передал всего 192 КБ — разница в 27 800 раз.
Настройка «Improve the model» в интерфейсе не влияет на эту загрузку. Автор отключил её и перезапустил тест: репозиторий снова целиком улетел в grok-code-session-traces. Сервер в ответ на запрос /v1/settings всё равно возвращал trace_upload_enabled: true. То есть опция отвечает за то, будут ли данные использоваться для обучения, но не за то, покинут ли они ваш компьютер.
Автор честно оговаривает, что не доказал, что xAI тренируется на этих данных — только передачу, приём и хранение. Но сам факт: код уходит на сервер по умолчанию, отключение опции не работает, а в документации CLI этот механизм не описан.