SpyBara
Go Premium

Documentation 2026-10-09 23:02 UTC to 2026-10-10 10:00 UTC

19 files changed +586 −238. View all changes and history on the product overview
2026
Sat 10 11:58 Fri 9 23:02 Thu 8 22:58 Wed 7 23:59 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59
Details

124 124 

125Без включенных частичных сообщений вы получаете все типы сообщений, кроме `StreamEvent`. Распространенные типы включают `SystemMessage` (инициализация сеанса), `AssistantMessage` (полные блоки содержимого), `ResultMessage` (финальный результат) и компактное граничное сообщение, указывающее на то, когда история разговора была сжата (`SDKCompactBoundaryMessage` в TypeScript; `SystemMessage` с подтипом `"compact_boundary"` в Python).125Без включенных частичных сообщений вы получаете все типы сообщений, кроме `StreamEvent`. Распространенные типы включают `SystemMessage` (инициализация сеанса), `AssistantMessage` (полные блоки содержимого), `ResultMessage` (финальный результат) и компактное граничное сообщение, указывающее на то, когда история разговора была сжата (`SDKCompactBoundaryMessage` в TypeScript; `SystemMessage` с подтипом `"compact_boundary"` в Python).

126 126 

127<h3 id="handle-a-stream-that’s-cut-off">

128 Обработка оборванного потока

129</h3>

130 

131Если поток обрывается посреди сообщения, например когда вы прерываете ход или разрывается соединение, вы всё равно получаете `message_stop` этого сообщения до завершения хода. Оборванный текстовый блок или блок размышлений также получает свой `content_block_stop`. Оборванный вызов инструмента его не получает, поэтому если `message_stop` поступает, пока блок вызова инструмента ещё открыт, считайте входные данные этого вызова неполными.

132 

133До Claude Code v2.1.290 оборванный поток мог завершить ход без `message_stop`, поэтому ответ, который вы отображаете на основе событий потока, мог оставаться показанным как выполняющийся. TypeScript Agent SDK включает Claude Code v2.1.290 или новее начиная с v0.3.290, а Python Agent SDK — начиная с v0.2.164. Если ответ остается показанным как выполняющийся после завершения хода, обновите SDK.

134 

127<h2 id="stream-tool-calls">135<h2 id="stream-tool-calls">

128 Потоковая передача вызовов инструментов136 Потоковая передача вызовов инструментов

129</h2>137</h2>

Details

1588 1588 

1589Сопоставляйте сообщения субагента с событиями его задачи по `agent_id`, а не по паре `parent_tool_use_id` сообщения и `tool_use_id` события задачи. Когда вызов инструмента возобновляет субагента, события задачи несут `tool_use_id` этого вызова, а сообщения сохраняют `parent_tool_use_id` вызова инструмента, который впервые запустил субагента, поэтому эти значения перестают совпадать.1589Сопоставляйте сообщения субагента с событиями его задачи по `agent_id`, а не по паре `parent_tool_use_id` сообщения и `tool_use_id` события задачи. Когда вызов инструмента возобновляет субагента, события задачи несут `tool_use_id` этого вызова, а сообщения сохраняют `parent_tool_use_id` вызова инструмента, который впервые запустил субагента, поэтому эти значения перестают совпадать.

1590 1590 

1591Claude Code устанавливает `user_message_uuid` и `user_message_uuids` в первом сообщении ассистента в ходе при условиях, описанных в [`user_message_uuid`](#user_message_uuid). Когда Claude Code повторно запускает ход, прерванный перезапуском, сообщения ассистента повторного запуска, которые содержат эти поля, также содержат [`resume_reason`](#resume_reason).1591Claude Code задаёт `user_message_uuid` и `user_message_uuids` в первом сообщении ассистента в ходе при условиях, описанных в [`user_message_uuid`](#user_message_uuid). Когда ход продолжает другой ход, прерванный перезапуском, сообщения ассистента, несущие эти поля, несут также [`resume_reason`](#resume_reason).

1592 1592 

1593`timestamp` — это время в формате ISO 8601, когда содержимое сообщения закончило генерироваться в процессе, который его создал. Значение берётся с часов этой машины, поэтому используйте его только для отображения и не упорядочивайте сообщения по нему. Один ход API может создать несколько сообщений ассистента с одинаковым `message.id`, каждое со своим `timestamp`. Когда это поле отсутствует, используйте время получения сообщения.1593`timestamp` — это время в формате ISO 8601, когда содержимое сообщения закончило генерироваться в процессе, который его создал. Значение берётся с часов этой машины, поэтому используйте его только для отображения и не упорядочивайте сообщения по нему. Один ход API может создать несколько сообщений ассистента с одинаковым `message.id`, каждое со своим `timestamp`. Когда это поле отсутствует, используйте время получения сообщения.

1594 1594 


1631 1631 

1632Задайте `inline_pastes`, чтобы сообщить Claude Code, какие части `message.content` пользователь вставил, а не набрал, — по одной строке на каждую вставку. Текст промпта остаётся там, где его поместил пользователь. Claude Code может обернуть каждую перечисленную вставку в теги `<pasted_content>` на её месте, чтобы Claude мог отличить вставленный материал от собственных слов пользователя. Оборачиваются только вставки в последнем текстовом блоке промпта. Требуется TypeScript Agent SDK v0.3.280 или новее.1632Задайте `inline_pastes`, чтобы сообщить Claude Code, какие части `message.content` пользователь вставил, а не набрал, — по одной строке на каждую вставку. Текст промпта остаётся там, где его поместил пользователь. Claude Code может обернуть каждую перечисленную вставку в теги `<pasted_content>` на её месте, чтобы Claude мог отличить вставленный материал от собственных слов пользователя. Оборачиваются только вставки в последнем текстовом блоке промпта. Требуется TypeScript Agent SDK v0.3.280 или новее.

1633 1633 

1634У каждого поля вставки есть ограничение размера:

1635 

1636* `pasted_content`: если записей вместе с блоками содержимого внутри них больше 1000, Claude Code игнорирует всё поле.

1637* `inline_pastes`: Claude Code использует первые 100 непустых записей и игнорирует остальные.

1638 

1634Задайте `shouldQuery`, `client_composed` или `priority`, чтобы изменить то, как Claude Code обрабатывает отправленное вами сообщение:1639Задайте `shouldQuery`, `client_composed` или `priority`, чтобы изменить то, как Claude Code обрабатывает отправленное вами сообщение:

1635 1640 

1636* `shouldQuery`: установите его в `false`, чтобы добавить сообщение в транскрипт без запуска хода ассистента. Сообщение удерживается и объединяется со следующим пользовательским сообщением, которое запускает ход. Используйте это для внедрения контекста, например вывода команды, которую вы запустили вне основного канала, не тратя на это вызов модели.1641* `shouldQuery`: установите его в `false`, чтобы добавить сообщение в транскрипт без запуска хода ассистента. Сообщение удерживается и объединяется со следующим пользовательским сообщением, которое запускает ход. Используйте это для внедрения контекста, например вывода команды, которую вы запустили вне основного канала, не тратя на это вызов модели.


1775* `ttft_stream_ms`: время в миллисекундах до первого события потока `message_start`, когда открывается поток ответа. Меньше, чем `ttft_ms`; разница между ними — это время, потраченное на потоковую передачу первого сообщения. Присутствует только в ветви успеха.1780* `ttft_stream_ms`: время в миллисекундах до первого события потока `message_start`, когда открывается поток ответа. Меньше, чем `ttft_ms`; разница между ними — это время, потраченное на потоковую передачу первого сообщения. Присутствует только в ветви успеха.

1776* `user_message_uuid`: `uuid` отправленного вами сообщения, на которое ответил этот ход. См. [`user_message_uuid`](#user_message_uuid), чтобы узнать, какие результаты его содержат.1781* `user_message_uuid`: `uuid` отправленного вами сообщения, на которое ответил этот ход. См. [`user_message_uuid`](#user_message_uuid), чтобы узнать, какие результаты его содержат.

1777* `user_message_uuids`: `uuid` каждого отправленного вами сообщения, на которое Claude Code ответил в этом ходе. См. [`user_message_uuids`](#user_message_uuids).1782* `user_message_uuids`: `uuid` каждого отправленного вами сообщения, на которое Claude Code ответил в этом ходе. См. [`user_message_uuids`](#user_message_uuids).

1778* `resume_reason`: почему Claude Code повторно выполнил этот ход после того, как его прервал перезапуск. Присутствует в обоих вариантах. См. [`resume_reason`](#resume_reason).1783* `resume_reason`: причина, по которой этот ход продолжает ход, прерванный перезапуском. Присутствует в обеих ветвях. См. [`resume_reason`](#resume_reason).

1779* `local_command`: имя команды, которую выполнил ход, в результате успеха хода, завершённого командой без входа в цикл агента, например `/compact`. Имя приводится к строчным буквам и подчёркиваниям, поэтому `/reload-plugins` сообщает `reload_plugins`. Команда, которую предоставляет MCP-сервер, и встроенная `/mcp` сообщают `mcp`. Команда, которую вы определили сами, сообщает `custom`. Аргументы никогда не включаются. Отсутствует в каждом ходе, который вошёл в цикл агента, и при отправках, не запустивших команду. Требует Agent SDK v0.3.268 или позже.1784* `local_command`: имя команды, которую выполнил ход, в результате успеха хода, завершённого командой без входа в цикл агента, например `/compact`. Имя приводится к строчным буквам и подчёркиваниям, поэтому `/reload-plugins` сообщает `reload_plugins`. Команда, которую предоставляет MCP-сервер, и встроенная `/mcp` сообщают `mcp`. Команда, которую вы определили сами, сообщает `custom`. Аргументы никогда не включаются. Отсутствует в каждом ходе, который вошёл в цикл агента, и при отправках, не запустивших команду. Требует Agent SDK v0.3.268 или позже.

1780* `request_sent_wall_ms`: миллисекунды эпохи, в которые Claude Code отправил запрос API, для сопоставления с серверными временными метками. Присутствует только вместе с [`user_message_uuid`](#user_message_uuid), в результате успеха с `is_error` равным false, чей ход отправил запрос API.1785* `request_sent_wall_ms`: миллисекунды эпохи, в которые Claude Code отправил запрос API, для сопоставления с серверными временными метками. Присутствует только вместе с [`user_message_uuid`](#user_message_uuid), в результате успеха с `is_error` равным false, чей ход отправил запрос API.

1781* `first_content_frame_ms`: время в миллисекундах до первого события потока `content_block_start` или `content_block_delta`, считая блоки размышлений содержимым. Присутствует только в ветви успеха, когда `is_error` имеет значение false. Требует Agent SDK v0.3.260 или позже.1786* `first_content_frame_ms`: время в миллисекундах до первого события потока `content_block_start` или `content_block_delta`, считая блоки размышлений содержимым. Присутствует только в ветви успеха, когда `is_error` имеет значение false. Требует Agent SDK v0.3.260 или позже.


1825 1830 

1826* **Обычное отправленное вами сообщение**, то есть без `isSynthetic: true`: ход отвечает на это сообщение на протяжении всего своего выполнения. Когда вы отправляете несколько сообщений почти одновременно, Claude Code может объединить их в один ход, и тогда поле содержит только `uuid` последнего сообщения. Чтобы сопоставить ответ с любым из объединённых сообщений, используйте [`user_message_uuids`](#user_message_uuids).1831* **Обычное отправленное вами сообщение**, то есть без `isSynthetic: true`: ход отвечает на это сообщение на протяжении всего своего выполнения. Когда вы отправляете несколько сообщений почти одновременно, Claude Code может объединить их в один ход, и тогда поле содержит только `uuid` последнего сообщения. Чтобы сопоставить ответ с любым из объединённых сообщений, используйте [`user_message_uuids`](#user_message_uuids).

1827* **Сообщение, отправленное вами с `isSynthetic: true`**: ход сначала отвечает на это сообщение. Если Claude Code подхватит ваше обычное сообщение между вызовами инструментов, с этого момента ход отвечает на подхваченное сообщение. Возврат `uuid` синтетического сообщения требует Agent SDK v0.3.265 или позже; более ранние версии ничего не возвращают в синтетических ходах.1832* **Сообщение, отправленное вами с `isSynthetic: true`**: ход сначала отвечает на это сообщение. Если Claude Code подхватит ваше обычное сообщение между вызовами инструментов, с этого момента ход отвечает на подхваченное сообщение. Возврат `uuid` синтетического сообщения требует Agent SDK v0.3.265 или позже; более ранние версии ничего не возвращают в синтетических ходах.

1828* **Промпт, который Claude Code генерирует для повторного запуска прерванного хода при [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/ru/env-vars)**: когда последний промпт прерванного хода — это обычное отправленное вами сообщение, открыло ли оно ход или Claude Code подхватил его во время хода, повторный запуск сначала отвечает на это сообщение. [`resume_reason`](#resume_reason) позволяет отличить кадры повторного запуска от кадров прерванной попытки. Когда последний промпт не является вашим обычным сообщением, повторный запуск сначала не отвечает ни на одно ваше сообщение. Если Claude Code подхватит ваше обычное сообщение между вызовами инструментов, с этого момента ход отвечает на подхваченное сообщение. Возврат промпта прерванного хода требует Agent SDK v0.3.268 или позже.1833* **Промпт, который Claude Code генерирует для продолжения прерванного хода при [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/ru/env-vars)**: когда последний промпт прерванного хода — это обычное отправленное вами сообщение, открыло ли оно ход или Claude Code подхватил его во время хода, продолжающий ход сначала отвечает на это сообщение. [`resume_reason`](#resume_reason) позволяет отличить фреймы продолжающего хода от фреймов прерванной попытки. Когда последний промпт не является вашим обычным сообщением, продолжающий ход сначала не отвечает ни на одно ваше сообщение. Если Claude Code подхватывает ваше обычное сообщение между вызовами инструментов, с этого момента ход отвечает на подхваченное сообщение. Возврат промпта прерванного хода требует Agent SDK v0.3.268 или новее.

1829* **Любой другой промпт, который Claude Code сгенерировал сам**: ход сначала не отвечает ни на одно ваше сообщение, и его кадры не содержат возвращаемого значения. Если Claude Code подхватит ваше обычное сообщение между вызовами инструментов, с этого момента ход отвечает на это сообщение. Возврат при подхвате требует Agent SDK v0.3.265 или позже; более ранние версии ничего не возвращают в этих ходах.1834* **Любой другой промпт, который Claude Code сгенерировал сам**: ход сначала не отвечает ни на одно ваше сообщение, и его кадры не содержат возвращаемого значения. Если Claude Code подхватит ваше обычное сообщение между вызовами инструментов, с этого момента ход отвечает на это сообщение. Возврат при подхвате требует Agent SDK v0.3.265 или позже; более ранние версии ничего не возвращают в этих ходах.

1830 1835 

1831Claude Code возвращает `uuid` сообщения, на которое дан ответ, в трёх видах кадров:1836Claude Code возвращает `uuid` сообщения, на которое дан ответ, в трёх видах кадров:


1857 `resume_reason`1862 `resume_reason`

1858</h4>1863</h4>

1859 1864 

1860Почему Claude Code повторно запустил этот ход после перезапуска. Claude Code устанавливает это поле в ходе, который он повторно запустил при [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/ru/env-vars), чтобы вы могли отличить ответ и результат повторного запуска от ответа и результата прерванной попытки. Требует Agent SDK v0.3.268 или позже.1865Причина, по которой этот ход продолжает ход, прерванный перезапуском. Claude Code задаёт это поле в ходе, продолжающем прерванный ход при [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/ru/env-vars), чтобы вы могли отличить ответ и результат продолжающего хода от ответа и результата прерванной попытки. Требуется Agent SDK v0.3.268 или новее.

1861 1866 

1862Claude Code устанавливает это поле в двух видах кадров:1867Claude Code устанавливает это поле в двух видах кадров:

1863 1868 

1864* **Результат повторного запуска**: как в ветви успеха, так и в ветви ошибки, независимо от того, содержит ли результат `user_message_uuid`.1869* **Результат продолжающего хода**: в ветвях success и error одинаково, независимо от того, несёт ли результат `user_message_uuid`.

1865* **Кадры ответа повторного запуска**: те, которые содержат [`user_message_uuid`](#user_message_uuid).1870* **Фреймы ответа продолжающего хода**: те, что несут [`user_message_uuid`](#user_message_uuid).

1866 1871 

1867Значение — короткий токен в нижнем регистре, называющий причину повторного выполнения хода, например `interrupted_turn`.1872Значение — короткий токен в нижнем регистре, например `interrupted_turn`.

1868 1873 

1869<h4 id="queued_turn_count">1874<h4 id="queued_turn_count">

1870 `queued_turn_count`1875 `queued_turn_count`


2029};2034};

2030```2035```

2031 2036 

2032Claude Code устанавливает `user_message_uuid` и `user_message_uuids` в первом событии потока хода, отличном от ping, и снова, когда меняется сообщение, на которое отвечает ход, при условиях, описанных в [`user_message_uuid`](#user_message_uuid). Когда Claude Code повторно запускает ход, прерванный перезапуском, события потока повторного запуска, которые содержат эти поля, также содержат [`resume_reason`](#resume_reason).2037Claude Code задаёт `user_message_uuid` и `user_message_uuids` в первом событии потока хода, отличном от ping, и снова — когда меняется сообщение, на которое отвечает ход, при условиях, описанных в [`user_message_uuid`](#user_message_uuid). Когда ход продолжает ход, прерванный перезапуском, события потока, несущие эти поля, несут также [`resume_reason`](#resume_reason).

2033 2038 

2034<h3 id="sdkcompactboundarymessage">2039<h3 id="sdkcompactboundarymessage">

2035 `SDKCompactBoundaryMessage`2040 `SDKCompactBoundaryMessage`


3558| - | - | - |3563| - | - | - |

3559| `script` | `string` | Встроенный скрипт workflow. Должен начинаться с `export const meta = { name, description }` как литерала, за которым следует тело скрипта с использованием `agent()`, `parallel()`, `pipeline()` и `phase()`. Опциональный массив `phases` в `meta` группирует агентов по именованным этапам в представлении прогресса |3564| `script` | `string` | Встроенный скрипт workflow. Должен начинаться с `export const meta = { name, description }` как литерала, за которым следует тело скрипта с использованием `agent()`, `parallel()`, `pipeline()` и `phase()`. Опциональный массив `phases` в `meta` группирует агентов по именованным этапам в представлении прогресса |

3560| `name` | `string` | Имя встроенного workflow или workflow, сохранённого в `.claude/workflows/`. Разрешается в скрипт |3565| `name` | `string` | Имя встроенного workflow или workflow, сохранённого в `.claude/workflows/`. Разрешается в скрипт |

3561| `scriptPath` | `string` | Путь к файлу скрипта workflow на диске. Имеет приоритет над `script` и `name`. Claude Code сохраняет скрипт каждого вызова и возвращает путь в результате, поэтому вы можете отредактировать этот файл и повторно вызвать с тем же `scriptPath` для итерации |3566| `scriptPath` | `string` | Путь к файлу скрипта workflow на диске, например `scriptPath`, который вернул предыдущий запуск. Имеет приоритет над `script` и `name`. Claude Code отклоняет `scriptPath` с ошибкой, если инструменты сессии не включают `Read` |

3562| `args` | `unknown` | Входное значение, доступное скрипту как глобальная переменная `args`, для параметризованных именованных workflow, таких как исследовательский вопрос или список путей к файлам. Передавайте массивы и объекты как фактические значения JSON, а не как JSON-кодированную строку |3567| `args` | `unknown` | Входное значение, доступное скрипту как глобальная переменная `args`, для параметризованных именованных workflow, таких как исследовательский вопрос или список путей к файлам. Передавайте массивы и объекты как фактические значения JSON, а не как JSON-кодированную строку |

3563| `resumeFromRunId` | `string` | Run ID предыдущего вызова `Workflow` для возобновления. Завершённые вызовы `agent()` с неизменёнными входными данными обычно возвращают кэшированные результаты; остальные выполняются заново. В разделе [Возобновление после паузы](/docs/ru/workflows#resume-after-a-pause) описано, какие завершённые вызовы выполняются повторно. Только в той же сессии |3568| `resumeFromRunId` | `string` | Run ID предыдущего вызова `Workflow` для возобновления. Завершённые вызовы `agent()` с неизменёнными входными данными обычно возвращают кэшированные результаты; остальные выполняются заново. В разделе [Возобновление после паузы](/docs/ru/workflows#resume-after-a-pause) описано, какие завершённые вызовы выполняются повторно. Только в той же сессии |

3564| `title` | `string` | Игнорируется; заголовок задаёт блок `meta` скрипта |3569| `title` | `string` | Игнорируется; заголовок задаёт блок `meta` скрипта |

chrome.md +3 −4

Details

129 Запросы разрешений в сессиях VS Code129 Запросы разрешений в сессиях VS Code

130</h3>130</h3>

131 131 

132В сессии VS Code то, будет ли Claude Code спрашивать вас перед действием в браузере, зависит от того, как сессия подключилась к вашему браузеру:132В сессии VS Code, когда Claude Code спрашивает вас перед действием в браузере, запрос появляется в виде карточки на панели чата. Если действие направлено на сайт, который вы не разрешили, карточка также предлагает разрешить этот сайт.

133 133 

134* **Вы ввели `@browser`**: расширение одобряет каждое действие в браузере, о котором Claude Code иначе спросил бы вас.134В сессии, которая подключилась к вашему браузеру при запуске, потому что включена настройка [Включено по умолчанию](#enable-chrome-by-default), Claude Code спрашивает вас перед действиями в браузере на сайте, который вы не разрешили, в режимах разрешений Manual, Edit automatically, Auto и Bypass permissions. В режимах Auto и Bypass permissions это действует, пока вы не введёте `@browser` в этой сессии.

135* **Подключение выполнила настройка [Включено по умолчанию](#enable-chrome-by-default) при запуске**: Claude Code спрашивает вас перед действиями в браузере на сайте, который вы не разрешили, в режимах разрешений Manual, Edit automatically, Auto и Bypass permissions, пока вы не введёте `@browser` в этой сессии.

136 135 

137<h3 id="browser-tools-in-plan-mode">136<h3 id="browser-tools-in-plan-mode">

138 Инструменты браузера в режиме планирования137 Инструменты браузера в режиме планирования

139</h3>138</h3>

140 139 

141В [режиме планирования](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode) запрос разрешения появляется перед тем, как Claude записывает GIF, открывает новую вкладку или запускает ярлык, за исключением сессии VS Code, в которой вы ввели [`@browser`](#permission-prompts-in-vs-code-sessions). Если в интерактивной сессии CLI [доступен режим обхода разрешений](/docs/ru/permission-modes#skip-all-checks-with-bypasspermissions-mode) и [получение feature-флагов](/docs/ru/env-vars#features-that-need-feature-flag-fetching) отключено, эти вызовы выполняются без запроса.140В [режиме планирования](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode) запрос разрешения появляется перед тем, как Claude записывает GIF, открывает новую вкладку или запускает ярлык. Если в интерактивной сессии CLI [доступен режим обхода разрешений](/docs/ru/permission-modes#skip-all-checks-with-bypasspermissions-mode) и [получение feature-флагов](/docs/ru/env-vars#features-that-need-feature-flag-fetching) отключено, эти вызовы выполняются без запроса.

142 141 

143Вызов `tabs_context_mcp` также запрашивает разрешение, когда он устанавливает `createIfEmpty`, как и вызов `browser_batch`, включающий любое из этих действий.142Вызов `tabs_context_mcp` также запрашивает разрешение, когда он устанавливает `createIfEmpty`, как и вызов `browser_batch`, включающий любое из этих действий.

144 143 

Details

981 * **Смешанные ключи**: файл, содержащий и `code`, и `cli` или его прежнее написание `settings`, останавливает шлюз при запуске. Поместите все блоки под один ключ за одно изменение.981 * **Смешанные ключи**: файл, содержащий и `code`, и `cli` или его прежнее написание `settings`, останавливает шлюз при запуске. Поместите все блоки под один ключ за одно изменение.

982</Warning>982</Warning>

983 983 

984Настройки Claude Code в политике, например правило, запрещающее чтение файлов `.env`, размещаются в блоке под ключом `cli` или `code`. Оба ключа принимают одинаковое содержимое. Ключ определяет, где применяются настройки:984Настройки Claude Code в политике, например правило, запрещающее чтение файлов `.env`, помещаются в блок под ключом `cli` или `code`. `code` — рекомендуемый ключ, а `cli` — устаревший. Оба ключа принимают одинаковое содержимое. Ключ определяет, где применяются настройки:

985 985 

986* **`cli`**: терминал, расширения VS Code и JetBrains, а также Agent SDK. При `cli` вкладка Code в Claude Desktop получает [производные настройки](#claude-desktop-overlay), поэтому ограниченное правило, например `Read(./.env)`, не останавливает пользователя там.986* **`cli`**: терминал, расширения VS Code и JetBrains, а также Agent SDK. При `cli` вкладка Code в Claude Desktop получает [производные настройки](#claude-desktop-overlay), поэтому ограниченное правило, например `Read(./.env)`, не останавливает пользователя там.

987* **`code`**: те же места, плюс может быть охвачена и вкладка Code в Claude Desktop.987* **`code`**: те же места, плюс может быть охвачена и вкладка Code в Claude Desktop.

988 988 

989Выбор сводится к тому, должны ли эти настройки распространяться и на вкладку Code. Если нет, ничего не меняйте. Файл, использующий `cli`, работает как прежде, а шлюз, обнаруживший `cli` в политике с ключом [`desktop`](#claude-desktop-overlay), выдаёт предупреждение при запуске и всё равно запускается. Чтобы охватить вкладку Code, переключитесь на `code` — рекомендуемый ключ.989Файл, использующий `cli`, работает как прежде, а шлюз, обнаруживший `cli` в политике с ключом [`desktop`](#claude-desktop-overlay), выдаёт предупреждение при запуске и всё равно запускается. Перейдите на `code`, чтобы настройки могли охватывать и вкладку Code.

990 990 

991Прежде чем переключаться, прочитайте раздел [Применение настроек `code` во вкладке Code](#apply-code-settings-in-the-code-tab). Чтобы настройки там применялись, политике нужен ключ `desktop`, а машины пользователей требуют настройки; кроме того, в Claude Desktop отключается веб-поиск.991Прежде чем переключаться, прочитайте раздел [Применение настроек `code` во вкладке Code](#apply-code-settings-in-the-code-tab). Чтобы настройки там применялись, политике нужен ключ `desktop`, а машины пользователей требуют настройки; кроме того, в Claude Desktop отключается веб-поиск.

992 992 

Details

277 277 

278Потоки работают в [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), когда модель потока это поддерживает, поэтому большинство вызовов инструментов работают без вашего запроса. Когда потоку нужно ваше одобрение, подсказка находится внутри этого потока и поток ждет, пока вы ответите там. Сказание Claude в разговоре проекта идти дальше не достигает его.278Потоки работают в [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), когда модель потока это поддерживает, поэтому большинство вызовов инструментов работают без вашего запроса. Когда потоку нужно ваше одобрение, подсказка находится внутри этого потока и поток ждет, пока вы ответите там. Сказание Claude в разговоре проекта идти дальше не достигает его.

279 279 

280Каждое одобрение охватывает эту подсказку или остаток этого потока, если вы выберете более широкий вариант. Чтобы позволить каждому потоку запускать определенные команды без запроса или блокировать некоторые, добавьте [правила разрешений](/docs/ru/permissions) в `.claude/settings.json` репозитория. Потоки применяют их только в проекте с одним репозиторием; см. [Что потоки берут из ваших репозиториев](#what-threads-pick-up-from-your-repositories). В проекте с несколькими репозиториями правила разрешений ни одного репозитория не достигают облачный поток, поэтому вы полагаетесь на auto mode и на одобрения, которые вы даете внутри каждого потока.280Каждое подтверждение охватывает этот запрос или остаток этого потока, если вы выберете более широкий вариант.

281 

282Чтобы позволить каждому потоку запускать определенные команды без запроса или блокировать некоторые, добавьте [правила разрешений](/docs/ru/permissions) в `.claude/settings.json` репозитория. Проверьте, применяют ли их облачные потоки в вашем проекте:

283 

284* **Один репозиторий**: облачные потоки применяют правила. См. [Что потоки берут из ваших репозиториев](#what-threads-pick-up-from-your-repositories).

285* **Несколько репозиториев, среда, размещенная Anthropic**: правила разрешений ни одного репозитория не доходят до облачного потока, поэтому вы полагаетесь на авторежим и на подтверждения, которые вы даете внутри каждого потока.

286* **Несколько репозиториев, самостоятельно размещенная среда**: см. [настройки какого репозитория применяются](/docs/ru/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories).

281 287 

282<h3 id="run-a-thread-on-your-own-computer">288<h3 id="run-a-thread-on-your-own-computer">

283 Запустите поток на своем компьютере289 Запустите поток на своем компьютере


381 Что потоки берут из ваших репозиториев387 Что потоки берут из ваших репозиториев

382</h3>388</h3>

383 389 

384Каждый облачный поток клонирует каждый репозиторий проекта и загружает `CLAUDE.md` и скиллы из всех них. Правила разрешений, хуки и `env` берутся только из `.claude/settings.json` в директории, в которой запускается поток: внутри репозитория, если он в проекте один, и над клонами, если их несколько, — в этом случае файлы репозиториев для них не читаются.390Каждый облачный поток клонирует каждый репозиторий проекта и загружает `CLAUDE.md` и скиллы из всех них. Правила разрешений, хуки и `env` берутся только из `.claude/settings.json` в директории, в которой запускается поток.

385 391 

386| В каждом репозитории | Один репозиторий | Несколько репозиториев |392| В каждом репозитории | Один репозиторий | Несколько репозиториев |

387| :- | :- | :- |393| :- | :- | :- |

388| `CLAUDE.md` | Загружается при запуске потока | Загружается из каждого репозитория при запуске потока |394| `CLAUDE.md` | Загружается при запуске потока | Загружается из каждого репозитория при запуске потока |

389| Скиллы, агенты и команды в `.claude/` | Загружаются | Загружаются из каждого репозитория |395| Скиллы, агенты и команды в `.claude/` | Загружаются | Загружаются из каждого репозитория |

390| Плагины, включённые в `.claude/settings.json` | Не загружаются. Вместо этого добавьте плагин в **Project settings > Plugins** | Не загружаются. Вместо этого добавьте плагин в **Project settings > Plugins** |396| Плагины, включённые в `.claude/settings.json` | Не загружаются. Вместо этого добавьте плагин в **Project settings > Plugins** | Не загружаются. Вместо этого добавьте плагин в **Project settings > Plugins** |

391| Правила разрешений, хуки и `env`, определённые в `.claude/settings.json` | Применяются к потоку, кроме ключей `env`, которые [не учитывает ни одна облачная сессия](/docs/ru/cloud-environments#what-carries-over-from-your-setup) | Не применяются |397| Правила разрешений, хуки и `env`, определённые в `.claude/settings.json` | Применяются к потоку, кроме ключей `env`, которые [не учитывает ни одна облачная сессия](/docs/ru/cloud-environments#what-carries-over-from-your-setup) | Не применяются в среде, размещённой Anthropic. Для самостоятельно размещённой среды см. [настройки какого репозитория применяются](/docs/ru/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

392 398 

393В проекте с несколькими репозиториями каждый клон подключается к потоку как [дополнительная директория](/docs/ru/memory#load-from-additional-directories) с включённой загрузкой `CLAUDE.md`, поэтому `CLAUDE.md` и скиллы каждого репозитория загружаются при запуске, хотя поток запускается над ними. В таком проекте помещайте постоянные правила в инструкции проекта, а переменные окружения передавайте потокам через [облачную среду](#choose-an-environment-for-threads).399В проекте с несколькими репозиториями помещайте постоянные правила в инструкции проекта, а переменные окружения передавайте потокам через [облачную среду](#choose-an-environment-for-threads).

394 400 

395<h3 id="choose-an-environment-for-threads">401<h3 id="choose-an-environment-for-threads">

396 Выбор среды для потоков402 Выбор среды для потоков


406 412 

407У облачных потоков нет скиллов, MCP-серверов, плагинов и инструментов, установленных только на вашей машине. Поток, который Claude запускает на вашей машине через [Remote Control](/docs/ru/remote-control), использует то, что установлено там. Чтобы сделать каждый из них доступным для облачных потоков:413У облачных потоков нет скиллов, MCP-серверов, плагинов и инструментов, установленных только на вашей машине. Поток, который Claude запускает на вашей машине через [Remote Control](/docs/ru/remote-control), использует то, что установлено там. Чтобы сделать каждый из них доступным для облачных потоков:

408 414 

409* Скиллы, субагенты и команды: добавьте их коммитом в репозиторий, который вы добавили в проект, например скилл в `.claude/skills/<skill-name>/SKILL.md`. Каждый облачный поток клонирует каждый репозиторий проекта и загружает `.claude/skills/`, `.claude/agents/` и `.claude/commands/` из каждого из них, поэтому скилл, добавленный коммитом в один репозиторий, доступен в каждом облачном потоке. Облачные потоки также загружают скиллы, которые вы включили для своего аккаунта claude.ai.415* Скиллы, субагенты и команды: добавьте их коммитом в репозиторий, который вы добавили в проект, например скилл в `.claude/skills/<skill-name>/SKILL.md`. Каждый облачный поток клонирует каждый репозиторий проекта и загружает `.claude/skills/`, `.claude/agents/` и `.claude/commands/` из каждого из них, поэтому скилл, добавленный коммитом в один репозиторий, доступен в каждом облачном потоке. Облачные потоки также загружают [скиллы, которые вы включили для своего аккаунта claude.ai](/docs/ru/skills#skills-in-cowork-and-cloud-sessions).

410* Плагины: добавьте их в **Project settings > Plugins**; они загружаются в каждый новый облачный поток. Плагины, которые репозиторий объявляет в своём `.claude/settings.json`, [не загружаются в облачных потоках](/docs/ru/cloud-environments#what-carries-over-from-your-setup).416* Плагины: добавьте их в **Project settings > Plugins**; они загружаются в каждый новый облачный поток. Плагины, которые репозиторий объявляет в своём `.claude/settings.json`, [не загружаются в облачных потоках](/docs/ru/cloud-environments#what-carries-over-from-your-setup).

411* MCP-серверы: облачные потоки получают свои инструменты MCP из коннекторов вашего аккаунта claude.ai — это MCP-серверы, которые вы один раз подключаете на [claude.ai/customize/connectors](https://claude.ai/customize/connectors) или через ссылку **Manage connectors** в **Project settings > Environment**. Каждый облачный поток может использовать их все без настройки для каждого проекта. У самого диалога проекта нет коннекторов, поэтому работу, требующую коннектора, отправляйте как задачу для облачного потока. В проекте с одним репозиторием облачные потоки также загружают MCP-серверы из [`.mcp.json`](/docs/ru/cloud-environments#what-carries-over-from-your-setup) этого репозитория. В разделе [Как коннекторы попадают в Claude Code](/docs/ru/mcp#how-connectors-reach-claude-code) перечислены правила для облачных сессий и настройки, отключающие коннекторы.417* MCP-серверы: облачные потоки получают свои инструменты MCP из коннекторов вашего аккаунта claude.ai — это MCP-серверы, которые вы один раз подключаете на [claude.ai/customize/connectors](https://claude.ai/customize/connectors) или через ссылку **Manage connectors** в **Project settings > Environment**. Каждый облачный поток может использовать их все без настройки для каждого проекта. У самого диалога проекта нет коннекторов, поэтому работу, требующую коннектора, отправляйте как задачу для облачного потока. В проекте с одним репозиторием облачные потоки также загружают MCP-серверы из [`.mcp.json`](/docs/ru/cloud-environments#what-carries-over-from-your-setup) этого репозитория. В разделе [Как коннекторы попадают в Claude Code](/docs/ru/mcp#how-connectors-reach-claude-code) перечислены правила для облачных сессий и настройки, отключающие коннекторы.

412* Инструменты командной строки и пакеты: установите их в [скрипте настройки](/docs/ru/cloud-environments#setup-scripts) среды.418* Инструменты командной строки и пакеты: установите их в [скрипте настройки](/docs/ru/cloud-environments#setup-scripts) среды.

Details

108| `--maintenance` | Запустить [Setup hooks](/docs/ru/hooks#setup) с matcher `maintenance` перед сеансом (только режим печати) | `claude -p --maintenance "query"` |108| `--maintenance` | Запустить [Setup hooks](/docs/ru/hooks#setup) с matcher `maintenance` перед сеансом (только режим печати) | `claude -p --maintenance "query"` |

109| `--max-budget-usd` | Остановить запуск, как только оценочные расходы на вызовы API достигнут этой суммы (только режим печати). Claude Code сверяет лимит со своей [клиентской оценкой стоимости](/docs/ru/agent-sdk/cost-tracking#estimates-not-billing), которая может отличаться от вашего счёта. Расходы [субагентов](/docs/ru/sub-agents) учитываются в лимите. Расходы могут превысить лимит, поэтому [оставляйте запас](/docs/ru/agent-sdk/agent-loop#budget-headroom). Когда вы возвращаетесь к диалогу с `--continue` или `--resume`, итоги, [восстановленные из предыдущих запусков](/docs/ru/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls), в нём не учитываются. Когда расходы достигают лимита, запуск ещё одного субагента завершается ошибкой `Budget limit reached`, а Claude Code останавливает всё ещё работающих фоновых субагентов; для этого поведения ограничения требуется Claude Code v2.1.217 или новее | `claude -p --max-budget-usd 5.00 "query"` |109| `--max-budget-usd` | Остановить запуск, как только оценочные расходы на вызовы API достигнут этой суммы (только режим печати). Claude Code сверяет лимит со своей [клиентской оценкой стоимости](/docs/ru/agent-sdk/cost-tracking#estimates-not-billing), которая может отличаться от вашего счёта. Расходы [субагентов](/docs/ru/sub-agents) учитываются в лимите. Расходы могут превысить лимит, поэтому [оставляйте запас](/docs/ru/agent-sdk/agent-loop#budget-headroom). Когда вы возвращаетесь к диалогу с `--continue` или `--resume`, итоги, [восстановленные из предыдущих запусков](/docs/ru/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls), в нём не учитываются. Когда расходы достигают лимита, запуск ещё одного субагента завершается ошибкой `Budget limit reached`, а Claude Code останавливает всё ещё работающих фоновых субагентов; для этого поведения ограничения требуется Claude Code v2.1.217 или новее | `claude -p --max-budget-usd 5.00 "query"` |

110| `--max-turns` | Ограничить количество агентских ходов (только режим печати). Выходит с ошибкой при достижении лимита. По умолчанию нет лимита. С `--input-format stream-json` сообщение, всё ещё находящееся в очереди, когда лимит заканчивает ход, остаётся в очереди и начинает новый ход с собственным лимитом | `claude -p --max-turns 3 "query"` |110| `--max-turns` | Ограничить количество агентских ходов (только режим печати). Выходит с ошибкой при достижении лимита. По умолчанию нет лимита. С `--input-format stream-json` сообщение, всё ещё находящееся в очереди, когда лимит заканчивает ход, остаётся в очереди и начинает новый ход с собственным лимитом | `claude -p --max-turns 3 "query"` |

111| `--mcp-config` | Загрузить MCP серверы из JSON файлов или строк (разделённые пробелом). Когда вы передаёте этот флаг с `-p`, Claude Code ждёт, пока всё ещё ожидающие серверы подключатся перед запуском первого хода, до стартового таймаута [`MCP_TIMEOUT`](/docs/ru/env-vars), 30 секунд по умолчанию; сервер с [кэшированным списком инструментов](/docs/ru/mcp#managing-your-servers) пропускает ожидание и подключается при первом использовании. Ожидание требует Claude Code v2.1.221 или позже | `claude --mcp-config ./mcp.json` |111| `--mcp-config` | Загрузить MCP-серверы из JSON-файлов или строк (через пробел). Когда вы передаёте этот флаг с `-p`, Claude Code перед первым ходом ждёт подключения ещё не подключившихся серверов — не дольше стартового таймаута [`MCP_TIMEOUT`](/docs/ru/env-vars), по умолчанию 30 секунд; сервер с [кэшированным списком инструментов](/docs/ru/mcp#managing-your-servers) не ожидается и подключается при первом использовании. В [самостоятельно размещённом окружении](/docs/ru/self-hosted-environments-configuration#connection-timing) вместо этого действует более короткое ожидание. Для ожидания требуется Claude Code v2.1.221 или новее | `claude --mcp-config ./mcp.json` |

112| `--model` | Устанавливает модель для текущего сеанса с [псевдонимом модели](/docs/ru/model-config#model-aliases), таким как `sonnet`, `opus`, `haiku` или `fable`, или полным именем модели. Переопределяет параметр [`model`](/docs/ru/settings-reference#model) и [`ANTHROPIC_MODEL`](/docs/ru/model-config#environment-variables) | `claude --model claude-sonnet-5` |112| `--model` | Устанавливает модель для текущего сеанса с [псевдонимом модели](/docs/ru/model-config#model-aliases), таким как `sonnet`, `opus`, `haiku` или `fable`, или полным именем модели. Переопределяет параметр [`model`](/docs/ru/settings-reference#model) и [`ANTHROPIC_MODEL`](/docs/ru/model-config#environment-variables) | `claude --model claude-sonnet-5` |

113| `--name`, `-n` | Установить отображаемое имя для сеанса, показываемое в `/resume` и в заголовке терминала. Вы можете возобновить именованный сеанс с помощью `claude --resume <name>`. В интерактивном сеансе, если другой живой сеанс на этой машине уже использует имя, Claude Code применяет [вариант его](/docs/ru/sessions#name-your-sessions) вместо этого. <br /><br />[`/rename`](/docs/ru/commands) изменяет имя во время сеанса и также показывает его на панели приглашения | `claude -n "my-feature-work"` |113| `--name`, `-n` | Установить отображаемое имя для сеанса, показываемое в `/resume` и в заголовке терминала. Вы можете возобновить именованный сеанс с помощью `claude --resume <name>`. В интерактивном сеансе, если другой живой сеанс на этой машине уже использует имя, Claude Code применяет [вариант его](/docs/ru/sessions#name-your-sessions) вместо этого. <br /><br />[`/rename`](/docs/ru/commands) изменяет имя во время сеанса и также показывает его на панели приглашения | `claude -n "my-feature-work"` |

114| `--no-chrome` | Отключить [интеграцию браузера Chrome](/docs/ru/chrome) для этого сеанса | `claude --no-chrome` |114| `--no-chrome` | Отключить [интеграцию браузера Chrome](/docs/ru/chrome) для этого сеанса | `claude --no-chrome` |

Details

314| Плагины и маркетплейсы, объявленные в `.claude/settings.json` вашего репозитория | Нет | Облачная сессия не устанавливает плагины, которые репозиторий включает в [`enabledPlugins`](/docs/ru/settings-reference#enabledplugins), включая плагины из маркетплейсов, которые он перечисляет в [`extraKnownMarketplaces`](/docs/ru/settings-reference#extraknownmarketplaces) |314| Плагины и маркетплейсы, объявленные в `.claude/settings.json` вашего репозитория | Нет | Облачная сессия не устанавливает плагины, которые репозиторий включает в [`enabledPlugins`](/docs/ru/settings-reference#enabledplugins), включая плагины из маркетплейсов, которые он перечисляет в [`extraKnownMarketplaces`](/docs/ru/settings-reference#extraknownmarketplaces) |

315| [Настройки, управляемые сервером](/docs/ru/server-managed-settings), вашей организации | Да, кроме сессий [Claude Tag](https://claude.com/docs/claude-tag/overview) | Загружаются с серверов Anthropic при запуске сессии. О том, как `availableModels` применяется в облачных сессиях, смотрите в разделе [Охват интерфейсов](/docs/ru/model-config#surface-coverage). Настройки, развёрнутые на вашем устройстве через MDM или файлы управляемых настроек, не применяются, потому что сессия работает на виртуальной машине, управляемой Anthropic; в [самостоятельно размещённой среде](/docs/ru/self-hosted-environments) сессии также читают файл управляемых настроек в образе runner, согласно разделу [как Claude Code объединяет управляемые источники](/docs/ru/managed-settings#how-claude-code-combines-managed-sources) |315| [Настройки, управляемые сервером](/docs/ru/server-managed-settings), вашей организации | Да, кроме сессий [Claude Tag](https://claude.com/docs/claude-tag/overview) | Загружаются с серверов Anthropic при запуске сессии. О том, как `availableModels` применяется в облачных сессиях, смотрите в разделе [Охват интерфейсов](/docs/ru/model-config#surface-coverage). Настройки, развёрнутые на вашем устройстве через MDM или файлы управляемых настроек, не применяются, потому что сессия работает на виртуальной машине, управляемой Anthropic; в [самостоятельно размещённой среде](/docs/ru/self-hosted-environments) сессии также читают файл управляемых настроек в образе runner, согласно разделу [как Claude Code объединяет управляемые источники](/docs/ru/managed-settings#how-claude-code-combines-managed-sources) |

316| Ваш пользовательский `~/.claude/CLAUDE.md` | Нет | Находится на вашей машине, а не в репозитории. Смотрите [Добавление личных предпочтений без коммита в репозиторий](#add-personal-preferences-without-committing-to-the-repo) |316| Ваш пользовательский `~/.claude/CLAUDE.md` | Нет | Находится на вашей машине, а не в репозитории. Смотрите [Добавление личных предпочтений без коммита в репозиторий](#add-personal-preferences-without-committing-to-the-repo) |

317| Ваши пользовательские `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` | Нет | Находятся на вашей машине, а не в репозитории. Вместо этого закоммитьте их в каталог `.claude/` репозитория. Облачные сессии автоматически загружают скиллы, которые вы включили на claude.ai |317| Ваши пользовательские `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` | Нет | Находятся на вашей машине, а не в репозитории. Вместо этого закоммитьте их в каталог `.claude/` репозитория. Облачные сессии автоматически загружают [скиллы, которые вы включили на claude.ai](/docs/ru/skills#skills-in-cowork-and-cloud-sessions) |

318| Плагины, включённые только в ваших пользовательских настройках | Нет | Пользовательский `enabledPlugins` находится в `~/.claude/settings.json` на вашей машине |318| Плагины, включённые только в ваших пользовательских настройках | Нет | Пользовательский `enabledPlugins` находится в `~/.claude/settings.json` на вашей машине |

319| MCP-серверы, которые вы добавили с помощью `claude mcp add` в области действия по умолчанию local или в области действия user | Нет | Они записываются в `~/.claude.json` на вашей машине, а не в репозиторий. Добавьте сервер с помощью `claude mcp add --scope project`, который записывает [`.mcp.json`](/docs/ru/mcp#project-scope) репозитория, и закоммитьте этот файл. Сессия с одним репозиторием загружает его |319| MCP-серверы, которые вы добавили с помощью `claude mcp add` в области действия по умолчанию local или в области действия user | Нет | Они записываются в `~/.claude.json` на вашей машине, а не в репозиторий. Добавьте сервер с помощью `claude mcp add --scope project`, который записывает [`.mcp.json`](/docs/ru/mcp#project-scope) репозитория, и закоммитьте этот файл. Сессия с одним репозиторием загружает его |

320| Транспортные переменные в блоке `env` файла `.claude/settings.json` вашего репозитория, такие как `NODE_EXTRA_CA_CERTS` и [переменные клиентского сертификата mTLS](/docs/ru/network-config#mtls-authentication) | Нет | Среда хостинга управляет API-соединением сессии, поэтому Claude Code игнорирует эти ключи и отмечает каждый проигнорированный ключ в отладочном логе сессии |320| Транспортные переменные в блоке `env` файла `.claude/settings.json` вашего репозитория, такие как `NODE_EXTRA_CA_CERTS` и [переменные клиентского сертификата mTLS](/docs/ru/network-config#mtls-authentication) | Нет | Среда хостинга управляет API-соединением сессии, поэтому Claude Code игнорирует эти ключи и отмечает каждый проигнорированный ключ в отладочном логе сессии |

env-vars.md +1 −1

Details

340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Ограничение на количество вызовов [WebSearch](/docs/ru/tools-reference#session-search-limit) (по умолчанию: 200). Когда Claude достигает ограничения, последующие вызовы WebSearch возвращают уведомление, предлагающее продолжить с уже собранной информацией. Принимает положительное целое число без верхней границы. Всё остальное игнорируется, и применяется значение по умолчанию, поэтому ограничение можно повысить, но не отключить. Требуется Claude Code v2.1.212 или новее |340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Ограничение на количество вызовов [WebSearch](/docs/ru/tools-reference#session-search-limit) (по умолчанию: 200). Когда Claude достигает ограничения, последующие вызовы WebSearch возвращают уведомление, предлагающее продолжить с уже собранной информацией. Принимает положительное целое число без верхней границы. Всё остальное игнорируется, и применяется значение по умолчанию, поэтому ограничение можно повысить, но не отключить. Требуется Claude Code v2.1.212 или новее |

341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Установите `1`, чтобы запускать stdio MCP-серверы только с безопасным базовым окружением и настроенным для сервера `env`, вместо наследования окружения вашей оболочки |341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Установите `1`, чтобы запускать stdio MCP-серверы только с безопасным базовым окружением и настроенным для сервера `env`, вместо наследования окружения вашей оболочки |

342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Время в миллисекундах, по истечении которого всё ещё выполняющийся вызов инструмента MCP [переводится в фоновую задачу](/docs/ru/mcp#automatic-backgrounding-of-long-tool-calls) (по умолчанию: 120000, или 2 минуты). Установите `0`, чтобы отключить автоматический перевод в фон. Требуется Claude Code v2.1.212 или новее |342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Время в миллисекундах, по истечении которого всё ещё выполняющийся вызов инструмента MCP [переводится в фоновую задачу](/docs/ru/mcp#automatic-backgrounding-of-long-tool-calls) (по умолчанию: 120000, или 2 минуты). Установите `0`, чтобы отключить автоматический перевод в фон. Требуется Claude Code v2.1.212 или новее |

343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Сколько миллисекунд первый ход [неинтерактивной](/docs/ru/headless) сессии ждёт MCP-серверы, которые ещё подключаются, вместо [ожидания первого хода](/docs/ru/agent-sdk/mcp#connection-timing) по умолчанию. Если переменная задана, ожидание распространяется на все ожидающие серверы. Установите `0`, чтобы пропустить ожидание. Сервер [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) сохраняет собственное ожидание `MCP_TIMEOUT` независимо от значения. Требуется Claude Code v2.1.274 или новее |343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Сколько миллисекунд первый ход [неинтерактивной](/docs/ru/headless) сессии ожидает MCP-серверы, которые ещё подключаются, вместо [ожидания на первом ходе](/docs/ru/agent-sdk/mcp#connection-timing) по умолчанию. Если переменная задана, ожидание охватывает все ожидающие серверы; в [самостоятельно размещённом окружении](/docs/ru/self-hosted-environments-configuration#connection-timing) она меняет только продолжительность ожидания. Установите `0`, чтобы пропустить ожидание. Сервер [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) сохраняет собственное ожидание `MCP_TIMEOUT` независимо от значения. Требуется Claude Code v2.1.274 или новее |

344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Таймаут простоя в миллисекундах для вызовов инструментов MCP. Когда MCP-сервер stdio, HTTP, SSE, WebSocket или [коннектор claude.ai](/docs/ru/mcp#use-mcp-servers-from-claude-ai) в течение этого времени не отправляет ни ответа, ни уведомления о прогрессе, вызов инструмента прерывается с ошибкой вместо ожидания общего `MCP_TOOL_TIMEOUT`. Переопределяет значения по умолчанию для каждого транспорта: 300000 (5 минут) для сетевых серверов и 1800000 (30 минут) для серверов stdio. Установите `0`, чтобы отключить проверку простоя. Значения меньше 1000 повышаются до одной секунды, а значение ограничивается действующим `MCP_TOOL_TIMEOUT`. Заданный для сервера `timeout` в `.mcp.json` не менее 1000 повышает окно простоя этого сервера как минимум до значения `timeout`. Не применяется к серверам IDE и внутрипроцессным серверам SDK. Требуется Claude Code v2.1.187 или новее. До v2.1.203 на серверы stdio таймаут простоя не распространялся |344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Таймаут простоя в миллисекундах для вызовов инструментов MCP. Когда MCP-сервер stdio, HTTP, SSE, WebSocket или [коннектор claude.ai](/docs/ru/mcp#use-mcp-servers-from-claude-ai) в течение этого времени не отправляет ни ответа, ни уведомления о прогрессе, вызов инструмента прерывается с ошибкой вместо ожидания общего `MCP_TOOL_TIMEOUT`. Переопределяет значения по умолчанию для каждого транспорта: 300000 (5 минут) для сетевых серверов и 1800000 (30 минут) для серверов stdio. Установите `0`, чтобы отключить проверку простоя. Значения меньше 1000 повышаются до одной секунды, а значение ограничивается действующим `MCP_TOOL_TIMEOUT`. Заданный для сервера `timeout` в `.mcp.json` не менее 1000 повышает окно простоя этого сервера как минимум до значения `timeout`. Не применяется к серверам IDE и внутрипроцессным серверам SDK. Требуется Claude Code v2.1.187 или новее. До v2.1.203 на серверы stdio таймаут простоя не распространялся |

345| `CLAUDE_CODE_MESSAGING_SOCKET` | Задаётся Claude Code, а не вами: в сессиях, которые привязывают [сокет входящих сообщений](/docs/ru/cross-session-messaging#the-sessions-inbox-socket), Claude Code экспортирует путь этого сокета в хуки и команды Bash при привязке сокета. В сессии, которая запускается с включённым обменом сообщениями, Claude Code привязывает сокет до запуска любого хука. Другие сессии на компьютере доставляют сообщения по этому пути. Каждая сессия экспортирует собственный сокет, а не унаследованный от родительской, и поступающие на него сообщения проходят через [средства контроля входящих сообщений](/docs/ru/cross-session-messaging#control-inbound-messages) сессии. Блоки `env` в настройках не могут её задать. Требуется Claude Code v2.1.224 или новее |345| `CLAUDE_CODE_MESSAGING_SOCKET` | Задаётся Claude Code, а не вами: в сессиях, которые привязывают [сокет входящих сообщений](/docs/ru/cross-session-messaging#the-sessions-inbox-socket), Claude Code экспортирует путь этого сокета в хуки и команды Bash при привязке сокета. В сессии, которая запускается с включённым обменом сообщениями, Claude Code привязывает сокет до запуска любого хука. Другие сессии на компьютере доставляют сообщения по этому пути. Каждая сессия экспортирует собственный сокет, а не унаследованный от родительской, и поступающие на него сообщения проходят через [средства контроля входящих сообщений](/docs/ru/cross-session-messaging#control-inbound-messages) сессии. Блоки `env` в настройках не могут её задать. Требуется Claude Code v2.1.224 или новее |

346| `CLAUDE_CODE_MESSAGING_TOKEN` | Задаётся Claude Code, а не вами: в сессиях, которые привязывают [сокет входящих сообщений](/docs/ru/cross-session-messaging#the-sessions-inbox-socket), Claude Code экспортирует этот токен сессии в хуки и команды Bash вместе с `CLAUDE_CODE_MESSAGING_SOCKET`. Скрипт, отправляющий данные в сокет, может передать `{"type":"auth","token":"<token>"}` первой строкой, чтобы подтвердить, что он принадлежит сессии. В нативной Windows Claude Code требует эту строку и закрывает любое соединение, которое не начинается с действительной строки. [Правила для собственных дочерних процессов](/docs/ru/cross-session-messaging#the-sessions-inbox-socket) определяют, когда Claude Code проверяет токен. Каждая сессия экспортирует собственный токен, никогда не унаследованный от родительской сессии. Блоки `env` в настройках не могут его задать. Требуется Claude Code v2.1.228 или новее |346| `CLAUDE_CODE_MESSAGING_TOKEN` | Задаётся Claude Code, а не вами: в сессиях, которые привязывают [сокет входящих сообщений](/docs/ru/cross-session-messaging#the-sessions-inbox-socket), Claude Code экспортирует этот токен сессии в хуки и команды Bash вместе с `CLAUDE_CODE_MESSAGING_SOCKET`. Скрипт, отправляющий данные в сокет, может передать `{"type":"auth","token":"<token>"}` первой строкой, чтобы подтвердить, что он принадлежит сессии. В нативной Windows Claude Code требует эту строку и закрывает любое соединение, которое не начинается с действительной строки. [Правила для собственных дочерних процессов](/docs/ru/cross-session-messaging#the-sessions-inbox-socket) определяют, когда Claude Code проверяет токен. Каждая сессия экспортирует собственный токен, никогда не унаследованный от родительской сессии. Блоки `env` в настройках не могут его задать. Требуется Claude Code v2.1.228 или новее |

errors.md +45 −8

Details

247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Command-line errors](#windows-reported-an-error-ebadf) |247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Command-line errors](#windows-reported-an-error-ebadf) |

248| `Cannot switch renderers in this session` | [Command-line errors](#cannot-switch-renderers-in-this-session) |248| `Cannot switch renderers in this session` | [Command-line errors](#cannot-switch-renderers-in-this-session) |

249| `Cannot switch renderers while work is running in the background` | [Command-line errors](#cannot-switch-renderers-in-this-session) |249| `Cannot switch renderers while work is running in the background` | [Command-line errors](#cannot-switch-renderers-in-this-session) |

250| `Claude Code couldn't restart` | [Command-line errors](#claude-code-couldnt-restart) |

250| `Couldn't open Claude Desktop` | [Command-line errors](#couldnt-open-claude-desktop) |251| `Couldn't open Claude Desktop` | [Command-line errors](#couldnt-open-claude-desktop) |

251| `Failed to open Claude Desktop. Please try opening it manually.` | [Command-line errors](#couldnt-open-claude-desktop) |252| `Failed to open Claude Desktop. Please try opening it manually.` | [Command-line errors](#couldnt-open-claude-desktop) |

252| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [Command-line errors](#terminal-setup-left-your-zed-keymap-unchanged) |253| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [Command-line errors](#terminal-setup-left-your-zed-keymap-unchanged) |


334| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Background session errors](#session-isnt-responding) |335| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Background session errors](#session-isnt-responding) |

335| `Session <id> was stopped while the respawn was in flight` | [Background session errors](#session-was-stopped-while-the-respawn-was-in-flight) |336| `Session <id> was stopped while the respawn was in flight` | [Background session errors](#session-was-stopped-while-the-respawn-was-in-flight) |

336| `This session was running agent '<name>', which is no longer available` | [Background session errors](#session-agent-no-longer-available) |337| `This session was running agent '<name>', which is no longer available` | [Background session errors](#session-agent-no-longer-available) |

338| `This session restarted <time> after its next /loop wakeup was due, so that wakeup will not fire` | [Background session errors](#restarted-after-its-next-loop-wakeup-was-due) |

337| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Background session errors](#claude_code_process_wrapper-launcher-errors) |339| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Background session errors](#claude_code_process_wrapper-launcher-errors) |

338| `EUNKNOWN: unknown error, uv_spawn` | [Background session errors](#eunknown-when-starting-a-background-session) |340| `EUNKNOWN: unknown error, uv_spawn` | [Background session errors](#eunknown-when-starting-a-background-session) |

339| `EACCES: permission denied, posix_spawn` | [Background session errors](#eacces-when-starting-a-background-session) |341| `EACCES: permission denied, posix_spawn` | [Background session errors](#eacces-when-starting-a-background-session) |


439| :- | :- | :- |441| :- | :- | :- |

440| [`CLAUDE_CODE_MAX_RETRIES`](/docs/ru/env-vars) | 10 | Количество повторных попыток. Ограничено 15 начиная с v2.1.186; начиная с v2.1.199 `CLAUDE_CODE_RETRY_WATCHDOG` повышает значение по умолчанию и удаляет ограничение. Снизьте его, чтобы быстрее выявлять сбои в скриптах. |442| [`CLAUDE_CODE_MAX_RETRIES`](/docs/ru/env-vars) | 10 | Количество повторных попыток. Ограничено 15 начиная с v2.1.186; начиная с v2.1.199 `CLAUDE_CODE_RETRY_WATCHDOG` повышает значение по умолчанию и удаляет ограничение. Снизьте его, чтобы быстрее выявлять сбои в скриптах. |

441| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/ru/env-vars) | не установлено | Установите значение `1` в автоматических сессиях, таких как задания CI, чтобы повторять ошибки пропускной способности `429` и `529` бесконечно вместо отказа после `CLAUDE_CODE_MAX_RETRIES` попыток. Claude Code сразу завершается с ошибкой, когда запрос со стандартной скоростью получает `429`, который сообщает о лимите расходов или исчерпанных кредитах использования, даже если это `429` от [gateway spend cap](#spend-limit-reached), который сбрасывается по расписанию. До v2.1.239 сторож повторял такие запросы бесконечно. Для запросов в быстром режиме см. [Handle rate limits](/docs/ru/fast-mode#handle-rate-limits). На v2.1.199 или позже он также повышает количество повторных попыток по умолчанию для других временных ошибок, таких как ошибки сервера, таймауты и разорванные соединения, до 300, примерно три часа задержки, и удаляет ограничение 15 на `CLAUDE_CODE_MAX_RETRIES`, если вы явно установите эту переменную. |443| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/ru/env-vars) | не установлено | Установите значение `1` в автоматических сессиях, таких как задания CI, чтобы повторять ошибки пропускной способности `429` и `529` бесконечно вместо отказа после `CLAUDE_CODE_MAX_RETRIES` попыток. Claude Code сразу завершается с ошибкой, когда запрос со стандартной скоростью получает `429`, который сообщает о лимите расходов или исчерпанных кредитах использования, даже если это `429` от [gateway spend cap](#spend-limit-reached), который сбрасывается по расписанию. До v2.1.239 сторож повторял такие запросы бесконечно. Для запросов в быстром режиме см. [Handle rate limits](/docs/ru/fast-mode#handle-rate-limits). На v2.1.199 или позже он также повышает количество повторных попыток по умолчанию для других временных ошибок, таких как ошибки сервера, таймауты и разорванные соединения, до 300, примерно три часа задержки, и удаляет ограничение 15 на `CLAUDE_CODE_MAX_RETRIES`, если вы явно установите эту переменную. |

444| [`CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`](/docs/ru/env-vars) | не установлено | Максимальное время в миллисекундах, которое каждый запрос к API тратит на ожидание при ошибках `429` и `529`, когда установлена `CLAUDE_CODE_RETRY_WATCHDOG`. Если переменная не установлена, время ожидания не ограничено. Требуется Claude Code v2.1.295 или позже. |

442| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/ru/env-vars) | 500 | Начальная задержка в миллисекундах для экспоненциальной задержки между повторными попытками запроса, который API отклоняет с ошибкой перегрузки `529`. Увеличьте её, вплоть до 32000, чтобы распределить повторные попытки на более длительный период, когда API работает на пределе пропускной способности. Не действует, если `CLAUDE_CODE_RETRY_WATCHDOG` установлена в `1` или если отклонённый запрос был отправлен в [быстром режиме](/docs/ru/fast-mode#handle-rate-limits). Требуется Claude Code v2.1.292 или позже. |445| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/ru/env-vars) | 500 | Начальная задержка в миллисекундах для экспоненциальной задержки между повторными попытками запроса, который API отклоняет с ошибкой перегрузки `529`. Увеличьте её, вплоть до 32000, чтобы распределить повторные попытки на более длительный период, когда API работает на пределе пропускной способности. Не действует, если `CLAUDE_CODE_RETRY_WATCHDOG` установлена в `1` или если отклонённый запрос был отправлен в [быстром режиме](/docs/ru/fast-mode#handle-rate-limits). Требуется Claude Code v2.1.292 или позже. |

443| [`API_TIMEOUT_MS`](/docs/ru/env-vars) | 600000 | Таймаут для каждого запроса в миллисекундах. Повысьте его для медленных сетей или прокси. Он также ограничивает, как долго Claude Code ждёт заголовков ответа, как описано в [No response from API](#no-response-from-api). |446| [`API_TIMEOUT_MS`](/docs/ru/env-vars) | 600000 | Таймаут для каждого запроса в миллисекундах. Повысьте его для медленных сетей или прокси. Он также ограничивает, как долго Claude Code ждёт заголовков ответа, как описано в [No response from API](#no-response-from-api). |

444| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/ru/env-vars) | не установлено | Лимит повторных отправок [непотокового запроса](#streaming-response-ended-before-any-complete-data-was-received), который завершается по таймауту. При достижении лимита запрос завершается с ошибкой. Ответ Claude, генерация которого занимает больше времени, чем таймаут, снова завершается по таймауту при каждой повторной отправке, поэтому установите небольшое число, например `0`, чтобы получить ошибку быстрее. Каждая непотоковая попытка завершается по таймауту через 300 секунд в локальной сессии или через `API_TIMEOUT_MS`, если вы задали положительное значение. Требуется Claude Code v2.1.285 или позже. |447| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/ru/env-vars) | не установлено | Лимит повторных отправок [непотокового запроса](#streaming-response-ended-before-any-complete-data-was-received), который завершается по таймауту. При достижении лимита запрос завершается с ошибкой. Ответ Claude, генерация которого занимает больше времени, чем таймаут, снова завершается по таймауту при каждой повторной отправке, поэтому установите небольшое число, например `0`, чтобы получить ошибку быстрее. Каждая непотоковая попытка завершается по таймауту через 300 секунд в локальной сессии или через `API_TIMEOUT_MS`, если вы задали положительное значение. Требуется Claude Code v2.1.285 или позже. |


3412 3415 

3413Claude Code показывает ту же ошибку для любого скилла, который [внедряет динамический контекст](/docs/ru/skills#when-an-injected-command-fails), и неудачная внедрённая команда прерывает вызов этого скилла. Две родственные строки появляются ещё до выполнения команды:3416Claude Code показывает ту же ошибку для любого скилла, который [внедряет динамический контекст](/docs/ru/skills#when-an-injected-command-fails), и неудачная внедрённая команда прерывает вызов этого скилла. Две родственные строки появляются ещё до выполнения команды:

3414 3417 

3415* `Shell command permission check failed for pattern "..."`: проверка разрешений команды не разрешила её. В разделе [Проверки разрешений для внедрённых команд](/docs/ru/skills#permission-checks-on-injected-commands) описано, какие результаты прерывают вызов в каждом режиме разрешений и как заранее одобрить команду с помощью `allowed-tools`3418* `Shell command permission check failed for pattern "..."`: проверка разрешений для команды не разрешила её. В разделе [Проверки разрешений для внедрённых команд](/docs/ru/skills#permission-checks-on-injected-commands) описано, какие результаты прерывают вызов в каждом режиме разрешений и как заранее одобрить команду с помощью `allowed-tools`

3416* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``: frontmatter скилла требует bash на компьютере, где его нет. Установите Git for Windows или измените frontmatter на `shell: powershell`. См. [Как выполняются внедрённые команды](/docs/ru/skills#how-injected-commands-run)3419* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``: frontmatter скилла требует bash на компьютере, где его нет. Установите Git for Windows или измените frontmatter на `shell: powershell`. См. [Как выполняются внедрённые команды](/docs/ru/skills#how-injected-commands-run)

3417 3420 

3418**Что делать:**3421**Что делать:**


3562 3565 

3563* **Вы не передали базовую ветку**: Claude Code сравнивал с веткой репозитория по умолчанию и предлагает явно передать вашу базовую ветку, как в примере выше3566* **Вы не передали базовую ветку**: Claude Code сравнивал с веткой репозитория по умолчанию и предлагает явно передать вашу базовую ветку, как в примере выше

3564* **Вы передали базовую ветку, которая уже была в вашем клоне**: подсказка гласит ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``3567* **Вы передали базовую ветку, которая уже была в вашем клоне**: подсказка гласит ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``

3565* **Вы передали базовую ветку, которой не было в вашем клоне**: Claude Code получил её из origin перед сравнением. Подсказка гласит ``<branch> was fetched from origin but shares no history with HEAD. If another branch is your real base, pass it explicitly (`/code-review ultra <branch>`)``; если Claude Code не может определить, является ли ваш клон неглубоким, он вместо этого предлагает `git fetch --unshallow origin`. До v2.1.221 подсказка предлагала `git fetch --unshallow origin` для каждой полученной базовой ветки, а в полном клоне эта команда завершается с ошибкой `fatal: --unshallow on a complete repository does not make sense`.3568* **Вы передали базовую ветку, которой не было в вашем клоне**: перед сравнением Claude Code получил её из origin. Подсказка гласит ``<branch> was fetched from origin but shares no history with HEAD. If another branch is your real base, pass it explicitly (`/code-review ultra <branch>`)``; когда Claude Code не может определить, является ли ваш клон неполным (shallow), он вместо этого предлагает `git fetch --unshallow origin`. До v2.1.221 подсказка предлагала `git fetch --unshallow origin` для каждой полученной базовой ветки, а в полном клоне эта команда завершается ошибкой `fatal: --unshallow on a complete repository does not make sense`.

3566 3569 

3567**Что делать:**3570**Что делать:**

3568 3571 


3816 3819 

3817* В сессии, запущенной без этих ограничений, выполните `/tui fullscreen` или `/tui default`, чтобы переключиться обратно. Claude Code сохранит там [настройку `tui`](/docs/ru/settings-reference#tui)3820* В сессии, запущенной без этих ограничений, выполните `/tui fullscreen` или `/tui default`, чтобы переключиться обратно. Claude Code сохранит там [настройку `tui`](/docs/ru/settings-reference#tui)

3818 3821 

3822<h3 id="claude-code-couldnt-restart">

3823 Claude Code couldn't restart

3824</h3>

3825 

3826Claude Code выполнял перезапуск, например чтобы переключиться на полноэкранный рендеринг или выйти из него после выполнения [`/tui`](/docs/ru/fullscreen#enable-fullscreen-rendering). Он закрыл сессию, но не смог запустить новый процесс, поэтому вывел это сообщение и завершился со статусом 1:

3827 

3828```text theme={null}

3829Claude Code couldn't restart. Your conversation is saved. Start Claude Code again and run /resume to pick it up.

3830```

3831 

3832Если при перезапуске не было диалога для повторного открытия, например потому что `/tui` был вашим первым вводом в новой сессии, сообщение выглядит так: `Claude Code couldn't restart. Start Claude Code again.`

3833 

3834**Что делать:**

3835 

3836* Снова выполните `claude` в оболочке из того же каталога. Если в сообщении было сказано, что диалог сохранён, выполните [`/resume`](/docs/ru/sessions#resume-a-session) в новой сессии и выберите его

3837* Если перезапуски продолжают завершаться ошибкой, запустите Claude Code из оболочки командой [`claude --debug-file claude-debug.log`](/docs/ru/cli-reference#cli-flags). Если перезапуск из этой сессии не удастся, файл `claude-debug.log` в каталоге запуска будет содержать строку `Failed to relaunch:` с ошибкой операционной системы. Приложите эту строку, когда будете [сообщать о проблеме](#report-an-error)

3838 

3819<h3 id="couldnt-open-claude-desktop">3839<h3 id="couldnt-open-claude-desktop">

3820 Не удалось открыть Claude Desktop3840 Не удалось открыть Claude Desktop

3821</h3>3841</h3>


4752 Команда заблокирована проверками изоляции в worktree4772 Команда заблокирована проверками изоляции в worktree

4753</h3>4773</h3>

4754 4774 

4755Claude запустил команду Bash или Monitor в [сессии, изолированной в worktree](/docs/ru/worktrees#how-claude-code-enforces-isolation), и Claude Code отклонил её по одной из двух причин:4775Claude запустил команду Bash, [PowerShell](/docs/ru/tools-reference#powershell-tool) или [Monitor](/docs/ru/tools-reference#monitor-tool) в [сессии, изолированной в worktree](/docs/ru/worktrees#how-claude-code-enforces-isolation), и Claude Code отклонил её по одной из следующих причин:

4756 4776 

4757* Команда направляет git на основную рабочую копию.4777* Команда выполнялась бы в основной рабочей копии или в другом worktree. В сообщении сказано, что её рабочий каталог `resolved to the shared checkout` или `is in a different worktree`.

4758* Claude Code не может проверить по тексту команды, что любой запускаемый ею git остаётся внутри worktree. Команда, в которой git вообще не упоминается, тоже может быть отклонена по этой причине, потому что раскрытие косвенной ссылки на переменную, например `${!name}`, или выполнение подстановки функции Bash, например `${ command; }`, порождает во время выполнения значение, которое само может быть командой.4778* Команда Bash или Monitor направляет git на основную рабочую копию.

4779* Claude Code не может проверить по тексту команды Bash или Monitor, что любой запускаемый ею git остаётся внутри worktree. Команда, в которой git вообще не упоминается, тоже может быть отклонена по этой причине, потому что раскрытие косвенной ссылки на переменную, например `${!name}`, или выполнение подстановки функции Bash, например `${ command; }`, порождает во время выполнения значение, которое само может быть командой.

4759 4780 

4760Средняя часть сообщения называет то, что не удалось проверить:4781Сообщение содержит `is isolated in the worktree <path>, but this command`, за которым следует причина, например для команды, текст которой Claude Code не смог проверить:

4761 4782 

4762```text wrap theme={null}4783```text wrap theme={null}

4763This session is isolated in the worktree /path/to/worktree, but this command evaluates ${!x@P} arithmetically inside a construct too complex to verify, which can run a command hidden in a variable's value. Refusing to run it — a worktree-isolated session's git operations must target its own worktree. Split it into plain, separate commands and run them from /path/to/worktree.4784This session is isolated in the worktree /path/to/worktree, but this command evaluates ${!x@P} arithmetically inside a construct too complex to verify, which can run a command hidden in a variable's value. Refusing to run it — a worktree-isolated session's git operations must target its own worktree. Split it into plain, separate commands and run them from /path/to/worktree.


4765 4786 

4766**Что делать:**4787**Что делать:**

4767 4788 

4768* Обычно ничего: Claude читает сообщение и переписывает команду так, как просит последнее предложение4789* **Git направлен на основную рабочую копию, или текст команды невозможно проверить**: ничего делать не нужно. Claude читает сообщение и переписывает команду так, как просит последнее предложение. Если запрошенная вами команда продолжает отклоняться из-за раскрытия в её тексте, запишите отмеченное значение буквально и запустите git отдельной простой командой изнутри worktree

4769* Если запрошенная вами команда продолжает отклоняться, запишите отмеченное значение буквально: замените косвенную ссылку или подстановку её значением и запустите git отдельной простой командой изнутри worktree

4770* Чтобы намеренно выполнить действие в основной рабочей копии, запустите команду самостоятельно в терминале вне сессии4790* Чтобы намеренно выполнить действие в основной рабочей копии, запустите команду самостоятельно в терминале вне сессии

4771 4791 

4772<h3 id="this-session-has-no-saved-transcript">4792<h3 id="this-session-has-no-saved-transcript">


4946* Или возобновите сессию с `--agent <name>`, указав существующего агента, чтобы запустить сессию с этим агентом4966* Или возобновите сессию с `--agent <name>`, указав существующего агента, чтобы запустить сессию с этим агентом

4947* Если агент относится к уровню проекта и вы не доверяете исходному каталогу сессии, один раз запустите там Claude Code, примите диалоговое окно доверия, затем снова возобновите сессию4967* Если агент относится к уровню проекта и вы не доверяете исходному каталогу сессии, один раз запустите там Claude Code, примите диалоговое окно доверия, затем снова возобновите сессию

4948 4968 

4969<h3 id="restarted-after-its-next-loop-wakeup-was-due">

4970 Эта сессия перезапустилась после наступления времени следующего пробуждения /loop

4971</h3>

4972 

4973[`/loop` с самостоятельно выбираемым интервалом](/docs/ru/scheduled-tasks#let-claude-choose-the-interval) в [фоновой сессии](/docs/ru/agent-view) остановился. Процесс сессии завершился, пока цикл ожидал следующего пробуждения, и время этого пробуждения наступило до запуска [следующего процесса](/docs/ru/agent-view#the-supervisor-process) сессии. Пропущенное пробуждение не срабатывает с опозданием. Уведомление сообщает, насколько было просрочено пробуждение на момент перезапуска сессии:

4974 

4975```text theme={null}

4976This session restarted 12m after its next /loop wakeup was due, so that wakeup will not fire. The loop stays stopped until Claude schedules it again: reply to continue it.

4977```

4978 

4979До версии 2.1.295 в такой ситуации цикл останавливался без уведомления.

4980 

4981**Что делать:**

4982 

4983* Чтобы продолжить цикл, [ответьте в сессии](/docs/ru/agent-view#peek-and-reply) и скажите об этом, например `keep the loop running`. Claude прочитает уведомление вместе с вашим ответом и сможет запланировать следующее пробуждение

4984* Если цикл вам больше не нужен, ничего не делайте. Он уже остановлен

4985 

4949<h3 id="claude_code_process_wrapper-launcher-errors">4986<h3 id="claude_code_process_wrapper-launcher-errors">

4950 Ошибки средства запуска CLAUDE\_CODE\_PROCESS\_WRAPPER4987 Ошибки средства запуска CLAUDE\_CODE\_PROCESS\_WRAPPER

4951</h3>4988</h3>

headless.md +79 −77

Details

89* **Наблюдения [Monitor](/docs/ru/tools-reference#monitor-tool)**: запуск ждёт, пока не истечёт время наблюдения или пока 10-минутный лимит не завершит ожидание, в зависимости от того, что произойдёт раньше. Пока запуск ждёт, Claude продолжает отвечать на то, что сообщает наблюдение. По умолчанию наблюдение истекает через пять минут после того, как Claude его запустит.89* **Наблюдения [Monitor](/docs/ru/tools-reference#monitor-tool)**: запуск ждёт, пока не истечёт время наблюдения или пока 10-минутный лимит не завершит ожидание, в зависимости от того, что произойдёт раньше. Пока запуск ждёт, Claude продолжает отвечать на то, что сообщает наблюдение. По умолчанию наблюдение истекает через пять минут после того, как Claude его запустит.

90* **Ожидающие пробуждения**: в запуске, промпт которого вы передали как текст, а не с помощью `--input-format stream-json`, если Claude запланировал [пробуждение `/loop` в собственном темпе](/docs/ru/scheduled-tasks#let-claude-choose-the-interval), запуск ждёт срабатывания каждого пробуждения и выполняет его итерацию, пока [цикл не завершится](/docs/ru/scheduled-tasks#stop-a-loop), даже после 10-минутного лимита.90* **Ожидающие пробуждения**: в запуске, промпт которого вы передали как текст, а не с помощью `--input-format stream-json`, если Claude запланировал [пробуждение `/loop` в собственном темпе](/docs/ru/scheduled-tasks#let-claude-choose-the-interval), запуск ждёт срабатывания каждого пробуждения и выполняет его итерацию, пока [цикл не завершится](/docs/ru/scheduled-tasks#stop-a-loop), даже после 10-минутного лимита.

91 91 

92Когда stderr является терминалом и запуск ожидает уже пять секунд, Claude Code выводит в stderr строку, которая начинается с `Waiting for background work to finish` и указывает, какую работу он ожидает. При [выводе `json` или `stream-json`](#get-structured-output) эта строка выводится только тогда, когда stdout не является терминалом, поэтому JSON, который читает ваш скрипт, никогда её не содержит.

93 

92Если запуск достигает своего лимита [`--max-budget-usd`](/docs/ru/cli-reference#cli-flags), Claude Code останавливает оставшуюся фоновую работу вместо того, чтобы ждать.94Если запуск достигает своего лимита [`--max-budget-usd`](/docs/ru/cli-reference#cli-flags), Claude Code останавливает оставшуюся фоновую работу вместо того, чтобы ждать.

93 95 

94Когда фоновая работа запускает ещё один ход, запуск выводит результат каждого хода при выводе по умолчанию `text` и результат последнего хода при выводе `json`. До v2.1.295 запуск и при выводе `text` выводил только результат последнего хода.96Когда фоновая работа запускает ещё один ход, запуск выводит результат каждого хода при выводе по умолчанию `text` и результат последнего хода при выводе `json`. До v2.1.295 запуск и при выводе `text` выводил только результат последнего хода.


116 Примеры118 Примеры

117</h2>119</h2>

118 120 

119Эти примеры демонстрируют распространённые паттерны CLI. Если команда указывает файл, например `auth.py` или `build-error.txt`, замените его файлом из вашего проекта. В CI или других скриптовых окружениях добавьте [`--bare`](#start-faster-with-bare-mode), чтобы Claude Code запустился без загрузки hooks, plugins, автоматической памяти или `CLAUDE.md` хоста.121Эти примеры демонстрируют распространённые паттерны CLI. Если команда указывает файл, например `auth.py` или `build-error.txt`, замените его файлом из вашего проекта. В CI или других скриптовых окружениях добавьте [`--bare`](#start-faster-with-bare-mode), чтобы Claude Code запустился без загрузки хуков, плагинов, автоматической памяти или `CLAUDE.md` хоста.

120 122 

121<h3 id="pipe-data-through-claude">123<h3 id="pipe-data-through-claude">

122 Передача данных через Claude124 Передача данных через Claude

123</h3>125</h3>

124 126 

125Неинтерактивный режим читает stdin, поэтому вы можете передавать данные и перенаправлять ответ, как любой другой инструмент командной строки.127Неинтерактивный режим читает stdin, поэтому вы можете передавать данные и перенаправлять ответ, как в любом другом инструменте командной строки.

126 128 

127Этот пример передаёт журнал сборки в Claude и записывает объяснение в файл:129Этот пример передаёт лог сборки в Claude и записывает объяснение в файл:

128 130 

129```bash theme={null}131```bash theme={null}

130cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt132cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt

131```133```

132 134 

133С `--output-format json` полезная нагрузка ответа включает `total_cost_usd` и разбивку затрат по моделям, поэтому скриптовые вызывающие стороны могут отслеживать расходы без обращения к [панели использования](/docs/ru/costs). Когда вы продолжаете более ранний разговор с `--continue` или `--resume`, запуск сообщает общую сумму разговора, [включая расходы более ранних запусков](/docs/ru/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls). Обе цифры являются [оценками на стороне клиента](/docs/ru/agent-sdk/cost-tracking) и могут отличаться от вашего фактического счёта.135С `--output-format json` данные ответа включают `total_cost_usd` и разбивку затрат по моделям, поэтому вызывающие скрипты могут отслеживать расходы без обращения к [панели использования](/docs/ru/costs). Когда вы продолжаете более ранний диалог с `--continue` или `--resume`, запуск сообщает общую сумму диалога, [включая расходы более ранних запусков](/docs/ru/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls). Обе цифры являются [оценками на стороне клиента](/docs/ru/agent-sdk/cost-tracking) и могут отличаться от вашего фактического счёта.

134 136 

135<Note>137<Note>

136 Передача данных через stdin ограничена 10 МБ. Если вы превысите лимит, Claude Code выйдет с понятной ошибкой и ненулевым статусом. Для работы с большими входными данными запишите содержимое в файл и ссылайтесь на путь файла в вашем приглашении вместо передачи данных через pipe.138 Данные, передаваемые через stdin, ограничены 10 МБ. Если вы превысите лимит, Claude Code завершится с понятной ошибкой и ненулевым статусом. Для работы с большими входными данными запишите содержимое в файл и укажите путь к файлу в вашем промпте вместо передачи данных через pipe.

137</Note>139</Note>

138 140 

139Если Claude Code не может прочитать stdin, например потому что процесс, который его запустил, отключил его конец, Claude Code выведет предупреждение в stderr и продолжит работу с приглашением из командной строки. До версии 2.1.211 нечитаемый stdin на Windows приводил к сбою сеанса или молчаливому выходу без вывода.141Если Claude Code не может прочитать stdin, например потому что процесс, который его запустил, отключил свой конец, Claude Code выводит предупреждение в stderr и продолжает работу с промптом из командной строки. До версии 2.1.211 нечитаемый stdin на Windows приводил к сбою сессии или к молчаливому завершению без вывода.

140 142 

141<h3 id="add-claude-to-a-build-script">143<h3 id="add-claude-to-a-build-script">

142 Добавление Claude в скрипт сборки144 Добавление Claude в скрипт сборки

143</h3>145</h3>

144 146 

145Вы можете обернуть неинтерактивный вызов в скрипт, чтобы использовать Claude как проектный linter или рецензент.147Вы можете обернуть неинтерактивный вызов в скрипт, чтобы использовать Claude как линтер или рецензента для конкретного проекта.

146 148 

147Этот скрипт `package.json` передаёт diff относительно `main` в Claude и просит его сообщить об опечатках. Передача diff означает, что Claude не нуждается в разрешении Bash для его чтения, а экранированные двойные кавычки делают скрипт портативным на Windows:149Этот скрипт `package.json` передаёт diff относительно `main` в Claude и просит его сообщить об опечатках. Передача diff означает, что Claude не нужно разрешение Bash для его чтения, а экранированные двойные кавычки делают скрипт переносимым на Windows:

148 150 

149```json theme={null}151```json theme={null}

150{152{


163Используйте `--output-format` для управления тем, как возвращаются ответы:165Используйте `--output-format` для управления тем, как возвращаются ответы:

164 166 

165* `text` (по умолчанию): простой текстовый вывод167* `text` (по умолчанию): простой текстовый вывод

166* `json`: структурированный JSON с результатом, ID сеанса и метаданными168* `json`: структурированный JSON с результатом, ID сессии и метаданными

167* `stream-json`: JSON с разделением по строкам для потоковой передачи в реальном времени169* `stream-json`: JSON с разделением по строкам для потоковой передачи в реальном времени

168 170 

169Этот пример возвращает сводку проекта в виде JSON с метаданными сеанса, с текстовым результатом в поле `result`:171Этот пример возвращает сводку проекта в виде JSON с метаданными сессии, с текстовым результатом в поле `result`:

170 172 

171```bash theme={null}173```bash theme={null}

172claude -p "Summarize this project" --output-format json174claude -p "Summarize this project" --output-format json

173```175```

174 176 

175Чтобы получить вывод, соответствующий определённой схеме, используйте `--output-format json` с `--json-schema` и определением [JSON Schema](https://json-schema.org/). Ответ включает метаданные о запросе (ID сеанса, использование и т. д.) со структурированным выводом в поле `structured_output`.177Чтобы получить вывод, соответствующий определённой схеме, используйте `--output-format json` с `--json-schema` и определением [JSON Schema](https://json-schema.org/). Ответ включает метаданные о запросе (ID сессии, использование и т. д.) со структурированным выводом в поле `structured_output`.

176 178 

177Этот пример извлекает имена функций и возвращает их как массив строк:179Этот пример извлекает имена функций и возвращает их как массив строк:

178 180 


182 --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'184 --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'

183```185```

184 186 

185Если значение не является допустимой JSON Schema, `claude` выходит с `Error: --json-schema is not a valid JSON Schema`, за которым следует диагностика валидатора. Claude Code принимает схемы, использующие ключевое слово `format`, такие как `"format": "email"`, но рассматривает `format` как аннотацию и не применяет её. До версии 2.1.205 Claude Code молча игнорировал недопустимую схему и возвращал неструктурированный текст, а также рассматривал любую схему, содержащую `format`, как недопустимую.187Если значение не является допустимой JSON Schema, `claude` завершается с `Error: --json-schema is not a valid JSON Schema`, за которым следует диагностика валидатора. Claude Code принимает схемы, использующие ключевое слово `format`, такие как `"format": "email"`, но рассматривает `format` как аннотацию и не применяет его. До версии 2.1.205 Claude Code молча игнорировал недопустимую схему и возвращал неструктурированный текст, а также рассматривал любую схему, содержащую `format`, как недопустимую.

186 188 

187<Tip>189<Tip>

188 Используйте инструмент, такой как [jq](https://jqlang.org/), для анализа ответа и извлечения определённых полей:190 Используйте инструмент, такой как [jq](https://jqlang.org/), для разбора ответа и извлечения определённых полей:

189 191 

190 ```bash theme={null}192 ```bash theme={null}

191 # Extract the text result193 # Extract the text result


209claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages211claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages

210```212```

211 213 

212Последняя строка потока — это сообщение `result` с финальным текстом ответа, стоимостью и метаданными сеанса.214Последняя строка потока — это сообщение `result` с итоговым текстом ответа, стоимостью и метаданными сессии.

213 215 

214Если ваш потребитель читает поток медленно, Claude Code ждёт, пока очередь вывода опустеет перед выходом, масштабируя ожидание в зависимости от того, сколько ещё в очереди, с максимумом 30 секунд. До версии 2.1.214 ожидание выхода было ограничено примерно двумя секундами, что могло обрезать конец большого ответа.216Если ваш потребитель читает поток медленно, Claude Code перед завершением ждёт, пока очередь вывода опустеет, масштабируя ожидание в зависимости от того, сколько ещё осталось в очереди, максимум 30 секунд. До версии 2.1.214 ожидание при завершении было ограничено примерно двумя секундами, что могло обрезать конец большого ответа.

215 217 

216Следующий пример использует [jq](https://jqlang.org/) для фильтрации текстовых дельт и отображения только потокового текста. Флаг `-r` выводит необработанные строки (без кавычек), а `-j` объединяет их без переводов строк, поэтому токены выводятся непрерывно:218Следующий пример использует [jq](https://jqlang.org/) для фильтрации текстовых дельт и отображения только потокового текста. Флаг `-r` выводит необработанные строки (без кавычек), а `-j` объединяет их без переводов строк, поэтому токены выводятся непрерывно:

217 219 


223Для программной потоковой передачи с обратными вызовами и объектами сообщений см. [Потоковая передача ответов в реальном времени](/docs/ru/agent-sdk/streaming-output) в документации Agent SDK.225Для программной потоковой передачи с обратными вызовами и объектами сообщений см. [Потоковая передача ответов в реальном времени](/docs/ru/agent-sdk/streaming-output) в документации Agent SDK.

224 226 

225<h4 id="follow-subagent-messages">227<h4 id="follow-subagent-messages">

226 Отслеживание сообщений подагентов228 Отслеживание сообщений субагентов

227</h4>229</h4>

228 230 

229Сообщения от [субагентов](/docs/ru/sub-agents) и от скиллов, которые [работают в субагенте](/docs/ru/skills#run-skills-in-a-subagent), появляются в потоке как сообщения `assistant` и `user`. Их поле `parent_tool_use_id` указывает, к какому запуску относится каждое из них. Сообщения из основного диалога содержат `null` в этом поле.231Сообщения от [субагентов](/docs/ru/sub-agents) и от скиллов, которые [работают в субагенте](/docs/ru/skills#run-skills-in-a-subagent), появляются в потоке как сообщения `assistant` и `user`. Их поле `parent_tool_use_id` указывает, к какому запуску относится каждое из них. Сообщения из основного диалога содержат `null` в этом поле.


235 237 

236Когда вы включаете любой из этих параметров, Claude Code пересылает сообщения от [субагентов на каждом уровне вложенности](/docs/ru/sub-agents#let-subagents-spawn-their-own-subagents), независимо от того, был ли каждый из них порождён инструментом Agent или запущен как разветвлённый скилл. В `parent_tool_use_id` сообщения вложенного субагента содержат ID вызова инструмента Agent или Skill, который его запустил, поэтому вы можете перестроить полное дерево вложенности, следуя этим ID.238Когда вы включаете любой из этих параметров, Claude Code пересылает сообщения от [субагентов на каждом уровне вложенности](/docs/ru/sub-agents#let-subagents-spawn-their-own-subagents), независимо от того, был ли каждый из них порождён инструментом Agent или запущен как разветвлённый скилл. В `parent_tool_use_id` сообщения вложенного субагента содержат ID вызова инструмента Agent или Skill, который его запустил, поэтому вы можете перестроить полное дерево вложенности, следуя этим ID.

237 239 

238Запуск, который Claude начинает вызовом инструмента, содержит ID этого вызова инструмента. У разветвлённого скилла, который вы запускаете, передавая `/<skill-name>` в качестве промпта, нет вызова инструмента, поэтому его сообщения содержат значение `forked-command-` и поступают после его завершения. Найдите способ запуска в первом столбце:240Запуск, который Claude начинает вызовом инструмента, содержит ID этого вызова инструмента. У разветвлённого скилла, который вы запускаете, передавая `/<skill-name>` в качестве промпта, нет вызова инструмента, поэтому его сообщения вместо этого содержат значение `forked-command-` и поступают после его завершения. Найдите способ запуска в первом столбце:

239 241 

240| Как начинается запуск | `parent_tool_use_id` | Когда поступают его сообщения |242| Как начинается запуск | `parent_tool_use_id` | Когда поступают его сообщения |

241| :- | :- | :- |243| :- | :- | :- |


247 249 

248Если каких-то из этих сообщений нет в вашем потоке, сверьте версию Claude Code с этими минимальными требованиями:250Если каких-то из этих сообщений нет в вашем потоке, сверьте версию Claude Code с этими минимальными требованиями:

249 251 

250* **`--forward-subagent-text` и `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT`**: версия 2.1.211 или позже252* **`--forward-subagent-text` и `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT`**: версия 2.1.211 или новее

251* **Пересылка на каждом уровне вложенности**: версия 2.1.219 или позже253* **Пересылка на каждом уровне вложенности**: версия 2.1.219 или новее

252* **Разветвлённый скилл, который Claude запускает инструментом Skill из основного диалога**: версия 2.1.86 или позже для его блоков `tool_use` и `tool_result` и версия 2.1.265 или позже для его первого сообщения `user`, а также текстовых блоков и блоков размышлений254* **Разветвлённый скилл, который Claude запускает инструментом Skill из основного диалога**: версия 2.1.86 или новее для его блоков `tool_use` и `tool_result` и версия 2.1.265 или новее для его первого сообщения `user`, а также текстовых блоков и блоков размышлений

253* **Сообщения субагентов, которых порождает разветвлённый скилл, и разветвлённых скиллов, запущенных внутри субагента или другого разветвлённого скилла**: версия 2.1.275 или позже255* **Сообщения субагентов, которых порождает разветвлённый скилл, и разветвлённых скиллов, запущенных внутри субагента или другого разветвлённого скилла**: версия 2.1.275 или новее

254* **Сообщения разветвлённого скилла, который вы запускаете, передавая `/<skill-name>` в качестве промпта**: версия 2.1.287 или позже256* **Сообщения разветвлённого скилла, который вы запускаете, передавая `/<skill-name>` в качестве промпта**: версия 2.1.287 или новее

255 257 

256<h4 id="handle-api-retries">258<h4 id="handle-api-retries">

257 Обработка повторных попыток API259 Обработка повторных попыток API

258</h4>260</h4>

259 261 

260Когда запрос API не удаётся с повторяемой ошибкой, Claude Code выдаёт событие `system/api_retry` перед повторной попыткой. На версии 2.1.246 или позже, когда `401` или `403` отклоняет учётные данные [`apiKeyHelper`](/docs/ru/settings-reference#apikeyhelper), Claude Code делает первые две повторные попытки молча без события, затем выдаёт событие как обычно с третьей последовательной повторной попытки и далее. Молчаливые повторные попытки всё ещё учитываются в `attempt`. Вы можете использовать событие для отображения прогресса повторных попыток в вашем собственном интерфейсе.262Когда запрос к API завершается ошибкой, допускающей повторную попытку, Claude Code выдаёт событие `system/api_retry` перед повторной попыткой. В версии 2.1.246 или новее, когда `401` или `403` отклоняет учётные данные [`apiKeyHelper`](/docs/ru/settings-reference#apikeyhelper), Claude Code делает первые две повторные попытки молча, без события, а начиная с третьей последовательной повторной попытки выдаёт событие как обычно. Молчаливые повторные попытки всё равно учитываются в `attempt`. Вы можете использовать событие для отображения хода повторных попыток в вашем собственном интерфейсе.

261 263 

262| Поле | Тип | Описание |264| Поле | Тип | Описание |

263| - | - | - |265| - | - | - |


266| `attempt` | целое число | номер текущей попытки, начиная с 1 |268| `attempt` | целое число | номер текущей попытки, начиная с 1 |

267| `max_retries` | целое число | общее число повторных попыток, разрешённых для причины этого сбоя |269| `max_retries` | целое число | общее число повторных попыток, разрешённых для причины этого сбоя |

268| `retry_delay_ms` | целое число | миллисекунды до следующей попытки |270| `retry_delay_ms` | целое число | миллисекунды до следующей попытки |

269| `error_status` | целое число или null | код состояния HTTP неудачной попытки, или `null`, когда попытка не получила HTTP ответ от API |271| `error_status` | целое число или null | код состояния HTTP неудачной попытки или `null`, когда попытка не получила HTTP-ответ от API |

270| `no_response` | объект, опционально | присутствует только когда неудачная попытка [не получила заголовки ответа вовремя](/docs/ru/errors#no-response-from-api). `waited_ms` — это время ожидания этой попытки, а `retry_wait_ms` — время ожидания повторной попытки. Требует Claude Code версии 2.1.261 или позже |272| `no_response` | объект, опционально | присутствует, только когда неудачная попытка [не получила заголовки ответа вовремя](/docs/ru/errors#no-response-from-api). `waited_ms` — это время ожидания этой попытки, а `retry_wait_ms` — время ожидания повторной попытки. Требует Claude Code версии 2.1.261 или новее |

271| `error` | строка | категория ошибки: `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `rate_limit`, `overloaded`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |273| `error` | строка | категория ошибки: `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `rate_limit`, `overloaded`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |

272| `uuid` | строка | уникальный идентификатор события |274| `uuid` | строка | уникальный идентификатор события |

273| `session_id` | строка | сеанс, к которому принадлежит событие |275| `session_id` | строка | сессия, к которой относится событие |

274 276 

275<h4 id="read-session-metadata">277<h4 id="read-session-metadata">

276 Чтение метаданных сеанса278 Чтение метаданных сессии

277</h4>279</h4>

278 280 

279Событие `system/init` сообщает метаданные сеанса, включая модель, инструменты, MCP серверы и загруженные plugins. Это первое событие в потоке, если только события запуска не предшествуют ему:281Событие `system/init` сообщает метаданные сессии, включая модель, инструменты, MCP-серверы и загруженные плагины. Это первое событие в потоке, если ему не предшествуют события запуска:

280 282 

281* События `plugin_install`, когда установлена [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/ru/env-vars).283* События `plugin_install`, когда задана [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/ru/env-vars).

282* [События `hook_started`, `hook_progress` и `hook_response`](/docs/ru/agent-sdk/typescript#sdkhookstartedmessage), пока работает настроенный hook [`SessionStart`](/docs/ru/hooks#sessionstart) или [`Setup`](/docs/ru/hooks#setup). Они передаются по потоку по мере их создания. Claude Code версии 2.1.169 по 2.1.203 доставлял их одной партией после завершения hook, всё ещё впереди `system/init`; версия 2.1.204 восстановила живую доставку.284* [События `hook_started`, `hook_progress` и `hook_response`](/docs/ru/agent-sdk/typescript#sdkhookstartedmessage), пока выполняется настроенный хук [`SessionStart`](/docs/ru/hooks#sessionstart) или [`Setup`](/docs/ru/hooks#setup). Они передаются в потоке по мере их создания хуком. Claude Code версий с 2.1.169 по 2.1.203 доставлял их одной партией после завершения хука, всё равно раньше `system/init`; версия 2.1.204 восстановила доставку в реальном времени.

283 285 

284Событие также содержит опциональный массив `capabilities` строк, называющих поведения протокола, которые реализует эта версия Claude Code, такие как `interrupt_receipt_v1` или `interrupt_cancel_queued_v1`. Проверьте его для обнаружения функций вместо сравнения строк версий и игнорируйте значения, которые вы не распознаёте. Поле требует Claude Code версии 2.1.205 или позже и отсутствует в более ранних версиях. См. [`SDKSystemMessage`](/docs/ru/agent-sdk/typescript#sdksystemmessage) для списка возможностей.286Событие также содержит опциональный массив строк `capabilities`, называющих поведения протокола, которые реализует эта версия Claude Code, такие как `interrupt_receipt_v1` или `interrupt_cancel_queued_v1`. Проверяйте его для обнаружения возможностей вместо сравнения строк версий и игнорируйте значения, которые вы не распознаёте. Поле требует Claude Code версии 2.1.205 или новее и отсутствует в более ранних версиях. См. [`SDKSystemMessage`](/docs/ru/agent-sdk/typescript#sdksystemmessage) для списка возможностей.

285 287 

286<h4 id="fail-ci-when-a-plugin-or-mcp-server-doesn’t-load">288<h4 id="fail-ci-when-a-plugin-or-mcp-server-doesn’t-load">

287 Сбой CI, когда plugin или MCP сервер не загружается289 Сбой CI, когда плагин или MCP-сервер не загружается

288</h4>290</h4>

289 291 

290Используйте поля plugin в событии `system/init` для перехвата plugin, который не загрузился:292Используйте поля плагинов в событии `system/init`, чтобы обнаружить плагин, который не загрузился:

291 293 

292| Поле | Тип | Описание |294| Поле | Тип | Описание |

293| - | - | - |295| - | - | - |

294| `plugins` | массив | plugins, которые успешно загрузились, каждый с `name` и `path` |296| `plugins` | массив | плагины, которые успешно загрузились, каждый с `name` и `path` |

295| `plugin_errors` | массив | ошибки загрузки plugin, каждая с `plugin`, `type` и `message`. Включает неудовлетворённые версии зависимостей и ошибки загрузки `--plugin-dir`, такие как отсутствующий путь или недопустимый архив. Затронутые plugins отсутствуют в `plugins`. Ключ опускается, когда нет ошибок |297| `plugin_errors` | массив | ошибки загрузки плагинов, каждая с `plugin`, `type` и `message`. Включает неудовлетворённые версии зависимостей и ошибки загрузки `--plugin-dir`, такие как отсутствующий путь или недопустимый архив. Плагин, который не загрузился, отсутствует в `plugins`. Ключ опускается, когда ошибок нет |

296 298 

297Когда каталог `--plugin-dir` или архив сам не загружается, его запись `plugin_errors` включает разрешённый абсолютный путь как `path`. Используйте его, чтобы определить, какой из нескольких значений `--plugin-dir` не загрузился. Поле `path` требует Claude Code версии 2.1.283 или позже.299Когда не удаётся загрузить сам каталог или архив `--plugin-dir`, его запись `plugin_errors` включает разрешённый абсолютный путь в виде `path`. Используйте его, чтобы определить, какое из нескольких значений `--plugin-dir` не загрузилось. Поле `path` требует Claude Code версии 2.1.283 или новее.

298 300 

299Используйте поля MCP сервера так же. Когда вы передаёте [`--mcp-config`](/docs/ru/cli-reference#cli-flags) с `-p`, Claude Code ждёт всё ещё ожидающих серверов перед запуском первого хода, до [`MCP_TIMEOUT`](/docs/ru/env-vars) времени ожидания запуска, 30 секунд по умолчанию. Удалённый сервер с [кэшированным списком инструментов](/docs/ru/agent-sdk/mcp#connection-timing) пропускает ожидание, показывает `pending` в `system/init` и подключается при первом вызове инструмента. Ожидание требует Claude Code версии 2.1.221 или позже.301Используйте поля MCP-серверов так же. Когда вы передаёте [`--mcp-config`](/docs/ru/cli-reference#cli-flags) с `-p`, Claude Code перед первым ходом ждёт серверы, которые ещё подключаются, в пределах таймаута запуска [`MCP_TIMEOUT`](/docs/ru/env-vars), по умолчанию 30 секунд. Удалённый сервер с [кэшированным списком инструментов](/docs/ru/agent-sdk/mcp#connection-timing) пропускает ожидание, показывает `pending` в `system/init` и подключается при первом вызове инструмента. В [самостоятельно размещённом окружении](/docs/ru/self-hosted-environments-configuration#connection-timing) вместо этого применяется более короткое ожидание. Ожидание требует Claude Code версии 2.1.221 или новее.

300 302 

301Claude Code проверяет каждую запись `--mcp-config` при запуске и пропускает записи, которые не прошли проверку, например запись `url` без `type`. Запуск продолжается и выходит чисто, поэтому проверьте эти поля для перехвата сервера, который никогда не загружался:303Claude Code проверяет каждую запись `--mcp-config` при запуске и пропускает записи, которые не прошли проверку, например запись `url` без `type`. Запуск продолжается и завершается без ошибок, поэтому проверяйте эти поля, чтобы обнаружить сервер, который так и не загрузился:

302 304 

303| Поле | Тип | Описание |305| Поле | Тип | Описание |

304| - | - | - |306| - | - | - |

305| `mcp_servers` | массив | MCP серверы в сеансе, каждый с `name` и `status` |307| `mcp_servers` | массив | MCP-серверы в сессии, каждый с `name` и `status` |

306| `mcp_server_errors` | массив | записи `--mcp-config`, пропущенные проверкой конфигурации, каждая с `name`, `type` и `message`. `type` — это категория пропуска, такая как `unknown_type`, `url_missing_type`, `invalid_config` или `reserved_name`; рассматривайте значения, которые вы не распознаёте, как общий пропуск. Затронутые серверы отсутствуют в `mcp_servers`. Ключ опускается, когда нет ошибок, поэтому ворота CI могут не пройти на непустом массиве. Требует Claude Code версии 2.1.219 или позже |308| `mcp_server_errors` | массив | записи `--mcp-config`, пропущенные при проверке конфигурации, каждая с `name`, `type` и `message`. `type` — это категория пропуска, такая как `unknown_type`, `url_missing_type`, `invalid_config` или `reserved_name`; рассматривайте значения, которые вы не распознаёте, как общий пропуск. Затронутые серверы отсутствуют в `mcp_servers`. Ключ опускается, когда ошибок нет, поэтому проверка в CI может завершаться сбоем при непустом массиве. Требует Claude Code версии 2.1.219 или новее |

307 309 

308Когда вы запускаете команду вручную в терминале, Claude Code также выводит предупреждение при запуске в stderr, такое как `Warning: 1 MCP server skipped due to invalid config:`, за которым следует причина для каждой пропущенной записи. Когда вы перенаправляете stderr или когда программа, такая как CI runner или хост SDK, захватывает его, Claude Code не выводит предупреждение и сообщает пропущенные записи только в поле `mcp_server_errors`. Предупреждение требует Claude Code версии 2.1.219 или позже.310Когда вы запускаете команду вручную в терминале, Claude Code также выводит в stderr предупреждение при запуске, например `Warning: 1 MCP server skipped due to invalid config:`, за которым следует причина для каждой пропущенной записи. Когда вы перенаправляете stderr или когда его перехватывает программа, такая как CI runner или хост SDK, Claude Code не выводит предупреждение и сообщает о пропущенных записях только в поле `mcp_server_errors`. Предупреждение требует Claude Code версии 2.1.219 или новее.

309 311 

310<h4 id="track-plugin-installs">312<h4 id="track-plugin-installs">

311 Отслеживание установок plugins313 Отслеживание установки плагинов

312</h4>314</h4>

313 315 

314Когда установлена [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/ru/env-vars), Claude Code выдаёт события `system/plugin_install` во время установки marketplace plugins перед первым ходом. Используйте их для отображения прогресса установки в вашем собственном UI.316Когда задана [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/ru/env-vars), Claude Code выдаёт события `system/plugin_install` во время установки плагинов из маркетплейсов перед первым ходом. Используйте их для отображения хода установки в вашем собственном UI.

315 317 

316| Поле | Тип | Описание |318| Поле | Тип | Описание |

317| - | - | - |319| - | - | - |

318| `type` | `"system"` | тип сообщения |320| `type` | `"system"` | тип сообщения |

319| `subtype` | `"plugin_install"` | идентифицирует это как событие установки plugin |321| `subtype` | `"plugin_install"` | идентифицирует это как событие установки плагина |

320| `status` | `"started"`, `"installed"`, `"failed"` или `"completed"` | `started` и `completed` заключают общую установку; `installed` и `failed` сообщают об отдельных marketplaces |322| `status` | `"started"`, `"installed"`, `"failed"` или `"completed"` | `started` и `completed` обрамляют всю установку; `installed` и `failed` сообщают об отдельных маркетплейсах |

321| `name` | строка, опционально | имя marketplace, присутствует на `installed` и `failed` |323| `name` | строка, опционально | имя маркетплейса, присутствует в `installed` и `failed` |

322| `error` | строка, опционально | сообщение об ошибке, присутствует на `failed` |324| `error` | строка, опционально | сообщение об ошибке, присутствует в `failed` |

323| `uuid` | строка | уникальный идентификатор события |325| `uuid` | строка | уникальный идентификатор события |

324| `session_id` | строка | сеанс, к которому принадлежит событие |326| `session_id` | строка | сессия, к которой относится событие |

325 327 

326<h3 id="auto-approve-tools">328<h3 id="auto-approve-tools">

327 Автоматическое одобрение инструментов329 Автоматическое подтверждение инструментов

328</h3>330</h3>

329 331 

330Используйте `--allowedTools` для разрешения Claude использовать определённые инструменты без запроса. Перечисление `Read` и `Edit` позволяет Claude читать и редактировать файлы без запроса разрешения. Перечисление `Bash` делает то же самое для команд shell, за исключением запуска, который начинается в [режиме auto](/docs/ru/permission-modes#how-auto-mode-evaluates-actions), где Claude Code отбрасывает запись `Bash` как широкое правило разрешения и режим auto оценивает каждую команду вместо этого. Этот пример запускает набор тестов и исправляет ошибки с этими тремя инструментами в списке:332Используйте `--allowedTools`, чтобы разрешить Claude использовать определённые инструменты без запроса. Перечисление `Read` и `Edit` позволяет Claude читать и редактировать файлы без запроса разрешения. Перечисление `Bash` делает то же самое для shell-команд, за исключением запуска, который начинается в [авторежиме](/docs/ru/permission-modes#how-auto-mode-evaluates-actions): там Claude Code отбрасывает голую запись `Bash` как слишком широкое разрешающее правило, и вместо этого авторежим оценивает каждую команду. Этот пример запускает набор тестов и исправляет сбои, указав эти три инструмента:

331 333 

332```bash theme={null}334```bash theme={null}

333claude -p "Run the test suite and fix any failures" \335claude -p "Run the test suite and fix any failures" \

334 --allowedTools "Bash,Read,Edit"336 --allowedTools "Bash,Read,Edit"

335```337```

336 338 

337Чтобы установить базовый уровень для всего сеанса вместо перечисления отдельных инструментов, передайте [режим разрешений](/docs/ru/permission-modes). Запуск, где ничто не устанавливает режим разрешений, принимает [встроенный начальный режим разрешений](/docs/ru/permission-modes#which-mode-a-session-starts-in), который может быть `auto`, поэтому передайте нужный вам режим:339Чтобы задать базовый уровень для всей сессии вместо перечисления отдельных инструментов, передайте [режим разрешений](/docs/ru/permission-modes). Запуск, в котором режим разрешений ничем не задан, использует [встроенный начальный режим разрешений](/docs/ru/permission-modes#which-mode-a-session-starts-in), которым может быть `auto`, поэтому передайте нужный вам режим:

338 340 

339* **`auto`**: передайте `--permission-mode auto`, чтобы классификатор проверил большинство действий вместо вас341* **`auto`**: передайте `--permission-mode auto`, чтобы большинство действий проверял классификатор вместо вас

340* **`dontAsk`**: Claude Code отклоняет каждый вызов, который иначе вызвал бы запрос, что полезно для заблокированных CI запусков. Действия, которые не требуют одобрения в режиме Manual, всё ещё выполняются, такие как чтение файлов в ваших рабочих каталогах и [набор команд только для чтения](/docs/ru/permissions#read-only-commands), а также действия, которые охватывают ваши записи `--allowedTools` или правила `permissions.allow`. `AskUserQuestion`, инструменты соединителя [которые ваша организация установила на `ask`](/docs/ru/mcp#organization-controls-on-connector-tools) и MCP инструменты, отмеченные [`requiresUserInteraction`](/docs/ru/mcp#require-approval-for-a-specific-tool), отклоняются даже когда правило разрешения совпадает342* **`dontAsk`**: Claude Code отклоняет каждый вызов, который иначе вызвал бы запрос, что полезно для строго ограниченных запусков в CI. Действия, не требующие подтверждения в режиме Manual, по-прежнему выполняются, например чтение файлов в ваших рабочих каталогах и [набор команд только для чтения](/docs/ru/permissions#read-only-commands), как и действия, охваченные вашими записями `--allowedTools` или правилами `permissions.allow`. `AskUserQuestion`, инструменты коннекторов, [для которых ваша организация установила `ask`](/docs/ru/mcp#organization-controls-on-connector-tools), и MCP-инструменты, помеченные [`requiresUserInteraction`](/docs/ru/mcp#require-approval-for-a-specific-tool), отклоняются, даже когда совпадает разрешающее правило

341* **`acceptEdits`**: Claude записывает файлы без запроса, и Claude Code автоматически одобряет распространённые команды файловой системы, такие как `mkdir`, `touch`, `mv` и `cp`. [Действия, которые ни один режим не одобряет автоматически](/docs/ru/permission-modes#actions-no-mode-auto-approves), всё ещё применяются. Помимо набора команд только для чтения, другие команды shell и сетевые запросы всё ещё требуют записи `--allowedTools` или правила `permissions.allow`. См. [что `acceptEdits` автоматически одобряет](/docs/ru/permission-modes#auto-approve-file-edits-with-acceptedits-mode) для полного списка343* **`acceptEdits`**: Claude записывает файлы без запроса, и Claude Code автоматически подтверждает распространённые команды файловой системы, такие как `mkdir`, `touch`, `mv` и `cp`. [Действия, которые ни один режим не подтверждает автоматически](/docs/ru/permission-modes#actions-no-mode-auto-approves), по-прежнему действуют. Помимо набора команд только для чтения, другие shell-команды и сетевые запросы по-прежнему требуют записи `--allowedTools` или правила `permissions.allow`. См. [что `acceptEdits` подтверждает автоматически](/docs/ru/permission-modes#auto-approve-file-edits-with-acceptedits-mode) для полного списка

342 344 

343Этот пример применяет исправления lint с `acceptEdits` в качестве базовой линии:345Этот пример применяет исправления линтера с `acceptEdits` в качестве базового уровня:

344 346 

345```bash theme={null}347```bash theme={null}

346claude -p "Apply the lint fixes" --permission-mode acceptEdits348claude -p "Apply the lint fixes" --permission-mode acceptEdits


350 Отключение запросов разрешений в автоматических запусках352 Отключение запросов разрешений в автоматических запусках

351</h3>353</h3>

352 354 

353Передайте `--permission-prompts none`, когда никто не доступен для ответа на запросы разрешений, например в запланированном задании. Флаг имеет наибольшее значение, когда ваш запуск имеет хост разрешений: приложение Agent SDK с обратным вызовом [`canUseTool`](/docs/ru/agent-sdk/user-input) или MCP инструмент, который вы передаёте с [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags). Без флага ваш запуск ждёт, пока этот хост ответит на каждый запрос разрешения.355Передайте `--permission-prompts none`, когда отвечать на запросы разрешений некому, например в запланированном задании. Флаг важнее всего, когда у вашего запуска есть хост разрешений: приложение Agent SDK с [обратным вызовом `canUseTool`](/docs/ru/agent-sdk/user-input) или MCP-инструмент, который вы передаёте с [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags). Без флага ваш запуск ждёт, пока этот хост ответит на каждый запрос разрешения.

354 356 

355С флагом ваш запуск не консультирует хост и не ждёт его. Всё, что вызвало бы запрос, отклоняется, если hook `PermissionRequest` не разрешает это, Claude сообщается, что никто не может одобрить запрос и не должен повторять попытку, и запуск продолжается. В запуске `-p` без хоста эти запросы отклоняются в любом случае, и флаг также сообщает Claude не повторять их. Правила разрешений, hooks [`PermissionRequest`](/docs/ru/hooks#permissionrequest) и режим разрешений, который вы установили, всё ещё решают каждый вызов в первую очередь; Claude Code отклоняет только запросы, которые ничто другое не разрешает.357С флагом ваш запуск не обращается к хосту и не ждёт его. Всё, что вызвало бы запрос, отклоняется, если это не разрешает хук `PermissionRequest`; Claude сообщается, что подтвердить запрос некому и что повторять попытку не нужно, и запуск продолжается. В запуске `-p` без хоста эти запросы отклоняются в любом случае, а флаг дополнительно сообщает Claude не повторять их. Правила разрешений, [хуки `PermissionRequest`](/docs/ru/hooks#permissionrequest) и заданный вами режим разрешений по-прежнему решают судьбу каждого вызова в первую очередь; Claude Code отклоняет только те запросы, которые ничто другое не разрешает.

356 358 

357Этот пример запускает автоматическое задание в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode). Классификатор проверяет каждое действие как обычно, и Claude Code отклоняет всё, что иначе вернулось бы к запросу:359Этот пример выполняет автоматическое задание в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode). Классификатор проверяет каждое действие как обычно, а Claude Code отклоняет всё, что иначе привело бы к запросу:

358 360 

359```bash theme={null}361```bash theme={null}

360claude -p "Update the dependency pins and run the tests" --permission-mode auto --permission-prompts none362claude -p "Update the dependency pins and run the tests" --permission-mode auto --permission-prompts none

361```363```

362 364 

363С `--permission-prompts none`, Claude Code удаляет инструменты, которые требуют ответа от человека, такие как [`AskUserQuestion`](/docs/ru/tools-reference#askuserquestion-tool-behavior), поэтому Claude не может их вызвать. Любой [запрос MCP elicitation](/docs/ru/mcp#respond-to-mcp-elicitation-requests), на который не ответит hook [`Elicitation`](/docs/ru/hooks#elicitation), отменяется.365С `--permission-prompts none` Claude Code удаляет инструменты, которым нужен ответ от человека, такие как [`AskUserQuestion`](/docs/ru/tools-reference#askuserquestion-tool-behavior), поэтому Claude не может их вызвать. Любой [запрос MCP elicitation](/docs/ru/mcp#respond-to-mcp-elicitation-requests), на который не отвечает ни один [хук `Elicitation`](/docs/ru/hooks#elicitation), отменяется.

364 366 

365С `--output-format stream-json`, отклонения появляются как системные сообщения `permission_denied`, и финальное сообщение результата перечисляет их в `permission_denials`.367С `--output-format stream-json` отклонения появляются как системные сообщения `permission_denied`, а итоговое сообщение результата перечисляет их в `permission_denials`.

366 368 

367<Note>369<Note>

368 Флаг `--permission-prompts` требует Claude Code версии 2.1.259 или позже. Более ранние версии отклоняют его с ошибкой неизвестного параметра.370 Флаг `--permission-prompts` требует Claude Code версии 2.1.259 или новее. Более ранние версии отклоняют его с ошибкой неизвестного параметра.

369</Note>371</Note>

370 372 

371<h3 id="create-a-commit">373<h3 id="create-a-commit">

372 Создание коммита374 Создание коммита

373</h3>375</h3>

374 376 

375Этот пример проверяет поставленные в очередь изменения и создаёт коммит с подходящим сообщением:377Этот пример просматривает проиндексированные изменения и создаёт коммит с подходящим сообщением:

376 378 

377```bash theme={null}379```bash theme={null}

378claude -p "Look at my staged changes and create an appropriate commit" \380claude -p "Look at my staged changes and create an appropriate commit" \

379 --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"381 --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"

380```382```

381 383 

382Флаг `--allowedTools` использует [синтаксис правила разрешений](/docs/ru/settings-reference#permission-rule-syntax). Завершающий ` *` включает сопоставление префиксов, поэтому `Bash(git diff *)` разрешает любую команду, начинающуюся с `git diff`. Пробел перед `*` важен: без него `Bash(git diff*)` также совпадал бы с `git diff-index`.384Флаг `--allowedTools` использует [синтаксис правил разрешений](/docs/ru/settings-reference#permission-rule-syntax). Завершающий ` *` включает сопоставление по префиксу, поэтому `Bash(git diff *)` разрешает любую команду, начинающуюся с `git diff`. Пробел перед `*` важен: без него `Bash(git diff*)` также совпадал бы с `git diff-index`.

383 385 

384<Note>386<Note>

385 Поддержка команд отличается в режиме `-p`:387 Поддержка команд в режиме `-p` отличается:

386 388 

387 * Вызванные пользователем [skills](/docs/ru/skills) и пользовательские команды работают. Включите `/skill-name` в строку приглашения и Claude Code развернёт её перед запуском.389 * Вызываемые пользователем [скиллы](/docs/ru/skills) и пользовательские команды работают. Включите `/skill-name` в строку промпта, и Claude Code развернёт её перед запуском.

388 * Встроенные команды, которые работают только в интерфейсе терминала, такие как `/login`, недоступны.390 * Встроенные команды, которые работают только в интерфейсе терминала, такие как `/login`, недоступны.

389 * `/model`, `/effort`, `/fast`, `/color` и `/rename` принимают значение как аргумент, например `/model sonnet`, а `/mcp` без аргумента выводит текстовую сводку статуса сервера. Эти формы требуют Claude Code версии 2.1.205 или позже и следуют [примечаниям доступности](/docs/ru/commands#all-commands) каждой команды.391 * `/model`, `/effort`, `/fast`, `/color` и `/rename` принимают значение как аргумент, например `/model sonnet`, а `/mcp` без аргумента выводит текстовую сводку состояния серверов. Эти формы требуют Claude Code версии 2.1.205 или новее и следуют [примечаниям о доступности](/docs/ru/commands#all-commands) каждой команды.

390 * Чтобы изменить параметр, передайте `key=value` в `/config`, например `/config thinking=false`.392 * Чтобы изменить настройку, передайте `key=value` в `/config`, например `/config thinking=false`.

391 * `/output-style <style>` переключает [стили вывода](/docs/ru/output-styles), а `/output-style` без аргумента выводит их список. Требует Claude Code версии 2.1.269 или позже.393 * `/output-style <style>` переключает [стили вывода](/docs/ru/output-styles), а `/output-style` без аргумента выводит их список. Требует Claude Code версии 2.1.269 или новее.

392</Note>394</Note>

393 395 

394<h3 id="customize-the-system-prompt">396<h3 id="customize-the-system-prompt">

395 Настройка системного приглашения397 Настройка системного промпта

396</h3>398</h3>

397 399 

398Используйте `--append-system-prompt` для добавления инструкций при сохранении поведения Claude Code по умолчанию. Этот пример передаёт diff PR в Claude и инструктирует его проверить на уязвимости безопасности. Сохраните его как shell скрипт, например `review.sh`:400Используйте `--append-system-prompt`, чтобы добавить инструкции, сохранив поведение Claude Code по умолчанию. Этот пример передаёт diff PR в Claude и поручает ему проверить код на уязвимости безопасности. Сохраните его как shell-скрипт, например `review.sh`:

399 401 

400```bash theme={null}402```bash theme={null}

401gh pr diff "$1" | claude -p \403gh pr diff "$1" | claude -p \


403 --output-format json405 --output-format json

404```406```

405 407 

406В скрипте `"$1"` обозначает первый аргумент, который вы передаёте в командной строке. Запустите `bash review.sh 123` и shell заменит `"$1"` на `123`, поэтому скрипт получит diff для PR 123. Claude Code выводит рецензию как JSON, с текстом в поле `result`.408В скрипте `"$1"` обозначает первый аргумент, который вы передаёте в командной строке. Запустите `bash review.sh 123`, и оболочка заменит `"$1"` на `123`, поэтому скрипт получит diff для PR 123. Claude Code выводит рецензию в виде JSON, с текстом в поле `result`.

407 409 

408См. [флаги системного приглашения](/docs/ru/cli-reference#system-prompt-flags) для дополнительных параметров, включая `--system-prompt` для полной замены приглашения по умолчанию.410См. [флаги системного промпта](/docs/ru/cli-reference#system-prompt-flags) для дополнительных параметров, включая `--system-prompt` для полной замены промпта по умолчанию.

409 411 

410<h3 id="continue-conversations">412<h3 id="continue-conversations">

411 Продолжение разговоров413 Продолжение диалогов

412</h3>414</h3>

413 415 

414Используйте `--continue` для продолжения самого последнего разговора или `--resume` с ID сеанса для продолжения определённого разговора. На Claude Code версии 2.1.257 или позже, когда вы передаёте `--continue`, Claude Code открывает [фоновый сеанс](/docs/ru/sessions#resume-a-session), который завершился, но не тот, который всё ещё работает. Этот пример запускает рецензию, затем отправляет последующие приглашения:416Используйте `--continue` для продолжения самого последнего диалога или `--resume` с ID сессии для продолжения определённого диалога. В Claude Code версии 2.1.257 или новее при передаче `--continue` Claude Code открывает [фоновую сессию](/docs/ru/sessions#resume-a-session), которая завершилась, но не ту, которая ещё выполняется. Этот пример запускает рецензию, а затем отправляет последующие промпты:

415 417 

416```bash theme={null}418```bash theme={null}

417# First request419# First request


422claude -p "Generate a summary of all issues found" --continue424claude -p "Generate a summary of all issues found" --continue

423```425```

424 426 

425Если вы запускаете несколько разговоров, захватите ID сеанса для возобновления определённого:427Если вы ведёте несколько диалогов, сохраните ID сессии, чтобы возобновить определённый:

426 428 

427```bash theme={null}429```bash theme={null}

428session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')430session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')

429claude -p "Continue that review" --resume "$session_id"431claude -p "Continue that review" --resume "$session_id"

430```432```

431 433 

432Вы можете запустить две команды из разных каталогов: Claude Code [находит сеанс по его ID](/docs/ru/sessions#resume-a-session) в любом проекте на этой машине. До версии 2.1.223 Claude Code искал ID только в текущем каталоге проекта и его git worktrees, поэтому вам пришлось бы запустить обе команды из одного каталога.434Вы можете запускать эти две команды из разных каталогов: Claude Code [находит сессию по её ID](/docs/ru/sessions#resume-a-session) в любом проекте на этой машине. До версии 2.1.223 Claude Code искал ID только в текущем каталоге проекта и его git worktree, поэтому обе команды приходилось запускать из одного каталога.

433 435 

434Вместо ID сеанса вы можете передать `--resume` абсолютный путь к [файлу транскрипта](/docs/ru/sessions#where-transcripts-are-stored) `.jsonl` сеанса, и Claude Code продолжит разговор, сохранённый в этом файле.436Вместо ID сессии вы можете передать `--resume` абсолютный путь к [файлу транскрипта](/docs/ru/sessions#where-transcripts-are-stored) `.jsonl` сессии, и Claude Code продолжит диалог, сохранённый в этом файле.

435 437 

436<h2 id="next-steps">438<h2 id="next-steps">

437 Следующие шаги439 Следующие шаги

Details

132Runner и его сеансы делают несколько видов исходящего соединения, и входящее соединение от Anthropic не требуется:132Runner и его сеансы делают несколько видов исходящего соединения, и входящее соединение от Anthropic не требуется:

133 133 

134* **Control plane**: runner опрашивает `api.anthropic.com` для работы и публикует события прогресса установки и отказа, все исходящие HTTPS. Опрос служит сердцебиением runner.134* **Control plane**: runner опрашивает `api.anthropic.com` для работы и публикует события прогресса установки и отказа, все исходящие HTTPS. Опрос служит сердцебиением runner.

135* **SCM connector**: дополнительный оркестратор [SCM connector](/docs/ru/self-hosted-environments-reference#scm-connector-flags) туннель — это единственное соединение WebSocket.135* **Git**: runner клонирует репозитории с вашего git-хоста и отправляет на него изменения по HTTPS или SSH, аутентифицируясь с помощью учётных данных, которые предоставляет ваше развёртывание. Варианты, включая учётные данные, выпускаемые для каждой сессии, описаны в разделе [Настройка git](/docs/ru/self-hosted-environments-deploy#configure-git). При использовании [git-прокси Anthropic](/docs/ru/self-hosted-environments-deploy#use-the-anthropic-git-proxy) git-трафик для репозиториев на github.com вместо этого проходит через `api.anthropic.com`.

136* **Git**: runner клонирует из и отправляет на ваш git-хост по HTTPS или SSH, аутентифицированный с учетными данными, которые предоставляет ваше развертывание; [Настройка git](/docs/ru/self-hosted-environments-deploy#configure-git) охватывает варианты, включая учетные данные, отчеканенные для каждого сеанса, и [Anthropic git proxy](/docs/ru/self-hosted-environments-deploy#use-the-anthropic-git-proxy), который маршрутизирует git через `api.anthropic.com` вместо этого.136* **Session child**: дочерний процесс Claude Code удерживает поток событий сессии к `api.anthropic.com` и выполняет собственные исходящие вызовы для инференса модели и для команд git, запускаемых во время сессии. В сессии, использующей [git под управлением Anthropic](/docs/ru/self-hosted-environments-deploy#use-the-anthropic-git-proxy), дочерний процесс отправляет свой трафик `git` и `gh` для github.com через WebSocket-соединение, которое он открывает к `api.anthropic.com`.

137* **Session child**: дочерний процесс Claude Code держит поток событий сеанса на `api.anthropic.com` и делает свои собственные исходящие вызовы для вывода модели и для команд git, запущенных во время сеанса. Смотрите [Требования к сети](/docs/ru/self-hosted-environments-deploy#network-requirements) для полного списка выхода. [Диаграмма выше](#how-self-hosted-environments-work) показывает эти пути, кроме дополнительного SCM connector.137* **SCM connector**: дополнительный [SCM connector](/docs/ru/self-hosted-environments-reference#scm-connector-flags) оркестратора недоступен, поэтому его туннель не открывается. Туннель — это WebSocket-соединение с `api.anthropic.com`.

138 

139Полный список исходящих адресов см. в разделе [Требования к сети](/docs/ru/self-hosted-environments-deploy#network-requirements). [Диаграмма выше](#how-self-hosted-environments-work) показывает эти пути, за исключением дополнительного SCM connector и соединения git под управлением Anthropic.

138 140 

139По умолчанию инференс модели использует Anthropic API. Плоскость управления передаёт эндпоинт API каждой сессии, и сессия аутентифицируется с помощью выданного Anthropic токена OAuth с областью действия сессии. Чтобы вместо этого отправлять запросы к модели в собственную облачную учётную запись, см. раздел [Отправка запросов к модели в Bedrock или Agent Platform](/docs/ru/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).141По умолчанию инференс модели использует Anthropic API. Плоскость управления передаёт эндпоинт API каждой сессии, и сессия аутентифицируется с помощью выданного Anthropic токена OAuth с областью действия сессии. Чтобы вместо этого отправлять запросы к модели в собственную облачную учётную запись, см. раздел [Отправка запросов к модели в Bedrock или Agent Platform](/docs/ru/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).

140 142 

Details

31| Переменная | Описание |31| Переменная | Описание |

32| :- | :- |32| :- | :- |

33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | JWT сессии с префиксом `sk-ant-cc-`. Его утверждение `act` идентифицирует создателя сессии, вместе с электронной почтой создателя, если интерфейс, создавший сессию, её записал. Значение — это токен на момент порождения процесса; обновления поступают через stdin дочернего процесса, поэтому обёртка видит только начальное значение. См. [Проверка идентичности сессии](/docs/ru/self-hosted-environments-identity). |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | JWT сессии с префиксом `sk-ant-cc-`. Его утверждение `act` идентифицирует создателя сессии, вместе с электронной почтой создателя, если интерфейс, создавший сессию, её записал. Значение — это токен на момент порождения процесса; обновления поступают через stdin дочернего процесса, поэтому обёртка видит только начальное значение. См. [Проверка идентичности сессии](/docs/ru/self-hosted-environments-identity). |

34| `CCR_SESSION_ACCOUNT_EMAIL` | Электронная почта создателя сессии, предварительно извлечённая средством выполнения из утверждения `act.email` токена без проверки подписи. Подходит для маркировки, например для трейлеров коммитов. Когда электронная почта управляет выдачей учётных данных, вместо этого проверьте токен и прочитайте утверждение из него; см. [Подготовка учётных данных, ограниченных создателем сессии](#provision-credentials-scoped-to-the-session-creator). Не установлена, когда токен не содержит электронную почту создателя. Рассматривайте как персональные данные. |34| `CCR_SESSION_ACCOUNT_EMAIL` | Электронная почта создателя сессии, предварительно извлечённая средством выполнения из утверждения `act.email` токена без проверки подписи. Подходит для маркировки, например для трейлеров коммитов. Когда электронная почта управляет выдачей учётных данных, вместо этого проверьте токен и прочитайте утверждение из него. См. [Подготовка учётных данных, ограниченных создателем сессии](#provision-credentials-scoped-to-the-session-creator). Не установлена, когда токен не содержит электронную почту создателя, например в сессиях, которые создаёт служебная учётная запись вашей организации. Рассматривайте как персональные данные. |

35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Клиентский интерфейс, который создал сессию, например `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli` или `scheduled_trigger`. Anthropic записывает значение один раз при создании сессии, поэтому обёртка и каждый хук жизненного цикла видят одно и то же значение. Используйте его только для аналитики внедрения и маркировки, а не как сигнал авторизации. Не установлена, когда у сессии нет записанного или распознанного интерфейса, поэтому ссылайтесь на неё как `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` при `set -u`. Требует Claude Code v2.1.229 или новее. |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Клиентский интерфейс, который создал сессию, например `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli` или `scheduled_trigger`. Anthropic записывает значение один раз при создании сессии, поэтому обёртка и каждый хук жизненного цикла видят одно и то же значение. Используйте его только для аналитики внедрения и маркировки, а не как сигнал авторизации. Не установлена, когда у сессии нет записанного или распознанного интерфейса. Требует Claude Code v2.1.229 или новее. |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | Абсолютный путь к собственному двоичному файлу Claude Code средства выполнения. Завершите вашу обёртку командой `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`, чтобы передать управление закреплённому двоичному файлу без жёсткого кодирования пути установки. |36| `CLAUDE_RUNNER_CLAUDE_BIN` | Абсолютный путь к собственному двоичному файлу Claude Code средства выполнения. Завершите вашу обёртку командой `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`, чтобы передать управление закреплённому двоичному файлу без жёсткого кодирования пути установки. |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID сессии в форме с тегом `cse_...`. Это та же сессия, которую [хуки жизненного цикла](#lifecycle-hooks) видят как `CLAUDE_RUNNER_SESSION_ID` в форме `session_...`; переменные UUID совпадают в обоих случаях, а замена префикса `cse_` на `session_` даёт ID, показанный в URL сессии. |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID сессии в форме с тегом `cse_...`. Это та же сессия, которую [хуки жизненного цикла](#lifecycle-hooks) видят как `CLAUDE_RUNNER_SESSION_ID` в форме `session_...`; переменные UUID совпадают в обоих случаях, а замена префикса `cse_` на `session_` даёт ID, показанный в URL сессии. |

38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | Тот же ID сессии в канонической форме UUID для систем, которые используют UUID в качестве ключа. |38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | Тот же ID сессии в канонической форме UUID для систем, которые используют UUID в качестве ключа. |

39| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | Для сессии [Claude Tag](https://claude.com/docs/claude-tag/overview), которая относится к одной ветке Slack, — ссылка на эту ветку. Не установлена для других сессий и может быть не установлена и для сессии ветки. |

40| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | Для сессии Claude Tag, которая относится к одной ветке Slack, — временная метка Slack этой ветки, например `1700000000.000100`. Может быть не установлена, а также может быть установлена, когда `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` не установлена, поэтому проверяйте каждую переменную отдельно. |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Абсолютный путь к файлу для каждой сессии, содержащему текущий JWT сессии, который поддерживается в актуальном состоянии при обновлении токенов. Подпроцессы оболочки читают его для своего заголовка `Authorization` при загрузке вложений, которые пользователь добавил в сессию. `exec` сохраняет переменную автоматически; обёртка, которая перестраивает окружение дочернего процесса, должна перенести переменную, иначе загрузки вложений молча прекратятся. |41| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Абсолютный путь к файлу для каждой сессии, содержащему текущий JWT сессии, который поддерживается в актуальном состоянии при обновлении токенов. Подпроцессы оболочки читают его для своего заголовка `Authorization` при загрузке вложений, которые пользователь добавил в сессию. `exec` сохраняет переменную автоматически; обёртка, которая перестраивает окружение дочернего процесса, должна перенести переменную, иначе загрузки вложений молча прекратятся. |

40| `CLAUDE_CONFIG_DIR` | Каталог конфигурации Claude для каждой сессии, записываемый при запуске сессии из снимка конфигурации хоста средства выполнения, который средство выполнения захватывает при запуске; см. [Разрешения и подтверждение инструментов](#permissions-and-tool-approval). Записи здесь изолированы для этой сессии. Каталог остаётся в `<base-dir>/_sessions/` после завершения сессии, если вы не запустите средство выполнения с [`--remove-session-state`](/docs/ru/self-hosted-environments-reference#runner-cli-flags); см. [Повторное использование предварительно подготовленного checkout](/docs/ru/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |42| `CLAUDE_CONFIG_DIR` | Каталог конфигурации Claude для каждой сессии, записываемый при запуске сессии из снимка конфигурации хоста средства выполнения, который средство выполнения захватывает при запуске; см. [Разрешения и подтверждение инструментов](#permissions-and-tool-approval). Записи здесь изолированы для этой сессии. Каталог остаётся в `<base-dir>/_sessions/` после завершения сессии, если вы не запустите средство выполнения с [`--remove-session-state`](/docs/ru/self-hosted-environments-reference#runner-cli-flags); см. [Повторное использование предварительно подготовленного checkout](/docs/ru/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |

41| `ANTHROPIC_BASE_URL` | Базовый URL API, который будет использовать дочерний процесс, доставляемый плоскостью управления для каждой сессии; обычно `https://api.anthropic.com`. Не переопределяйте его: учётные данные вывода сессии — это выданный Anthropic токен OAuth, который другие поставщики не принимают. |43| `ANTHROPIC_BASE_URL` | Базовый URL API, который будет использовать дочерний процесс, доставляемый плоскостью управления для каждой сессии; обычно `https://api.anthropic.com`. Не переопределяйте его: учётные данные вывода сессии — это выданный Anthropic токен OAuth, который другие поставщики не принимают. |


43 45 

44Обёртка также наследует остальную часть управляемого окружения дочернего процесса, включая любые переменные окружения, предоставленные сервером. `exec` передаёт всё это автоматически; если ваша обёртка порождает дочерний процесс другим способом, пересылайте окружение полностью.46Обёртка также наследует остальную часть управляемого окружения дочернего процесса, включая любые переменные окружения, предоставленные сервером. `exec` передаёт всё это автоматически; если ваша обёртка порождает дочерний процесс другим способом, пересылайте окружение полностью.

45 47 

48`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` и `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` доступны вашей обёртке или [хуку `command`](#command). Они также доступны тому, что запускает сессия, например shell-командам, хукам git и хукам Claude Code. Хуки `checkout`, `post-session` и `spawn-runner` их не получают.

49 

50<h3 id="give-a-default-to-variables-that-can-be-unset">

51 Задавайте значение по умолчанию для переменных, которые могут быть не установлены

52</h3>

53 

54Каждая из переменных `CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` и `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` может быть не установлена. Если ваш скрипт использует `set -u`, Bash останавливается с ошибкой `unbound variable` при раскрытии неустановленной переменной, поэтому раскрывайте их со значением по умолчанию, например `${CCR_SESSION_ACCOUNT_EMAIL:-}`.

55 

56Везде, где оболочка раскрывает ссылку на ветку Slack, соблюдайте следующие меры предосторожности:

57 

58* **Заключайте её в кавычки**: ссылка может содержать символы, на которые реагирует оболочка, например `?` и `&`, поэтому заключайте переменную в кавычки, как в `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`.

59* **Не подставляйте её значение в строки `eval` и `sh -c`**: не подставляйте её значение в строку, которую выполняет `eval` или `sh -c`, даже внутри кавычек. Вместо этого пусть такая строка ссылается на саму переменную.

60 

46<h3 id="keep-stdin-and-file-descriptor-3-attached">61<h3 id="keep-stdin-and-file-descriptor-3-attached">

47 Сохраняйте stdin и дескриптор файла 3 подключёнными62 Сохраняйте stdin и дескриптор файла 3 подключёнными

48</h3>63</h3>

49 64 

50stdin дочернего процесса — это канал управления средства выполнения. Ротации токенов и сигналы завершения сессии поступают через него. Средство выполнения также открывает канал на дескрипторе файла 3 и читает из него сигналы активности дочернего процесса для управления таймаутами простоя и запуска. Простой `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` сохраняет оба автоматически.65stdin дочернего процесса — это канал управления средства выполнения. Ротации токенов и сигналы завершения сессии поступают через него. Средство выполнения также открывает канал на дескрипторе файла 3 и читает из него сигналы активности дочернего процесса для управления таймаутами простоя и запуска. Простой `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` сохраняет оба автоматически.

51 66 

52Если ваша обёртка переводит дочерний процесс в фоновый режим с помощью простого `&`, она разрывает stdin дочернего процесса: сессия выглядит работоспособной до истечения примерно 30-минутного времени жизни начального токена OAuth, после чего каждый вызов API завершается ошибкой `401 authentication_error`. Если ваша обёртка должна переводить дочерний процесс в фоновый режим, например чтобы сохранить ловушку очистки, сохраните stdin на дескрипторе файла 4 или выше и явно подключите его заново:67Если ваша обёртка переводит дочерний процесс в фоновый режим с помощью простого `&`, она разрывает stdin дочернего процесса. Сессия выглядит работоспособной до истечения примерно 30-минутного времени жизни начального токена OAuth, после чего каждый вызов API, использующий этот токен, завершается ошибкой `401 authentication_error`. Если ваша обёртка должна переводить дочерний процесс в фоновый режим, например чтобы сохранить ловушку очистки, сохраните stdin на дескрипторе файла 4 или выше и явно подключите его заново:

53 68 

54```bash theme={null}69```bash theme={null}

55exec 4<&070exec 4<&0


59wait "$CHILD"74wait "$CHILD"

60```75```

61 76 

62Не закрывайте и не переиспользуйте дескриптор файла 3 в обёртке. Перенаправлять stdout и stderr дочернего процесса можно.77Перенаправлять stdout дочернего процесса можно. Дескриптор файла 3 и stderr должны оставаться подключёнными к средству выполнения:

78 

79* **Дескриптор файла 3**: передаёт сигналы активности дочернего процесса средству выполнения. Не закрывайте и не переиспользуйте его в обёртке.

80* **stderr**: когда обёртка или дочерний процесс завершается с ненулевым кодом выхода, средство выполнения публикует последние строки stderr в сессию и выводит их в свой собственный лог. Пользователь сессии видит эти строки, поэтому не выводите секреты в stderr и удалите `set -x` перед развёртыванием обёртки. Если вы перенаправите stderr, сессии по-прежнему будут работать, но средство выполнения будет сообщать о сбое только с кодом выхода.

63 81 

64<h3 id="pass-the-system-prompt-flags-through">82<h3 id="pass-the-system-prompt-flags-through">

65 Передавайте флаги системного промпта дальше83 Передавайте флаги системного промпта дальше


108 checkout126 checkout

109</h3>127</h3>

110 128 

111Запускается один раз на репозиторий вместо встроенного клонирования и получения данных runner'а. Используйте хук для клонирования из зеркала сквозного доступа, инициализации рабочего дерева из архива или применения аутентификации git для каждой сессии. Runner устанавливает эти переменные, а также может устанавливать другие переменные `CLAUDE_RUNNER_`, которых нет в таблице:129Запускается один раз на репозиторий вместо встроенного клонирования и получения данных runner'а. Используйте хук для клонирования из зеркала сквозного доступа, к которому вы обращаетесь по HTTPS или SSH, инициализации рабочего дерева из архива или применения аутентификации git для каждой сессии. Runner устанавливает эти переменные, а также может устанавливать другие переменные `CLAUDE_RUNNER_`, которых нет в таблице:

112 130 

113| Variable | Description |131| Variable | Description |

114| :- | :- |132| :- | :- |

115| `CLAUDE_RUNNER_REPO_URL` | URL репозитория для клонирования, после применения любых `--git-host-rewrite` и `--git-ssh-rewrite` |133| `CLAUDE_RUNNER_REPO_URL` | URL репозитория для клонирования, после применения любых `--git-host-rewrite` и `--git-ssh-rewrite` |

116| `CLAUDE_RUNNER_REPO_REF` | Ревизия для проверки: ветка, тег или SHA коммита, как её запросила сессия. Пусто означает ветку по умолчанию репозитория. |134| `CLAUDE_RUNNER_REPO_REF` | Ревизия для checkout в том виде, в каком её запросила сессия: ветка, тег, SHA коммита или полное имя ссылки, например `refs/pull/<number>/head`. Пустое значение означает ветку по умолчанию репозитория. |

117| `CLAUDE_RUNNER_CHECKOUT_PATH` | Абсолютный путь, где должно остаться рабочее дерево |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | Абсолютный путь, где должно остаться рабочее дерево |

118| `CLAUDE_RUNNER_SESSION_ID` | ID сессии в форме с тегом `session_...`, для логирования и корреляции |136| `CLAUDE_RUNNER_SESSION_ID` | ID сессии в форме с тегом `session_...`, для логирования и корреляции |

119| `CLAUDE_RUNNER_SESSION_UUID` | Тот же ID сессии в канонической форме UUID |137| `CLAUDE_RUNNER_SESSION_UUID` | Тот же ID сессии в канонической форме UUID |

120| `CLAUDE_RUNNER_API_BASE_URL` | Базовый URL API Anthropic для вызовов в области сессии |138| `CLAUDE_RUNNER_API_BASE_URL` | Базовый URL API Anthropic для вызовов в области сессии |

121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Поверхность клиента, которая создала сессию, такая как `web_claude_ai`, `desktop_app` или `ios`. Не установлено, когда сессия не имеет записанной или распознанной поверхности. |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Интерфейс клиента, который создал сессию, например `web_claude_ai`, `desktop_app` или `ios`. Не установлена, если у сессии нет записанного или распознанного интерфейса, поэтому при `set -u` ссылайтесь на неё как `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`. Требуется Claude Code v2.1.229 или новее. |

122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Токен доступа сессии для вызовов API в области сессии |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Токен доступа сессии для вызовов API в области сессии |

123| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Настройки git, которые runner фиксирует для git, запускаемого вашим хуком. Они описаны в разделе [Конфигурация git внутри хуков жизненного цикла](#git-configuration-inside-lifecycle-hooks). Требуется Claude Code v2.1.280 или новее. |141| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Настройки git, которые runner фиксирует для git, запускаемого вашим хуком. Они описаны в разделе [Конфигурация git внутри хуков жизненного цикла](#git-configuration-inside-lifecycle-hooks). Требуется Claude Code v2.1.280 или новее. |

124 142 

125Скрипт должен оставить рабочее дерево в `CLAUDE_RUNNER_CHECKOUT_PATH`, проверенное на запрошенной ревизии. Отсоединённая HEAD в порядке; runner создаёт рабочую ветку сессии сверху. Runner проверяет, что путь содержит `.git` после этого; если ваш hook материализует источник, не основанный на git, такой как Perforce или распакованный tarball, установите `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` в окружении runner'а, чтобы пропустить эту проверку. Потоки на основе Git, такие как создание рабочей ветки и отправка результатов, требуют проверки git, поэтому экспортируйте результаты из деревьев, не основанных на git, с помощью [`post-session` hook](#post-session).143Скрипт должен оставить в `CLAUDE_RUNNER_CHECKOUT_PATH` рабочее дерево, переключённое на запрошенную ревизию. Отсоединённый HEAD подходит, потому что runner создаёт рабочую ветку сессии поверх него.

126 144 

127Runner не передаёт учётные данные git в hook. Вместо этого создайте учётные данные клонирования для каждой сессии из идентификации сессии: проверьте `CLAUDE_CODE_SESSION_ACCESS_TOKEN` с помощью стандартной библиотеки JWT для конечной точки JWKS под `CLAUDE_RUNNER_API_BASE_URL`, как описано в [Verify the token from your service](/docs/ru/self-hosted-environments-identity#verify-the-token-from-your-service), затем попросите вашу службу учётных данных выдать краткосрочные учётные данные клонирования для идентификации в утверждении `act` токена. `CLAUDE_RUNNER_CLAUDE_BIN` не установлен в окружении checkout-hook, поэтому подкоманда `decode-token` недоступна здесь. Возврат к любой аутентификации git, которая уже есть на хосте, такой как SSH агент, помощник учётных данных или `.netrc`, также является вариантом.145После возврата вашего хука runner проверяет, что `CLAUDE_RUNNER_CHECKOUT_PATH` содержит `.git`. Если ваш хук материализует источник, не основанный на git, такой как Perforce или распакованный tarball, установите `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` в окружении runner'а, чтобы пропустить эту проверку. Потоки на основе Git, такие как создание рабочей ветки и отправка результатов, требуют checkout git, поэтому экспортируйте результаты из деревьев, не основанных на git, с помощью [хука `post-session`](#post-session).

128 146 

129Когда hook завершается с ненулевым кодом или завершается с кодом 0 без оставления пригодной для использования проверки, то, что делает runner, зависит от репозитория:147<h4 id="get-git-credentials-in-the-hook">

148 Получение учётных данных git в хуке

149</h4>

130 150 

131* **Репозиторий, в который сессия отправляет результаты**: runner отмечает сеанс как неудачный, и при ненулевом выходе выводит пользователю конец stderr скрипта.151Runner не передаёт учётные данные git в хук. Подкоманда `decode-token` здесь тоже недоступна, потому что `CLAUDE_RUNNER_CLAUDE_BIN` не установлена в окружении хука checkout. Вместо этого создайте учётные данные клонирования для каждой сессии на основе идентичности сессии или вернитесь к собственной аутентификации git хоста:

132* **Репозиторий, из которого сессия только читает**, такой как репозиторий, добавленный к запущенной сессии: runner логирует строку `[runner:warn]` с деталями отказа, отправляет шаг `Skipped` в сессию, удаляет всё, что hook оставил в пути проверки, и продолжает с оставшимися репозиториями. Когда runner не может немедленно удалить путь, он повторяет удаление в конце сессии. Если пропуск оставляет сессию вообще без репозитория, runner отмечает сеанс как неудачный в любом случае.

133 152 

134До v2.1.228 runner отмечал сеанс как неудачный при отказе hook для любого репозитория, поэтому репозиторий только для чтения, который hook не мог обслуживать, отмечал сеанс как неудачный снова при каждом новом runner'е, на котором сессия возобновлялась.153* **Учётные данные клонирования для каждой сессии**: проверьте `CLAUDE_CODE_SESSION_ACCESS_TOKEN` с помощью стандартной библиотеки JWT по эндпоинту JWKS под `CLAUDE_RUNNER_API_BASE_URL`, как описано в разделе [Verify the token from your service](/docs/ru/self-hosted-environments-identity#verify-the-token-from-your-service). Затем попросите вашу службу учётных данных выдать краткосрочные учётные данные клонирования для идентичности из утверждения `act` токена. Привязывайте эти учётные данные к `act.sub` и не требуйте `act.email`.

154* **Аутентификация git хоста**: используйте любую аутентификацию git, которая уже есть на хосте, например SSH-агент, помощник учётных данных или `.netrc`.

135 155 

136Runner удаляет путь проверки после завершения сессии.156<h4 id="when-the-hook-fails">

157 Когда хук завершается ошибкой

158</h4>

159 

160Хук считается завершившимся ошибкой, если он завершается с ненулевым кодом или завершается с кодом 0, не оставив пригодного для использования checkout:

161 

162* **Репозиторий, в который сессия отправляет результаты**: runner отмечает сеанс как неудачный, и при ненулевом выходе выводит пользователю конец stderr скрипта.

163* **Репозиторий, из которого сессия только читает**, например репозиторий, добавленный к запущенной сессии: runner записывает в лог строку `[runner:warn]` с подробностями ошибки, отправляет в сессию шаг `Skipped`, удаляет всё, что хук оставил по пути checkout, и продолжает работу с оставшимися репозиториями. Если после пропуска у сессии не остаётся ни одного репозитория, runner всё равно отмечает сессию как неудачную.

164 

165Если хук завершается успешно, runner удаляет путь checkout после завершения сессии.

137 166 

138<h3 id="post-session">167<h3 id="post-session">

139 post-session168 post-session


151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Разделённые двоеточиями абсолютные пути рабочих деревьев сессии. Пусто для сессий с нулевым репозиторием. |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Разделённые двоеточиями абсолютные пути рабочих деревьев сессии. Пусто для сессий с нулевым репозиторием. |

152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Путь к логу отладки сессии, всё ещё на диске во время выполнения hook'а |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Путь к логу отладки сессии, всё ещё на диске во время выполнения hook'а |

153| `CLAUDE_RUNNER_API_BASE_URL` | Базовый URL API Anthropic для вызовов в области сессии |182| `CLAUDE_RUNNER_API_BASE_URL` | Базовый URL API Anthropic для вызовов в области сессии |

154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Поверхность клиента, которая создала сессию, такая как `web_claude_ai`, `desktop_app` или `ios`. Не установлено, когда сессия не имеет записанной или распознанной поверхности. Требует Claude Code v2.1.229 или позже. |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Интерфейс клиента, который создал сессию, например `web_claude_ai`, `desktop_app` или `ios`. Не установлена, если у сессии нет записанного или распознанного интерфейса, поэтому при `set -u` ссылайтесь на неё как `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`. Требуется Claude Code v2.1.229 или новее. |

155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Токен доступа сессии для вызовов API в области сессии |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Токен доступа сессии для вызовов API в области сессии |

156| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Настройки git, которые runner фиксирует для git, запускаемого вашим хуком. Они описаны в разделе [Конфигурация git внутри хуков жизненного цикла](#git-configuration-inside-lifecycle-hooks). Требуется Claude Code v2.1.280 или новее. |185| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Настройки git, которые runner фиксирует для git, запускаемого вашим хуком. Они описаны в разделе [Конфигурация git внутри хуков жизненного цикла](#git-configuration-inside-lifecycle-hooks). Требуется Claude Code v2.1.280 или новее. |

157 186 

158`CLAUDE_RUNNER_EXIT_REASON` принимает одно из четырёх значений:187`CLAUDE_RUNNER_EXIT_REASON` принимает одно из четырёх значений:

159 188 

160* `completed`: сессия завершилась чисто. Процесс Claude Code завершился нормально, или сессия была архивирована или удалена, пока она всё ещё работала.189* `completed`: сессия завершилась чисто. Процесс Claude Code завершился нормально или завершился сам после того, как сессия была архивирована или удалена.

161* `failed`: процесс Claude Code упал, или настройка не удалась после его запуска.190* `failed`: процесс Claude Code упал, или настройка не удалась после его запуска.

162* `interrupted`: runner остановил сессию. Он освободил сессию, чтобы освободить слот, сессия истекла при запуске, сервер переместил сессию с этого runner'а, runner был в режиме дренирования, или сессия превысила свой лимит [`--kill-session-after-min`](/docs/ru/self-hosted-environments-reference#runner-cli-flags).191* `interrupted`: runner остановил сессию в одном из следующих случаев:

192 * Runner освободил сессию, чтобы освободить слот.

193 * Истекло время ожидания сессии при запуске.

194 * Сервер переместил сессию с этого runner'а.

195 * Опрос runner'а обнаружил архивирование или удаление до завершения процесса.

196 * Runner был в режиме дренирования.

197 * Сессия превысила свой лимит [`--kill-session-after-min`](/docs/ru/self-hosted-environments-reference#runner-cli-flags).

163* `abandoned`: зарезервировано для сессии, которую заявил другой runner. Hook в настоящее время не срабатывает в этом случае.198* `abandoned`: зарезервировано для сессии, которую заявил другой runner. Hook в настоящее время не срабатывает в этом случае.

164 199 

165[Счётчики жизненного цикла сессии](/docs/ru/self-hosted-environments-reference#session-lifecycle-counter-semantics) считают освобождение, истечение времени при запуске и перемещение сервера как `completed` вместо `interrupted`, потому что runner чисто вернул слот. Ожидайте этого различия, если вы сравниваете квитанции hook'а со счётчиками.200Если вы сравниваете квитанции хука со [счётчиками жизненного цикла сессии](/docs/ru/self-hosted-environments-reference#session-lifecycle-counter-semantics), ожидайте, что некоторые квитанции `interrupted` будут учтены там как `completed`. Счётчики считают освобождение, истечение времени при запуске, перемещение сервером, а также архивирование или удаление, которые первым обнаружил опрос runner'а, как `completed`, потому что runner чисто вернул слот.

166 201 

167Статус выхода hook'а никогда не влияет на результат сессии; отказ логируется и игнорируется. Runner ждёт до `--post-session-hook-timeout-sec`, 60 секунд по умолчанию, при каждом завершении сессии, включая завершение runner'а. Этот пример сохраняет незафиксированную работу в ветку спасения:202Статус выхода hook'а никогда не влияет на результат сессии; отказ логируется и игнорируется. Runner ждёт до `--post-session-hook-timeout-sec`, 60 секунд по умолчанию, при каждом завершении сессии, включая завершение runner'а. Этот пример сохраняет незафиксированную работу в ветку спасения:

168 203 

169```bash theme={null}204```bash theme={null}

170#!/usr/bin/env bash205#!/usr/bin/env bash

171set -u206set -u

207export GIT_ALLOW_PROTOCOL=${GIT_ALLOW_PROTOCOL:-https:http:ssh}

172IFS=':'208IFS=':'

173# -c overrides beat repo-local settings, blocking session-written fsmonitor,209# -c overrides beat repo-local settings, blocking session-written fsmonitor,

174# hook-path, and gpg-program config from executing code with the hook's210# hook-path, and gpg-program config from executing code with the hook's


188done224done

189```225```

190 226 

227Строка `GIT_ALLOW_PROTOCOL` в скрипте ограничивает git удалёнными репозиториями по HTTPS, HTTP и SSH. Если окружение runner'а уже задаёт собственный непустой список `GIT_ALLOW_PROTOCOL`, скрипт сохраняет этот список.

228 

191Хук выполняет push с любыми учётными данными git, доступными в его собственном окружении на хосте runner'а. При [подходе без учётных данных в образе](/docs/ru/self-hosted-environments-deploy#configure-git), в том числе когда встроенное клонирование проходит через git-прокси Anthropic, их нет, поэтому перед push создайте краткосрочные учётные данные для отправки внутри хука: обменяйте токен сессии, который хук получает в `CLAUDE_CODE_SESSION_ACCESS_TOKEN`, в вашей собственной службе токенов, предварительно проверив его, как описано в разделе [Проверка идентичности сессии](/docs/ru/self-hosted-environments-identity). Когда у хука есть учётные данные, которых не было у сессии, замените `origin` на URL, предоставленный оператором, и передайте `-c credential.helper=` вместе с вашим собственным помощником. Раздел [Конфигурация git внутри хуков жизненного цикла](#git-configuration-inside-lifecycle-hooks) описывает, на что всё ещё может влиять конфигурация, записанная сессией.229Хук выполняет push с любыми учётными данными git, доступными в его собственном окружении на хосте runner'а. При [подходе без учётных данных в образе](/docs/ru/self-hosted-environments-deploy#configure-git), в том числе когда встроенное клонирование проходит через git-прокси Anthropic, их нет, поэтому перед push создайте краткосрочные учётные данные для отправки внутри хука: обменяйте токен сессии, который хук получает в `CLAUDE_CODE_SESSION_ACCESS_TOKEN`, в вашей собственной службе токенов, предварительно проверив его, как описано в разделе [Проверка идентичности сессии](/docs/ru/self-hosted-environments-identity). Когда у хука есть учётные данные, которых не было у сессии, замените `origin` на URL, предоставленный оператором, и передайте `-c credential.helper=` вместе с вашим собственным помощником. Раздел [Конфигурация git внутри хуков жизненного цикла](#git-configuration-inside-lifecycle-hooks) описывает, на что всё ещё может влиять конфигурация, записанная сессией.

192 230 

193<h4 id="hook-timing-when-the-runner-releases-a-session">231<h4 id="hook-timing-when-the-runner-releases-a-session">


264| `CLAUDE_RUNNER_ORDER_ID` | Непрозрачный ключ идемпотентности, уникальный для каждого запроса на порождение и безопасный для имен ресурсов Kubernetes. Используйте только ID заказа как ключ дедупликации вашего провизионера. |302| `CLAUDE_RUNNER_ORDER_ID` | Непрозрачный ключ идемпотентности, уникальный для каждого запроса на порождение и безопасный для имен ресурсов Kubernetes. Используйте только ID заказа как ключ дедупликации вашего провизионера. |

265| `CLAUDE_RUNNER_SESSION_ID` | Сеанс, для которого предназначен этот запрос. Он повторяется при каждом повторном запросе для сеанса, поэтому используйте его для логирования и маршрутизации, а не как ключ дедупликации. Пусто для запросов предварительного прогрева, которые загружают резервное средство выполнения перед любым конкретным сеансом, когда установлен [`--min-idle`](/docs/ru/self-hosted-environments-reference#orchestrator-cli-flags), поэтому не предполагайте, что переменная установлена. |303| `CLAUDE_RUNNER_SESSION_ID` | Сеанс, для которого предназначен этот запрос. Он повторяется при каждом повторном запросе для сеанса, поэтому используйте его для логирования и маршрутизации, а не как ключ дедупликации. Пусто для запросов предварительного прогрева, которые загружают резервное средство выполнения перед любым конкретным сеансом, когда установлен [`--min-idle`](/docs/ru/self-hosted-environments-reference#orchestrator-cli-flags), поэтому не предполагайте, что переменная установлена. |

266| `CLAUDE_RUNNER_SESSION_UUID` | Тот же ID сеанса в канонической форме UUID. Пусто для запросов предварительного прогрева. |304| `CLAUDE_RUNNER_SESSION_UUID` | Тот же ID сеанса в канонической форме UUID. Пусто для запросов предварительного прогрева. |

267| `CLAUDE_RUNNER_ATTEMPT` | Сколько запросов на порождение было у этого сеанса. `0` для запросов предварительного прогрева. |305| `CLAUDE_RUNNER_ATTEMPT` | Счётчик для каждой сессии, предназначенный для логирования. Это не число повторных попыток и не число запросов. `0` для запросов предварительного прогрева, хотя запрос для сессии тоже может содержать `0`. |

268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Время сервера из заголовка HTTP `Date` ответа опроса. Когда хук проверяет `exp` JWT наряда на работу, сравнивайте с этим значением вместо локальных часов, чтобы допустить перекос. Пусто, когда шлюз опустил заголовок. |306| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Время сервера из заголовка HTTP `Date` ответа опроса. Когда хук проверяет `exp` JWT наряда на работу, сравнивайте с этим значением вместо локальных часов, чтобы допустить перекос. Пусто, когда шлюз опустил заголовок. |

269| `CLAUDE_RUNNER_POOL_ID` | ID окружения, к которому должно присоединиться новое средство выполнения, в форме `ccpool_...` |307| `CLAUDE_RUNNER_POOL_ID` | ID окружения, к которому должно присоединиться новое средство выполнения, в форме `ccpool_...` |

270| `CLAUDE_RUNNER_ACCOUNT_ID` | Помеченный ID учетной записи, которая поставила сеанс в очередь, для маршрутизации по учетной записи, квоты или возврата средств. Пусто, когда недоступно, и всегда пусто для сеансов канала Claude Tag, которые не ставит в очередь ни одна учетная запись. |308| `CLAUDE_RUNNER_ACCOUNT_ID` | Помеченный ID учетной записи, которая поставила сеанс в очередь, для маршрутизации по учетной записи, квоты или возврата средств. Пусто, когда недоступно, и всегда пусто для сеансов канала Claude Tag, которые не ставит в очередь ни одна учетная запись. |

271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Электронная почта учетной записи, которая поставила сеанс в очередь. Пусто, когда недоступно. Рассматривайте электронную почту как личную информацию и не логируйте ее. |309| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Электронная почта учетной записи, которая поставила сеанс в очередь. Пусто, когда недоступно. Рассматривайте электронную почту как личную информацию и не логируйте ее. |

272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL первого источника git сеанса для маршрутизации на средство выполнения с этим репозиторием предварительно прогретым. Пусто, когда сеанс не имеет источников git. |310| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL первого источника git сеанса для маршрутизации на средство выполнения с этим репозиторием предварительно прогретым. Пусто, когда сеанс не имеет источников git. |

273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Ревизия первого источника git сеанса: ветка, SHA или тег. Пусто, когда не указано. |311| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Ревизия первого git-источника сессии: ветка, SHA, тег или полное имя ссылки. Пусто, когда не указано. |

274| `CLAUDE_RUNNER_REPO_SOURCES` | JSON массив `{url, revision}` для всех источников git сеанса для хуков, которые маршрутизируют на вторичный репозиторий. Пусто, когда нет источников. |312| `CLAUDE_RUNNER_REPO_SOURCES` | JSON массив `{url, revision}` для всех источников git сеанса для хуков, которые маршрутизируют на вторичный репозиторий. Пусто, когда нет источников. |

275| `CLAUDE_RUNNER_CORRELATION_ID` | ID корреляции, предоставленный при создании сеанса, повторно отправленный, чтобы хук мог сопоставить этот наряд на работу с запросом, который создал сеанс. Пусто, когда сеанс не имеет ни одного. |313| `CLAUDE_RUNNER_CORRELATION_ID` | ID корреляции, предоставленный при создании сеанса, повторно отправленный, чтобы хук мог сопоставить этот наряд на работу с запросом, который создал сеанс. Пусто, когда сеанс не имеет ни одного. |

276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Поверхность клиента, которая создала сеанс, такая как `web_claude_ai`, `desktop_app`, `ios` или `scheduled_trigger`, для аналитики внедрения. Не установлена, когда сеанс не имеет записанной или распознанной поверхности, и для запросов предварительного прогрева; проверьте ее с помощью `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, что остается безопасным под `set -u`. |314| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Поверхность клиента, которая создала сеанс, такая как `web_claude_ai`, `desktop_app`, `ios` или `scheduled_trigger`, для аналитики внедрения. Не установлена, когда сеанс не имеет записанной или распознанной поверхности, и для запросов предварительного прогрева; проверьте ее с помощью `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, что остается безопасным под `set -u`. |


282* **Используйте `--capacity 1` на порожденных средствах выполнения**: наряд на работу, привязанный к сеансу, регистрирует ровно одно средство выполнения, привязанное к этому сеансу, поэтому более высокая емкость добавляет слоты, которые никогда не получают работу, и средство выполнения логирует предупреждение при запуске.320* **Используйте `--capacity 1` на порожденных средствах выполнения**: наряд на работу, привязанный к сеансу, регистрирует ровно одно средство выполнения, привязанное к этому сеансу, поэтому более высокая емкость добавляет слоты, которые никогда не получают работу, и средство выполнения логирует предупреждение при запуске.

283* **Нарядные работы предварительного прогрева регистрируют без привязки**: резервное средство выполнения не привязано к сеансу и заявляет поставленную в очередь работу, как средство выполнения фиксированного флота.321* **Нарядные работы предварительного прогрева регистрируют без привязки**: резервное средство выполнения не привязано к сеансу и заявляет поставленную в очередь работу, как средство выполнения фиксированного флота.

284 322 

285Контракт имеет четыре правила, независимые от провизионера:323Контракт состоит из четырёх правил, независимо от того, на какой платформе ваш хук выделяет ресурсы:

286 324 

2871. **Будьте идемпотентны на `CLAUDE_RUNNER_ORDER_ID`.** Переделивка одного и того же запроса должна порождать не более одного средства выполнения. Выведите детерминированное имя ресурса из ID заказа и позвольте вашей платформе отклонить дубликат. Не ключируйте на `CLAUDE_RUNNER_SESSION_ID` вместо этого. Каждый повторный запрос для сеанса несет тот же ID сеанса с новым ID заказа, поэтому рабочая нагрузка, названная или дедуплицированная по ID сеанса, создается один раз и никогда снова для этого сеанса.3251. **Будьте идемпотентны на `CLAUDE_RUNNER_ORDER_ID`.** Переделивка одного и того же запроса должна порождать не более одного средства выполнения. Выведите детерминированное имя ресурса из ID заказа и позвольте вашей платформе отклонить дубликат. Не ключируйте на `CLAUDE_RUNNER_SESSION_ID` вместо этого. Каждый повторный запрос для сеанса несет тот же ID сеанса с новым ID заказа, поэтому рабочая нагрузка, названная или дедуплицированная по ID сеанса, создается один раз и никогда снова для этого сеанса.

2882. **Не повторяйте рабочую нагрузку.** Один ID заказа означает не более одной созданной рабочей нагрузки. Если средство выполнения никогда не регистрируется, Anthropic повторно запрашивает с новым ID заказа после `--expected-spawn-seconds`.3262. **Не повторяйте рабочую нагрузку.** Один ID заказа означает не более одной созданной рабочей нагрузки. Если средство выполнения никогда не регистрируется, Anthropic повторно запрашивает с новым ID заказа после `--expected-spawn-seconds`.

2893. **Используйте контракт кода выхода.** Выход 0 означает отправлено. Выход 1 означает повторяемый отказ; сеанс отступает и переоффертируется. Выход 2 или выше означает неповторяемый; сеанс блокируется от порождения снова до тех пор, пока [владелец](/docs/ru/cloud-environments#organization-shared-environments) не выберет **Retry** на нем на вкладке **Activity** окружения. При ненулевом выходе хвост stderr хука появляется там как причина отказа, поэтому напишите действенную ошибку в stderr и никогда не секреты. Для запроса предварительного прогрева нет сеанса для отказа: оркестратор логирует ненулевой выход локально только, и сервер повторно запрашивает порождение после аренды.3273. **Соблюдайте контракт кода выхода.** Завершайтесь со статусом, соответствующим результату:

2904. **Установите `--expected-spawn-seconds` на по крайней мере ваше время загрузки p99.** Это аренда на стороне сервера. Все реплики оркестратора должны использовать одно и то же значение.328 

329 * **Выход 0**: отправлено.

330 * **Выход 1**: сбой, допускающий повторную попытку. Сессия выжидает и предлагается снова.

331 * **Выход 2 или выше**: сбой, не допускающий повторной попытки. Сессия блокируется от повторного порождения до тех пор, пока пользователь не отправит ей новое сообщение или [Owner](/docs/ru/cloud-environments#organization-shared-environments) не выберет для неё **Retry** на вкладке **Activity** окружения.

332 

333 При ненулевом выходе конец stderr хука отображается на вкладке **Activity** как причина сбоя, поэтому пишите в stderr понятную ошибку, указывающую, что делать, и никогда не пишите туда секреты. В shell-хуке [сохраняйте временные сбои повторяемыми](#keep-transient-failures-retryable-in-a-shell-hook).

334 

335 У запроса предварительного прогрева нет сессии, которая могла бы завершиться сбоем: оркестратор записывает ненулевой выход только в локальный лог, а сервер повторно запрашивает порождение после истечения аренды `--expected-spawn-seconds`.

3364. **Установите `--expected-spawn-seconds` не меньше вашего времени p99 от запроса на порождение до регистрации средства выполнения.** Отсчитывайте от момента, когда оркестратор получает запрос на порождение, и учитывайте как ожидание ресурсов на вашей платформе, так и время загрузки. Это значение является арендой на стороне сервера, и наряд на работу истекает вместе с ней, поэтому средство выполнения, рабочая нагрузка которого запускается дольше, не сможет зарегистрироваться. Все реплики оркестратора должны использовать одно и то же значение.

291 337 

292Все, что хук пишет в stdout или stderr, появляется в логе оркестратора с автоматически удаленными учетными данными. Если сеансы остаются в очереди, проверьте тело `/healthz` оркестратора на предмет количества в очереди, затем откройте вкладку **Activity** вашего окружения на [странице администратора **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): разверните неудачный сеанс там для его ошибки порождения и выберите **Retry** для повторного запроса.338Все, что хук пишет в stdout или stderr, появляется в логе оркестратора с автоматически удаленными учетными данными. Если сеансы остаются в очереди, проверьте тело `/healthz` оркестратора на предмет количества в очереди, затем откройте вкладку **Activity** вашего окружения на [странице администратора **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): разверните неудачный сеанс там для его ошибки порождения и выберите **Retry** для повторного запроса.

293 339 

294Сеанс, который остается в очереди без ошибки порождения на вкладке **Activity**, может означать, что хук ключируется по ID сеанса. Чтобы подтвердить, проверьте, есть ли на вашей платформе рабочая нагрузка для первого запроса порождения этого сеанса и нет ни одной для повторных запросов. Если это так, ключируйте рабочую нагрузку на `CLAUDE_RUNNER_ORDER_ID` вместо этого.340Сеанс, который остается в очереди без ошибки порождения на вкладке **Activity**, может означать, что хук ключируется по ID сеанса. Чтобы подтвердить, проверьте, есть ли на вашей платформе рабочая нагрузка для первого запроса порождения этого сеанса и нет ни одной для повторных запросов. Если это так, ключируйте рабочую нагрузку на `CLAUDE_RUNNER_ORDER_ID` вместо этого.

295 341 

342<h4 id="keep-transient-failures-retryable-in-a-shell-hook">

343 Сохраняйте временные сбои повторяемыми в shell-хуке

344</h4>

345 

346В shell-хуке, использующем `set -e`, сбой, который могла бы устранить повторная попытка, может заблокировать сессию. Хук останавливается на сбойной команде и завершается с собственным статусом этой команды, а оркестратор применяет контракт кода выхода к этому статусу. Многие сбои возвращают статус 2 или выше, например `127`, когда команда не установлена, и `22` от `curl --fail` при ошибке HTTP, поэтому они блокируют сессию при первом же сбое.

347 

348Сессия, которую хук уже заблокировал, остаётся заблокированной, пока пользователь не отправит ей новое сообщение или [Owner](/docs/ru/cloud-environments#organization-shared-environments) не выберет для неё **Retry** на вкладке **Activity** окружения.

349 

350Чтобы вместо этого превращать такой сбой в выход 1, поместите эти строки сразу под строкой `#!` хука, перед всем, что может завершиться сбоем:

351 

352```bash theme={null}

353set -e

354PERMANENT=; permanent() { printf '%s\n' "$*" >&2; PERMANENT=1; exit 2; }

355trap 'rc=$?; [ "$rc" -eq 0 ] || [ -n "${PERMANENT:-}" ] || exit 1' EXIT

356```

357 

358Эти строки меняют поведение остальной части хука, поэтому после их добавления проверьте хук на каждый из следующих шаблонов:

359 

360* **Просто `exit 2` или выше**: при установленной ловушке он превращается в выход 1. Для ошибки, которую не исправит никакая повторная попытка, вместо этого вызовите `permanent` с указанием причины, например `permanent "namespace claude-runners does not exist"`. Вызывайте её в основной оболочке, а не внутри `$( )`, `( )` или конвейера.

361* **`exec`**: не начинайте последнюю команду хука с `exec`, потому что `exec` заменяет оболочку, и ловушка не выполняется.

362* **Вторая ловушка `EXIT`**: второй `trap ... EXIT` заменяет первый, поэтому объедините их в одну ловушку. Поместите команды очистки сразу после `rc=$?;` и завершите каждую `|| true;`. Тогда очистка выполняется как при сбое, так и при успехе, а сбойная команда очистки не влияет на статус выхода хука. Эта объединённая ловушка показывает структуру, где `your-cleanup-command` заменяет вашу собственную команду:

363 

364 ```bash theme={null}

365 trap 'rc=$?; your-cleanup-command || true; [ "$rc" -eq 0 ] || [ -n "${PERMANENT:-}" ] || exit 1' EXIT

366 ```

367* **Команды, которым разрешено завершаться сбоем**: если хук раньше не использовал `set -e`, теперь он останавливается на первой команде, вернувшей ненулевой статус, например на поиске, который ничего не нашёл, или на повторной отправке, которую отклоняет ваша платформа. Если хук использует результат, сделайте эту команду условием `if`. Если он игнорирует результат, добавьте после команды `|| true`.

368 

369Чтобы убедиться, что ловушка работает, добавьте сразу под строкой `trap` строку, вызывающую несуществующую команду, например `no-such-command`. Запустите файл хука из своей оболочки и убедитесь, что `echo $?` выводит `1`, затем удалите эту строку.

370 

296<h2 id="send-model-requests-to-bedrock-or-agent-platform">371<h2 id="send-model-requests-to-bedrock-or-agent-platform">

297 Отправка запросов к модели в Bedrock или Agent Platform372 Отправка запросов к модели в Bedrock или Agent Platform

298</h2>373</h2>


381Сессия, отправляющая запросы к модели в Amazon Bedrock или Google Cloud's Agent Platform, отличается от сессии в Anthropic API следующим:456Сессия, отправляющая запросы к модели в Amazon Bedrock или Google Cloud's Agent Platform, отличается от сессии в Anthropic API следующим:

382 457 

383* **Политики из claude.ai**: [настройки, управляемые сервером](/docs/ru/server-managed-settings), не доходят до этих сессий. Не доходят и политики организации, которые Owner задаёт в настройках администратора Claude Code, поэтому Claude Code не применяет их внутри сессии. Поместите правила, на которые вы полагаетесь, в [файл управляемых настроек](/docs/ru/managed-settings#delivery-mechanisms) образа runner.458* **Политики из claude.ai**: [настройки, управляемые сервером](/docs/ru/server-managed-settings), не доходят до этих сессий. Не доходят и политики организации, которые Owner задаёт в настройках администратора Claude Code, поэтому Claude Code не применяет их внутри сессии. Поместите правила, на которые вы полагаетесь, в [файл управляемых настроек](/docs/ru/managed-settings#delivery-mechanisms) образа runner.

459* **Скиллы аккаунта**: эти сессии не загружают скиллы, включённые для аккаунта claude.ai пользователя. См. [Как собирается конфигурация каждой сессии](#how-each-session’s-config-is-assembled).

384* **Файлы**: файлы, которые пользователи прикрепляют к сессии в claude.ai, мобильном или десктопном приложении, до неё не доходят, и Claude не может отправлять файлы обратно с помощью [инструмента `SendUserFile`](/docs/ru/tools-reference). Вместо этого размещайте входные файлы в репозитории или на runner.460* **Файлы**: файлы, которые пользователи прикрепляют к сессии в claude.ai, мобильном или десктопном приложении, до неё не доходят, и Claude не может отправлять файлы обратно с помощью [инструмента `SendUserFile`](/docs/ru/tools-reference). Вместо этого размещайте входные файлы в репозитории или на runner.

385* **Выбор модели**: управляющий уровень Anthropic передаёт модель для каждой сессии, а если сессия запускается без неё, Claude Code использует модель по умолчанию для провайдера. Runner удаляет `ANTHROPIC_MODEL` и `ANTHROPIC_DEFAULT_MODEL` из окружения, которое он передаёт сессиям. В примерах на страницах провайдеров задаётся `ANTHROPIC_MODEL`, но в окружении runner ни одна из этих переменных ни на что не влияет. Переменные для отдельных семейств из раздела «Закрепление версий моделей» для [Amazon Bedrock](/docs/ru/amazon-bedrock#4-pin-model-versions) и [Agent Platform](/docs/ru/google-vertex-ai#5-pin-model-versions) до сессий доходят. Они определяют, во что разрешается псевдоним, например `opus`, но не полный идентификатор модели.461* **Выбор модели**: управляющий уровень Anthropic передаёт модель для каждой сессии, а если сессия запускается без неё, Claude Code использует модель по умолчанию для провайдера. Вы не можете выбрать модель с помощью `ANTHROPIC_MODEL` или `ANTHROPIC_DEFAULT_MODEL` в окружении runner, но можете закрепить, во что разрешается псевдоним:

462 * **`ANTHROPIC_MODEL` и `ANTHROPIC_DEFAULT_MODEL`**: runner удаляет их из окружения, которое он передаёт сессиям, хотя в примерах на страницах провайдеров задаётся `ANTHROPIC_MODEL`.

463 * **Переменные закрепления для отдельных семейств**: переменные из раздела «Закрепление версий моделей» для [Amazon Bedrock](/docs/ru/amazon-bedrock#4-pin-model-versions) и [Agent Platform](/docs/ru/google-vertex-ai#5-pin-model-versions) до сессий доходят. Они определяют, во что разрешается псевдоним, например `opus`, но не полный идентификатор модели.

386* **Модели, которые ваш аккаунт не обслуживает**: сессия может завершиться ошибкой на сообщении с указанием модели. Включите модели, которые могут выбирать ваши разработчики, фоновую модель, описанную в разделе «Закрепление версий моделей», и модель классификатора, которую использует [авторежим](/docs/ru/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). В Amazon Bedrock разрешите каждую из них в своей политике.464* **Модели, которые ваш аккаунт не обслуживает**: сессия может завершиться ошибкой на сообщении с указанием модели. Включите модели, которые могут выбирать ваши разработчики, фоновую модель, описанную в разделе «Закрепление версий моделей», и модель классификатора, которую использует [авторежим](/docs/ru/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). В Amazon Bedrock разрешите каждую из них в своей политике.

387* **Веб-поиск и быстрый режим**: [веб-поиск](/docs/ru/tools-reference#websearch-tool-behavior) недоступен в Amazon Bedrock, а [быстрый режим](/docs/ru/fast-mode) недоступен ни у одного из этих провайдеров. О других возможностях, различающихся в зависимости от провайдера, см. [Возможности CLI, зависящие от провайдера](/docs/ru/feature-availability#cli-capabilities-that-vary-by-provider).465* **Веб-поиск и быстрый режим**: [веб-поиск](/docs/ru/tools-reference#websearch-tool-behavior) недоступен в Amazon Bedrock, а [быстрый режим](/docs/ru/fast-mode) недоступен ни у одного из этих провайдеров. О других возможностях, различающихся в зависимости от провайдера, см. [Возможности CLI, зависящие от провайдера](/docs/ru/feature-availability#cli-capabilities-that-vary-by-provider).

388 466 


411 489 

412Сессии наследуют окружение раннера, поэтому задайте там [`ENABLE_TOOL_SEARCH`](/docs/ru/mcp#scale-with-mcp-tool-search), чтобы управлять поиском инструментов MCP для каждой сессии, которую запускает раннер; допустимые значения описаны на странице MCP.490Сессии наследуют окружение раннера, поэтому задайте там [`ENABLE_TOOL_SEARCH`](/docs/ru/mcp#scale-with-mcp-tool-search), чтобы управлять поиском инструментов MCP для каждой сессии, которую запускает раннер; допустимые значения описаны на странице MCP.

413 491 

492<a id="connection-timing" />

493 

494<h3 id="wait-for-mcp-servers-before-the-first-turn">

495 Ожидание MCP-серверов перед первым ходом

496</h3>

497 

498Сессия на собственном хостинге ненадолго ожидает MCP-серверы, которые ещё подключаются, в двух разных точках. Если сервер не успевает к моменту окончания ожидания, его инструменты отсутствуют в начале первого хода и становятся доступны позже без каких-либо действий с вашей стороны. Вот эти две точки ожидания:

499 

500* **Запуск сессии**: до того как список инструментов будет получен в первый раз, сессия по умолчанию ждёт до 5 секунд сервер HTTP или SSE, в записи которого задано [`alwaysLoad: true`](/docs/ru/mcp#exempt-a-server-from-deferral), или все серверы, если в окружении раннера задано [`MCP_CONNECTION_NONBLOCKING=0`](/docs/ru/env-vars). В остальных случаях серверы HTTP и SSE подключаются в фоновом режиме. Пока сессия ждёт на этом этапе, она инициализируется медленнее. [`MCP_CONNECT_TIMEOUT_MS`](/docs/ru/env-vars) изменяет значение по умолчанию в 5 секунд.

501* **Первый ход**: после поступления сообщения первый ход ждёт до 2 секунд stdio-серверы, которые ещё подключаются. Пока сессия ждёт на этом этапе, первый ответ приходит медленнее. Чтобы изменить длительность этого ожидания, задайте [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/ru/env-vars) в окружении раннера. Эта переменная не меняет, какие серверы охватывает ожидание. Требуется Claude Code v2.1.274 или новее.

502 

503У `claude mcp add` нет флага `alwaysLoad`. Чтобы задать этот ключ, добавьте сервер командой `claude mcp add-json`, которая принимает его в JSON сервера и записывает в `.claude.json`. В вашем Dockerfile:

504 

505```dockerfile theme={null}

506RUN claude mcp add-json core '{"type":"http","url":"https://mcp.example.com/mcp","alwaysLoad":true}' --scope user

507```

508 

509Если инструменты сервера не появляются и в последующих ходах, проверьте, попал ли сервер в сессию вообще, как описано в разделе [MCP-серверы](#mcp-servers).

510 

414<h3 id="turn-off-built-in-session-tools">511<h3 id="turn-off-built-in-session-tools">

415 Отключение встроенных инструментов сессии512 Отключение встроенных инструментов сессии

416</h3>513</h3>


571 668 

572Установите `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` для заполнения из другого пути или укажите его на пустой каталог для отключения заполнения.669Установите `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` для заполнения из другого пути или укажите его на пустой каталог для отключения заполнения.

573 670 

574Закоммиченный в репозиторий `.claude/settings.json` накладывается сверху как настройки проекта. В сессии с несколькими репозиториями [действует файл не более чем одного репозитория](#repository-settings-in-sessions-with-several-repositories). Сессии также читают [`managed-settings.json`](/docs/ru/settings#where-settings-live) из стандартного системного пути в вашем образе средства выполнения. Применяются ли его ключи наряду с [управляемыми сервером настройками](/docs/ru/server-managed-settings), определяется тем, [как Claude Code объединяет управляемые источники](/docs/ru/managed-settings#how-claude-code-combines-managed-sources): по умолчанию, когда ваша организация доставляет какие-либо управляемые сервером ключи, сессии игнорируют файл из образа средства выполнения, за исключением [ключей, которые Claude Code читает из каждого источника администратора](/docs/ru/managed-settings#keys-read-from-every-admin-source), таких как блок `env`, блокировки песочницы, пути к исполняемым файлам песочницы и `forceRemoteSettingsRefresh`. См. [приоритет настроек](/docs/ru/settings#settings-precedence).671Сессии также читают следующие файлы настроек:

672 

673* **Настройки проекта**: закоммиченный в репозиторий `.claude/settings.json` накладывается поверх базовой конфигурации уровня пользователя. В сессии с несколькими репозиториями [действует файл не более чем одного репозитория](#repository-settings-in-sessions-with-several-repositories).

674* **Управляемые настройки**: сессии читают [`managed-settings.json`](/docs/ru/settings#where-settings-live) из стандартного системного пути в вашем образе средства выполнения. О том, применяются ли его ключи наряду с [управляемыми сервером настройками](/docs/ru/server-managed-settings), см. раздел [как Claude Code объединяет управляемые источники](/docs/ru/managed-settings#how-claude-code-combines-managed-sources).

675 

676О порядке применения этих источников см. [приоритет настроек](/docs/ru/settings#settings-precedence).

575 677 

576Когда плоскость управления Anthropic предоставляет сеансу [хуки Claude Code](/docs/ru/hooks), средство выполнения устанавливает их рядом, а не над вашей собственной конфигурацией. Требует Claude Code v2.1.229 или позже.678Когда плоскость управления Anthropic предоставляет сеансу [хуки Claude Code](/docs/ru/hooks), средство выполнения устанавливает их рядом, а не над вашей собственной конфигурацией. Требует Claude Code v2.1.229 или позже.

577 679 


579* **Кто их создает**: плоскость управления заполняет скрипты из фиксированных констант в своем собственном развертывании, никогда не из входных данных для каждого сеанса или третьей стороны.681* **Кто их создает**: плоскость управления заполняет скрипты из фиксированных констант в своем собственном развертывании, никогда не из входных данных для каждого сеанса или третьей стороны.

580* **Что по-прежнему их управляет**: хуки, доставленные через `--settings`, входят в обычную объединенную конфигурацию хука, а не в управляемый уровень, поэтому ваши управляемые настройки по-прежнему применяются. `disableAllHooks` отключает их, и они не входят в категории, которые [`allowManagedHooksOnly`](/docs/ru/settings-reference#allowmanagedhooksonly) сохраняет загруженными.682* **Что по-прежнему их управляет**: хуки, доставленные через `--settings`, входят в обычную объединенную конфигурацию хука, а не в управляемый уровень, поэтому ваши управляемые настройки по-прежнему применяются. `disableAllHooks` отключает их, и они не входят в категории, которые [`allowManagedHooksOnly`](/docs/ru/settings-reference#allowmanagedhooksonly) сохраняет загруженными.

581 683 

684Когда пользователь сам запускает свою сессию, Claude Code также загружает [скиллы, включённые для его учётной записи claude.ai](/docs/ru/skills#skills-in-cowork-and-cloud-sessions), в каталог конфигурации этой сессии. Запуск [routine](/docs/ru/routines) не получает скиллы своего владельца, а сессия, которая [отправляет запросы к модели в Bedrock или Agent Platform](#send-model-requests-to-bedrock-or-agent-platform), не загружает никаких скиллов. Если такой сессии нужен скилл, сделайте его коммит в `.claude/skills/` репозитория или добавьте его в образ средства выполнения.

685 

582Вне сессий [Claude Tag](https://claude.com/docs/claude-tag/overview) сессия в самостоятельно размещаемом окружении по умолчанию работает с отключённой [автоматической памятью](/docs/ru/memory#auto-memory). Для инструкций, которые должны сохраняться между сессиями, используйте `CLAUDE.md` в вашем образе средства выполнения или в репозитории.686Вне сессий [Claude Tag](https://claude.com/docs/claude-tag/overview) сессия в самостоятельно размещаемом окружении по умолчанию работает с отключённой [автоматической памятью](/docs/ru/memory#auto-memory). Для инструкций, которые должны сохраняться между сессиями, используйте `CLAUDE.md` в вашем образе средства выполнения или в репозитории.

583 687 

584Снимок `~/.claude/` хоста, который делает средство выполнения, не включает каталог `projects/`. Место хранения автоматической памяти по умолчанию находится внутри этого каталога. Если вы поместите туда файлы памяти, средство выполнения не перенесёт их в сессии, и они не включат автоматическую память.688Снимок `~/.claude/` хоста, который делает средство выполнения, не включает каталог `projects/`. Место хранения автоматической памяти по умолчанию находится внутри этого каталога. Если вы поместите туда файлы памяти, средство выполнения не перенесёт их в сессии, и они не включат автоматическую память.

Details

20 20 

21* **Эфемерные контейнеры для каждой сессии**: запускайте каждый процесс runner в свежем контейнере или VM, который уничтожается при выходе процесса, с `--capacity 1` и значением по умолчанию `--drain-grace-sec 0`, чтобы каждый контейнер обслуживал ровно одну сессию. При более высокой ёмкости или положительном периоде осушения один контейнер обслуживает несколько сессий от одного [заблокированного владельца](/docs/ru/self-hosted-environments#key-concepts); см. [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle). Не переиспользуйте файловую систему между перезапусками runner, кроме намеренной настройки [pre-warmed checkout](#reuse-a-pre-warmed-checkout), и никогда между владельцами.21* **Эфемерные контейнеры для каждой сессии**: запускайте каждый процесс runner в свежем контейнере или VM, который уничтожается при выходе процесса, с `--capacity 1` и значением по умолчанию `--drain-grace-sec 0`, чтобы каждый контейнер обслуживал ровно одну сессию. При более высокой ёмкости или положительном периоде осушения один контейнер обслуживает несколько сессий от одного [заблокированного владельца](/docs/ru/self-hosted-environments#key-concepts); см. [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle). Не переиспользуйте файловую систему между перезапусками runner, кроме намеренной настройки [pre-warmed checkout](#reuse-a-pre-warmed-checkout), и никогда между владельцами.

22 * <span id="processes-a-stopped-session-leaves" />Когда runner останавливает сессию, он не отправляет никакого сигнала процессу, который продолжает работать после завершения его shell-команды, например сервису, ставшему демоном. Уничтожение контейнера или VM завершает такой процесс.22 * <span id="processes-a-stopped-session-leaves" />Когда runner останавливает сессию, он не отправляет никакого сигнала процессу, который продолжает работать после завершения его shell-команды, например сервису, ставшему демоном. Уничтожение контейнера или VM завершает такой процесс.

23* **Нет широких учётных данных в образе**: не включайте долгоживущие SSH-ключи, учётные данные облачного провайдера или личные токены доступа, которые предоставляют больше, чем нужно сессии. Создавайте учётные данные, используемые во время сессии, такие как токены push или API, для каждой сессии из вашего [скрипта-обёртки](/docs/ru/self-hosted-environments-configuration#wrapper-scripts). Для начального клонирования, которое происходит перед запуском обёртки, используйте [хук жизненного цикла `checkout`](/docs/ru/self-hosted-environments-configuration#checkout) или [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy); см. [Configure git](#configure-git).23* **Нет широких учётных данных в образе**: не включайте долгоживущие SSH-ключи, учётные данные облачного провайдера или личные токены доступа, которые предоставляют больше, чем нужно сессии. Создавайте учётные данные, используемые во время сессии, такие как токены push или API, для каждой сессии из вашего [скрипта-обёртки](/docs/ru/self-hosted-environments-configuration#wrapper-scripts). Начальное клонирование происходит перед запуском обёртки, поэтому обрабатывайте его с помощью [хука жизненного цикла `checkout`](/docs/ru/self-hosted-environments-configuration#checkout) или с помощью [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), если все репозитории сессии находятся на github.com. Для обоих вариантов см. [Configure git](#configure-git).

24* **Держите учётные данные GitHub хоста вдали от сессий**: Claude может использовать любые учётные данные GitHub, которые может прочитать сессия, с любым доступом, который эти учётные данные предоставляют. Не допускайте, чтобы собственные учётные данные GitHub хоста runner с широкими правами попадали туда, где их может прочитать сессия. Такими учётными данными может быть личный токен доступа, токен, который `gh auth login` сохраняет для вашей учётной записи, или `GH_TOKEN` в окружении runner.

25 * **С [Anthropic-managed git](#use-the-anthropic-git-proxy)**: при наличии таких учётных данных Claude обращается к GitHub напрямую, а не через Anthropic-managed git.

26 * **Без Anthropic-managed git**: учётные данные для клонирования могут оставаться в образе, если вы ограничите их так строго, как описано в [Ship git config in your image](#ship-git-config-in-your-image).

24* **Держите секрет окружения вдали от хостов, запускающих сессии**: секрет окружения может регистрировать runners и получать любую сессию, поставленную в очередь в окружение. На фиксированном флоте он находится на каждом хосте runner, где код любой сессии может прочитать файл секрета. Предпочитайте [on-demand runners](/docs/ru/self-hosted-environments-configuration#on-demand-runners), где секрет остаётся на хосте оркестратора, который никогда не запускает пользовательский код, и каждый runner получает одноразовый наряд на работу, который регистрирует ровно один runner. На фиксированном флоте рассматривайте файл environment-secret как читаемый каждой сессией и ротируйте секрет после любого подозрения на компрометацию сессии.27* **Держите секрет окружения вдали от хостов, запускающих сессии**: секрет окружения может регистрировать runners и получать любую сессию, поставленную в очередь в окружение. На фиксированном флоте он находится на каждом хосте runner, где код любой сессии может прочитать файл секрета. Предпочитайте [on-demand runners](/docs/ru/self-hosted-environments-configuration#on-demand-runners), где секрет остаётся на хосте оркестратора, который никогда не запускает пользовательский код, и каждый runner получает одноразовый наряд на работу, который регистрирует ровно один runner. На фиксированном флоте рассматривайте файл environment-secret как читаемый каждой сессией и ротируйте секрет после любого подозрения на компрометацию сессии.

25* **Исходящий трафик по умолчанию запрещён**: ограничьте исходящий трафик контейнеров runner и сессии на границе вашей собственной сети в каждом окружении; [Default-deny egress](#default-deny-egress) описывает, что разрешить и почему.28* **Исходящий трафик по умолчанию запрещён**: ограничьте исходящий трафик контейнеров runner и сессии на границе вашей собственной сети в каждом окружении; [Default-deny egress](#default-deny-egress) описывает, что разрешить и почему.

26* **Наименьшие привилегии IAM хоста**: вычислительная идентификация, прикреплённая к хосту runner, такая как профиль экземпляра или учётная запись сервиса узла, должна предоставлять только то, что нужно самому runner. Сессии должны получать свои собственные учётные данные через ваш скрипт-обёртку, а не наследовать учётные данные хоста.29* **Наименьшие привилегии IAM хоста**: вычислительная идентификация, прикреплённая к хосту runner, такая как профиль экземпляра или учётная запись сервиса узла, должна предоставлять только то, что нужно самому runner. Сессии должны получать свои собственные учётные данные через ваш скрипт-обёртку, а не наследовать учётные данные хоста.


42 Защита работает независимо от [`--trust-workspace`](/docs/ru/self-hosted-environments-reference#runner-cli-flags) и не охватывает хуки репозитория, `.mcp.json` или правила Bash; см. [Permissions and tool approval](/docs/ru/self-hosted-environments-configuration#permissions-and-tool-approval), чтобы узнать, где должны находиться эти гранты.45 Защита работает независимо от [`--trust-workspace`](/docs/ru/self-hosted-environments-reference#runner-cli-flags) и не охватывает хуки репозитория, `.mcp.json` или правила Bash; см. [Permissions and tool approval](/docs/ru/self-hosted-environments-configuration#permissions-and-tool-approval), чтобы узнать, где должны находиться эти гранты.

43 46 

44<Note>47<Note>

45 Список разрешённых IP-адресов вашей организации по умолчанию не охватывает трафик self-hosted runner. Не полагайтесь на него как на сетевой контроль для трафика runner или сессий; вместо этого применяйте default-deny egress на границе вашей собственной сети и свяжитесь с командой вашего аккаунта Anthropic, если вы хотите применять список разрешённых IP-адресов для вашей организации.48 Если в вашей организации включён [список разрешённых IP-адресов](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting), добавьте публичные адреса исходящего трафика ваших runners и контейнеров сессий в список разрешённых перед их запуском. Если вы используете [on-demand runners](/docs/ru/self-hosted-environments-configuration#on-demand-runners), добавьте также адрес хоста оркестратора. Не полагайтесь на список разрешённых как на сетевой контроль для трафика runner или сессий. Вместо этого применяйте default-deny egress на границе вашей собственной сети.

46</Note>49</Note>

47 50 

48<h2 id="network-requirements">51<h2 id="network-requirements">


55 58 

56| Хост | Порт | Используется для |59| Хост | Порт | Используется для |

57| :- | :- | :- |60| :- | :- | :- |

58| `api.anthropic.com` | 443, HTTPS; WSS только для SCM connector | Плоскость управления runner и потоковая передача сеанса, вывод модели, флаги функций, аналитика продукта, [JWKS](/docs/ru/self-hosted-environments-identity) получение ключей, подпись коммитов, git proxy при установке `--use-anthropic-git-proxy` и туннель [SCM connector](/docs/ru/self-hosted-environments-reference#scm-connector-flags) оркестратора при установке `--scm-connector-host` |61| `api.anthropic.com` | 443, HTTPS; WSS для [git под управлением Anthropic](#use-the-anthropic-git-proxy) | Плоскость управления runner и потоковая передача сессии, вывод модели, флаги функций, аналитика продукта, получение ключей [JWKS](/docs/ru/self-hosted-environments-identity), подпись коммитов и git под управлением Anthropic при установке `--use-anthropic-git-proxy` |

59| Ваш git-хост, такой как `github.com` или ваш хост GitHub Enterprise | 443 или 22 | Клонирование и push репозиториев. Не требуется, если runner использует `--use-anthropic-git-proxy`, который маршрутизирует трафик git через `api.anthropic.com`. |62| Ваш git-хост, такой как `github.com` или ваш хост GitHub Enterprise | 443 или 22 | Клонирование и push репозиториев на каждом git-хосте, который используют сессии runner. Для runner, использующего [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), см. [когда путь к `github.com` всё ещё нужен](#github-com-egress-with-the-anthropic-git-proxy). |

63 

64<span id="github-com-egress-with-the-anthropic-git-proxy" />Runner, использующий [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), направляет свой git-трафик к `github.com` через `api.anthropic.com`, поэтому ему не нужен путь к git-хосту `github.com`. Этот путь всё ещё нужен, если вы устанавливаете `--push-outcome-on-release` или выполняете push из хука `post-session`.

60 65 

61Требуются ли эти хосты, зависит от вашей конфигурации:66Требуются ли эти хосты, зависит от вашей конфигурации:

62 67 


71| `browser-intake-us5-datadoghq.com` | 443 | Загрузки отчетов об ошибках Anthropic, отправляемые только когда [отчетность об ошибках](/docs/ru/data-usage#telemetry-services) включена для учетной записи сеанса. Подавляется `DISABLE_ERROR_REPORTING=1` или `DISABLE_TELEMETRY=1`. |76| `browser-intake-us5-datadoghq.com` | 443 | Загрузки отчетов об ошибках Anthropic, отправляемые только когда [отчетность об ошибках](/docs/ru/data-usage#telemetry-services) включена для учетной записи сеанса. Подавляется `DISABLE_ERROR_REPORTING=1` или `DISABLE_TELEMETRY=1`. |

72| Эндпоинты вашего облачного провайдера для запросов к модели, поиска моделей и обновления учётных данных, такие как `bedrock-runtime.us-east-1.amazonaws.com` или `aiplatform.googleapis.com` | 443 | Только когда runner [отправляет запросы к модели в Amazon Bedrock или Google Cloud's Agent Platform](/docs/ru/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |77| Эндпоинты вашего облачного провайдера для запросов к модели, поиска моделей и обновления учётных данных, такие как `bedrock-runtime.us-east-1.amazonaws.com` или `aiplatform.googleapis.com` | 443 | Только когда runner [отправляет запросы к модели в Amazon Bedrock или Google Cloud's Agent Platform](/docs/ru/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |

73 78 

74Runner не достигает `statsig.anthropic.com`, `*.sentry.io`, `claude.ai` или `platform.claude.com`. Эти хосты появляются в некоторых старых контрольных списках корпоративной сети, но вам не нужно добавлять их в список разрешений для трафика runner или сеанса: получение флагов функций идет на `api.anthropic.com`, и runner аутентифицируется с помощью секрета окружения, а не интерактивного OAuth. Два потока на стороне хоста достигают `claude.ai`, поэтому запускайте их с хоста, чей исходящий трафик это позволяет, а не расширяйте исходящий трафик контейнера сеанса: одностроковый установщик получает `install.sh` с `claude.ai` во время установки, и интерактивный `claude auth login`, который используют [guided setup](/docs/ru/self-hosted-environments-quickstart#set-up-an-environment-and-runner), режим `doctor` с входом и [CI dispatch](/docs/ru/self-hosted-environments-testing#authenticate-from-ci), входит через `claude.ai`, `claude.com` и `platform.claude.com`. `mcp-proxy.anthropic.com` тоже не требуется: самостоятельно размещаемые сеансы его не используют, и доставка коннекторов claude.ai вашей организации в сеансы, когда это включено для вашей организации, маршрутизируется через `api.anthropic.com`. См. [MCP servers](/docs/ru/self-hosted-environments-configuration#mcp-servers).79Эти хосты не нужно добавлять в список разрешённых хостов для трафика runner или сессий:

80 

81* **`statsig.anthropic.com`, `*.sentry.io`, `claude.ai` и `platform.claude.com`**: эти хосты встречаются в некоторых старых контрольных списках корпоративной сети, но runner к ним не обращается. Получение флагов функций идёт на `api.anthropic.com`, а runner аутентифицируется с помощью секрета окружения, а не интерактивного OAuth.

82* **`mcp-proxy.anthropic.com`**: самостоятельно размещаемые сессии его не используют. Когда доставка коннекторов включена для вашей организации, коннекторы claude.ai вашей организации попадают в сессии через `api.anthropic.com`. См. [MCP servers](/docs/ru/self-hosted-environments-configuration#mcp-servers).

83 

84Следующие процессы на стороне хоста обращаются к `claude.ai`, поэтому запускайте их с хоста, чей исходящий трафик это позволяет, а не расширяйте исходящий трафик контейнера сессии:

85 

86* **Однострочный установщик**: получает `install.sh` с `claude.ai` во время установки.

87* **Интерактивный `claude auth login`**: выполняет вход через `claude.ai`, `claude.com` и `platform.claude.com`. Его используют [guided setup](/docs/ru/self-hosted-environments-quickstart#run-the-guided-setup), режим `doctor` с входом и [CI dispatch](/docs/ru/self-hosted-environments-testing#authenticate-from-ci). Браузер, в котором вы входите, также загружает браузерные проверки страницы входа claude.ai с `hcaptcha.com`, `*.hcaptcha.com` и `challenges.cloudflare.com`.

75 88 

76<h3 id="default-deny-egress">89<h3 id="default-deny-egress">

77 Default-deny egress90 Default-deny egress


127* **Позвольте раннеру настроить git**: запустите раннер с `--configure-git`, чтобы он записал ту же конфигурацию идентификации и подписи коммитов, что используют сессии, размещённые Anthropic140* **Позвольте раннеру настроить git**: запустите раннер с `--configure-git`, чтобы он записал ту же конфигурацию идентификации и подписи коммитов, что используют сессии, размещённые Anthropic

128* **Поставляйте конфигурацию git в своём образе**: задайте идентификацию и учётные данные для push самостоятельно, например чтобы делать коммиты от имени собственного бота141* **Поставляйте конфигурацию git в своём образе**: задайте идентификацию и учётные данные для push самостоятельно, например чтобы делать коммиты от имени собственного бота

129 142 

143Для репозиториев на github.com также можно запустить раннер с [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) или задать `CLAUDE_RUNNER_USE_GIT_PROXY=1`, чтобы попросить Anthropic обслуживать git для сессий раннера.

144 

130Минимальные версии Git на хосте раннера: для подписи коммитов через SSH с [`--configure-git`](#let-the-runner-configure-git) требуется Git 2.34 или новее, для [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) — 2.32 или новее, а для возобновления сессий из веток, отправленных с помощью [`--push-outcome-on-release`](/docs/ru/self-hosted-environments-reference#runner-cli-flags), — 2.29 или новее. Git 2.24 достаточно, если вы не используете ни одну из этих трёх возможностей и управляете идентификацией git самостоятельно.145Минимальные версии Git на хосте раннера: для подписи коммитов через SSH с [`--configure-git`](#let-the-runner-configure-git) требуется Git 2.34 или новее, для [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) — 2.32 или новее, а для возобновления сессий из веток, отправленных с помощью [`--push-outcome-on-release`](/docs/ru/self-hosted-environments-reference#runner-cli-flags), — 2.29 или новее. Git 2.24 достаточно, если вы не используете ни одну из этих трёх возможностей и управляете идентификацией git самостоятельно.

131 146 

132<h3 id="let-the-runner-configure-git">147<h3 id="let-the-runner-configure-git">


138* `user.name = Claude` и `user.email = noreply@anthropic.com`, как в сессиях, размещённых Anthropic153* `user.name = Claude` и `user.email = noreply@anthropic.com`, как в сессиях, размещённых Anthropic

139* Подпись коммитов и тегов в формате SSH, проходящая через управляемую раннером прослойку, которая подписывает каждый коммит через сервис подписи Anthropic с использованием собственных учётных данных сессии. Подписи можно проверить на GitHub по опубликованному ключу подписи SSH от Anthropic.154* Подпись коммитов и тегов в формате SSH, проходящая через управляемую раннером прослойку, которая подписывает каждый коммит через сервис подписи Anthropic с использованием собственных учётных данных сессии. Подписи можно проверить на GitHub по опубликованному ключу подписи SSH от Anthropic.

140* `push.negotiate = true`, чтобы перед упаковкой push git спрашивал у вашего git-хостинга, какие коммиты у него уже есть. Требуется Claude Code v2.1.257 или новее.155* `push.negotiate = true`, чтобы перед упаковкой push git спрашивал у вашего git-хостинга, какие коммиты у него уже есть. Требуется Claude Code v2.1.257 или новее.

141* `core.hooksPath`, указывающий на управляемый раннером каталог хуков. Его хуки `commit-msg` и `prepare-commit-msg` добавляют к каждому коммиту трейлер `Co-authored-by:` для создателя сессии, сформированный из адреса электронной почты в [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/ru/self-hosted-environments-configuration#wrapper-scripts); если эта переменная не задана, трейлер не добавляется. Если ваш образ уже задаёт `core.hooksPath`, раннер оставляет вашу настройку как есть, не устанавливает эти хуки и выводит предупреждение `[runner:git]`.156* `core.hooksPath`, указывающий на управляемый раннером каталог хуков. Его хуки `commit-msg` и `prepare-commit-msg` добавляют к каждому коммиту трейлер `Co-authored-by:` для создателя сессии. Трейлер формируется из адреса электронной почты в [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/ru/self-hosted-environments-configuration#wrapper-scripts) и не добавляется, если эта переменная не задана. Если ваш образ уже задаёт `core.hooksPath` и раннер не использует [git под управлением Anthropic](#use-the-anthropic-git-proxy), раннер оставляет вашу настройку как есть, не устанавливает эти хуки и выводит предупреждение `[runner:git]`.

142 157 

143Для подписи коммитов требуется git 2.34 или новее; раннер проверяет это при запуске и завершается с ошибкой, если ваш git старше. Этот флаг не настраивает учётные данные для push — их по-прежнему нужно предоставить в образе.158Для подписи коммитов требуется git 2.34 или новее; раннер проверяет это при запуске и завершается с ошибкой, если ваш git старше. Этот флаг не настраивает учётные данные для push — их по-прежнему нужно предоставить в образе.

144 159 

145На раннере версии v2.1.280 или новее коммиты, которые вы делаете из хука жизненного цикла `checkout` или `post-session`, также подписываются от имени сессии, но без трейлера `Co-authored-by:`. В разделе [Конфигурация git внутри хуков жизненного цикла](/docs/ru/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) описаны настройки git, которые раннер фиксирует внутри этих хуков.160На раннере версии v2.1.280 или новее коммиты, которые вы делаете из хука жизненного цикла `checkout` или `post-session`, также подписываются от имени сессии, но без трейлера `Co-authored-by:`. В разделе [Конфигурация git внутри хуков жизненного цикла](/docs/ru/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) описаны настройки git, которые раннер фиксирует внутри этих хуков.

146 161 

162С `--configure-git` или без него Claude Code указывает Claude завершать сообщения коммитов трейлером `Claude-Session: <url>`, а описания pull request — URL сессии. Чтобы отключить и то и другое, задайте для [`attribution.sessionUrl`](/docs/ru/settings-reference#attribution-sessionurl) значение `false` в файле [`~/.claude/settings.json`](/docs/ru/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) на хосте раннера, а затем перезапустите раннер.

163 

147<h3 id="ship-git-config-in-your-image">164<h3 id="ship-git-config-in-your-image">

148 Поставляйте конфигурацию git в своём образе165 Поставляйте конфигурацию git в своём образе

149</h3>166</h3>


186 Используйте git-прокси Anthropic203 Используйте git-прокси Anthropic

187</h3>204</h3>

188 205 

189Запустите раннер с `--use-anthropic-git-proxy` или задайте `CLAUDE_RUNNER_USE_GIT_PROXY=1`, чтобы он клонировал репозитории через git-прокси Anthropic с аутентификацией собственным краткосрочным токеном сессии. Для обычных пользовательских сессий прокси использует OAuth-токен GitHub или GitHub Enterprise, сохранённый для создателя сессии; для сессий ботов и агентов он использует токен установки GitHub App вашей организации. В любом случае образу раннера вообще не нужны учётные данные git: ни ключи SSH, ни вспомогательная программа учётных данных, ни `.netrc`. Это тот же путь аутентификации, что используют среды, размещённые Anthropic.206С git-прокси Anthropic, который также называется git под управлением Anthropic, образу раннера не нужны ключи SSH, вспомогательная программа учётных данных, `.netrc` или другие учётные данные git для самой сессии. Вместо этого раннер просит Anthropic обслуживать git для его сессий. Для пользовательской сессии, которую обслуживает Anthropic, clone раннера и собственные fetch и push сессии проходят через Anthropic, который использует OAuth-токен GitHub, сохранённый для создателя сессии. Сессии ботов и агентов описаны в разделе [Как Anthropic обслуживает git для сессии](#how-anthropic-serves-git-for-a-session).

207 

208Git-прокси отключён, пока вы [не включите его](#turn-the-anthropic-git-proxy-on). Раннеру, который обращается к вашему git-хостингу с собственными учётными данными, он не нужен, и git такого раннера работает с любым git-хостингом.

209 

210Взамен git-прокси ограничивает то, что поддерживает раннер, и меняет то, что ему нужно:

211 

212* **Только github.com**: Anthropic обслуживает сессию, только если все её репозитории находятся на github.com, а git-прокси пока не поддерживает GitHub Enterprise Server. На раннере с git-прокси сессия с репозиторием на другом git-хостинге [не запускается](#when-anthropic-doesnt-serve-a-session).

213* **Подключённые аккаунты GitHub**: человек, создавший пользовательскую сессию, должен подключить GitHub на claude.ai, иначе сессия [не запускается](#creator-has-no-github-connection).

214* **`--capacity 1`**: git-прокси требует одну сессию на процесс раннера, поэтому для параллелизма запускайте больше реплик. Требования перечислены в разделе [Включение git-прокси Anthropic](#turn-the-anthropic-git-proxy-on).

215* **Заменённая глобальная конфигурация git**: раннер [удаляет и заменяет глобальную конфигурацию git](#git-proxy-replaces-global-git-config) пользователя, от имени которого он запущен. Запускайте его от имени отдельного пользователя или в контейнере.

216* **Учётные данные хоста для push с хоста**: push с помощью [`--push-outcome-on-release`](/docs/ru/self-hosted-environments-reference#runner-cli-flags) раннера и любой push, который делает ваш [хук `post-session`](/docs/ru/self-hosted-environments-configuration#post-session), по-прежнему используют собственные учётные данные git хоста раннера и его [сетевой путь к `github.com`](#github-com-egress-with-the-anthropic-git-proxy). Об этих учётных данных см. [Поставляйте конфигурацию git в своём образе](#ship-git-config-in-your-image).

217* **Решение для каждой сессии**: Anthropic решает для каждой сессии на раннере, обслуживать ли её git, и сессия, которую он не обслуживает, не запускается. Причины описаны в разделе [Когда сессии не запускаются на раннере с git-прокси](#when-anthropic-doesnt-serve-a-session).

218 

219<span id="git-proxy-replaces-global-git-config" />

220 

221<Warning>

222 Когда задан `--use-anthropic-git-proxy`, раннер удаляет и заменяет глобальную конфигурацию git пользователя, от имени которого он запущен, и не сохраняет резервную копию. Он делает это при запуске и перед каждой сессией. Данные входа или вспомогательная программа учётных данных, которые вы там хранили, теряются. Настройки, которые записывает [`--configure-git`](#let-the-runner-configure-git), сохраняются. Запускайте раннер от имени отдельного пользователя или в контейнере, но никогда от своего имени.

223</Warning>

224 

225Храните несекретные настройки git, такие как идентификация и `safe.directory`, в системной конфигурации git.

226 

227<h4 id="turn-the-anthropic-git-proxy-on">

228 Включение git-прокси Anthropic

229</h4>

230 

231Прежде чем запускать раннер с `--use-anthropic-git-proxy`, убедитесь, что хост раннера отвечает каждому из этих требований. Раннер отказывается запускаться, если требование к capacity или к git не выполнено:

190 232 

191Прокси требует `--capacity 1`, потому что URL прокси уникален для каждой сессии, и git 2.32 или новее, потому что более старые версии git игнорируют механизм конфигурации, которым прокси изолирует сессии друг от друга. Раннер отказывается запускаться, если любое из этих требований не выполнено. Поскольку прокси выполняет fetch со стороны Anthropic, ваш git-хостинг должен быть доступен из инфраструктуры Anthropic — то же требование, что и для сессий, размещённых Anthropic; для git-хостинга, маршрутизируемого только внутри вашей сети, используйте вместо этого [хук жизненного цикла `checkout`](/docs/ru/self-hosted-environments-configuration#checkout). Каждый процесс раннера обрабатывает одну сессию за раз, поэтому для параллелизма запускайте больше реплик. Когда прокси включён, `--git-host-rewrite` и `--git-ssh-rewrite` не действуют: URL прокси указывает на `api.anthropic.com`, а не на ваш git-хостинг.233* **Claude Code v2.1.267 или новее**: более ранние версии принимают флаг, но не сообщают Anthropic о запросе на обслуживание git и не выводят строку `Registering as opted in`, поэтому Anthropic не обслуживает их сессии.

234* **`--capacity 1`, значение по умолчанию**: каждый процесс раннера обрабатывает одну сессию за раз, поэтому для параллелизма запускайте больше реплик.

235* **Git 2.32 или новее**: более старые версии git игнорируют конфигурацию git для отдельной сессии, которую раннер настраивает для git-прокси.

192 236 

193<Warning>237<Warning>

194 Рецепты для [Kubernetes](#kubernetes) и [Docker Compose](#docker-compose) на этой странице используют `--capacity 4`. Если вы добавите `--use-anthropic-git-proxy` или `CLAUDE_RUNNER_USE_GIT_PROXY=1` в один из них, не изменив capacity на `1`, раннер будет завершаться при запуске каждый раз, когда оркестратор его перезапускает. Задайте `--capacity 1` и запускайте больше реплик для параллелизма. В разделе [Когда раннер завершается](#when-the-runner-exits) показана строка, которую выводит раннер.238 Рецепты для [Kubernetes](#kubernetes) и [Docker Compose](#docker-compose) на этой странице используют `--capacity 4`. Если вы добавите `--use-anthropic-git-proxy` или `CLAUDE_RUNNER_USE_GIT_PROXY=1` в один из них, не изменив capacity на `1`, раннер будет завершаться при запуске каждый раз, когда оркестратор его перезапускает. Задайте `--capacity 1` и запускайте больше реплик для параллелизма. В разделе [Когда раннер завершается](#when-the-runner-exits) показана строка, которую выводит раннер.

195</Warning>239</Warning>

196 240 

197Раннер также сообщает Anthropic о подключении при регистрации, выводя при запуске `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`. Для сообщения о подключении требуется Claude Code v2.1.267 или новее; более ранние версии принимают флаг, но не сообщают о нём и не выводят эту строку. Каждая сессия на подключённом раннере затем использует либо git под управлением Anthropic, либо URL прокси для отдельной сессии. Когда сессия использует URL прокси для отдельной сессии, раннер записывает в лог одну строку `[runner:warn]`, сообщающую об этом.241Чтобы включить git-прокси, добавьте `--use-anthropic-git-proxy` в команду раннера или задайте `CLAUDE_RUNNER_USE_GIT_PROXY=1` в окружении раннера. Эта команда, выполненная в оболочке на хосте раннера, запускает раннер из [быстрого старта](/docs/ru/self-hosted-environments-quickstart#set-up-manually) с включённым git-прокси:

242 

243```bash theme={null}

244claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>' --use-anthropic-git-proxy

245```

246 

247При запуске раннер выводит `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`. Затем Anthropic решает для каждой сессии на этом раннере, обслуживать ли её git. Для каждой обслуживаемой сессии раннер записывает в лог строку `[runner:session]`, содержащую `governed git ACTIVE`. Если вместо этого сессия не запускается, см. [Когда сессии не запускаются на раннере с git-прокси](#when-anthropic-doesnt-serve-a-session).

248 

249<h4 id="how-anthropic-serves-git-for-a-session">

250 Как Anthropic обслуживает git для сессии

251</h4>

252 

253Для сессии, которую обслуживает Anthropic, clone раннера и собственные fetch и push сессии проходят через Anthropic с аутентификацией собственным краткосрочным токеном сессии:

254 

255* **Пользовательские сессии**: Anthropic использует OAuth-токен GitHub, сохранённый для создателя сессии.

256* **Сессии ботов и агентов**: Anthropic использует токен установки GitHub App вашей организации.

257* **Перезапись URL**: `--git-host-rewrite` и `--git-ssh-rewrite` не действуют на репозиторий, который обслуживает git-прокси.

258 

259<h4 id="when-anthropic-doesnt-serve-a-session">

260 Когда сессии не запускаются на раннере с git-прокси

261</h4>

262 

263На раннере, запущенном с `--use-anthropic-git-proxy`, сессия не запускается, если Anthropic не обслуживает её git. Найдите в логе раннера ошибку git, в которой указан адрес `api.anthropic.com`, содержащий `/git_proxy/`.

264 

265Для каждой сессии раннер на Claude Code v2.1.267 или новее также записывает в лог либо строку `[runner:session]`, содержащую `governed git ACTIVE`, если Anthropic обслуживает git сессии, либо одну строку `[runner:warn]`, содержащую `the server withheld Anthropic-managed git for this session`, если нет. Найдите строку, которую вы видите, среди следующих случаев:

266 

267* **Нет ни `governed git ACTIVE`, ни строки `withheld`**: раннер старше Claude Code v2.1.267 не записывает ни одну из этих строк, и Anthropic не обслуживает его сессии. Обновите раннер до v2.1.267 или новее, следуя разделу [Закрепление версии](#pin-the-version).

268* **Строка `withheld`**: Anthropic не обслужил сессию. Раннер, который раньше работал с git-прокси, может начать так завершаться без каких-либо изменений с вашей стороны.

269 * **Репозиторий находится не на github.com**: сессия, у которой хотя бы один репозиторий находится на другом git-хостинге, например GitHub Enterprise Server, не обслуживается, включая её репозитории на github.com. [Отключите git-прокси Anthropic](#turn-the-anthropic-git-proxy-off) для раннеров этой среды.

270 * **Все репозитории находятся на github.com**: сообщите о сбое [вашей команде по работе с аккаунтом в Anthropic](#report-an-issue), указав ID сессии из строки `withheld`. Anthropic записывает причину на своей стороне.

271* **Строка, содержащая `remote: access denied by the git proxy`**: сессии, которую обслуживает Anthropic, всё равно может быть отказано, например когда политика организации запрещает доступ к git для сессии или у сессии нет авторизации для репозитория. Тогда в логе раннера есть строка, содержащая `remote: access denied by the git proxy`, и остальная часть этой строки объясняет причину.

272* <span id="creator-has-no-github-connection" />**`GitHub authentication required`**: появляется, когда у создателя сессии нет работающего подключения GitHub на claude.ai. Clone сессии завершается ошибкой, и ошибка git гласит `GitHub authentication required. Please reconnect your GitHub account.` Попросите этого человека подключить или переподключить GitHub в настройках claude.ai.

273 

274После устранения причины снова запустите сессии, которые не запустились.

275 

276<h4 id="turn-the-anthropic-git-proxy-off">

277 Отключение git-прокси Anthropic

278</h4>

279 

280Если сессии в среде используют репозиторий на git-хостинге, отличном от github.com, например GitHub Enterprise Server, отключите `--use-anthropic-git-proxy` для раннеров этой среды.

281 

282<Steps>

283 <Step title="Удалите флаг">

284 Удалите `--use-anthropic-git-proxy` из команды раннера. Если вы задали `CLAUDE_RUNNER_USE_GIT_PROXY` в окружении раннера, например в спецификации пода или в файле Compose, удалите её оттуда. В оболочке сбросьте её:

285 

286 ```bash theme={null}

287 unset CLAUDE_RUNNER_USE_GIT_PROXY

288 ```

289 </Step>

290 

291 <Step title="Предоставьте раннеру учётные данные git">

292 Предоставьте учётные данные, работающие без запроса ввода, для каждого git-хостинга, который используют сессии раннеров, включая github.com. Любые учётные данные, которые были в глобальной конфигурации git пользователя раннера, утеряны, потому что раннер удалил эту конфигурацию, пока был задан `--use-anthropic-git-proxy`. [Поставляйте учётные данные в своём образе](#ship-git-config-in-your-image) или используйте [хук жизненного цикла `checkout`](/docs/ru/self-hosted-environments-configuration#checkout).

293 </Step>

294 

295 <Step title="Откройте сетевой путь">

296 Разрешите раннеру обращаться к каждому git-хостингу, который используют сессии раннеров, по порту 443 или 22. См. строку о git-хостинге в разделе [Сетевые требования](#network-requirements).

297 </Step>

298 

299 <Step title="Перезапустите раннеры">

300 Перезапустите раннеры, чтобы они зарегистрировались без git-прокси. Затем снова запустите каждую сессию, которая не запустилась.

301 </Step>

302</Steps>

198 303 

199<h4 id="github-api-access-without-the-github-cli">304<h4 id="github-api-access-without-the-github-cli">

200 Доступ к API GitHub без GitHub CLI305 Доступ к API GitHub без GitHub CLI


266```dockerfile theme={null}371```dockerfile theme={null}

267FROM debian:bookworm-slim372FROM debian:bookworm-slim

268ARG CLAUDE_CODE_VERSION373ARG CLAUDE_CODE_VERSION

269RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client \374RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client jq \

270 && rm -rf /var/lib/apt/lists/*375 && rm -rf /var/lib/apt/lists/*

271RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \376RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \

272 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude377 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude


382kubectl create namespace claude-runners487kubectl create namespace claude-runners

383```488```

384 489 

385Создайте поддерживающий Secret из локального файла, содержащего значение, которое вы скопировали на шаге [**Copy environment key**](/docs/ru/self-hosted-environments-quickstart#set-up-an-environment-and-runner) в пользовательском интерфейсе администратора, чтобы секрет никогда не появлялся в истории вашей shell. Запустите `(umask 077 && cat > ./environment-secret)`, вставьте секрет, нажмите Enter, затем Ctrl-D. Затем создайте Secret и удалите файл:490Создайте поддерживающий Secret из локального файла, содержащего значение, которое вы скопировали на шаге [**Copy environment key**](/docs/ru/self-hosted-environments-quickstart#set-up-manually) в пользовательском интерфейсе администратора, чтобы секрет никогда не появлялся в истории вашей оболочки. Запустите `(umask 077 && cat > ./environment-secret)`, вставьте секрет, нажмите Enter, затем Ctrl-D. Затем создайте Secret и удалите файл:

386 491 

387```bash theme={null}492```bash theme={null}

388kubectl create secret generic claude-runner-environment-secret -n claude-runners --from-file=environment-secret=./environment-secret493kubectl create secret generic claude-runner-environment-secret -n claude-runners --from-file=environment-secret=./environment-secret


500 Переиспользуйте pre-warmed checkout605 Переиспользуйте pre-warmed checkout

501</h2>606</h2>

502 607 

503Для больших репозиториев клон может доминировать при запуске сеанса. На `--capacity 1` без [`checkout` hook](/docs/ru/self-hosted-environments-configuration#checkout), runner держит один канонический клон на репозиторий на `<base-dir>/<repo-owner>/<repo>` и переиспользует его на сеансы: он получает запрошенный ref, отсоединяет `HEAD` и жестко сбрасывает его, что почти мгновенно, когда мало что изменилось. Чтобы пропустить холодный клон, поставьте клон одним из двух способов:608Для больших репозиториев клонирование может занимать бо́льшую часть времени запуска сессии. Чтобы пропустить холодное клонирование, подготовьте клон самостоятельно по тому пути, где runner хранит собственный. Без [`checkout` хука](/docs/ru/self-hosted-environments-configuration#checkout) runner хранит один канонический клон на репозиторий по пути `<base-dir>/<repo-owner>/<repo>` и переиспользует его между сессиями:

609 

610* **При `--capacity 1`**: runner получает запрошенный ref, отсоединяет `HEAD` и выполняет жесткий сброс на него, что происходит почти мгновенно, когда изменилось немногое.

611* **При `--capacity` больше единицы**: runner выполняет fetch в этот клон, а затем создает из него отдельный worktree для каждой сессии. Pre-warmed клон экономит загрузку, но не checkout.

612 

613Подготовьте клон в образе или на постоянном томе:

504 614 

505* **Клон в образе**: постройте клон в образ runner на этом пути. Каждый свежий контейнер затем начинается с теплым клоном без переиспользования диска.615* **Клон в образе**: постройте клон в образ runner на этом пути. Каждый свежий контейнер затем начинается с теплым клоном без переиспользования диска.

506* **Клон на постоянном томе**: на runners, которые вы предварительно блокируете для учетной записи одного пользователя с [`--lock-to-account`](/docs/ru/self-hosted-environments-reference#runner-cli-flags), укажите `--base-dir` на постоянный том, поэтому диск только когда-либо обслуживает эту учетную запись. Pre-locked runner никогда не подхватывает сеансы канала Claude Tag, поэтому этот вариант не применяется к runners, которые их обслуживают.616* **Клон на постоянном томе**: на runners, которые вы предварительно блокируете для учетной записи одного пользователя с [`--lock-to-account`](/docs/ru/self-hosted-environments-reference#runner-cli-flags), укажите `--base-dir` на постоянный том, поэтому диск только когда-либо обслуживает эту учетную запись. Pre-locked runner никогда не подхватывает сеансы канала Claude Tag, поэтому этот вариант не применяется к runners, которые их обслуживают.


508Что путь переиспользования делает и не гарантирует:618Что путь переиспользования делает и не гарантирует:

509 619 

510* **Любая форма клона работает**: полный, неглубокий или однозвездный клон на пути используется как есть. Runner никогда не передает `--depth` при получении в существующий клон, поэтому полный pre-warm держит свою полную историю и неглубокий остается неглубоким. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0` или число; по умолчанию 50) контролирует только холодный клон, который runner делает, когда клон еще не существует.620* **Любая форма клона работает**: полный, неглубокий или однозвездный клон на пути используется как есть. Runner никогда не передает `--depth` при получении в существующий клон, поэтому полный pre-warm держит свою полную историю и неглубокий остается неглубоким. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0` или число; по умолчанию 50) контролирует только холодный клон, который runner делает, когда клон еще не существует.

511* **Отслеживаемые изменения сбрасываются, неотслеживаемые файлы сохраняются**: каждый сеанс начинается с жесткого сброса, который стирает предыдущие модификации сеанса, но runner никогда не запускает `git clean`, поэтому неотслеживаемые файлы из более ранних сеансов заблокированного владельца остаются в дереве.621* **Отслеживаемые изменения сбрасываются, неотслеживаемые файлы сохраняются**: при `--capacity 1` каждая сессия начинается с жесткого сброса, который стирает отслеживаемые изменения предыдущей сессии, но runner никогда не запускает `git clean`, поэтому неотслеживаемые файлы из более ранних сессий заблокированного владельца остаются в дереве.

512* **Каталоги для каждого сеанса также сохраняются**: рядом с checkout runner создает записи для каждого сеанса под `<base-dir>/_sessions/` для каждого сеанса, который он запускает. Локальный каталог конфигурации Claude сеанса содержит локальную копию транскрипта беседы. Рядом с ним находятся загруженные файлы сеанса, когда сеанс их имеет. Каталог сеанса находится там же: он содержит любые worktrees для каждого сеанса и `checkout` hook checkouts во время работы сеанса, и он сохраняет все остальное, что Claude написал в нем.622* **Каталоги для каждого сеанса также сохраняются**: рядом с checkout runner создает записи для каждого сеанса под `<base-dir>/_sessions/` для каждого сеанса, который он запускает. Локальный каталог конфигурации Claude сеанса содержит локальную копию транскрипта беседы. Рядом с ним находятся загруженные файлы сеанса, когда сеанс их имеет. Каталог сеанса находится там же: он содержит любые worktrees для каждого сеанса и `checkout` hook checkouts во время работы сеанса, и он сохраняет все остальное, что Claude написал в нем.

513 623 

514 По умолчанию runner оставляет их на месте, когда сеанс заканчивается, поэтому на диске, который пережил процесс runner, они накапливаются. Каждый сеанс запускается как собственный пользователь runner, поэтому любой более поздний сеанс, который обслуживает этот диск, может их прочитать. Если вы сохраняете постоянный `--base-dir`, размер тома для этого роста. То же самое применяется к любой установке, которая перезапускает runner на той же файловой системе, включая [Docker Compose рецепт](#docker-compose).624 По умолчанию runner оставляет их на месте, когда сеанс заканчивается, поэтому на диске, который пережил процесс runner, они накапливаются. Каждый сеанс запускается как собственный пользователь runner, поэтому любой более поздний сеанс, который обслуживает этот диск, может их прочитать. Если вы сохраняете постоянный `--base-dir`, размер тома для этого роста. То же самое применяется к любой установке, которая перезапускает runner на той же файловой системе, включая [Docker Compose рецепт](#docker-compose).


522 632 

523Процесс дочернего Claude Code каждого сеанса запускает собственный бинарный файл runner, и runner отключает auto-update внутри сеансов, которые он порождает, поэтому каждый сеанс запускает версию, которую вы установили на хосте или встроили в образ. Обновление на уровне хоста вступает в силу в следующий раз, когда runner запускается.633Процесс дочернего Claude Code каждого сеанса запускает собственный бинарный файл runner, и runner отключает auto-update внутри сеансов, которые он порождает, поэтому каждый сеанс запускает версию, которую вы установили на хосте или встроили в образ. Обновление на уровне хоста вступает в силу в следующий раз, когда runner запускается.

524 634 

525Модель, которую используют ваши сеансы, может требовать более новую версию Claude Code, чем та, которую они запускают. Сервер затем отклоняет запросы для этой модели с [Claude Code does not support this model](/docs/ru/errors#claude-code-does-not-support-this-model). Перед тем как закрепить версию, проверьте [версии Claude Code, которые требуют модели](/docs/ru/model-config#available-models) для каждой модели, которую используют ваши сеансы.635Выберите, какую версию запускают ваши сессии и когда она меняется:

526 636 

637* **Перед тем как закрепить версию**: проверьте [версии Claude Code, которые требуют модели](/docs/ru/model-config#available-models), для каждой модели, которую используют ваши сессии. Если модель требует более новую версию, чем та, которую запускают ваши сессии, сервер отклоняет запросы для этой модели с [Claude Code does not support this model](/docs/ru/errors#claude-code-does-not-support-this-model).

527* **Чтобы держать флот на одной версии**: постройте образ с закрепленной версией или на голом хосте установите конкретную версию и [отключите auto-updates](/docs/ru/setup#disable-auto-updates)638* **Чтобы держать флот на одной версии**: постройте образ с закрепленной версией или на голом хосте установите конкретную версию и [отключите auto-updates](/docs/ru/setup#disable-auto-updates)

528* **Чтобы обновить**: установите более новую версию или пересоздайте образ, затем перезагрузите runners639* **Чтобы обновить фиксированный флот**: прочитайте записи [журнала изменений](/docs/en/changelog) между вашей версией и той, которую вы устанавливаете, затем установите более новую версию или пересоберите образ и перезапустите runners

640* **Чтобы обновить runners по требованию**: прочитайте записи [журнала изменений](/docs/en/changelog) между вашей версией и той, которую вы устанавливаете, затем измените образ, который запускает ваш [хук `spawn-runner`](/docs/ru/self-hosted-environments-configuration#the-spawn-runner-hook). Каждый новый runner получает новую версию. Runner, который уже запущен, включая резервный runner, запущенный [`--min-idle`](/docs/ru/self-hosted-environments-reference#orchestrator-cli-flags), сохраняет свою версию до завершения работы. Не перезапускайте его, потому что его рабочий заказ одноразовый.

529* **Плагины**: рынки плагинов тоже не auto-update; установите `FORCE_AUTOUPDATE_PLUGINS=1` в окружении runner, чтобы позволить плагинам auto-update, пока бинарный файл остается закрепленным641* **Плагины**: рынки плагинов тоже не auto-update; установите `FORCE_AUTOUPDATE_PLUGINS=1` в окружении runner, чтобы позволить плагинам auto-update, пока бинарный файл остается закрепленным

530 642 

531<h2 id="scale-the-fleet">643<h2 id="scale-the-fleet">


580</h3>692</h3>

581 693 

582* **Возобновлённые сессии теряют неотправленную работу**: новый runner заново клонирует репозиторий с его начальной ветки, поэтому работа, которую сессия не отправила, теряется.694* **Возобновлённые сессии теряют неотправленную работу**: новый runner заново клонирует репозиторий с его начальной ветки, поэтому работа, которую сессия не отправила, теряется.

583 * **Чтобы сохранить закоммиченную работу**: задайте [`--push-outcome-on-release`](/docs/ru/self-hosted-environments-reference#runner-cli-flags). Тогда перед освобождением runner по возможности отправляет (push) ветки результатов сессии, и возобновлённая сессия начинается с этих коммитов. Незакоммиченные изменения всё равно теряются.695 * **Чтобы сохранить закоммиченную работу**: задайте [`--push-outcome-on-release`](/docs/ru/self-hosted-environments-reference#runner-cli-flags) на каждом runner в окружении, поскольку runner без этого флага возобновляет сессию с её начальной ветки. Runner с этим флагом перед освобождением по возможности отправляет (push) ветки результатов сессии, и возобновлённая сессия начинается с этих коммитов. Для push используются собственные учётные данные git хоста runner, в том числе на runner, который использует [управляемый Anthropic git](#use-the-anthropic-git-proxy). Незакоммиченные изменения всё равно теряются.

696 * **С хуком `checkout`**: репозитории, извлечённые с помощью [хука жизненного цикла `checkout`](/docs/ru/self-hosted-environments-configuration#checkout), не отправляются. Вместо этого сохраняйте их снимки из [хука `post-session`](/docs/ru/self-hosted-environments-configuration#post-session).

584 * **Перед включением флага**: ограничьте круг тех, кто может выполнять push в refs `claude/*` на исходном удалённом репозитории. При возобновлении runner получает ранее отправленную ветку, не проверяя, кто её отправил.697 * **Перед включением флага**: ограничьте круг тех, кто может выполнять push в refs `claude/*` на исходном удалённом репозитории. При возобновлении runner получает ранее отправленную ветку, не проверяя, кто её отправил.

585* **Репозиторий, добавленный в середине сессии, может не клонироваться**: Claude клонирует его с помощью `git clone` по HTTPS. На runner без [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) клонирование завершается ошибкой аутентификации git, если ничто на хосте не может прочитать репозиторий. По возможности выбирайте все необходимые сессии репозитории при её создании.698* **Репозиторий, добавленный в середине сессии, может не клонироваться**: Claude клонирует его с помощью `git clone` по HTTPS. На runner без [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) клонирование завершается ошибкой аутентификации git, если ничто на хосте не может прочитать репозиторий. По возможности выбирайте все необходимые сессии репозитории при её создании.

586* **Некоторые коннекторы не появляются в самостоятельно размещаемых сеансах**: коннектор, который вы еще не подключили в параметрах claude.ai, не указан в самостоятельно размещаемом сеансе, и сеанс не будет вас приглашать подключить его. Подключите его в параметрах сначала, затем запустите свежий сеанс. Добавление коннектора в уже работающий сеанс тоже не делает его инструменты доступными для Claude; запустите свежий сеанс, чтобы подхватить недавно добавленный коннектор.699* **Некоторые коннекторы не появляются в самостоятельно размещаемых сеансах**: коннектор, который вы еще не подключили в параметрах claude.ai, не указан в самостоятельно размещаемом сеансе, и сеанс не будет вас приглашать подключить его. Подключите его в параметрах сначала, затем запустите свежий сеанс. Добавление коннектора в уже работающий сеанс тоже не делает его инструменты доступными для Claude; запустите свежий сеанс, чтобы подхватить недавно добавленный коннектор.


606* **Runner не появляется в окружении**: подтвердите, что хост может достичь `api.anthropic.com` через HTTPS, секрет окружения текущий и часы хоста находятся в пределах пяти минут от реального времени; большее смещение вызывает отказ аутентификации. Runner регистрирует `[runner:fatal]` с причиной отказа при отказе аутентификации.719* **Runner не появляется в окружении**: подтвердите, что хост может достичь `api.anthropic.com` через HTTPS, секрет окружения текущий и часы хоста находятся в пределах пяти минут от реального времени; большее смещение вызывает отказ аутентификации. Runner регистрирует `[runner:fatal]` с причиной отказа при отказе аутентификации.

607* **Runner выходит при запуске с `cannot create or write to base directory`**: runner не может создать или писать в `--base-dir`, который по умолчанию `/workspace`. Исправьте владение каталога или укажите `--base-dir` на записываемый путь, как описано в [Keep the base directory and capacity identical across runners](#keep-the-base-directory-and-capacity-identical-across-runners). Если runner вместо этого регистрирует `[runner:fatal]`, говоря, что проверка базового каталога истекла по времени, каталог находится на зависшем монтировании NFS или CSI. Проверьте здоровье монтирования, а не разрешения. Runner печатает оба эти отказа при запуске в stderr перед открытием `--log-file`, поэтому ищите их в терминале или логах контейнера вашей платформы, а не в файле логов. До v2.1.225, runner не проверял базовый каталог при запуске, и эта неправильная конфигурация не удавалась сеансам после подхвата вместо этого.720* **Runner выходит при запуске с `cannot create or write to base directory`**: runner не может создать или писать в `--base-dir`, который по умолчанию `/workspace`. Исправьте владение каталога или укажите `--base-dir` на записываемый путь, как описано в [Keep the base directory and capacity identical across runners](#keep-the-base-directory-and-capacity-identical-across-runners). Если runner вместо этого регистрирует `[runner:fatal]`, говоря, что проверка базового каталога истекла по времени, каталог находится на зависшем монтировании NFS или CSI. Проверьте здоровье монтирования, а не разрешения. Runner печатает оба эти отказа при запуске в stderr перед открытием `--log-file`, поэтому ищите их в терминале или логах контейнера вашей платформы, а не в файле логов. До v2.1.225, runner не проверял базовый каталог при запуске, и эта неправильная конфигурация не удавалась сеансам после подхвата вместо этого.

608* **Сеансы остаются поставленными в очередь**: каждый онлайн runner может быть заблокирован для другого владельца. Проверьте метрику `claude_code_self_hosted_runner_locked_account` каждого runner [metric](/docs/ru/self-hosted-environments-reference#prometheus-metrics) или поле `locked_account` его строки логов `[runner:health]`, чтобы увидеть, кто его держит. Оба показывают email владельца только после того, как runner получил токен сеанса, несущий претензию `act.email`, которую сеансы агента Claude Tag никогда не делают. Без претензии runner не излучает серию `locked_account` и регистрирует `locked_account=yes`, что говорит вам, что runner заблокирован, но не для какого владельца. Добавьте реплики или ждите, пока существующий runner осушится и перезагрузится. Если окружение использует on-demand runners, проверьте оркестратор вместо этого; см. [On-demand runners](/docs/ru/self-hosted-environments-configuration#on-demand-runners).721* **Сеансы остаются поставленными в очередь**: каждый онлайн runner может быть заблокирован для другого владельца. Проверьте метрику `claude_code_self_hosted_runner_locked_account` каждого runner [metric](/docs/ru/self-hosted-environments-reference#prometheus-metrics) или поле `locked_account` его строки логов `[runner:health]`, чтобы увидеть, кто его держит. Оба показывают email владельца только после того, как runner получил токен сеанса, несущий претензию `act.email`, которую сеансы агента Claude Tag никогда не делают. Без претензии runner не излучает серию `locked_account` и регистрирует `locked_account=yes`, что говорит вам, что runner заблокирован, но не для какого владельца. Добавьте реплики или ждите, пока существующий runner осушится и перезагрузится. Если окружение использует on-demand runners, проверьте оркестратор вместо этого; см. [On-demand runners](/docs/ru/self-hosted-environments-configuration#on-demand-runners).

609* **Сеансы не удаются сразу после подхвата**: откройте сеанс в claude.ai/code, чтобы увидеть ошибку. Наиболее распространенные причины - отсутствие [git credentials](#configure-git) в образе runner и инструменты сборки, которые не установлены. Неписываемый базовый каталог останавливает runner при запуске вместо того, чтобы не удавались сеансы. См. запись **Runner exits at startup with `cannot create or write to base directory`** в этом списке.722* **Сессии завершаются сбоем сразу после получения**: откройте сессию в claude.ai/code, чтобы увидеть ошибку. Наиболее распространённые причины — отсутствие [учётных данных git](#configure-git) в образе runner и неустановленные инструменты сборки. Для runner, запущенного с `--use-anthropic-git-proxy`, см. [Когда сессии не запускаются на runner с git-прокси](#when-anthropic-doesnt-serve-a-session). Базовый каталог, недоступный для записи, останавливает runner при запуске, а не приводит к сбою сессий. См. пункт **Runner завершается при запуске с `cannot create or write to base directory`** в этом списке.

723* **Сессии не запускаются на runner, для которого задан `--use-anthropic-git-proxy`**: найдите в логе runner `access denied by the git proxy` или ошибку git, в которой указан адрес `api.anthropic.com`, содержащий `/git_proxy/`. Чтобы определить, обслуживала ли Anthropic эту сессию, и устранить причину, см. [Когда сессии не запускаются на runner с git-прокси](#when-anthropic-doesnt-serve-a-session).

610* **Сеансы не могут достичь сеть через аутентифицирующий исходящий прокси**: когда источник, который вы установили с помощью [`--proxy-authorization-command` или `--proxy-authorization-file`](#authenticate-to-an-egress-proxy), не удается, истекает по времени после 30 секунд или дает пустое значение, runner отвечает на это соединение `502 Bad Gateway` и регистрирует почему. Runner редактирует stderr команды в этом логе и никогда не регистрирует значение заголовка. С `--proxy-authorization-command`, запустите команду самостоятельно на хосте, чтобы подтвердить, что она печатает все значение заголовка на stdout. Если runner вместо этого выходит при запуске с `could not start the proxy-authorization listener`, он не мог открыть свой слушатель loopback.724* **Сеансы не могут достичь сеть через аутентифицирующий исходящий прокси**: когда источник, который вы установили с помощью [`--proxy-authorization-command` или `--proxy-authorization-file`](#authenticate-to-an-egress-proxy), не удается, истекает по времени после 30 секунд или дает пустое значение, runner отвечает на это соединение `502 Bad Gateway` и регистрирует почему. Runner редактирует stderr команды в этом логе и никогда не регистрирует значение заголовка. С `--proxy-authorization-command`, запустите команду самостоятельно на хосте, чтобы подтвердить, что она печатает все значение заголовка на stdout. Если runner вместо этого выходит при запуске с `could not start the proxy-authorization listener`, он не мог открыть свой слушатель loopback.

611* **Runner регистрирует строки `Poll failed`, содержащие `rejecting the malformed poll response`**: runner получил ответ на опрос работы, чье тело не является ожидаемым JSON очереди, чаще всего потому что что-то между runner и `api.anthropic.com`, такое как перехватывающий прокси или captive portal, ответил своей собственной страницей. Runner отклоняет ответ, считает его под видом `transport` метрики `claude_code_self_hosted_runner_poll_errors_total` [metric](/docs/ru/self-hosted-environments-reference#prometheus-metrics) и повторяет попытку по расписанию отказа опроса, описанному в [Session lifecycle](/docs/ru/self-hosted-environments#session-lifecycle). Runner продолжает обслуживать свои живые сеансы. Конфигурируйте прокси, чтобы пропустить ответы от `api.anthropic.com` без изменений. До v2.1.246, runner читал такой ответ как пустую очередь работы, которая могла закончить его живые сеансы или заставить его выйти.725* **Runner регистрирует строки `Poll failed`, содержащие `rejecting the malformed poll response`**: runner получил ответ на опрос работы, чье тело не является ожидаемым JSON очереди, чаще всего потому что что-то между runner и `api.anthropic.com`, такое как перехватывающий прокси или captive portal, ответил своей собственной страницей. Runner отклоняет ответ, считает его под видом `transport` метрики `claude_code_self_hosted_runner_poll_errors_total` [metric](/docs/ru/self-hosted-environments-reference#prometheus-metrics) и повторяет попытку по расписанию отказа опроса, описанному в [Session lifecycle](/docs/ru/self-hosted-environments#session-lifecycle). Runner продолжает обслуживать свои живые сеансы. Конфигурируйте прокси, чтобы пропустить ответы от `api.anthropic.com` без изменений. До v2.1.246, runner читал такой ответ как пустую очередь работы, которая могла закончить его живые сеансы или заставить его выйти.

612* **Ветка сеанса больше не существует на удаленном**: для источника git, который сеанс только читает, runner пропускает этот источник и продолжает на оставшихся. Для источника, на который сеанс отправляет результаты, удаленная ветка, обычно потому что она была объединена и auto-deleted, не удается сеанс с ошибкой, называющей репозиторий и ветку и просящей вас восстановить ветку и повторить попытку. Runner не удается сеанс с той же ошибкой, когда пропуск оставил бы его без репозитория вообще. До v2.1.228, такой сеанс начинался в пустом каталоге.726* **Ветка сеанса больше не существует на удаленном**: для источника git, который сеанс только читает, runner пропускает этот источник и продолжает на оставшихся. Для источника, на который сеанс отправляет результаты, удаленная ветка, обычно потому что она была объединена и auto-deleted, не удается сеанс с ошибкой, называющей репозиторий и ветку и просящей вас восстановить ветку и повторить попытку. Runner не удается сеанс с той же ошибкой, когда пропуск оставил бы его без репозитория вообще. До v2.1.228, такой сеанс начинался в пустом каталоге.


616 730 

617 Проверка доступа запускается снова каждый раз, когда сеанс начинается на runner, поэтому как только git identity runner имеет доступ на чтение, следующий старт клонирует репозиторий. До v2.1.274, каждый из этих отказов не удавался запустить сеанс.731 Проверка доступа запускается снова каждый раз, когда сеанс начинается на runner, поэтому как только git identity runner имеет доступ на чтение, следующий старт клонирует репозиторий. До v2.1.274, каждый из этих отказов не удавался запустить сеанс.

618* **Сеансы занимают минуты для запуска**: начальный клон обычно доминирует. Смотрите метрику `claude_code_self_hosted_runner_session_init_duration_seconds` [metric](/docs/ru/self-hosted-environments-reference#prometheus-metrics), чтобы подтвердить, и сократите клон с помощью [pre-warmed checkout](#reuse-a-pre-warmed-checkout) или меньшего `CLAUDE_RUNNER_FETCH_DEPTH`.732* **Сеансы занимают минуты для запуска**: начальный клон обычно доминирует. Смотрите метрику `claude_code_self_hosted_runner_session_init_duration_seconds` [metric](/docs/ru/self-hosted-environments-reference#prometheus-metrics), чтобы подтвердить, и сократите клон с помощью [pre-warmed checkout](#reuse-a-pre-warmed-checkout) или меньшего `CLAUDE_RUNNER_FETCH_DEPTH`.

619* **Turns не удаются с 401**: каждый сеанс аутентифицирует вызовы модели с помощью краткосрочного [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/ru/self-hosted-environments-configuration#wrapper-scripts), который runner получает от Anthropic и ротирует через stdin сеанса. Когда turn заканчивается с 401 или 403 от API модели, runner получает свежий токен и передает его сеансу. Неудачный turn не повторяется.733* **Ходы завершаются с ошибкой 401**: когда ход завершается ошибкой 401 или 403 от Anthropic API, runner получает от Anthropic свежий [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/ru/self-hosted-environments-configuration#wrapper-scripts) и передаёт его сессии. Неудавшийся ход не повторяется. Этот токен краткосрочный, и runner ротирует его через stdin сессии.

620 734 

621 Когда fetch не удается, runner регистрирует строку `inference_token refresh failed`, которая говорит, когда он будет повторять попытку, и он продолжает повторять попытку столько, сколько работает сеанс.735 Когда fetch не удается, runner регистрирует строку `inference_token refresh failed`, которая говорит, когда он будет повторять попытку, и он продолжает повторять попытку столько, сколько работает сеанс.

622 736 


637 751 

638* **Нормальный выход**: runner завершил свои сеансы и осушился, достиг времени выхода на пенсию или ему было приказано остановиться. Перезапустите его, чтобы окружение снова имело емкость. [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle) описывает эти выходы.752* **Нормальный выход**: runner завершил свои сеансы и осушился, достиг времени выхода на пенсию или ему было приказано остановиться. Перезапустите его, чтобы окружение снова имело емкость. [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle) описывает эти выходы.

639* **Неудачный старт**: runner не может запуститься с конфигурацией или хостом, который ему был дан, поэтому он выходит через несколько секунд после запуска, и он выходит одинаково каждый раз, когда вы его перезапускаете. Перезапуск его быстрее не помогает. Кто-то должен прочитать его вывод и исправить причину.753* **Неудачный старт**: runner не может запуститься с конфигурацией или хостом, который ему был дан, поэтому он выходит через несколько секунд после запуска, и он выходит одинаково каждый раз, когда вы его перезапускаете. Перезапуск его быстрее не помогает. Кто-то должен прочитать его вывод и исправить причину.

754* **Потеря связи**: runner, который не может связаться с Anthropic дольше срока своей [аренды](/docs/ru/self-hosted-environments#session-lifecycle), например пока его хост находится в спящем режиме, может быть удалён из окружения. Когда удалённый runner снова подключается, он завершается. В его логе может появиться строка `[runner:fatal]`, содержащая `runner record gone server-side` или, после более длительного перерыва, [`poll auth failed`](/docs/ru/self-hosted-environments-quickstart#set-up-an-environment-and-runner). Runner не регистрируется повторно самостоятельно, поэтому перезапустите его.

640 755 

641Конфигурируйте ваш supervisor, чтобы перезапустить runner всякий раз, когда он выходит, чтобы ждать дольше между перезапусками, когда runner продолжает выходить сразу после запуска, и чтобы сообщить кому-то, когда это продолжает происходить.756Конфигурируйте ваш supervisor, чтобы перезапустить runner всякий раз, когда он выходит, чтобы ждать дольше между перезапусками, когда runner продолжает выходить сразу после запуска, и чтобы сообщить кому-то, когда это продолжает происходить.

642 757 

Details

195 195 

196Обертки получают абсолютный путь к собственному бинарному файлу runner в `CLAUDE_RUNNER_CLAUDE_BIN`; используйте этот путь вместо разрешенного PATH `claude`, чтобы декодирование выполнялось на том же бинарном файле, который использует сам runner.196Обертки получают абсолютный путь к собственному бинарному файлу runner в `CLAUDE_RUNNER_CLAUDE_BIN`; используйте этот путь вместо разрешенного PATH `claude`, чтобы декодирование выполнялось на том же бинарном файле, который использует сам runner.

197 197 

198Используйте `jq -re` вместо `jq -r`, чтобы отсутствующее утверждение вызвало ненулевой выход. С одним `-r`, отсутствующее утверждение выводит буквальную строку `null` и выходит с нулем, что молча передает плохое значение вниз по потоку. Передайте `--no-verify` в `decode-token` только для автономной проверки, где эндпоинт JWKS недоступен.198Используйте `jq -re` вместо `jq -r`, чтобы отсутствующее утверждение вызвало ненулевой выход. С одним `-r`, отсутствующее утверждение выводит буквальную строку `null` и выходит с нулем, что молча передает плохое значение вниз по потоку.

199 

200Если `decode-token` не может получить ключи из эндпоинта JWKS или не может проверить токен, она выводит причину в stderr, не выводит утверждения и завершается с кодом 1. Передайте `--no-verify` в `decode-token` только для автономной проверки, где эндпоинт JWKS недоступен.

199 201 

200<h2 id="claims-reference">202<h2 id="claims-reference">

201 Справочник утверждений203 Справочник утверждений

Details

34Хост runner требует:34Хост runner требует:

35 35 

36* Хост или контейнер Linux или macOS с исходящим HTTPS к `api.anthropic.com`, к `claude.ai` и хостам загрузки, на которые он перенаправляет для шага установки ниже, и к вашему git-хосту для клонирования; [таблица требований к сети](/docs/ru/self-hosted-environments-deploy#network-requirements) содержит полный список. Windows не поддерживается в качестве хоста runner; запустите runner в контейнере Linux вместо этого. Рабочие станции разработчиков не затронуты, так как сеансы запускаются из claude.ai в браузере.36* Хост или контейнер Linux или macOS с исходящим HTTPS к `api.anthropic.com`, к `claude.ai` и хостам загрузки, на которые он перенаправляет для шага установки ниже, и к вашему git-хосту для клонирования; [таблица требований к сети](/docs/ru/self-hosted-environments-deploy#network-requirements) содержит полный список. Windows не поддерживается в качестве хоста runner; запустите runner в контейнере Linux вместо этого. Рабочие станции разработчиков не затронуты, так как сеансы запускаются из claude.ai в браузере.

37* Репозиторий для тестовой сессии: публичный или такой, который этот хост уже может клонировать по его HTTPS URL без запроса учётных данных.

37* Часы, синхронизированные с реальным временем, например с помощью NTP. Аутентификация не удаётся, когда часы отстают или спешат более чем на пять минут; см. [Troubleshooting](/docs/ru/self-hosted-environments-deploy#troubleshooting).38* Часы, синхронизированные с реальным временем, например с помощью NTP. Аутентификация не удаётся, когда часы отстают или спешат более чем на пять минут; см. [Troubleshooting](/docs/ru/self-hosted-environments-deploy#troubleshooting).

38 39 

39<h3 id="software-on-the-runner-host">40<h3 id="software-on-the-runner-host">


57 Настройка окружения и runner58 Настройка окружения и runner

58</h2>59</h2>

59 60 

60Claude Code включает управляемую установку: интерактивный сеанс Claude Code, который проведёт вас через создание окружения в админ-интерфейсе, запустит локальный runner с файлом секрета, который вы сохраняете, подтвердит, что runner регистрируется, и напишет шпаргалку в `./runner-setup/CHEAT-SHEET.md`. Запустите его на машине, где вы вошли с помощью `claude auth login`, используя учётную запись, которая имеет роль Owner; это недоступно с API ключами или поставщиками моделей третьих сторон. На хостах, где интерактивный сеанс невозможен, используйте вместо этого ручные шаги ниже. Сначала подтвердите, что [проверка версии](#software-on-the-runner-host) прошла: на версиях старше 2.1.224 эта команда запускает обычный сеанс Claude со словами в качестве подсказки вместо управляемой установки. Чтобы запустить управляемую установку, запустите подкоманду setup и следуйте подсказкам:61Используйте либо [пошаговую настройку](#run-the-guided-setup), либо [ручные шаги](#set-up-manually). Пошаговая настройка — это одна команда, которая запускает интерактивную сессию Claude Code и проводит вас через остальные действия. Используйте вместо неё ручные шаги на хосте, где интерактивная сессия невозможна. Также используйте их, если окружение создал пользователь с ролью Owner и передал вам его секрет, поскольку для пошаговой настройки требуется вход с ролью Owner.

62 

63<h3 id="run-the-guided-setup">

64 Запуск пошаговой настройки

65</h3>

66 

67Пошаговая настройка проводит вас через создание окружения в админ-интерфейсе, запускает локальный runner с файлом секрета, который вы сохраняете, подтверждает, что runner регистрируется, и записывает шпаргалку в `./runner-setup/CHEAT-SHEET.md`. Перед запуском проверьте вход и версию:

68 

69* **Вход**: запускайте её на машине, где вы вошли с помощью `claude auth login`, используя учётную запись с ролью Owner. Если используется только API-ключ или сторонний поставщик моделей, сессия запустится, но проверки организации завершатся неудачей.

70* **Версия**: убедитесь, что [проверка версии](#software-on-the-runner-host) пройдена. На версиях старше 2.1.224 команда setup запускает сессию Claude с этими словами в качестве промпта вместо пошаговой настройки.

71 

72Чтобы запустить пошаговую настройку, выполните подкоманду setup в оболочке и следуйте инструкциям:

61 73 

62```bash theme={null}74```bash theme={null}

63claude self-hosted-runner setup75claude self-hosted-runner setup

64```76```

65 77 

66Для ручной настройки вместо этого:78Пошаговая настройка сама не запускает тестовую сессию: она предлагает вам запустить её на claude.ai/code. Последний шаг настройки останавливает запущенный ею runner. Если вы выйдете из настройки до этого шага, runner продолжит работать. Чтобы продолжить после последнего шага, снова запустите runner в оболочке с помощью команды из `./runner-setup/CHEAT-SHEET.md`, затем [направьте сессию в окружение](#route-a-session).

79 

80<h3 id="set-up-manually">

81 Ручная настройка

82</h3>

83 

84Создайте окружение на claude.ai, запустите runner из терминала на хосте, затем вернитесь на claude.ai, чтобы убедиться, что runner появился, и направить на него сессию. Если пользователь с ролью Owner уже создал окружение и передал вам его секрет, начните с шага 2.

67 85 

68<Steps>86<Steps>

69 <Step title="Создайте окружение">87 <Step title="Создайте окружение">

70 Перейдите на [страницу **Cloud environments**](https://claude.ai/admin-settings/cloud-environments) в параметрах администратора. В разделе **Self-hosted environments** выберите **New**, назовите окружение и выберите **Create**. На втором шаге мастера выберите **Copy environment key**, чтобы скопировать секрет окружения, который админ-интерфейс обозначает как ключ окружения. claude.ai показывает секрет один раз, и вы не можете получить его позже; он истекает через 365 дней после создания. ID окружения `ccpool_...` остаётся видимым в его диалоговом окне деталей; вам понадобится он для проверки `aud` в [проверке токена](/docs/ru/self-hosted-environments-identity) и для отправки [тестовых сеансов из CI](/docs/ru/self-hosted-environments-testing#run-the-test-loop).88 Перейдите на [страницу **Cloud environments**](https://claude.ai/admin-settings/cloud-environments) в параметрах администратора. В разделе **Self-hosted environments** выберите **New**, назовите окружение и выберите **Create**. На втором шаге мастера выберите **Copy environment key**, чтобы скопировать секрет окружения, который админ-интерфейс обозначает как ключ окружения. claude.ai показывает секрет один раз, и вы не можете получить его позже; он истекает через 365 дней после создания. ID окружения `ccpool_...` остаётся видимым в его диалоговом окне деталей; вам понадобится он для проверки `aud` в [проверке токена](/docs/ru/self-hosted-environments-identity) и для отправки [тестовых сеансов из CI](/docs/ru/self-hosted-environments-testing#run-the-test-loop).

71 89 

72 Если вы потеряли секрет или вам нужно его ротировать, создайте новый секрет на вкладке **Configuration** окружения, разверните новый секрет на ваших runners, затем отозовите старый. Runners, держащие отозванный секрет, не пройдут свой следующий аутентифицированный опрос и выйдут, логируя `poll auth failed`, и ваш оркестратор перезапустит их с новым секретом.90 Если вы потеряли секрет или вам нужно его ротировать, создайте новый секрет на вкладке **Configuration** окружения, разверните новый секрет на ваших runners, затем отзовите старый. Runners с отозванным секретом не пройдут следующий аутентифицированный опрос и завершатся, записав в лог `poll auth failed`, а ваш оркестратор перезапустит их с новым секретом.

73 </Step>91 </Step>

74 92 

75 <Step title="Запустите runner">93 <Step title="Запустите runner">

76 Создайте директорию секрета. Этот шаг и следующий требуют root для пути `/etc/claude`; любой путь, который процесс runner может читать, работает, поэтому отрегулируйте обе команды и значение `--environment-secret-file` вместе, если вы используете другой.94 Создайте директорию для секрета. Эта и следующая команды используют `/etc/claude`, что требует root, а создаваемый ими файл секрета доступен для чтения только пользователю, который их выполнил. Если runner будет работать от имени другого пользователя, он завершится с ошибкой `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`. В этом случае выполните обе команды от имени пользователя runner, указав вместо `/etc/claude` директорию, в которую этот пользователь может записывать, и передайте тот же путь в `--environment-secret-file`. Подойдёт любой путь, который процесс runner может читать.

77 95 

78 ```bash theme={null}96 ```bash theme={null}

79 mkdir -p /etc/claude97 mkdir -p /etc/claude


89 107 

90 Если runner не может создать или писать в путь, он выходит при запуске с ошибкой, называющей директорию вместо регистрации. См. [Troubleshooting](/docs/ru/self-hosted-environments-deploy#troubleshooting).108 Если runner не может создать или писать в путь, он выходит при запуске с ошибкой, называющей директорию вместо регистрации. См. [Troubleshooting](/docs/ru/self-hosted-environments-deploy#troubleshooting).

91 109 

92 Затем запустите runner с `--environment-secret-file` и `--base-dir`. Runner регистрируется в вашем окружении и начинает опрашивать работу. Если runner выходит, перезапустите его вручную. Production развёртывания запускают runner под оркестратором, который перезапускает вышедшие runners, обычно со свежей файловой системой при каждом перезапуске; [Reuse a pre-warmed checkout](/docs/ru/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) охватывает поддерживаемую настройку постоянного диска.110 Затем запустите runner с `--environment-secret-file` и `--base-dir`:

93 111 

94 ```bash theme={null}112 ```bash theme={null}

95 claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>'113 claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>'

96 ```114 ```

115 

116 После регистрации в вашем окружении runner записывает в лог `Registered: runner_id=<runner-id>`, а затем начинает опрашивать наличие работы. Если runner позже завершится, перезапустите его вручную. О том, когда это происходит, см. [Если runner завершился](#if-the-runner-exits).

97 </Step>117 </Step>

98 118 

99 <Step title="Проверьте, что runner появился">119 <Step title="Проверьте, что runner появился">

100 Вернитесь на [страницу **Cloud environments**](https://claude.ai/admin-settings/cloud-environments). Статус вашего окружения изменяется с **No runners deployed** на **Healthy** в течение нескольких секунд после запуска runner; откройте окружение и выберите **Activity**, чтобы увидеть сам runner.120 Вернитесь на [страницу **Cloud environments**](https://claude.ai/admin-settings/cloud-environments). Статус вашего окружения изменится с **No runners deployed** на **Healthy** в течение нескольких секунд после запуска runner; откройте окружение и выберите **Activity**, чтобы увидеть сам runner. Если у вас нет доступа к странице администратора, тот же сигнал даёт строка `Registered: runner_id=<runner-id>` в логе runner из предыдущего шага.

101 </Step>121 </Step>

102 122 

103 <Step title="Маршрутизируйте сеанс на окружение">123 <Step title="Направьте сессию в окружение">

104 Запустите сеанс на claude.ai/code и выберите ваше окружение из средства выбора окружения, где самостоятельно размещаемые окружения появляются рядом с размещаемыми Anthropic. Runner клонирует с любыми учётными данными git, которые хост уже имеет, поэтому выберите репозиторий, который этот хост уже может клонировать, или публичный; опции учётных данных для приватных репозиториев в production находятся на [Configure git](/docs/ru/self-hosted-environments-deploy#configure-git). Следующий доступный runner подхватывает поставленный в очередь сеанс и логирует `Picked up session <session-id>` вместе с его активным счётом и ёмкостью, поэтому вы можете подтвердить из собственного вывода runner, какой хост взял сеанс. Смотрите, как работает сеанс, и читайте ответы Claude на [claude.ai/code](https://claude.ai/code). Если сеанс остаётся в очереди вместо этого, см. [Troubleshooting](/docs/ru/self-hosted-environments-deploy#troubleshooting).124 <span id="route-a-session" />Запустите сессию на claude.ai/code и выберите ваше окружение в средстве выбора окружения, где самостоятельно размещаемые окружения отображаются рядом с размещаемыми Anthropic. В качестве репозитория выберите указанный в [предварительных требованиях](#host-and-network): публичный репозиторий или тот, который этот хост уже может клонировать. Runner клонирует с теми учётными данными git, которые уже есть на хосте.

125 

126 Следующий доступный runner подхватывает поставленную в очередь сессию и записывает в лог `Picked up session <session-id>` вместе с числом активных сессий и ёмкостью, поэтому по собственному выводу runner можно определить, какой хост взял сессию. Наблюдайте за работой сессии и читайте ответы Claude на [claude.ai/code](https://claude.ai/code).

127 

128 Если сессия не начинает работу, сопоставьте то, что вы видите:

129 

130 * **Сессия остаётся в очереди**: см. [Устранение неполадок](/docs/ru/self-hosted-environments-deploy#troubleshooting).

131 * **Сессия не запускается из-за ошибки git**: ошибка отображается в сессии и в логе runner. Если она содержит `could not read Username for` из git, за которым следует URL вашего git-хоста, у runner не было учётных данных HTTPS для этого хоста. См. [Configure git](/docs/ru/self-hosted-environments-deploy#configure-git), где также описаны варианты учётных данных для приватных репозиториев в production.

105 </Step>132 </Step>

106</Steps>133</Steps>

107 134 

108Runner выходит по дизайну после завершения его активных сеансов; см. [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle). Для production развёртывайте его под оркестратором, который перезапускает его при выходе и ждёт дольше между перезапусками, когда runner продолжает выходить сразу после запуска. См. [Deploy to production](/docs/ru/self-hosted-environments-deploy) и [When the runner exits](/docs/ru/self-hosted-environments-deploy#when-the-runner-exits).135<h3 id="if-the-runner-exits">

136 Если runner завершился

137</h3>

138 

139Если runner завершится во время этого быстрого старта, запустите его снова той же командой. Runner может завершиться самостоятельно:

140 

141* **Сессии завершены**: в логе отображается `[runner:exit] account workload drained — exiting`. Runner по задумке завершается после окончания его активных сессий. См. [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle).

142* **Потеряна связь**: в логе отображается строка `[runner:fatal]` с `runner record gone server-side` или с `poll auth failed`. Если runner на некоторое время теряет связь с Anthropic, например потому что хост перешёл в спящий режим, он может завершиться при следующем обращении к Anthropic.

143 

144Завершённый ход не завершает вашу тестовую сессию. После первого хода сессия остаётся подключённой, а runner продолжает работать, поэтому вы можете [отправить сессии следующее сообщение](#send-a-follow-up-message-to-a-running-session), не перезапуская runner.

145 

146Для production развёртывайте runner под оркестратором, который перезапускает его при завершении и увеличивает паузу между перезапусками, если runner продолжает завершаться сразу после запуска. См. [Deploy to production](/docs/ru/self-hosted-environments-deploy) и [When the runner exits](/docs/ru/self-hosted-environments-deploy#when-the-runner-exits).

109 147 

110<h2 id="send-a-follow-up-message-to-a-running-session">148<h2 id="send-a-follow-up-message-to-a-running-session">

111 Отправьте follow-up сообщение работающему сеансу149 Отправьте follow-up сообщение работающему сеансу

Details

52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Отпустите слот сеанса после N минут неактивности после завершения хода или ожидания сеансом действия пользователя. Сеанс, который все еще находится в процессе хода, включая тот, который держит никогда не заканчивающуюся фоновую задачу или одобрение, запрошенное изнутри работающего вызова инструмента, не считается неактивным; объедините с `--kill-session-after-min` как жесткий упор. После завершения фоновой задачи сеанса runner считает сеанс занятым до тех пор, пока не начнется следующий ход, который читает результат, в течение максимум окна [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). До тех пор, пока runner не получит сигнал завершения или не достигнет времени выхода на пенсию, отпуск, который оставляет runner без активных сеансов, запускает тот же путь выхода, что и нормальное осушение, управляемое `--drain-grace-sec`. После первого сигнала, который вы отложили с помощью [`--defer-shutdown-max-min`](/docs/ru/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), runner выходит, как только отпуск оставляет его без сеансов. `0` отключает. |52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Отпустите слот сеанса после N минут неактивности после завершения хода или ожидания сеансом действия пользователя. Сеанс, который все еще находится в процессе хода, включая тот, который держит никогда не заканчивающуюся фоновую задачу или одобрение, запрошенное изнутри работающего вызова инструмента, не считается неактивным; объедините с `--kill-session-after-min` как жесткий упор. После завершения фоновой задачи сеанса runner считает сеанс занятым до тех пор, пока не начнется следующий ход, который читает результат, в течение максимум окна [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). До тех пор, пока runner не получит сигнал завершения или не достигнет времени выхода на пенсию, отпуск, который оставляет runner без активных сеансов, запускает тот же путь выхода, что и нормальное осушение, управляемое `--drain-grace-sec`. После первого сигнала, который вы отложили с помощью [`--defer-shutdown-max-min`](/docs/ru/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), runner выходит, как только отпуск оставляет его без сеансов. `0` отключает. |

53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | off | Удалите каталоги сеанса для каждого сеанса под `<base-dir>/_sessions/` когда сеанс заканчивается на этом runner, независимо от результата. [Reuse a pre-warmed checkout](/docs/ru/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) описывает, что они содержат и кто может их читать, когда они остаются. Удаление является лучшим усилием: каталоги для каждого сеанса остаются на месте, когда runner убивается или достигает крайнего срока осушения перед запуском очистки. С флагом включенным, логи отладки неудачного или прерванного сеанса не сохраняются на диск. Требует Claude Code v2.1.268 или позже. |53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | off | Удалите каталоги сеанса для каждого сеанса под `<base-dir>/_sessions/` когда сеанс заканчивается на этом runner, независимо от результата. [Reuse a pre-warmed checkout](/docs/ru/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) описывает, что они содержат и кто может их читать, когда они остаются. Удаление является лучшим усилием: каталоги для каждого сеанса остаются на месте, когда runner убивается или достигает крайнего срока осушения перед запуском очистки. С флагом включенным, логи отладки неудачного или прерванного сеанса не сохраняются на диск. Требует Claude Code v2.1.268 или позже. |

54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Выведите runner на пенсию в абсолютный временной штамп Unix в секундах для инфраструктуры, которая убивает runner в известное время; [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle) описывает последовательность отпуска и как определить размер маржи. Значения до 2001 или после года 5138 отклоняются флагом и игнорируются переменной окружения. |54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Выведите runner на пенсию в абсолютный временной штамп Unix в секундах для инфраструктуры, которая убивает runner в известное время; [Runner lifecycle](/docs/ru/self-hosted-environments#runner-lifecycle) описывает последовательность отпуска и как определить размер маржи. Значения до 2001 или после года 5138 отклоняются флагом и игнорируются переменной окружения. |

55| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | Какие из списков правил классификатора [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), которые управляющий уровень отправляет вместе с сессией, могут применяться к этой сессии: `all`, `no-allow` или `none`. Что применяет каждое значение, см. в разделе [Списки правил авторежима](#auto-mode-rule-lists). Недопустимое значение останавливает runner при запуске. Требуется Claude Code v2.1.295 или новее. |

55| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Как долго ждать чистого выхода процесса Claude после завершения сеанса перед принудительным завершением. Повысьте значение, если собственные hooks `SessionEnd` дочернего процесса нуждаются в большем времени. |56| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Как долго ждать чистого выхода процесса Claude после завершения сеанса перед принудительным завершением. Повысьте значение, если собственные hooks `SessionEnd` дочернего процесса нуждаются в большем времени. |

56| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Отпустите слот сеанса, если дочерний процесс не сигнализировал об инициализации в течение N минут после порождения. Очищается сигналом инициализации дочернего процесса на [канале активности](/docs/ru/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), а не обычным выводом, после чего `--release-idle-session-min` берет верх. `0` отключает. |57| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Освобождает слот сессии, если дочерний процесс не сообщил об инициализации в течение N минут после запуска. Клонирование выполняется до запуска, поэтому время клонирования не учитывается. Сбрасывается сигналом инициализации дочернего процесса в [канале активности](/docs/ru/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), а не обычным выводом, после чего в действие вступает `--release-idle-session-min`. `0` отключает. |

57| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Посейте сохраняемое доверие для путей репозитория каждого сеанса, чтобы зафиксированные в репо `permissions.allow` и `additionalDirectories` были соблюдены. Установите `false` для отпуска зафиксированных в репо грантов разрешений и вместо этого настройте правила разрешения в `settings.json` конфигурации хоста; параметры `sandbox.*` зафиксированные в репо все еще применяются в любом случае, поэтому [защита repo-settings](/docs/ru/self-hosted-environments-deploy#harden-your-deployment) сканирует их независимо от этого флага. |58| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Посейте сохраняемое доверие для путей репозитория каждого сеанса, чтобы зафиксированные в репо `permissions.allow` и `additionalDirectories` были соблюдены. Установите `false` для отпуска зафиксированных в репо грантов разрешений и вместо этого настройте правила разрешения в `settings.json` конфигурации хоста; параметры `sandbox.*` зафиксированные в репо все еще применяются в любом случае, поэтому [защита repo-settings](/docs/ru/self-hosted-environments-deploy#harden-your-deployment) сканирует их независимо от этого флага. |

58| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Клонируйте через [прокси git Anthropic](/docs/ru/self-hosted-environments-deploy#use-the-anthropic-git-proxy) вместо управляемой клиентом аутентификации git. Требует `--capacity 1` и git 2.32 или новее; runner отказывается запускаться в противном случае. Заменяет флаги переписи. |59| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Клонирует репозитории на github.com через [прокси git Anthropic](/docs/ru/self-hosted-environments-deploy#use-the-anthropic-git-proxy) вместо управляемой клиентом аутентификации git. Требует `--capacity 1` и git 2.32 или новее; в противном случае runner отказывается запускаться. Заменяет флаги перезаписи. |

59 60 

60Большинство флагов длительности имеют максимум, выбранный для сохранения каждого timeout в потолке 32-битного таймера runtime примерно 24,85 дня. Флаги `--*-min` ограничены 10080 минутами, 7 дней; `--drain-grace-sec` на 604800 секунд, также 7 дней; и `--drain-wait-sec` на 86400 секунд, 24 часа. `--session-stop-grace-sec` и `--post-session-hook-timeout-sec` не ограничены. Превышение лимита ведет себя по-разному в зависимости от поверхности:61Большинство флагов длительности имеют максимум, выбранный для сохранения каждого timeout в потолке 32-битного таймера runtime примерно 24,85 дня. Флаги `--*-min` ограничены 10080 минутами, 7 дней; `--drain-grace-sec` на 604800 секунд, также 7 дней; и `--drain-wait-sec` на 86400 секунд, 24 часа. `--session-stop-grace-sec` и `--post-session-hook-timeout-sec` не ограничены. Превышение лимита ведет себя по-разному в зависимости от поверхности:

61 62 

62* **Флаг**: запуск не удается с ошибкой.63* **Флаг**: запуск не удается с ошибкой.

63* **Переменная окружения**: runner зажимает значение до потолка таймера вместо его отклонения.64* **Переменная окружения**: runner зажимает значение до потолка таймера вместо его отклонения.

64 65 

66<h3 id="auto-mode-rule-lists">

67 Списки правил авторежима

68</h3>

69 

70`--server-auto-mode-lists` позволяет решить, какие правила классификатора [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), поступающие извне runner, применяются к сессиям на ваших runner. Управляющий уровень Anthropic может отправлять списки правил вместе с сессией и просить runner применить их. Некоторые записи могут быть правилами, написанными администратором вашей организации. Списки называются `environment`, `soft_deny` и `allow`:

71 

72* **`environment`**: запись может заставить классификатор разрешать как больше, так и меньше.

73* **`soft_deny`**: запись блокирует действие, если только пользователь явно не попросил о нём или не применяется исключение `allow`.

74* **`allow`**: исключения для записей `soft_deny`.

75 

76Значение флага определяет, какие списки применяет runner:

77 

78* **`no-allow`**: значение по умолчанию. Применяет `environment` и `soft_deny` и не применяет `allow`. Запись `environment` по-прежнему может заставить классификатор разрешать больше, поэтому значение по умолчанию не исключает всех ослаблений.

79* **`all`**: применяет все три списка.

80* **`none`**: не применяет ни один из них. Выберите `none`, чтобы исключить любые ослабления из этих списков. При этом также отбрасываются ограничения `soft_deny`.

81 

82Никакая настройка runner не заставляет управляющий уровень просить runner применить списки. Если он не просит, сессии не получают ни одного списка, что бы вы ни установили. Чтобы узнать, что произошло, запустите runner с `--log-level debug`. Тогда для каждой сессии runner записывает в лог строку, содержащую `the server asked this runner to apply`, или строку, содержащую `the server did not ask this runner to apply the auto mode lists it sends`.

83 

65<h2 id="orchestrator-cli-flags">84<h2 id="orchestrator-cli-flags">

66 Флаги CLI Orchestrator85 Флаги CLI Orchestrator

67</h2>86</h2>


72| :- | :- | :- |91| :- | :- | :- |

73| `--hook-concurrency <n>` | `4` | Максимум hooks `spawn-runner`, работающих параллельно. Также ограничивает, сколько запросов на порождение претендуют на опрос. |92| `--hook-concurrency <n>` | `4` | Максимум hooks `spawn-runner`, работающих параллельно. Также ограничивает, сколько запросов на порождение претендуют на опрос. |

74| `--hook-timeout <sec>` | `60` | Завершите дерево процессов hook после этого количества секунд. Timeout плюс его 5-секундная благодать убийства должны оставаться ниже `--expected-spawn-seconds`; orchestrator обеспечивает это при запуске. |93| `--hook-timeout <sec>` | `60` | Завершите дерево процессов hook после этого количества секунд. Timeout плюс его 5-секундная благодать убийства должны оставаться ниже `--expected-spawn-seconds`; orchestrator обеспечивает это при запуске. |

75| `--expected-spawn-seconds <sec>` | `120` | Ожидаемое время загрузки p99 для порожденных runner в диапазоне, обеспеченном сервером, от 10 до 3600. Отправляется при каждом опросе как аренда на стороне сервера; если ни один runner не регистрируется до его истечения, сеанс переоформляется с новым ID заказа. Все реплики должны совместно использовать это значение. |94| `--expected-spawn-seconds <sec>` | `120` | Ожидаемое время p99 с момента получения orchestrator запроса на порождение до регистрации runner, включая любое ожидание свободных ресурсов на вашей платформе. Сервер допускает диапазон от 10 до 3600. Отправляется при каждом опросе как аренда на стороне сервера: если ни один runner не зарегистрируется до её истечения, сессия предлагается повторно с новым ID заказа. Все реплики должны использовать одно и то же значение. |

76| `--min-idle <n>` | `0` | Держите по крайней мере N свободных слотов сеанса в режиме ожидания, активно порождая резервные runner. `0` отключает предварительное прогревание. Объедините с `--exit-if-unused-min` runner, чтобы избыточные резервные runner восстановили себя. |95| `--min-idle <n>` | `0` | Держите по крайней мере N свободных слотов сеанса в режиме ожидания, активно порождая резервные runner. `0` отключает предварительное прогревание. Объедините с `--exit-if-unused-min` runner, чтобы избыточные резервные runner восстановили себя. |

77| `--debug-dir <path>` | unset | Запишите рабочий заказ каждого запроса на порождение и stderr hook на диск. Только для отладки; никогда не устанавливайте в production. |96| `--debug-dir <path>` | unset | Запишите рабочий заказ каждого запроса на порождение и stderr hook на диск. Только для отладки; никогда не устанавливайте в production. |

78 97 


108| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Ограничение на то, как долго runner считает сеанс занятым для осушения `--drain-wait-sec` после завершения хода, пока процесс сеанса сообщает об окончании хода в Anthropic. `0` или неиспользуемое значение возвращается к значению по умолчанию, поэтому удержание не может быть отключено. Требует Claude Code v2.1.275 или позже. |127| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Ограничение на то, как долго runner считает сеанс занятым для осушения `--drain-wait-sec` после завершения хода, пока процесс сеанса сообщает об окончании хода в Anthropic. `0` или неиспользуемое значение возвращается к значению по умолчанию, поэтому удержание не может быть отключено. Требует Claude Code v2.1.275 или позже. |

109| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Как долго runner ждет, пока ОС доставит `SIGKILL` дочернему процессу, застрявшему в неперерываемом I/O, перед выходом самого себя. Минимум `--post-session-hook-timeout-sec` плюс 15 секунд, и 30 больше, когда установлен `--push-outcome-on-release`, поэтому эффективный минимум составляет 75 секунд при значениях по умолчанию. |128| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Как долго runner ждет, пока ОС доставит `SIGKILL` дочернему процессу, застрявшему в неперерываемом I/O, перед выходом самого себя. Минимум `--post-session-hook-timeout-sec` плюс 15 секунд, и 30 больше, когда установлен `--push-outcome-on-release`, поэтому эффективный минимум составляет 75 секунд при значениях по умолчанию. |

110| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Глубина выборки Git для свежих клонов. Установите положительное целое число или `full` или `0` для полной выборки. Репозитории, уже присутствующие в рабочем пространстве, сохраняют свою существующую глубину. |129| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Глубина выборки Git для свежих клонов. Установите положительное целое число или `full` или `0` для полной выборки. Репозитории, уже присутствующие в рабочем пространстве, сохраняют свою существующую глубину. |

130| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | Как долго в миллисекундах, в рамках одной попытки, выборка git может ждать первых данных, пока собственные показатели прогресса сервера git продолжают расти, например когда сервер подготавливает pack для большого репозитория. `0` или `off` отключает ожидание: тогда такая выборка прерывается через две минуты без данных. Любое другое целое число ограничивается диапазоном от `120000` до `1800000`, то есть от 2 до 30 минут. Требует Claude Code v2.1.295 или позже. |

111| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | unset | Когда `1`, пропустите проверку наличия `.git` после запуска hook `checkout`. Установите это, когда ваш hook материализует источник, не являющийся git. |131| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | unset | Когда `1`, пропустите проверку наличия `.git` после запуска hook `checkout`. Установите это, когда ваш hook материализует источник, не являющийся git. |

112| `FORCE_AUTOUPDATE_PLUGINS` | unset | Когда `1`, позвольте маркетплейсам плагинов автоматически обновляться, несмотря на то, что бинарный файл закреплен |132| `FORCE_AUTOUPDATE_PLUGINS` | unset | Когда `1`, позвольте маркетплейсам плагинов автоматически обновляться, несмотря на то, что бинарный файл закреплен |

113| `CLAUDE_CODE_DISABLE_ARTIFACT` | unset | Когда `1`, отключите инструмент Artifact в сеансах независимо от параметра администратора организации и отпустите требование выхода `*.frame.claudeusercontent.com` |133| `CLAUDE_CODE_DISABLE_ARTIFACT` | unset | Когда `1`, отключите инструмент Artifact в сеансах независимо от параметра администратора организации и отпустите требование выхода `*.frame.claudeusercontent.com` |


148 Метрики Prometheus168 Метрики Prometheus

149</h2>169</h2>

150 170 

151Каждый runner служит метрикам Prometheus в `GET /metrics` на том же порту, что и `/healthz`. Ключевые серии:171Каждый runner отдаёт метрики Prometheus по `GET /metrics` на том же порту, что и `/healthz`. Основные серии:

152 172 

153| Серия | Примечания |173| Серия | Примечания |

154| :- | :- |174| :- | :- |

155| `claude_code_self_hosted_runner_info{runner_id,version,client_label}` | Всегда `1`; полезно для инвентаризации флота и обнаружения дрейфа версий |175| `claude_code_self_hosted_runner_info{runner_id,version,client_label}` | Всегда `1`; полезна для инвентаризации парка и обнаружения расхождения версий |

156| `claude_code_self_hosted_runner_capacity` | Настроенный `--capacity` |176| `claude_code_self_hosted_runner_capacity` | Настроенное значение `--capacity` |

157| `claude_code_self_hosted_runner_active_sessions` | Сеансы, в настоящее время работающие |177| `claude_code_self_hosted_runner_active_sessions` | Сессии, выполняющиеся в данный момент |

158| `claude_code_self_hosted_runner_locked_account{email}` | Присутствует после того, как runner заблокировался на пользователя и был выдан токен сеанса, несущий претензию `act.email`. Серия отсутствует на runner, заблокированном на агента Claude Tag, чьи токены сеанса не несут `act.email`. Значение метки — это адрес электронной почты аккаунта; если ваше хранилище метрик широко читаемо, отпустите или хешируйте метку во время скребка, например с помощью Prometheus `metric_relabel_configs`. |178| `claude_code_self_hosted_runner_locked_account{email}` | Появляется, как только runner закреплён за пользователем и выдан токен сессии с утверждением `act.email`. Серия отсутствует на runner, закреплённом за агентом Claude Tag, поскольку его токены сессий не содержат `act.email`. Значение метки — email учётной записи; если ваше хранилище метрик доступно для чтения широкому кругу лиц, удаляйте или хешируйте метку при сборе, например с помощью `metric_relabel_configs` в Prometheus. |

159| `claude_code_self_hosted_runner_last_poll_age_seconds` | Секунды с момента последнего успешного опроса. Оповещение, если более 60. |179| `claude_code_self_hosted_runner_last_poll_age_seconds` | Секунды с момента последнего успешного опроса. Настройте оповещение, если значение превышает 60. |

160| `claude_code_self_hosted_runner_poll_errors_total{error_kind}` | Кумулятивные сбои PollWork по типу: `transport`, `timeout`, `5xx`, `429` или `4xx`. Все пять серий присутствуют с начала процесса; оповещение на `rate(...[5m]) > 0`. |180| `claude_code_self_hosted_runner_poll_errors_total{error_kind}` | Накопительное число сбоев PollWork по типам: `transport`, `timeout`, `5xx`, `429` или `4xx`. Все пять серий присутствуют с момента запуска процесса; настройте оповещение на `rate(...[5m]) > 0`. |

161| `claude_code_self_hosted_runner_sessions_started_total{client_platform}` | Дочерние процессы сеанса, порожденные за время жизни runner, одна серия на источник сеанса, такой как `web_claude_ai`, `ios`, `android`, `desktop_app` или `claude_code_cli`, или `unknown`, когда сервер не отправил один. Сеансы Slack несут либо `claude_in_slack`, либо `claude-in-slack` в зависимости от того, какая интеграция Slack их создала, поэтому совпадайте с обоими с помощью селектора regex, такого как `{client_platform=~"claude[-_]in[-_]slack"}`. Используйте `sum()` для общего количества флота. |181| `claude_code_self_hosted_runner_sessions_started_total{client_platform}` | Дочерние процессы сессий, запущенные за время жизни runner, по одной серии на источник сессии, например `web_claude_ai`, `ios`, `android`, `desktop_app` или `claude_code_cli`, либо `unknown`, если сервер его не передал. Сессии Slack помечаются либо `claude_in_slack`, либо `claude-in-slack` в зависимости от того, какая интеграция Slack их создала, поэтому сопоставляйте оба варианта селектором с регулярным выражением, например `{client_platform=~"claude[-_]in[-_]slack"}`. Используйте `sum()` для получения общего значения по парку. |

162| `claude_code_self_hosted_runner_sessions_completed_total{client_platform}` | Сеансы, которые завершились чисто, помеченные так же. Шире, чем простой чистый выход: см. [session lifecycle counter semantics](#session-lifecycle-counter-semantics) для того, что считается. |182| `claude_code_self_hosted_runner_sessions_completed_total{client_platform}` | Сессии, завершившиеся штатно, с такими же метками. Понятие шире, чем просто штатный выход: что именно учитывается, см. в разделе [семантика счётчиков жизненного цикла сессий](#session-lifecycle-counter-semantics). |

163| `claude_code_self_hosted_runner_sessions_failed_total{client_platform}` | Сеансы, которые завершились в отказе, помеченные так же. Та же оговорка: см. [session lifecycle counter semantics](#session-lifecycle-counter-semantics). |183| `claude_code_self_hosted_runner_sessions_failed_total{client_platform}` | Сессии, завершившиеся сбоем, с такими же метками. Та же оговорка: см. [семантика счётчиков жизненного цикла сессий](#session-lifecycle-counter-semantics). |

164| `claude_code_self_hosted_runner_sessions_interrupted_total{client_platform}` | Сеансы, которые runner завершил по операционной причине, а не по результату сеанса, помеченные так же. См. [session lifecycle counter semantics](#session-lifecycle-counter-semantics). |184| `claude_code_self_hosted_runner_sessions_interrupted_total{client_platform}` | Сессии, которые runner завершил по эксплуатационной причине, а не по итогу самой сессии, с такими же метками. См. [семантика счётчиков жизненного цикла сессий](#session-lifecycle-counter-semantics). |

165| `claude_code_self_hosted_runner_initializing_sessions` | Сеансы, в настоящее время находящиеся в фазе инициализации, от назначения до события инициализации дочернего процесса |185| `claude_code_self_hosted_runner_initializing_sessions` | Сессии, находящиеся в фазе инициализации: от назначения до события init дочернего процесса |

166| `claude_code_self_hosted_runner_session_init_duration_seconds` | Гистограмма длительности инициализации сеанса |186| `claude_code_self_hosted_runner_session_init_duration_seconds` | Гистограмма длительности инициализации сессий |

167| `claude_code_self_hosted_runner_session_init_errors_total` | Сеансы, которые не удалось инициализировать: сбой hook checkout, подготовка git, проблема с токеном или сбой дочернего процесса до инициализации |187| `claude_code_self_hosted_runner_session_init_errors_total` | Сессии, завершившиеся сбоем до достижения init: сбой хука checkout, подготовки git, выдачи токена или падение дочернего процесса до init |

168| `claude_code_self_hosted_runner_session_start_hook_errors_total` | Hooks `SessionStart`, которые сообщили об ошибке результата, один на каждое неудачное выполнение hook |188| `claude_code_self_hosted_runner_session_start_hook_errors_total` | Хуки `SessionStart`, сообщившие об ошибке, по одному на каждое неудачное выполнение хука |

169| `claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform}` | Датчик для каждого сеанса секунд с момента простоя сеанса. Полезно для завершения сеансов, застрявших на неотвеченном запросе разрешения. |189| `claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform}` | Gauge для каждой сессии: секунды с момента перехода сессии в режим простоя. Полезна для завершения сессий, зависших на неотвеченном запросе разрешения. |

170 190 

171Orchestrator служит своим собственным сериям в `GET /metrics` на том же порту, что и его `/healthz`:191Оркестратор отдаёт собственные серии по `GET /metrics` на том же порту, что и его `/healthz`:

172 192 

173| Серия | Примечания |193| Серия | Примечания |

174| :- | :- |194| :- | :- |

175| `claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname}` | Всегда `1` |195| `claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname}` | Всегда `1` |

176| `claude_code_self_hosted_orchestrator_connected` | `1`, когда последний опрос успешен; падает до `0` после любого неудачного опроса, независимо от типа сбоя |196| `claude_code_self_hosted_orchestrator_connected` | `1`, если последний опрос завершился успешно; падает до `0` после любого неудачного опроса, независимо от типа сбоя |

177| `claude_code_self_hosted_orchestrator_last_poll_age_seconds` | Секунды с момента последней попытки опроса, успеха или сбоя, в отличие от идентично названной метрики runner, которая измеряет с момента последнего успеха; объедините с `connected` для перехвата неудачных опросов. Цикл опроса orchestrator ждет выполнения hook, поэтому оповещение выше `--hook-timeout` плюс маржа, около 90 секунд при значениях по умолчанию, вместо плоских 60. |197| `claude_code_self_hosted_orchestrator_last_poll_age_seconds` | Секунды с момента последней попытки опроса, успешной или нет, в отличие от одноимённой метрики runner, которая отсчитывается от последнего успешного опроса; используйте вместе с `connected`, чтобы отлавливать неудачные опросы. Цикл опроса оркестратора ожидает выполнения хуков, поэтому настраивайте оповещение на значение выше `--hook-timeout` плюс запас, около 90 секунд при значениях по умолчанию, а не на фиксированные 60. |

178| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Кумулятивные сбои PollSpawnHints по типу: `transport`, `timeout`, `5xx`, `429` или `4xx`. Все пять серий присутствуют с начала процесса; оповещение на `rate(...[5m]) > 0`. |198| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Накопительное число сбоев PollSpawnHints по типам: `transport`, `timeout`, `5xx`, `429` или `4xx`. Все пять серий присутствуют с момента запуска процесса; настройте оповещение на `rate(...[5m]) > 0`. |

179| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Запросы на порождение, претендующие прямо сейчас |199| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Запросы на запуск, которые можно забрать прямо сейчас |

180| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Запросы на порождение в отступлении повтора после повторяемого сбоя hook |200| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Запросы на запуск, находящиеся в задержке перед повторной попыткой после сбоя хука, допускающего повторную попытку |

181| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Запросы на порождение, заблокированные до тех пор, пока Owner не повторит их с вкладки **Activity** среды; оповещение, если выше нуля |201| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Сессии, запуск которых заблокирован. Каждая остаётся заблокированной, пока пользователь не отправит ей новое сообщение или Owner не повторит попытку на вкладке **Activity** окружения. Значение может оставаться выше нуля после устранения причины. Настройте оповещение, если значение выше нуля. |

182| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Всего сеансов, ожидающих runner для этой среды. Совокупность на уровне среды, идентичная на каждом экземпляре orchestrator: используйте `MAX` вместо `SUM` по экземплярам. |202| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Общее число сессий, ожидающих runner для этого окружения. Агрегат по всему окружению, одинаковый на каждом экземпляре оркестратора: используйте `MAX`, а не `SUM` по экземплярам. |

183| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Сеансы, в настоящее время назначенные живому runner в этой среде. Совокупность на уровне среды, идентичная на каждом экземпляре orchestrator: используйте `MAX` вместо `SUM` по экземплярам. |203| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Сессии, в данный момент назначенные работающему runner в этом окружении. Агрегат по всему окружению, одинаковый на каждом экземпляре оркестратора: используйте `MAX`, а не `SUM` по экземплярам. |

184| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Кумулятивные результаты hook `spawn-runner`: `ok`, `retryable`, `non_retryable`. Подсчитывает вызовы hook orchestrator, а не дочерние процессы сеанса, которые порождают runner: не сравнимо с `sessions_started_total`, так как емкость выше одного, теплые пулы и runner, порожденные снова для того же сеанса, все расходятся в двух. |204| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Накопительные результаты хука `spawn-runner`: `ok`, `retryable`, `non_retryable`. Учитывает вызовы хука оркестратором, а не дочерние процессы сессий, которые запускают runner: несопоставима с `sessions_started_total`, поскольку ёмкость больше единицы, тёплые пулы и повторный запуск runner для той же сессии приводят к расхождению этих значений. |

185| `claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds` | Гистограмма длительности hook |205| `claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds` | Гистограмма длительности выполнения хука |

186| `claude_code_self_hosted_orchestrator_warm_hints_dispatched_total` | Запросы на порождение резервного копирования, отправленные с начала процесса |206| `claude_code_self_hosted_orchestrator_warm_hints_dispatched_total` | Резервные запросы на запуск, отправленные с момента запуска процесса |

187| `claude_code_self_hosted_orchestrator_session_queue_wait_seconds` | Гистограмма секунд, которые каждый сеанс ждал в очереди перед тем, как orchestrator претендовал на него для порождения, записанная из временной метки очереди ожидания, которую плоскость управления отправляет с каждым запросом на порождение сеанса. Используйте для оповещения времени очереди p50/p99. Порождения предварительного прогрева не отбираются. |207| `claude_code_self_hosted_orchestrator_session_queue_wait_seconds` | Гистограмма времени в секундах, которое каждая сессия провела в очереди, прежде чем оркестратор забрал её для запуска; записывается по метке времени ожидания в очереди, которую плоскость управления передаёт с запросом на запуск каждой сессии. Используйте для оповещений по p50/p99 времени в очереди. Запуски для предварительного прогрева не учитываются. |

188| `claude_code_self_hosted_orchestrator_clock_skew_seconds` | Перекос часов локальный минус сервер; диагностический, присутствует один раз измеренный |208| `claude_code_self_hosted_orchestrator_clock_skew_seconds` | Расхождение часов (локальное минус серверное); диагностическая метрика, появляется после измерения |

189| `claude_code_self_hosted_orchestrator_scm_connector_connected` | `1`, когда WebSocket [SCM connector](#scm-connector-flags) открыт; `0` во время набора номера или отступления. Отсутствует, когда `--scm-connector-host` не установлен. |209| `claude_code_self_hosted_orchestrator_scm_connector_connected` | `1`, когда WebSocket [коннектора SCM](#scm-connector-flags) открыт; `0` во время подключения или задержки перед повторной попыткой. Отсутствует, если `--scm-connector-host` не задан. |

190| `claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total` | Кумулятивные HTTP запросы, проксированные на настроенный хост SCM с начала процесса. Отсутствует, когда `--scm-connector-host` не установлен. |210| `claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total` | Накопительное число HTTP-запросов, проксированных на настроенный хост SCM с момента запуска процесса. Отсутствует, если `--scm-connector-host` не задан. |

191 211 

192Для автомасштабирования выберите серию, которая соответствует вашему стилю масштабирования, и ограничьте её перед подачей в масштабер:212Для автомасштабирования выберите серию, соответствующую вашему подходу к масштабированию, и отфильтруйте её, прежде чем передавать в механизм масштабирования:

193 213 

194* **Масштабирование глубины очереди**: подайте `claude_code_self_hosted_orchestrator_pool_pending_sessions` в ваш HPA или KEDA масштабер, а не `queue_pending_sessions`.214* **Масштабирование по глубине очереди**: передавайте в HPA или KEDA `claude_code_self_hosted_orchestrator_pool_pending_sessions`, а не `queue_pending_sessions`.

195* **Масштабирование емкости**: масштабируйте по соотношению `active_sessions` runner к `capacity`.215* **Масштабирование по ёмкости**: масштабируйте по отношению `active_sessions` runner к `capacity`.

196* **Ограничение на `connected`**: отфильтруйте запрос с помощью `claude_code_self_hosted_orchestrator_connected == 1` на экземпляр, поэтому устаревшее значение отключенной реплики не подается в масштабер.216* **Фильтрация по `connected`**: фильтруйте запрос условием `claude_code_self_hosted_orchestrator_connected == 1` для каждого экземпляра, чтобы устаревшее значение отключённой реплики не попадало в механизм масштабирования.

197 217 

198Во время полного отключения опроса каждая реплика отключена, гейтированный запрос не возвращает данные. HPA удерживает текущее количество реплик на отсутствующей метрике, но Prometheus масштабер KEDA при его значении по умолчанию `ignoreNullValues: "true"` читает пустой результат как ноль и масштабирует; установите `ignoreNullValues: "false"` на ScaledObject, опционально с полом реплики `fallback`.218Во время полного сбоя опроса, когда все реплики отключены, отфильтрованный запрос не возвращает данных. HPA сохраняет текущее число реплик при отсутствии метрики, однако Prometheus scaler в KEDA со значением по умолчанию `ignoreNullValues: "true"` интерпретирует пустой результат как ноль и уменьшает число реплик; задайте `ignoreNullValues: "false"` в ScaledObject, при необходимости вместе с минимальным числом реплик `fallback`.

199 219 

200Следующий Prometheus Operator `PodMonitor` охватывает оба процесса. Он выбирает pods по метке `app.kubernetes.io/part-of: claude-code-self-hosted-runner` и именованному порту `health`, который устанавливает [рецепт Kubernetes](/docs/ru/self-hosted-environments-deploy#kubernetes); отрегулируйте пространства имен в соответствии с вашим развертыванием:220Следующий `PodMonitor` для Prometheus Operator охватывает оба процесса. Он выбирает поды по метке `app.kubernetes.io/part-of: claude-code-self-hosted-runner` и именованному порту `health`, которые задаёт [рецепт для Kubernetes](/docs/ru/self-hosted-environments-deploy#kubernetes); скорректируйте пространства имён в соответствии с вашим развёртыванием:

201 221 

202```yaml theme={null}222```yaml theme={null}

203# Example Prometheus Operator PodMonitor for the Claude Code self-hosted223# Example Prometheus Operator PodMonitor for the Claude Code self-hosted


227 interval: 30s247 interval: 30s

228```248```

229 249 

230Эти примеры правил оповещения — это отправная точка; настройте пороги для размера вашего флота:250Эти примеры правил оповещений — отправная точка; настройте пороговые значения под размер вашего парка:

231 251 

232```yaml theme={null}252```yaml theme={null}

233# Example Prometheus alert rules for the Claude Code self-hosted runner253# Example Prometheus alert rules for the Claude Code self-hosted runner


285 for: 1m305 for: 1m

286 labels: {severity: critical}306 labels: {severity: critical}

287 annotations:307 annotations:

288 summary: "{{ $value }} sessions circuit-broken — spawn-runner hook is repeatedly non-retryable; fix infra then retry from the Activity tab"308 summary: "Sessions blocked from spawning: {{ $value }}. Read each one's error in the Activity tab, fix the cause, then select Retry"

289 - alert: ClaudeOrchestratorPollErrors309 - alert: ClaudeOrchestratorPollErrors

290 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0310 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0

291 for: 2m311 for: 2m


301```321```

302 322 

303<h3 id="pass-through-session-child-metrics">323<h3 id="pass-through-session-child-metrics">

304 Пропустить метрики дочернего процесса сеанса324 Проброс метрик дочерних процессов сессий

305</h3>325</h3>

306 326 

307Каждый сеанс работает в своем собственном дочернем процессе с собственными метриками OpenTelemetry; при `--capacity` выше одного runner переписывает, как эти метрики дочернего процесса выставляются. Установка `OTEL_METRICS_EXPORTER=prometheus` на хосте runner и `CLAUDE_CODE_ENABLE_TELEMETRY=1` в окружении сеанса, например из вашего [скрипта-обертки](/docs/ru/self-hosted-environments-configuration#wrapper-scripts) или собственного окружения runner, которое сеансы наследуют, переоткрывает счетчики и датчики каждого дочернего процесса на собственной конечной точке `/metrics` runner, наряду с сериями runner. Runner переписывает экспортер дочернего процесса для отправки по OTLP на приемник только для loopback на порту здоровья, помечает каждую серию метками `session_id` и `client_platform` и вытесняет серии сеанса при завершении этого сеанса. Гистограммы не проходят, и метрика дочернего процесса, чье имя будет конфликтовать с собственным префиксом runner, отпускается.327Каждая сессия выполняется в собственном дочернем процессе со своими метриками OpenTelemetry; при `--capacity` больше единицы runner изменяет способ публикации этих дочерних метрик. Если задать `OTEL_METRICS_EXPORTER=prometheus` на хосте runner и `CLAUDE_CODE_ENABLE_TELEMETRY=1` в окружении сессии, например из вашего [скрипта-обёртки](/docs/ru/self-hosted-environments-configuration#wrapper-scripts) или в собственном окружении runner, которое наследуют сессии, то инструменты типа counter и gauge каждого дочернего процесса будут повторно опубликованы на собственном эндпоинте `/metrics` runner рядом с сериями самого runner. Runner перенастраивает экспортёр дочернего процесса на отправку по OTLP в приёмник на порту health, доступный только через loopback, помечает каждую серию метками `session_id` и `client_platform` и удаляет серии сессии, когда эта сессия завершается. Гистограммы не пробрасываются, а дочерняя метрика, имя которой конфликтовало бы с собственным префиксом runner, отбрасывается.

308 328 

309При значении по умолчанию `--capacity 1` переписывание не применяется: дочерний процесс сеанса привязывает свою собственную конечную точку Prometheus на порту 9464 как обычно.329При значении по умолчанию `--capacity 1` эта перенастройка не применяется: дочерний процесс сессии, как обычно, открывает собственный эндпоинт Prometheus на порту 9464.

310 330 

311<h3 id="session-lifecycle-counter-semantics">331<h3 id="session-lifecycle-counter-semantics">

312 Семантика счетчика жизненного цикла сеанса332 Семантика счётчиков жизненного цикла сессий

313</h3>333</h3>

314 334 

315Счетчики `sessions_started_total`, `sessions_completed_total`, `sessions_failed_total` и `sessions_interrupted_total` классифицируют каждый сеанс по тому, как он завершился. Каждый порожденный дочерний процесс сеанса увеличивает `sessions_started_total` во время порождения, и ровно один из трех других увеличивается при выходе, поэтому `sessions_started_total` минус сумма трех других равна количеству дочерних процессов сеанса, в настоящее время работающих.335Счётчики `sessions_started_total`, `sessions_completed_total`, `sessions_failed_total` и `sessions_interrupted_total` классифицируют каждую сессию по тому, как она завершилась. Каждый запущенный дочерний процесс сессии увеличивает `sessions_started_total` в момент запуска, и ровно один из остальных трёх счётчиков увеличивается при выходе, поэтому `sessions_started_total` минус сумма остальных трёх равна числу дочерних процессов сессий, выполняющихся в данный момент.

316 336 

317* `completed`: сеанс завершился чисто. Это охватывает дочерний процесс, выходящий самостоятельно с кодом `0`, сеанс, архивируемый или удаляемый, пока дочерний процесс был все еще подключен, и runner, передающий слот чисто: отпуск сеанса при timeout простоя, времени выхода на пенсию или лимите `--kill-session-after-min`; startup timeout; или деассайн на стороне сервера, который цикл опроса заметил перед выходом дочернего процесса. Увеличивает `sessions_completed_total`.337* `completed`: сессия завершилась штатно. Сюда относятся: самостоятельный выход дочернего процесса с кодом `0`; архивация или удаление сессии, пока дочерний процесс ещё был подключён; штатное освобождение слота runner: освобождение сессии по таймауту простоя, по времени вывода из эксплуатации или по лимиту `--kill-session-after-min`; таймаут запуска; либо снятие назначения на стороне сервера, которое цикл опроса заметил до выхода дочернего процесса. Увеличивает `sessions_completed_total`.

318* `failed`: дочерний процесс выходит самостоятельно с ненулевым кодом, либо сбой, либо сбой настройки после порождения. Увеличивает `sessions_failed_total`.338* `failed`: дочерний процесс самостоятельно завершился с ненулевым кодом — из-за падения или сбоя настройки после запуска. Увеличивает `sessions_failed_total`.

319* `interrupted`: runner завершил дочерний процесс по операционной причине, которая не является ни успехом сеанса, ни ошибкой runner, такой как осушение или завершение сеанса, который все еще был на runner, когда окончилось окно благодати [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) после его лимита `--kill-session-after-min`. Перезагрузка Kubernetes, отправляющая `SIGTERM`, является одним примером осушения. Увеличивает `sessions_interrupted_total`.339* `interrupted`: runner завершил дочерний процесс по эксплуатационной причине, которая не является ни успехом сессии, ни ошибкой runner, например при выводе из работы (drain) или при завершении сессии, которая всё ещё находилась на runner по истечении окна отсрочки [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) после её лимита `--kill-session-after-min`. Поэтапный перезапуск в Kubernetes с отправкой `SIGTERM` — один из примеров вывода из работы. Увеличивает `sessions_interrupted_total`.

320 340 

321До v2.1.260 runner завершал каждый сеанс, который достигал своего лимита `--kill-session-after-min`, и подсчитывал его в `sessions_interrupted_total`.341До версии v2.1.260 runner завершал каждую сессию, достигшую лимита `--kill-session-after-min`, и учитывал её в `sessions_interrupted_total`.

322 342 

323Hook [`post-session`](/docs/ru/self-hosted-environments-configuration#post-session) классифицирует чистые передачи по-другому через `CLAUDE_RUNNER_EXIT_REASON`. Hook сообщает об отпуске, startup timeout и деассайне сервера как `interrupted`, потому что runner остановил дочерний процесс. Эти счетчики записывают те же события, что и `completed`, потому что слот был передан чисто.343Переменная `CLAUDE_RUNNER_EXIT_REASON` [хука `post-session`](/docs/ru/self-hosted-environments-configuration#post-session) классифицирует штатные передачи иначе. Хук сообщает о них как об `interrupted`, поскольку runner остановил дочерний процесс: это освобождение, таймаут запуска, снятие назначения сервером, а также архивация или удаление, которые первым заметил опрос. Эти счётчики записывают те же события как `completed`, поскольку слот был освобождён штатно.

324 344 

325Если вы согласовываете квитанции hook непосредственно с `sessions_completed_total`, вы недосчитываетесь завершений. Используйте hook для гарантий для каждого сеанса и счетчики для совокупных ставок.345Если сверять получение хуков непосредственно с `sessions_completed_total`, число завершений окажется заниженным. Используйте хук для гарантий на уровне отдельных сессий, а счётчики — для агрегированных показателей.

326 346 

327В одноразовой среде `--capacity 1` с значением по умолчанию `--drain-grace-sec 0` каждый процесс runner выходит через несколько мгновений после завершения его одного сеанса. `sessions_completed_total`, `sessions_failed_total` и `sessions_interrupted_total` увеличиваются только при завершении сеанса, прямо перед этим выходом, поэтому скребок Prometheus каждые 15-60 секунд редко ловит увеличение перед исчезновением серии runner; эти три счетчика конца сеанса — это терминальные счетчики, на которые ссылается остальная часть этого раздела. `sessions_started_total` увеличивается при порождении и остается видимым в течение жизни сеанса, поэтому он надежно показывается, но в одноразовой среде он читается ближе к "сеансам, в настоящее время работающим", чем к совокупному подсчету.347В одноразовом окружении, с `--capacity 1` и значением по умолчанию `--drain-grace-sec 0`, каждый процесс runner завершается через мгновение после окончания его единственной сессии. `sessions_completed_total`, `sessions_failed_total` и `sessions_interrupted_total` увеличиваются только в конце сессии, непосредственно перед этим выходом, поэтому сбор метрик Prometheus каждые 15–60 секунд редко успевает зафиксировать приращение до того, как серии runner исчезнут; именно эти три счётчика окончания сессии далее в этом разделе называются терминальными. `sessions_started_total` увеличивается при запуске и остаётся видимым на протяжении всей сессии, поэтому он надёжно появляется, однако в одноразовом окружении он скорее отражает «сессии, выполняющиеся в данный момент», чем накопительное значение.

328 348 

329Используйте серию в этой таблице для соответствующей цели вместо терминальных счетчиков:349Для соответствующей цели используйте серии из этой таблицы вместо терминальных счётчиков:

330 350 

331| Цель | Использование |351| Цель | Что использовать |

332| :- | :- |352| :- | :- |

333| Пропускная способность | `claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"}`, счетчик на долгоживущем orchestrator, который увеличивается один раз на успешный hook `spawn-runner` и остается значимым под `rate()`. Он подсчитывает вызовы hook, а не сеансы, поэтому предварительное прогревание и повторные порождения для того же сеанса расходятся в нем от подсчетов сеансов. |353| Пропускная способность | `claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"}` — счётчик на долгоживущем оркестраторе, который увеличивается один раз на каждое успешное выполнение хука `spawn-runner` и сохраняет смысл при использовании `rate()`. Он учитывает вызовы хука, а не сессии, поэтому предварительный прогрев и повторные запуски для одной и той же сессии приводят к расхождению с числом сессий. |

334| Использование | `sum(claude_code_self_hosted_runner_active_sessions)` против `sum(claude_code_self_hosted_runner_capacity)`, оба датчика действительны при каждом скребке независимо от времени жизни runner |354| Загрузка | `sum(claude_code_self_hosted_runner_active_sessions)` относительно `sum(claude_code_self_hosted_runner_capacity)`; обе метрики — gauge, корректные при каждом сборе независимо от времени жизни runner |

335| Невыполненные заказы | `claude_code_self_hosted_orchestrator_pool_pending_sessions` для глубины очереди и `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions`, оповещение, если выше нуля |355| Очередь | `claude_code_self_hosted_orchestrator_pool_pending_sessions` для глубины очереди и `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` с оповещением, если значение выше нуля |

336| Сбои | `claude_code_self_hosted_runner_sessions_failed_total`, лучшее усилие: реальные сбои после порождения действительно увеличивают его, и `rate()` значим на runner, которые пережили свои сеансы с `--drain-grace-sec` выше `0`. Одноразовая среда имеет ту же проблему окна скребка, что и другие терминальные счетчики, поэтому рассматривайте любое ненулевое значение, которое вы видите, как стоящее исследования. Сбои перед порождением, такие как сбой hook checkout, подготовка git или проблема с токеном, появляются только в `session_init_errors_total`. |356| Сбои | `claude_code_self_hosted_runner_sessions_failed_total`, по мере возможности: реальные падения после запуска его увеличивают, а `rate()` имеет смысл на runner, которые переживают свои сессии при `--drain-grace-sec` больше `0`. В одноразовом окружении существует та же проблема окна сбора, что и у остальных терминальных счётчиков, поэтому любое ненулевое значение, которое вы всё же увидите, стоит расследовать. Сбои до запуска, например сбой хука checkout, подготовки git или выдачи токена, отражаются только в `session_init_errors_total`. |

337 357 

338Строки `orchestrator_*` существуют только в средах, работающих с [on-demand orchestrator](/docs/ru/self-hosted-environments-configuration#on-demand-runners). На фиксированном флоте, чьи runner пережили свои сеансы, с `--drain-grace-sec` выше `0`, используйте `sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m]))` для пропускной способности; в одноразовом флоте эта серия имеет ту же проблему окна скребка, что и терминальные счетчики, поэтому полагайтесь на подсчет сеансов в очереди вместо этого. Проверьте невыполненные заказы на вкладке **Activity** среды, на [странице администратора **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): runner не экспортируют серию глубины очереди.358Строки `orchestrator_*` существуют только в окружениях, использующих [оркестратор по требованию](/docs/ru/self-hosted-environments-configuration#on-demand-runners). В фиксированном парке, runner которого переживают свои сессии при `--drain-grace-sec` больше `0`, используйте `sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m]))` для пропускной способности; в одноразовом парке у этой серии та же проблема окна сбора, что и у терминальных счётчиков, поэтому полагайтесь на число сессий в очереди. Проверяйте очередь на вкладке **Activity** окружения на [странице администрирования **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): runner не экспортируют серию глубины очереди.

339 359 

340Для отчетности результатов для каждого сеанса используйте вместо этого [hook `post-session`](/docs/ru/self-hosted-environments-configuration#post-session): он срабатывает при каждом завершении сеанса, где был порожден дочерний процесс, кроме резкого завершения runner, такого как вытеснение VM, в соответствии с [собственным контрактом hook](/docs/ru/self-hosted-environments-configuration#post-session).360Для отчётности по итогам отдельных сессий используйте [хук `post-session`](/docs/ru/self-hosted-environments-configuration#post-session): он срабатывает при каждом завершении сессии, для которой был запущен дочерний процесс, за исключением внезапного завершения runner, например при вытеснении VM, в соответствии с [собственным контрактом хука](/docs/ru/self-hosted-environments-configuration#post-session).

341 361 

342<h2 id="what’s-next">362<h2 id="what’s-next">

343 Что дальше363 Что дальше

Details

87 87 

88Флаги dispatch `--environment` и `--ref` требуют Claude Code v2.1.224 или позже на машине, которая запускает скрипт, то же минимальное требование, что и для самого runner. С установленным hook и запущенным runner на этом хосте тестовый скрипт:88Флаги dispatch `--environment` и `--ref` требуют Claude Code v2.1.224 или позже на машине, которая запускает скрипт, то же минимальное требование, что и для самого runner. С установленным hook и запущенным runner на этом хосте тестовый скрипт:

89 89 

901. Создаёт сеанс в тестовом окружении с помощью `claude -p "<prompt>" --environment <environment-id> --output-format json`, запущенной из git-репозитория, чтобы CLI мог автоматически обнаружить репозиторий из удалённого `origin`. Опциональный флаг `--ref <branch>` основывает checkout сеанса на именованном ref вместо локального HEAD. Команда создаёт сеанс, выводит одну строку JSON, содержащую `session_id`, и выходит без ожидания ответа Claude.901. Создаёт сессию в тестовом окружении с помощью `claude -p "<prompt>" --environment <environment-id> --output-format json`. Запускайте команду из git-checkout, чтобы CLI мог автоматически определить репозиторий по удалённому `origin`. Опциональный флаг `--ref <branch>` основывает checkout сессии на именованном ref вместо локального HEAD. Команда завершается, не дожидаясь ответа Claude. То, что она выводит, сообщает вашему скрипту результат:

91 * **Сессия создана**: одна строка JSON, например `{"ok":true,"session_id":"session_...","title":"...","url":"...","pool_id":"..."}`

92 * **Не удалось создать сессию**: строка `{"ok":false,"error":"..."}`, и команда завершается с кодом 1

93 * **Некоторые более ранние ошибки**, например недоступность облачных сессий для вашей организации или отсутствующий промпт: ошибка выводится в stderr без строки JSON, и команда завершается с кодом 1

912. Ждёт, пока ответ появится в `$E2E_REPLY_DIR/<session_id>.txt`, записанный hook Stop на runner после завершения хода.942. Ждёт, пока ответ появится в `$E2E_REPLY_DIR/<session_id>.txt`, записанный hook Stop на runner после завершения хода.

923. Отправляет дополнительный вопрос с помощью `claude -p "<message>" --cloud <session_id> --output-format json` (см. [Отправка дополнительного сообщения в работающий сеанс](/docs/ru/claude-code-on-the-web#send-follow-ups-from-the-cli)), который отправляет событие пользователя в существующий сеанс и выходит.953. Отправляет дополнительный вопрос с помощью `claude -p "<message>" --cloud <session_id> --output-format json` (см. [Отправка дополнительного сообщения в работающий сеанс](/docs/ru/claude-code-on-the-web#send-follow-ups-from-the-cli)), который отправляет событие пользователя в существующий сеанс и выходит.

934. Ждёт ответа на дополнительный вопрос так же, как на шаге 2.964. Ждёт ответа на дополнительный вопрос так же, как на шаге 2.


104 Пример скрипта107 Пример скрипта

105</h2>108</h2>

106 109 

107Скрипт ниже запускает полный цикл против `$CLAUDE_TEST_ENVIRONMENT_ID`, ID `ccpool_...` вашего тестового окружения, показанный в диалоговом окне деталей окружения на странице администратора или возвращённый вызовом [create-environment](#create-a-dedicated-test-environment), и проверяет наличие фразы-маркера в каждом ответе. Запускайте его из git-клона репозитория, в котором должна работать сессия, после запуска runner на этом хосте с установленным хуком захвата и экспортированной переменной `E2E_REPLY_DIR`. Сначала войдите с учётной записью claude.ai на машине, на которой запускается скрипт, как описано в разделе [Аутентификация из CI](#authenticate-from-ci). Без этого входа первая отправка завершится ошибкой, например `Unable to get organization UUID for cloud session creation`.110Пример скрипта запускается на той же машине, что и тестовый runner. Перед запуском подготовьте эту машину:

111 

112* **Клон репозитория**: запускайте скрипт из git-клона репозитория, в котором должна работать сессия.

113* **Runner**: запустите runner на этом хосте с установленным хуком захвата и экспортированной переменной `E2E_REPLY_DIR`.

114* **Вход**: войдите с учётной записью claude.ai на машине, на которой запускается скрипт, как описано в разделе [Аутентификация из CI](#authenticate-from-ci).

115* **ID окружения**: задайте в `CLAUDE_TEST_ENVIRONMENT_ID` ID `ccpool_...` вашего тестового окружения, показанный в диалоговом окне деталей окружения на странице администратора или возвращённый [вызовом create-environment](#create-a-dedicated-test-environment).

116 

117Скрипт ниже запускает полный цикл против `$CLAUDE_TEST_ENVIRONMENT_ID` и проверяет наличие фразы-маркера в каждом ответе.

108 118 

109```bash theme={null}119```bash theme={null}

110#!/usr/bin/env bash120#!/usr/bin/env bash


152TURN1="e2e-probe-$(date +%s)-$$: say exactly 'ok: custom tools are reachable' and nothing else"162TURN1="e2e-probe-$(date +%s)-$$: say exactly 'ok: custom tools are reachable' and nothing else"

153EXPECT1="ok: custom tools are reachable"163EXPECT1="ok: custom tools are reachable"

154create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \164create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \

155 --ref "$TEST_REPO_REF" --output-format json)165 --ref "$TEST_REPO_REF" --output-format json < /dev/null)

156echo "create: $create_json"166echo "create: $create_json"

157SESSION_ID=$(jq -er '.session_id' <<<"$create_json")167SESSION_ID=$(jq -er '.session_id' <<<"$create_json")

158 168 


163# 3. Post a follow-up via the CLI.173# 3. Post a follow-up via the CLI.

164TURN2="e2e-probe-followup-$(date +%s): say exactly 'ok: follow-up delivered' and nothing else"174TURN2="e2e-probe-followup-$(date +%s): say exactly 'ok: follow-up delivered' and nothing else"

165EXPECT2="ok: follow-up delivered"175EXPECT2="ok: follow-up delivered"

166followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json)176followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json < /dev/null)

167echo "followup: $followup_json"177echo "followup: $followup_json"

168jq -e '.ok == true' <<<"$followup_json" >/dev/null178jq -e '.ok == true' <<<"$followup_json" >/dev/null

169 179 

skills.md +1 −1

Details

235 235 

236Если скилл существует только в `~/.claude/skills/` на вашем компьютере, Claude Code сообщает, что скилл не найден, когда его вызывает [routine](/docs/ru/routines), поскольку каждый запуск routine начинается как новая облачная сессия. Чтобы сделать личный скилл доступным в этих сессиях:236Если скилл существует только в `~/.claude/skills/` на вашем компьютере, Claude Code сообщает, что скилл не найден, когда его вызывает [routine](/docs/ru/routines), поскольку каждый запуск routine начинается как новая облачная сессия. Чтобы сделать личный скилл доступным в этих сессиях:

237 237 

238* Для Cowork и облачных сессий включите скилл для своего аккаунта claude.ai.238* Для Cowork и облачных сессий включите скилл для своего аккаунта claude.ai. [Некоторые сессии в самостоятельно размещённой среде](/docs/ru/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) не загружают скиллы вашего аккаунта.

239* Для облачных сессий вы можете вместо этого сделать коммит скилла в `.claude/skills/` репозитория. Плагины, объявленные в `.claude/settings.json` репозитория, и плагины, включённые только в ваших пользовательских настройках, [не загружаются в облачных сессиях](/docs/ru/cloud-environments#what-carries-over-from-your-setup).239* Для облачных сессий вы можете вместо этого сделать коммит скилла в `.claude/skills/` репозитория. Плагины, объявленные в `.claude/settings.json` репозитория, и плагины, включённые только в ваших пользовательских настройках, [не загружаются в облачных сессиях](/docs/ru/cloud-environments#what-carries-over-from-your-setup).

240 240 

241[Запланированные задачи Desktop](/docs/ru/desktop-scheduled-tasks) выполняются локально на вашем компьютере, поэтому они загружают `~/.claude/skills/`.241[Запланированные задачи Desktop](/docs/ru/desktop-scheduled-tasks) выполняются локально на вашем компьютере, поэтому они загружают `~/.claude/skills/`.

vs-code.md +1 −1

Details

479 479 

480Claude открывает новые вкладки для задач браузера и делится состоянием входа вашего браузера, поэтому он может получить доступ к любому сайту, на который вы уже вошли.480Claude открывает новые вкладки для задач браузера и делится состоянием входа вашего браузера, поэтому он может получить доступ к любому сайту, на который вы уже вошли.

481 481 

482Чтобы каждая сессия подключалась к вашему браузеру при запуске без ввода `@browser`, см. раздел [Включение Chrome по умолчанию](/docs/ru/chrome#enable-chrome-by-default). О том, когда Claude Code запрашивает у вас подтверждение перед действием в браузере в сессии, подключённой таким образом, см. раздел [Запросы разрешений в сессиях VS Code](/docs/ru/chrome#permission-prompts-in-vs-code-sessions).482Чтобы каждая сессия подключалась к вашему браузеру при запуске без ввода `@browser`, см. раздел [Включение Chrome по умолчанию](/docs/ru/chrome#enable-chrome-by-default). О том, когда Claude Code запрашивает у вас подтверждение перед действием в браузере, см. раздел [Запросы разрешений в сессиях VS Code](/docs/ru/chrome#permission-prompts-in-vs-code-sessions).

483 483 

484Инструкции по настройке, полный список возможностей и устранение неполадок см. в разделе [Use Claude Code with Chrome](/docs/ru/chrome).484Инструкции по настройке, полный список возможностей и устранение неполадок см. в разделе [Use Claude Code with Chrome](/docs/ru/chrome).

485 485