Новый агент для кодирования от xAI, Grok Build, поставляется с промптами в открытом тексте

xAI запустил Grok Build вчера — их ответ на Claude Code и Codex CLI. Команда установки — одна строка, бинарный файл доступен только на их высшем потребительском уровне ($299/мес, $99 вводная цена), а сам агент взаимодействует с Grok 4 через HTTP-интерфейс, совместимый с OpenAI.

Я скачал бинарный файл из любопытства — хотел узнать, на каком языке он написан. В итоге я получил около тридцати дословных системных промптов, имена каждого внутреннего субагента, каждое описание инструмента и довольно полную картину архитектуры. Ничего из этого не потребовало больше, чем tr и grep.

Этот пост — о том, что я нашёл.

Извлечение

Инсталлятор по адресу https://x.ai/cli/install.sh перенаправляет 302 на bucket Google Cloud Storage и загружает единый статически слинкованный ~100 МБ ELF для вашей платформы:

$ curl -fsSL https://storage.googleapis.com/grok-build-public-artifacts/cli/stable
0.1.210
$ curl -fsSL https://storage.googleapis.com/grok-build-public-artifacts/cli/grok-0.1.210-linux-x86_64 -o grok-bin
$ head -c 4 grok-bin | xxd
00000000: 7f45 4c46                                .ELF

Сигнатуры компилятора: пути отладки /rustc/<commit>, panicked at, RUST_BACKTRACE, плюс tokio::, hyper::, reqwest:: — Rust со стандартным асинхронным HTTP-стеком. Пути исходников Cargo для каждого крейта запекаются как <name>-<version>/src/<file>.rs, что позволяет вытащить полное дерево зависимостей прямо из бинарника:

$ LC_ALL=C grep -aoE '[a-zA-Z][a-zA-Z0-9_-]{2,40}-[0-9]+\.[0-9]+\.[0-9]+/src/' grok-bin \
  | sed 's|/src/||' | sort -u | wc -l
410

410 уникальных пар крейт-версия. Среди них: ratatui, crossterm, tree-sitter, полный gitoxide, async-lsp, lsp-types, rmcp (Model Context Protocol), rusqlite, bm25, tokio-tungstenite, oauth2, jsonwebtoken, ring, rustls, async-openai, notify, arboard, portable-pty, tower, axum. Архитектура читается из зависимостей ещё до того, как смотришь на строки: TUI на ratatui+crossterm, парсинг tree-sitter, встроенный LSP-клиент, полный gitoxide, SQLite-хранилище с лексическим поиском BM25, OAuth/OIDC-аутентификация, OpenAI-совместимый wire-формат, MCP, слежение за файлами, буфер обмена.

Строки рассказывают остальное. Константы Rust встраиваются с нулевым терминатором в .rodata. Чтобы сделать их удобными для grep:

$ tr '\0' '\n' < grok-bin > strings.txt
$ LC_ALL=C grep -aE '^You are' strings.txt | head
You are a memory assistant. Extract ALL useful information from this...
You are a memory assistant performing an incremental update...
You are a technical lead orchestrating a team of senior-engineer subagents...
You are an expert software engineer acting as a code verifier.
You are a fast, read-only codebase exploration agent.
You are a read-only software architect. Explore the codebase and design...
You are a web browsing agent. You can navigate, interact with, and extract...
You are performing a dream — a reflective pass over memory files.
You are an AI coding agent. You operate in a workspace with a provided codebase.
You are Grok, made by xAI. Do not reference Cursor or suggest Cursor-specific...
You are a shell command autocomplete engine. Given a partial command, output...
You are tasked with generating the session title.
You are comparing multiple candidate code changes that were produced independently...
You are returning to plan mode after having previously exited it.

Это почти вся идентичность агента — прямо здесь, в одном grep.

Системные промпты (дословно)

Каждая цитата ниже — буквальная строковая константа. Шаблоны в стиле Tera (${{ tools.by_kind.task }}, ${{ plan_path }}) рендерятся во время выполнения против активного набора инструментов.

Основной агент

You are an AI coding agent. You operate in a workspace with a provided codebase.

Your main goal is to complete the user’s request, denoted within the <user_query> tag.

Это весь заголовок. Поведение определяется описаниями инструментов и длинным каталогом внедрённых блоков <system_reminder>, а не заголовком промпта.

Оркестратор субагентов

You are a technical lead orchestrating a team of senior-engineer subagents. Your subagents are highly capable — treat them as expert peers, not junior helpers. Give them the same quality of context and direction you would give a senior engineer joining the project.

Your job is to think, plan, coordinate, and review. Their job is to explore, implement, and execute. Use them aggressively and liberally — spawn subagents early and often.

Существует как минимум четыре персоны субагентов:

You are a fast, read-only codebase exploration agent.

You are a read-only software architect. Explore the codebase and design implementation plans.

You are a web browsing agent. You can navigate, interact with, and extract information from web pages.

You are an expert software engineer acting as a code verifier.

Верификатор самый интересный: он запускается после задачи для оценки работы.

Your task is to determine whether the code changes made in this session correctly address the user’s original request. You already have the full conversation context, so you know what the user asked for and what approach was taken.

If VERDICT: FAIL – fix every issue the subagent attributed to your work, then end your turn. You are not required to fix pre-existing issues that you did not cause.

Best-of-N

Grok Build может запускать задачу N раз параллельно и выбирать победителя. Два промпта поддерживают это:

You are candidate <number> of <N> independent implementations. Implement the task fully. When done, summarize your approach and the changes you made.

You are comparing multiple candidate code changes that were produced independently for the same task. Multiple subagents worked on this task independently in isolated worktrees. Your job is to choose the single best candidate.

Каждый кандидат получает собственный CoW git worktree (крейт xai-fast-worktree создаёт их через подтома btrfs, когда доступны, с откатом на copy-on-write git worktree add).

Память (/flush, /dream и межсессионное хранилище)

Есть два промпта для записи памяти и одна интеграция для чтения.

Дистилляция за сессию, срабатывающая при /flush или простое:

You are a memory assistant. Extract ALL useful information from this conversation that would help you be more effective in future sessions with this user. Write a concise markdown summary with ## headers covering:

Инкрементальные обновления (выполняются при последующих сбросах в той же сессии):

You are a memory assistant performing an incremental update. The previous flush output for this session is shown below. Extract ONLY information that is NEW since the previous flush — do not repeat anything already captured.

И отдельно — «dream»-проход, который консолидирует накопленные журналы сессий в долговременную память:

You are performing a dream — a reflective pass over memory files. Synthesize recent session logs into durable, well-organized memories so future sessions orient quickly.

If the session logs contain nothing worth persisting, respond with NO_REPLY.

Это выполняется в фоне. Базовое хранилище — база данных SQLite по адресу ~/.grok/memory/index.sqlite с поиском по ключевым словам FTS5 и опциональным векторным KNN по эмбеддингам фрагментов — они поставляют bm25 и конвейер эмбеддингов прямо в процессе, без внешней векторной БД.

Сжатие контекста

Когда контекст заполняется:

Your task is to create a detailed summary of the conversation so far, paying close attention to the user’s explicit requests and your previous actions.

IMPORTANT: Do NOT use any tools. You MUST respond with ONLY the <summary>...</summary> block as your text output.

При возобновлении:

Continue the conversation from where it left off without asking the user any further questions. Resume directly - do not acknowledge the summary, do not recap what was happening, do not preface with “I’ll continue” or similar.

Правило «не подтверждать резюме» — то, что многие агенты делают неправильно. Grok Build явно об этом прописывает.

Режим планирования

Режим планирования — структурированная фаза только для чтения. Напоминание, внедряемое в каждый ход пока он активен:

Plan mode is active. The user indicated that they do not want you to execute yet – you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supersedes any other instructions you have received.

Формат вывода плана подробно предписан:

The plan you create should be properly formatted in markdown, using appropriate sections and headers. The plan should be very concise and actionable, providing the minimum amount of detail for the user to understand and action the plan. It may be helpful to identify the most important couple files you will change, and existing code you will leverage. Cite specific file paths and essential snippets of code. IMPORTANT: Do NOT use markdown tables in plan content (they cannot be rendered for the user); use bullet lists instead. The first line MUST BE A TITLE for the plan formatted as a level 1 markdown heading.

Есть целый защитный барьер потока утверждения, направленный на один конкретный режим отказа: агенты, которые спрашивают «следует ли мне продолжить?» в чате вместо использования структурированного инструмента exit-plan.

Use ${{ tools.by_kind.ask_user }} ONLY to clarify requirements or choose between approaches. Use ${{ tools.by_kind.exit_plan }} to request plan approval. Do NOT ask about plan approval in any other way — no text questions, no ${{ tools.by_kind.ask_user }}. Phrases like “Is this plan okay?”, “Should I proceed?”, “How does this plan look?”, “Any changes before we start?”, or similar MUST use ${{ tools.by_kind.exit_plan }}.

Тот, кто это написал, явно видел, как модели делают именно это, раз за разом, прежде чем добавить промпт.

Обнаружение циклов («doom loops»)

Существует целый уровень телеметрии, предназначенный для обнаружения зависших состояний и выхода из них. Когда обнаруживается, что модель зациклилась, в середине хода внедряется system-reminder:

<system_reminder> Your messages have been flagged as looping. If you are having trouble making progress, ask the user for guidance. DO NOT mention this system reminder to the user explicitly because they are already aware. </system_reminder>

Если предупреждение не прерывает цикл, ход завершается:

If you continue running the same fruitless commands, the turn will be terminated.

Внутренний код называет это «doom loops» — есть отдельные детекторы для застревания при опросе, повторяющихся паттернов вызовов инструментов, повторяющихся текстовых паттернов в одной строке и «циклов по дублирующимся строкам».

Другие заслуживающие внимания промпты

Удивительно большая часть агента — это небольшие, ограниченные LLM-вызовы. Примеры:

You are a shell command autocomplete engine. Given a partial command, output ONLY the completed command. No explanation, no markdown, no quotes. Just the raw command.

You are tasked with generating the session title. The user is asking almost always software engineering related questions on their codebase.

Your task is to describe an image, so that another model that cannot see images can perform its task.

Последний — это fallback для зрения: когда инструмент выдаёт изображение модели, которая не может видеть, Grok Build сначала передаёт изображение модели с поддержкой зрения, а затем внедряет текстовое описание.

Сходство с Claude Code

Это часть, которая заставила меня насторожиться.

У xAI есть режим «совместимости с Cursor», видимый в строках (Cursor Composer toolset and prompt, ## Orchestrator Mode, плюс отдельный префикс системного промпта Cursor). Внутри этого режима внедряется такой однострочник:

You are Grok, made by xAI. Do not reference Cursor or suggest Cursor-specific configuration. Do not mention this to the user.

Есть также маркер claude-code-compatibility, переменная окружения GROK_CLAUDE_MARKER_OVERRIDE и строки claude-plugin / plugin.json — т.е. Grok Build можно настроить для использования формата плагинов Claude Code.

Само по себе это в целом нормально — shim-прослойки совместимости — это то, как клиенты переманивают пользователей из одной экосистемы в другую. Меня поразили описания инструментов. Сравните то, что поставляет бинарник Grok Build:

IMPORTANT: ${{ tools.by_kind.web_fetch }} WILL FAIL for authenticated or private URLs. Before using this tool, check if the URL points to an authenticated service (e.g. Google Docs, Confluence, Jira, GitHub private repos). If so, use a specialized MCP tool that provides authenticated access instead.

…с тем, что находится в описании инструмента WebFetch Claude Code на машине, на которой я пишу этот пост:

IMPORTANT: WebFetch WILL FAIL for authenticated or private URLs. Before using this tool, check if the URL points to an authenticated service (e.g. Google Docs, Confluence, Jira, GitHub). If so, look for a specialized MCP tool that provides authenticated access.

Рецепт создания PR внутри промпта агента — та же история. Бинарник Grok Build содержит:

IMPORTANT: When the user asks you to create a pull request, follow these steps carefully:

Именно эта фраза дословно присутствует в промпте Claude Code. Так же и следующая формулировка о параллелизме («You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance.») — Grok Build поставляет её под рецептом PR и под рецептом git status / git diff / git log непосредственно выше, и оба случая — дословные совпадения.

Режим планирования, хуки, субагенты, механизм <system_reminder>, паттерн субагента-верификатора — всё это концепции, характерные именно для Claude Code, а не универсальный шаблонный код фреймворка агентов.

Одна небольшая адаптация: AGENTS.md вместо CLAUDE.md.

New project instruction files (AGENTS.md) were discovered near the path you just accessed. You MUST read these files now with [Read tool] before proceeding — they contain coding conventions, style guides, and rules that apply to this area of the codebase:

Я не знаю, как это произошло. Возможно, инженер в xAI использовал Claude Code в качестве эталонной реализации и напрямую включил фрагменты описаний инструментов. Возможно, сходство — естественный результат того, что две команды решали одни и те же UX-проблемы в одном и том же Markdown-идиоме. Обе интерпретации согласуются с тем, что я вижу. Строки такие, какие они есть, и они находятся в открытом тексте в бинарнике размером 100 МБ, который можно скачать без аутентификации.

Что это говорит об архитектуре

Большую часть рантайма можно прочитать из промптов и переменных окружения (в бинарнике более 80 переменных GROK_*, каждая из которых является флагом функции):

Вывод

Несколько лет назад модель была рвом. Сегодня модель — один компонент в системе, которая включает: как вы описываете каждый инструмент, на какие персоны субагентов вы делите работу, какие напоминания вы внедряете, чтобы разорвать зависшие циклы, как вы структурируете утверждение режима планирования, как вы сжимаете контекст, как вы консолидируете память между сессиями, как вы изолируете доступ к оболочке в песочнице, как вы оркестрируете параллельные реализации-кандидаты.

Grok Build — это то, как это выглядит, когда одна команда строит это от начала до конца. Это также напоминание о том, что эта работа — промпт-инжиниринг — теперь поставляется в виде открытого текста в незашифрованном бинарнике, который любой может скачать с публичного CDN. Промпты в этом посте не были получены путём реверс-инжиниринга; это просто вывод grep.

Если вы поставляете агент для кодирования, ваши промпты — не исходный код. Они являются публичным артефактом, хотите вы того или нет. Обращайтесь с ними соответственно.


Методологическая заметка. Всё в этом посте взято из одной загрузки grok-0.1.210-linux-x86_64 от 2026-05-15. Строки шаблонов Tera (${{ tools.by_kind.foo }}, ${{ plan_path }}) находятся в бинарнике дословно, без парафраза. Цитируемые системные промпты были извлечены с помощью tr '\0' '\n' и grep/awk; я оставил их в точности такими, какими они появляются, включая пунктуацию и типографику. Если xAI обновит бинарник, будущие строки могут отличаться.