SpyBara
Go Premium

Documentation 2026-10-23 22:59 UTC to 2026-10-24 22:59 UTC

31 files changed +772 −195. View all changes and history on the product overview
2026
Fri 30 23:01 Thu 29 23:57 Wed 28 23:57 Tue 27 22:59 Mon 26 22:57 Sun 25 23:58 Sat 24 22:59 Fri 23 22:59 Thu 22 22:58 Wed 21 23:02 Tue 20 23:00 Mon 19 23:58 Sat 17 23:57 Fri 16 22:59 Thu 15 23:58 Wed 14 22:58 Tue 13 23:57 Sun 11 23:57 Sat 10 23:01 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

artifacts.md +1 −3

Details

340 340 

341Claude Docs подключается к Claude Code как [соединитель](https://code.claude.com/docs/ru/mcp.md#use-mcp-servers-from-claude-ai) claude.ai, а не как команда. Когда он подключен, `/mcp` отображает его как `claude.ai Claude Docs`. Запрос на документ, предназначенный для других людей, затем переходит в Claude Docs вместо страницы артефакта: спецификация, предложение или описание плана, который вы разработали в сеансе. Claude дает вам ссылку на документ, когда он создан.341Claude Docs подключается к Claude Code как [соединитель](https://code.claude.com/docs/ru/mcp.md#use-mcp-servers-from-claude-ai) claude.ai, а не как команда. Когда он подключен, `/mcp` отображает его как `claude.ai Claude Docs`. Запрос на документ, предназначенный для других людей, затем переходит в Claude Docs вместо страницы артефакта: спецификация, предложение или описание плана, который вы разработали в сеансе. Claude дает вам ссылку на документ, когда он создан.

342 342 

343Документ, который принадлежит кодовой базе, например README, остается файлом. Чтобы получить файл для чего-то, что Claude иначе поместил бы в Claude Docs, укажите формат, например `.docx` или файл Markdown в репозитории.343Документ, который принадлежит кодовой базе, например README, остается файлом. Чтобы получить файл для чего-то, что Claude иначе поместил бы в Claude Docs, укажите формат, например `.docx` или файл Markdown в репозитории. Чтобы отключить только коннектор `claude.ai Claude Docs`, см. раздел [Отключение коннекторов claude.ai](https://code.claude.com/docs/ru/mcp.md#disable-claude-ai-connectors).

344 

345Чтобы отключить соединитель, добавьте `claude.ai Claude Docs` в `deniedMcpServers` или используйте переключатель `/mcp`, оба описаны в разделе [Отключение соединителей claude.ai](https://code.claude.com/docs/ru/mcp.md#disable-claude-ai-connectors).

346 344 

347## Ограничения страницы345## Ограничения страницы

348 346 

Details

458 458 

459#### Как действуют ключи хуков и скиллов в родительских настройках459#### Как действуют ключи хуков и скиллов в родительских настройках

460 460 

461Если вы передаёте `disableAllHooks: true` как родительскую настройку через параметр `managedSettings` в Agent SDK, останавливаются не все хуки. Ваши [функции обратного вызова хуков SDK](https://code.claude.com/docs/ru/agent-sdk/hooks.md) продолжают выполняться, как и хуки администратора, которые ваше приложение отключить не может.461Ключи, которые ваше приложение передаёт в параметре [`managedSettings`](https://code.claude.com/docs/ru/agent-sdk/typescript#options) Agent SDK, являются родительскими настройками. На машине, где администратор развёртывает управляемые настройки, Claude Code игнорирует родительские настройки, если только администратор не [разрешил встраивающему хосту добавлять политику](https://code.claude.com/docs/ru/managed-settings.md#let-an-embedding-host-add-policy).

462 462 

463На машине, где администратор развёртывает управляемые настройки, Claude Code игнорирует родительские настройки, если только администратор не [разрешил встраивающему хосту добавлять политику](https://code.claude.com/docs/ru/managed-settings.md#let-an-embedding-host-add-policy).463Если вы передаёте [`disableAllHooks: true`](https://code.claude.com/docs/ru/settings-reference#disableallhooks) в `managedSettings`:

464 

465* **Останавливаются**: пользовательские, проектные и локальные хуки, а также хуки, объявленные во frontmatter агента или в [параметре `settings`](https://code.claude.com/docs/ru/agent-sdk/typescript#options) SDK.

466* **Продолжают выполняться**: [функции обратного вызова хуков SDK](https://code.claude.com/docs/ru/agent-sdk/hooks.md) вашего приложения и хуки администратора из управляемых настроек. Ваше приложение не может отключить хуки администратора.

464 467 

465| Что вы передаёте | Что происходит |468| Что вы передаёте | Что происходит |

466| :- | :- |469| :- | :- |

467| `disableAllHooks: true` | Обрабатывается как `allowManagedHooksOnly: true`, поэтому хуки, перечисленные как [блокируемые при `allowManagedHooksOnly`](https://code.claude.com/docs/ru/settings-reference#what-runs-under-allowmanagedhooksonly), останавливаются, как и хуки в [параметре `settings`](https://code.claude.com/docs/ru/agent-sdk/typescript#options) SDK. |470| `hooks`, либо `allowedHttpHookUrls` или `httpHookAllowedEnvVars` с записями | Claude Code игнорирует этот ключ. Вместо этого используйте параметр `settings` SDK. |

468| [`disableSkillShellExecution: true`](https://code.claude.com/docs/ru/settings-reference#disableskillshellexecution) | Вступает в силу. |

469| `allowedHttpHookUrls: []` | Вступает в силу, если администратор не определяет `hooks` и не включает плагин. Ни один HTTP-хук не выполняется, за исключением URL, перечисленных другим источником настроек. |471| `allowedHttpHookUrls: []` | Вступает в силу, если администратор не определяет `hooks` и не включает плагин. Ни один HTTP-хук не выполняется, за исключением URL, перечисленных другим источником настроек. |

470| `httpHookAllowedEnvVars: []` | Вступает в силу, если администратор не определяет `hooks` и не включает плагин. Заголовки HTTP-хуков могут включать только переменные окружения, перечисленные другим источником настроек. |472| `httpHookAllowedEnvVars: []` | Вступает в силу, если администратор не определяет `hooks` и не включает плагин. Заголовки HTTP-хуков могут включать только переменные окружения, перечисленные другим источником настроек. |

471| `allowedHttpHookUrls` или `httpHookAllowedEnvVars` с записями | Claude Code игнорирует их, поскольку объединение расширило бы список администратора. Вместо этого используйте параметр `settings` SDK. |473| [`disableSkillShellExecution: true`](https://code.claude.com/docs/ru/settings-reference#disableskillshellexecution) | Вступает в силу. |

472 474 

473Для передачи этих ключей в `managedSettings` требуется Claude Code v2.1.309 или новее либо TypeScript Agent SDK v0.3.309 или новее.475Для передачи этих ключей в `managedSettings` требуется Claude Code v2.1.309 или новее либо TypeScript Agent SDK v0.3.309 или новее.

474 476 

Details

8 8 

9> [!NOTE]9> [!NOTE]

10>10>

11> Облачные сессии доступны в планах Pro, Max и Team, а также для пользователей Enterprise с премиум-местами или местами Chat + Claude Code. Если ваша организация Enterprise управляет вашим доступом с помощью [пользовательских ролей](https://support.claude.com/en/articles/13930452), вам также нужна роль, включающая разрешение на облачные сессии. Попросите владельца (Owner) проверить ваши роли и добавить это разрешение в [**Organization settings > Roles**](https://claude.ai/admin-settings/roles), если оно отсутствует.11> Облачные сессии доступны в планах Pro, Max и Team, а также для пользователей Enterprise с премиум-местами или местами Chat + Claude Code. Если вашим доступом управляют [пользовательские роли](https://support.claude.com/en/articles/13930452), вам также нужна роль с разрешением на облачные сессии, чтобы запускать сессии на инфраструктуре Anthropic из браузера, приложений или терминала. Попросите владельца (Owner) добавить это разрешение в одну из ваших ролей в [**Organization settings > Roles**](https://claude.ai/admin-settings/roles).

12 12 

13Облачная сессия — это сессия Claude Code, которая запускается на облачной инфраструктуре вместо вашей машины. По умолчанию она запускается на инфраструктуре, управляемой Anthropic, или в [самостоятельно размещённом окружении](https://code.claude.com/docs/ru/self-hosted-environments) вашей организации, когда маршрутизируется туда. Сессия продолжает работать после того, как вы закроете ноутбук, и вы можете проверить её или управлять ею с любого устройства. Она учитывается в лимитах использования вашего плана наряду с остальным использованием Claude и Claude Code, а отдельная плата за облачную виртуальную машину не взимается.13Облачная сессия — это сессия Claude Code, которая запускается на облачной инфраструктуре вместо вашей машины. По умолчанию она запускается на инфраструктуре, управляемой Anthropic, или в [самостоятельно размещённом окружении](https://code.claude.com/docs/ru/self-hosted-environments) вашей организации, когда маршрутизируется туда. Сессия продолжает работать после того, как вы закроете ноутбук, и вы можете проверить её или управлять ею с любого устройства. Она учитывается в лимитах использования вашего плана наряду с остальным использованием Claude и Claude Code, а отдельная плата за облачную виртуальную машину не взимается.

14 14 

Details

109 109 

110#### Добавление секрета110#### Добавление секрета

111 111 

112Вы добавляете секреты по одному и не можете редактировать секрет после добавления. Чтобы изменить хосты или значение секрета, удалите его и добавьте снова.112Вы добавляете секреты по одному. Чтобы изменить хосты или значение секрета, удалите его и добавьте снова.

113 113 

114Чтобы добавить секрет в [общую среду](#organization-shared-environments), откройте её для редактирования на странице **Cloud environments** в [настройках администратора](https://claude.ai/admin-settings), затем продолжите с шага 2 в её разделе **Network secrets**. Если вы используете план Team и не имеете [роли администратора организации](#requirements), выполните шаг 1 в своей собственной среде, затем [заполните сокращённую форму](#add-a-secret-without-the-role).114Чтобы добавить секрет в [общую среду](#organization-shared-environments), откройте её для редактирования на странице **Cloud environments** в [настройках администратора](https://claude.ai/admin-settings), затем продолжите с шага 2 в её разделе **Network secrets**. Если вы используете план Team и не имеете [роли администратора организации](#requirements), выполните шаг 1 в своей собственной среде, затем [заполните сокращённую форму](#add-a-secret-without-the-role).

115 115 


119 119 

120**2. Добавьте секрет**120**2. Добавьте секрет**

121 121 

122Выберите **Add secret** и заполните форму. Оставьте **Secret type** по умолчанию, **Bearer**, для API-ключа, который передаётся в заголовке запроса, и заполните эти поля:122Выберите **Add secret** (в настройках администратора эта кнопка называется **Add**) и заполните форму. Оставьте **Secret type** по умолчанию, **Bearer**, для API-ключа, который передаётся в заголовке запроса, и заполните эти поля:

123 123 

124* **Name**: метка для секрета, например `Internal billing API`124* **Name**: метка для секрета, например `Internal billing API`

125* **Allowed websites**: хосты API, например `api.example.com`. Префикс `*.` соответствует любому поддомену125* **Allowed websites**: хосты API, например `api.example.com`. Префикс `*.` соответствует любому поддомену


443 443 

444### Требования к скрипту444### Требования к скрипту

445 445 

446Скрипт установки имеет три ограничения для работы:446При написании скрипта установки нужно учитывать четыре ограничения:

447 447 

448* **Выход с нулём**: если скрипт выходит с ненулевым значением, сеанс не запускается. Добавьте `|| true` к некритичным командам, чтобы перебой установки не блокировал сеанс.448* **Выход с нулём**: если скрипт выходит с ненулевым значением, сеанс не запускается. Добавьте `|| true` к некритичным командам, чтобы перебой установки не блокировал сеанс.

449* **Завершение в течение пяти минут**: держите общее время выполнения скрипта примерно под пять минут, чтобы [кэш среды](#environment-caching) мог построиться. Когда установка занимает больше времени, среда не кэшируется. Запускайте независимые установки параллельно с `&` и `wait`, и переместите любую одиночную загрузку, которая не подходит, в [SessionStart hook](#setup-scripts-vs-sessionstart-hooks), который запускает её в фоне. Если новые сеансы зависают или не удаются во время установки, смотрите [New sessions hang or time out during setup](https://code.claude.com/docs/ru/web-quickstart.md#new-sessions-hang-or-time-out-during-setup).449* **Завершение в течение пяти минут**: держите общее время выполнения скрипта примерно под пять минут, чтобы [кэш среды](#environment-caching) мог построиться. Когда установка занимает больше времени, среда не кэшируется. Запускайте независимые установки параллельно с `&` и `wait`, и переместите любую одиночную загрузку, которая не подходит, в [SessionStart hook](#setup-scripts-vs-sessionstart-hooks), который запускает её в фоне. Если новые сеансы зависают или не удаются во время установки, смотрите [New sessions hang or time out during setup](https://code.claude.com/docs/ru/web-quickstart.md#new-sessions-hang-or-time-out-during-setup).

450* **Сетевой доступ для установок**: установки пакетов должны достичь реестров. Уровень **Trusted** по умолчанию охватывает [общие реестры пакетов](#default-allowed-domains), включая npm, PyPI, RubyGems и crates.io; с **None** сетевым доступом установки не удаются.450* **Сетевой доступ для установок**: установки пакетов должны достичь реестров. Уровень **Trusted** по умолчанию охватывает [общие реестры пакетов](#default-allowed-domains), включая npm, PyPI, RubyGems и crates.io; с **None** сетевым доступом установки не удаются.

451* **Переменные среды ещё не заданы**: скрипт запускается до того, как сессия задаёт [переменные окружения](#set-environment-variables) среды. Задавайте все значения, которые нужны скрипту, в самом скрипте.

451 452 

452### Кэширование среды453### Кэширование среды

453 454 

Details

123 123 

124Если ревью не применяет включаемый файл, проверьте каждый из следующих пунктов:124Если ревью не применяет включаемый файл, проверьте каждый из следующих пунктов:

125 125 

126* **Расположение**: переместите файл в корень репозитория. Путь в подкаталог, например `@docs/review-rules.md`, не включается.126* **Расположение**: переместите файл в корень репозитория. За исключением [файла скилла](#include-a-skill-file), путь в подкаталог, например `@docs/review-rules.md`, не включается.

127* **Имя**: указывайте имя файла точно, с учётом регистра, и используйте имя без пробелов. Строка, имя в которой не совпадает ни с одним файлом рядом с `REVIEW.md`, остаётся в `REVIEW.md` как обычный текст, и check run не сообщает о ней как о пропущенном включении.127* **Имя**: указывайте имя файла точно, с учётом регистра, и используйте имя без пробелов. Строка, имя в которой не совпадает ни с одним файлом рядом с `REVIEW.md`, остаётся в `REVIEW.md` как обычный текст, и check run не сообщает о ней как о пропущенном включении.

128* **Один уровень**: перечислите все файлы в корневом `REVIEW.md`. Строка `@` во включаемом файле или в `REVIEW.md` подкаталога остаётся обычным текстом, а ссылка Markdown на другой файл не является включением.128* **Один уровень**: перечислите все файлы в корневом `REVIEW.md`. Строка `@` во включаемом файле или в `REVIEW.md` подкаталога остаётся обычным текстом ([для файлов скиллов это иначе](#include-a-skill-file)), а ссылка Markdown на другой файл не является включением.

129* **Ограничения**: включайте не более восьми разных файлов, а общий размер `REVIEW.md` и включаемых им файлов должен быть меньше 150 000 байт. Файл, который достиг бы ограничения по байтам, пропускается целиком, а не обрезается. Check run сообщает, сколько строк включения было пропущено из-за каждого из ограничений.129* **Ограничения**: включайте не более восьми разных файлов, а общий размер `REVIEW.md` и включаемых им файлов должен быть меньше 150 000 байт. Файл, который достиг бы ограничения по байтам, пропускается целиком, а не обрезается. Check run сообщает, сколько строк включения было пропущено из-за каждого из ограничений.

130* **Ссылки**: общее количество ссылок Markdown в `REVIEW.md` и включаемых им файлах должно быть не более 64. Ссылки на адреса `http`, `https` или `mailto` и на якоря `#` не учитываются. При превышении этого ограничения ревью пропускает весь ваш корневой `REVIEW.md`, а не только включаемые файлы. В этом случае check run [сообщает, что инструкции не были применены](https://code.claude.com/docs/ru/code-review-troubleshooting.md#the-check-run-mentions-review-md).130* **Ссылки**: общее количество ссылок Markdown в `REVIEW.md` и включаемых им файлах должно быть не более 64. Ссылки на адреса `http`, `https` или `mailto` и на якоря `#` не учитываются, как и ссылки в [файле скилла](#include-a-skill-file). При превышении этого ограничения ревью пропускает весь ваш корневой `REVIEW.md`, а не только включаемые файлы. В этом случае check run [сообщает, что инструкции не были применены](https://code.claude.com/docs/ru/code-review-troubleshooting.md#the-check-run-mentions-review-md).

131* **Копия после слияния**: выполните слияние включаемого файла в [ветку, из которой читается `REVIEW.md`](#which-branch-review-md-is-read-from). Ревью читает оба файла из одного и того же коммита, но никогда из изменений самого pull request.131* **Копия после слияния**: выполните слияние включаемого файла в [ветку, из которой читается `REVIEW.md`](#which-branch-review-md-is-read-from). Ревью читает оба файла из одного и того же коммита, но никогда из изменений самого pull request.

132 132 

133### Включение файла скилла

134 

135Чтобы ревью следовали указаниям, которые вы храните в [скилле](https://code.claude.com/docs/ru/skills.md), включите `SKILL.md` этого скилла в корневой `REVIEW.md`. Code Review не запускает скиллы.

136 

137Добавьте `@` и путь к `SKILL.md` в формате `.claude/skills/<folder>/SKILL.md` на отдельной строке:

138 

139```markdown theme={null}

140# Review instructions

141 

142Report at most five Nits per review.

143 

144@.claude/skills/api-review/SKILL.md

145 

146Treat any change under `migrations/` as Important.

147```

148 

149Защитите [ветку, из которой читается `REVIEW.md`](#which-branch-review-md-is-read-from), поскольку Code Review включает файл скилла, только когда читает `REVIEW.md` из защищённой ветки. Файл скилла учитывается в ограничениях в восемь файлов и 150 000 байт, а также имеет собственное ограничение в 30 000 байт.

150 

151#### Напишите строку скилла, которую Code Review включит

152 

153Используйте имя папки без пробелов. Строка с пробелом в пути остаётся в `REVIEW.md` как обычный текст, и check run не сообщает о ней как о пропущенном включении.

154 

155Если строка `@` для скилла нарушает одно из приведённых ниже правил, Code Review не включает скилл из этой строки:

156 

157* **Путь**: указывайте путь в виде `.claude/skills/<folder>/SKILL.md` от корня репозитория, при этом папка скилла должна находиться непосредственно в `skills/`. В отличие от имени файла в корне, путь такого вида, не совпадающий ни с одним файлом, пропускается и учитывается.

158* **Источник**: скопируйте указания из любого другого файла в `.claude/` или из [встроенного, личного скилла или скилла плагина](https://code.claude.com/docs/ru/skills.md#where-skills-live) в файл рядом с `REVIEW.md`. Включить их напрямую нельзя.

159* **Файл**: сделайте коммит `SKILL.md` как обычного текстового файла. Code Review не переходит по символическим ссылкам, будь то сам файл или папка в его пути.

160* **Размер**: размер `SKILL.md` должен быть не более 30 000 байт, включая frontmatter

161* **Количество**: пишите не более восьми строк скиллов. Повторяющаяся строка снова учитывается в этих восьми.

162* **Блоки в `REVIEW.md`**: не размещайте строку `@` внутри блоков кода. Закройте все HTML-комментарии и все блоки `<pre>`, `<script>`, `<style>` или `<textarea>` выше неё.

163 

164Когда Code Review пропускает строку скилла из-за нарушения правил «Файл», «Размер», «Количество» или «Блоки», она учитывается в [сообщении check run о пропущенных строках включения](https://code.claude.com/docs/ru/code-review-troubleshooting.md#the-check-run-mentions-review-md). Это сообщение появляется, только когда ревью применяет `REVIEW.md` из защищённой ветки.

165 

166#### Проверьте, что ревью получает из скилла

167 

168Когда скилл включён, ревью получает тело `SKILL.md` и ничего больше из скилла, поэтому проверьте скилл по списку ниже.

169 

170* **Frontmatter**: повторите в теле всё, что нужно ревью из [frontmatter](https://code.claude.com/docs/ru/skills.md#frontmatter-reference), например условия использования скилла, указанные в `description`

171* **Внедряемые команды**: распишите то, что предоставила бы [команда `!`](https://code.claude.com/docs/ru/skills#inject-dynamic-context). Code Review не выполняет команду и заменяет всю строку или блок, где она находится, заполнителем.

172* **Подстановки**: замените `$ARGUMENTS` и другие [подстановки](https://code.claude.com/docs/ru/skills.md#available-string-substitutions) фиксированным текстом, поскольку ревью не передаёт аргументы и оставляет их как есть

173* **Вспомогательные файлы**: скопируйте то, что нужно ревью, в `SKILL.md`, поскольку Code Review не загружает скрипты, связанные файлы или ссылки `@file`

174* **Исключения и ограничения Nit**: пишите инструкции, исключающие замечания или ограничивающие количество Nit, в `REVIEW.md` или в файле рядом с ним, а не в скилле. Code Review не принимает текст скилла как основание ни для того, ни для другого.

175* **Ссылки на файлы репозитория**: опишите словами, на что указывает ссылка или ссылка `@file`. Ревью видит путь как обычный текст или как заполнитель.

176 

177Если вы редактируете команды `!`, `$ARGUMENTS` или ссылки скилла, вы также меняете то, как он работает в Claude Code. Если ваша команда на них полагается, скопируйте указания в файл рядом с `REVIEW.md` и включите этот файл вместо скилла.

178 

179#### Символы, которые Code Review изменяет в тексте скилла

180 

181Code Review изменяет некоторые символы в тексте скилла, поэтому ваши примеры кода попадают в ревью в виде, показанном ниже.

182 

183```text theme={null}

184In SKILL.md: Use `items[0]`, never `List<String>`.

185The review reads: Use ˋitems(0)ˋ, never ˋList< String>ˋ.

186 

187In SKILL.md: Run `ps | grep api` and ask @alice.

188The review reads: Run ˋps ¦ grep apiˋ and ask @ alice.

189```

190 

191Если правило зависит от одного из этих символов, опишите его также словами.

192 

133### Из какой ветки читается REVIEW\.md193### Из какой ветки читается REVIEW\.md

134 194 

135Code Review читает `REVIEW.md` из базовой ветки pull request или из ветки по умолчанию, но никогда из изменений самого pull request. Чтобы изменить поведение ревью, сначала выполните слияние изменения `REVIEW.md`.195Code Review читает `REVIEW.md` из базовой ветки pull request или из ветки по умолчанию, но никогда из изменений самого pull request. Чтобы изменить поведение ревью, сначала выполните слияние изменения `REVIEW.md`.


140* Исключение путей, файлов или классов проблем200* Исключение путей, файлов или классов проблем

141* Ограничение количества мелких замечаний201* Ограничение количества мелких замечаний

142 202 

203Пишите исключения и ограничения Nit в `REVIEW.md` или в файле рядом с ним, а не во [включённом скилле](#include-a-skill-file).

204 

143#### Что считается защитой ветки205#### Что считается защитой ветки

144 206 

145Code Review считает защитой следующие настройки:207Code Review считает защитой следующие настройки:

Details

67 67 

68## Check run упоминает REVIEW\.md68## Check run упоминает REVIEW\.md

69 69 

70Вот три сообщения, которые check run может содержать о `REVIEW.md`:70Вот четыре сообщения, которые check run может содержать о `REVIEW.md`:

71 71 

72* **"This review applied the repository's review instructions (REVIEW\.md) from its default branch, which is not protected against direct pushes."**: ревью прочитало только корневой файл. О том, что меняет защита ветки, см. [Из какой ветки читается REVIEW.md](https://code.claude.com/docs/ru/code-review-customize.md#which-branch-review-md-is-read-from).72* **"This review applied the repository's review instructions (REVIEW\.md) from its default branch, which is not protected against direct pushes."**: ревью прочитало только корневой файл. О том, что меняет защита ветки, см. [Из какой ветки читается REVIEW.md](https://code.claude.com/docs/ru/code-review-customize.md#which-branch-review-md-is-read-from).

73* **"were not applied to this review: branch protection could not be confirmed"**: ревью не прочитало ни одного `REVIEW.md`.73* **"were not applied to this review: branch protection could not be confirmed"**: ревью не прочитало ни одного `REVIEW.md`.


75 * **Слишком много ссылок**: файл содержит более 64 ссылок Markdown. Сократите число ссылок до [64 или меньше](https://code.claude.com/docs/ru/code-review-customize.md#include-other-files-in-review-md).75 * **Слишком много ссылок**: файл содержит более 64 ссылок Markdown. Сократите число ссылок до [64 или меньше](https://code.claude.com/docs/ru/code-review-customize.md#include-other-files-in-review-md).

76 * **Ссылка, которую ревью не может разобрать**: файл содержит некорректную ссылку Markdown. Исправьте или удалите эту ссылку.76 * **Ссылка, которую ревью не может разобрать**: файл содержит некорректную ссылку Markdown. Исправьте или удалите эту ссылку.

77 * **Ссылка на изменённый файл**: файл ссылается на файл или папку, которые изменяет этот pull request, и ревью не смогло исключить только строки с этой ссылкой. Запишите правило непосредственно в `REVIEW.md`.77 * **Ссылка на изменённый файл**: файл ссылается на файл или папку, которые изменяет этот pull request, и ревью не смогло исключить только строки с этой ссылкой. Запишите правило непосредственно в `REVIEW.md`.

78* **"include line(s) in the root REVIEW\.md were skipped on this review"**: ваш корневой `REVIEW.md` был применён, но файлы, указанные в этих строках, — нет. Проверьте списки в разделе [Включение других файлов в REVIEW.md](https://code.claude.com/docs/ru/code-review-customize.md#include-other-files-in-review-md), а для скилла — в разделе [Включение файла скилла](https://code.claude.com/docs/ru/code-review-customize.md#include-a-skill-file).

78 79 

79## Проблемы с настройкой80## Проблемы с настройкой

80 81 

desktop.md +3 −3

Details

844| [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/ru/env-vars#variables) или [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/ru/env-vars#variables) | Задайте её в [одном из мест, где вы задали бы переменную для dev-серверов](#set-environment-variables-for-dev-servers), затем закройте и снова откройте Desktop |844| [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/ru/env-vars#variables) или [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/ru/env-vars#variables) | Задайте её в [одном из мест, где вы задали бы переменную для dev-серверов](#set-environment-variables-for-dev-servers), затем закройте и снова откройте Desktop |

845| `API_TIMEOUT_MS`, `ANTHROPIC_BASE_URL` или другая переменная, которую Desktop задаёт сам | См. [Переменные окружения, которые Desktop задаёт сам](#environment-variables-desktop-sets-itself) |845| `API_TIMEOUT_MS`, `ANTHROPIC_BASE_URL` или другая переменная, которую Desktop задаёт сам | См. [Переменные окружения, которые Desktop задаёт сам](#environment-variables-desktop-sets-itself) |

846 846 

847Если в macOS или Linux вы уже задали свою переменную через `export` в `~/.zshrc` или `~/.bashrc`, см. [Экспортированная переменная отсутствует или неверна в командах, которые запускает Claude](#exported-variable-missing-or-wrong-in-commands-claude-runs).847Если в macOS или Linux переменная, которую вы задали с помощью `export`, отсутствует или имеет неверное значение в команде, которую выполняет Claude, см. [Экспортированная переменная отсутствует или неверна в командах, которые выполняет Claude](#exported-variable-missing-or-wrong-in-commands-claude-runs).

848 848 

849#### Установка переменных окружения для локальных сессий849#### Установка переменных окружения для локальных сессий

850 850 


896 896 

897**1. Запустите новую сессию**897**1. Запустите новую сессию**

898 898 

899Попросите Claude снова выполнить команду.899Попросите Claude выполнить команду снова.

900 900 

901**2. Закройте и снова откройте Desktop**901**2. Закройте и снова откройте Desktop**

902 902 


908 908 

909**4. Используйте сохранённое окружение**909**4. Используйте сохранённое окружение**

910 910 

911Добавьте переменную в [сохранённое локальное окружение](#set-environment-variables-for-local-sessions), затем запустите новую сессию из этого окружения. Для таких переменных, как `PATH` или `CLAUDE_CONFIG_DIR`, вместо этого следуйте [отдельным инструкциям](#environment-variables-in-local-sessions).911Добавьте переменную в [сохранённое локальное окружение](#set-environment-variables-for-local-sessions), затем запустите новую сессию из этого окружения. Для таких переменных, как `PATH`, `CLAUDE_CONFIG_DIR` или `API_TIMEOUT_MS`, следуйте вместо этого [их собственным инструкциям](#environment-variables-in-local-sessions).

912 912 

913До версии v2.1.304 Claude Code не передаёт экспортированные переменные командам, поэтому [проверьте, какую версию запускает сессия](#claude-code-version-in-the-code-tab).913До версии v2.1.304 Claude Code не передаёт экспортированные переменные командам, поэтому [проверьте, какую версию запускает сессия](#claude-code-version-in-the-code-tab).

914 914 

Details

15 15 

16На этой странице рассматриваются локальные запланированные задачи; для облачных запланированных задач и их параметров срабатывания см. [Автоматизация работы с помощью запланированных задач](https://code.claude.com/docs/ru/routines.md).16На этой странице рассматриваются локальные запланированные задачи; для облачных запланированных задач и их параметров срабатывания см. [Автоматизация работы с помощью запланированных задач](https://code.claude.com/docs/ru/routines.md).

17 17 

18> [!NOTE]

19>

20> Если в вашем приложении эта функция отображается под [прежним названием](https://code.claude.com/docs/ru/routines.md#where-the-name-routines-still-appears), нажимайте **Routines** везде, где на этой странице указано **Scheduled**, и **New routine** там, где указано **New task**.

21 

18## Сравнение параметров планирования22## Сравнение параметров планирования

19 23 

20Claude Code предлагает три способа планирования повторяющихся или одноразовых задач:24Claude Code предлагает три способа планирования повторяющихся или одноразовых задач:


45 49 

46**1. Откройте страницу запланированных задач**50**1. Откройте страницу запланированных задач**

47 51 

48На [вкладке **Code**](https://code.claude.com/docs/ru/desktop.md) нажмите **Scheduled** на боковой панели или в меню **More** боковой панели.52На [вкладке **Code**](https://code.claude.com/docs/ru/desktop.md) нажмите **Scheduled** на боковой панели или в меню **More** боковой панели. Если на боковой панели вместо **Scheduled** отображается **Routines**, нажмите **Routines**, затем **New routine** и продолжите с раздела [Полностраничная форма](#full-page-form).

49 53 

50**2. Создайте новую задачу**54**2. Создайте новую задачу**

51 55 

52Нажмите **New task**. Если откроется меню с пунктами **Create with Claude** и **Set up manually**, выберите **Set up manually**. Откроется диалоговое окно **New scheduled task**. Если в верхней части диалогового окна находится **Only on this computer**, перейдите к разделу [Диалоговое окно с Only on this computer вверху](#dialog-with-only-on-this-computer-at-the-top), прежде чем что-либо вводить.56Нажмите **New task**, чтобы открыть диалоговое окно **New scheduled task**. Прежде чем продолжить, проверьте, не появился ли один из следующих экранов:

57 

58* Если откроется меню с пунктами **Create with Claude** и **Set up manually**, выберите **Set up manually**, чтобы открыть диалоговое окно.

59* Если в верхней части диалогового окна находится **Only on this computer**, перейдите к разделу [Диалоговое окно с Only on this computer вверху](#dialog-with-only-on-this-computer-at-the-top), прежде чем что-либо вводить.

60* Если откроется меню с пунктами **Local** и **Cloud** или вместо диалогового окна откроется целая страница, перейдите к разделу [Полностраничная форма](#full-page-form).

53 61 

54**3. Задайте имя задачи**62**3. Задайте имя задачи**

55 63 


99 107 

100Нажмите **Create**. Откроется страница с подробностями задачи.108Нажмите **Create**. Откроется страница с подробностями задачи.

101 109 

110### Полностраничная форма

111 

112Если откроется меню с пунктами **Local** и **Cloud**, выберите **Local**. Откроется страница с заголовком **New local routine** или **New local scheduled task**. Заполните ее поля:

113 

114* **Name**: введите имя, уникальное среди ваших задач.

115* **Description**: введите описание.

116* **Instructions**: введите, что должен делать Claude при запуске задачи. В этом же поле выберите режим разрешений, модель и папку, в которой выполняется задача.

117* **Schedule**: выберите один из [параметров расписания](#schedule-options).

118 

119Если кнопка **Create** недоступна, наведите на нее указатель, чтобы увидеть, что еще требуется заполнить в форме. Нажмите **Create**, и откроется страница с подробностями задачи.

120 

102## Параметры расписания121## Параметры расписания

103 122 

104Когда вы включаете **Only on this computer** в разделе **Advanced settings**, карточка **Trigger** предлагает варианты Hourly, Daily, Weekdays и Weekly. Чтобы получить **Manual** или **Custom** для такой задачи, откройте её [форму **Edit**](#manage-scheduled-tasks) после создания. Эта форма и [диалог с **Only on this computer** вверху](#dialog-with-only-on-this-computer-at-the-top) предлагают следующие шесть вариантов:123Когда вы включаете **Only on this computer** в разделе **Advanced settings**, карточка **Trigger** предлагает варианты Hourly, Daily, Weekdays и Weekly. Чтобы получить **Manual** или **Custom** для такой задачи, откройте её [форму **Edit**](#manage-scheduled-tasks) после создания. Эта форма, [диалог с **Only on this computer** вверху](#dialog-with-only-on-this-computer-at-the-top) и [полностраничная форма](#full-page-form) предлагают следующие шесть вариантов:

105 124 

106* **Hourly**: запускается каждый час125* **Hourly**: запускается каждый час

107* **Daily**: запускается каждый день в выбранное вами местное время126* **Daily**: запускается каждый день в выбранное вами местное время

env-vars.md +1 −1

Details

298| `CLAUDE_CODE_FORCE_SESSION_PERSISTENCE` | Установите `1`, чтобы принудительно включить сохранение транскриптов, истории промптов и регистрацию в `claude agents`, даже если этот `claude` был запущен изнутри другой сессии Claude Code. Используйте, когда унаследованное значение `CLAUDE_CODE_CHILD_SESSION`, например из сессии `screen` или фонового загрузчика, впервые запущенного инструментом Bash в Claude Code, приводит к тому, что настоящая сессия верхнего уровня ошибочно классифицируется как вложенная. Начиная с v2.1.178 Claude Code автоматически распознаёт случай с tmux и игнорирует унаследованный маркер, поэтому для tmux эта переменная больше не нужна. Также учитывается в v2.1.169 и более ранних версиях; не действует в v2.1.170 и v2.1.171, где было удалено обнаружение вложенных сессий, которое она переопределяет |298| `CLAUDE_CODE_FORCE_SESSION_PERSISTENCE` | Установите `1`, чтобы принудительно включить сохранение транскриптов, истории промптов и регистрацию в `claude agents`, даже если этот `claude` был запущен изнутри другой сессии Claude Code. Используйте, когда унаследованное значение `CLAUDE_CODE_CHILD_SESSION`, например из сессии `screen` или фонового загрузчика, впервые запущенного инструментом Bash в Claude Code, приводит к тому, что настоящая сессия верхнего уровня ошибочно классифицируется как вложенная. Начиная с v2.1.178 Claude Code автоматически распознаёт случай с tmux и игнорирует унаследованный маркер, поэтому для tmux эта переменная больше не нужна. Также учитывается в v2.1.169 и более ранних версиях; не действует в v2.1.170 и v2.1.171, где было удалено обнаружение вложенных сессий, которое она переопределяет |

299| `CLAUDE_CODE_FORCE_STRIKETHROUGH` | Установите `1`, чтобы принудительно отображать `~~text~~` в ответах Claude зачёркнутым, когда ваш терминал это поддерживает, но не определяется автоматически, например при работе по SSH без пересылки `TERM_PROGRAM`. Без этого неопределённые терминалы показывают буквальные маркеры `~~` вместо зачёркнутого текста. Требуется Claude Code v2.1.186 или новее |299| `CLAUDE_CODE_FORCE_STRIKETHROUGH` | Установите `1`, чтобы принудительно отображать `~~text~~` в ответах Claude зачёркнутым, когда ваш терминал это поддерживает, но не определяется автоматически, например при работе по SSH без пересылки `TERM_PROGRAM`. Без этого неопределённые терминалы показывают буквальные маркеры `~~` вместо зачёркнутого текста. Требуется Claude Code v2.1.186 или новее |

300| `CLAUDE_CODE_FORCE_SYNC_OUTPUT` | Установите `1`, чтобы принудительно включить [синхронизированный вывод](https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036) DEC private mode 2026, когда ваш терминал его поддерживает, но не определяется автоматически. Полезно для эмуляторов, таких как Emacs `eat`, которые реализуют BSU/ESU, но не отвечают на проверку возможностей. Не действует под tmux. В отличие от `CLAUDE_CODE_NO_FLICKER`, которая переключает на [полноэкранный рендеринг](https://code.claude.com/docs/ru/fullscreen.md), эта переменная не меняет рендерер |300| `CLAUDE_CODE_FORCE_SYNC_OUTPUT` | Установите `1`, чтобы принудительно включить [синхронизированный вывод](https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036) DEC private mode 2026, когда ваш терминал его поддерживает, но не определяется автоматически. Полезно для эмуляторов, таких как Emacs `eat`, которые реализуют BSU/ESU, но не отвечают на проверку возможностей. Не действует под tmux. В отличие от `CLAUDE_CODE_NO_FLICKER`, которая переключает на [полноэкранный рендеринг](https://code.claude.com/docs/ru/fullscreen.md), эта переменная не меняет рендерер |

301| `CLAUDE_CODE_FORCE_TERMINAL_IMAGES` | Установите значение `1`, чтобы отображать [элементы `Image` модов](https://code.claude.com/docs/ru/plugins/mods/reference#elements) как изображения, если ваш терминал отображает изображения протокола kitty graphics с плейсхолдерами Unicode, а вы всё равно видите приглушённый текст `alt` элемента `Image`. См. [какие терминалы отображают `Image`](https://code.claude.com/docs/ru/plugins/mods/gallery#image-and-client) и почему эта переменная не помогает внутри tmux или screen |301| `CLAUDE_CODE_FORCE_TERMINAL_IMAGES` | Установите значение `1`, чтобы отрисовывать [элементы `Image` модов](https://code.claude.com/docs/ru/plugins/mods/reference#elements) как изображения, когда ваш терминал отображает изображения протокола графики kitty с заполнителями Unicode, а вы всё равно видите затенённый текст `alt` элемента `Image`. См. [какие терминалы отрисовывают `Image` и где не следует задавать эту переменную](https://code.claude.com/docs/ru/plugins/mods/gallery#image-and-client) |

302| `CLAUDE_CODE_FORK_SUBAGENT` | Управляет режимом форков, который включён по умолчанию и позволяет Claude самостоятельно запускать [форки](https://code.claude.com/docs/ru/sub-agents.md#fork-the-current-conversation). Пока режим форков включён, Claude также не может [ожидать субагента](https://code.claude.com/docs/ru/sub-agents.md#run-subagents-in-foreground-or-background) в интерактивных сессиях терминала, VS Code или десктопного приложения на вашем компьютере. Установите значение `0`, чтобы отключить режим форков. О версиях см. [Отключение режима форков](https://code.claude.com/docs/ru/sub-agents.md#turn-fork-mode-on-or-off) |302| `CLAUDE_CODE_FORK_SUBAGENT` | Управляет режимом форков, который включён по умолчанию и позволяет Claude самостоятельно запускать [форки](https://code.claude.com/docs/ru/sub-agents.md#fork-the-current-conversation). Пока режим форков включён, Claude также не может [ожидать субагента](https://code.claude.com/docs/ru/sub-agents.md#run-subagents-in-foreground-or-background) в интерактивных сессиях терминала, VS Code или десктопного приложения на вашем компьютере. Установите значение `0`, чтобы отключить режим форков. О версиях см. [Отключение режима форков](https://code.claude.com/docs/ru/sub-agents.md#turn-fork-mode-on-or-off) |

303| `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT` | Установите `1`, чтобы выводить текст и блоки размышлений [субагентов](https://code.claude.com/docs/ru/sub-agents.md) в выводе `claude -p --output-format stream-json` — то же поведение, что и у флага [`--forward-subagent-text`](https://code.claude.com/docs/ru/cli-reference#cli-flags). Используйте переменную, когда `claude` вызывается обвязкой, которая не может сама передать флаг. В отличие от флага, который завершается с ошибкой вне неинтерактивного режима с выводом stream-json, переменная в таких случаях игнорируется, чтобы вложенные вызовы продолжали работать, когда она задана для всего процесса. Требуется Claude Code v2.1.211 или новее |303| `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT` | Установите `1`, чтобы выводить текст и блоки размышлений [субагентов](https://code.claude.com/docs/ru/sub-agents.md) в выводе `claude -p --output-format stream-json` — то же поведение, что и у флага [`--forward-subagent-text`](https://code.claude.com/docs/ru/cli-reference#cli-flags). Используйте переменную, когда `claude` вызывается обвязкой, которая не может сама передать флаг. В отличие от флага, который завершается с ошибкой вне неинтерактивного режима с выводом stream-json, переменная в таких случаях игнорируется, чтобы вложенные вызовы продолжали работать, когда она задана для всего процесса. Требуется Claude Code v2.1.211 или новее |

304| `CLAUDE_CODE_GATEWAY_HINT_HEADERS` | Установите `1`, чтобы отправлять [заголовки-подсказки для шлюза](https://code.claude.com/docs/ru/llm-gateway-protocol.md#gateway-hint-headers), такие как `x-claude-code-request-class` и `x-claude-code-compaction`, через пользовательский прокси или стороннего провайдера, такого как Amazon Bedrock или Claude Platform on AWS. Установите `0`, чтобы прекратить их отправку при любом подключении, включая прямое подключение к Anthropic API, где Claude Code отправляет их по умолчанию. Требуется Claude Code v2.1.273 или новее |304| `CLAUDE_CODE_GATEWAY_HINT_HEADERS` | Установите `1`, чтобы отправлять [заголовки-подсказки для шлюза](https://code.claude.com/docs/ru/llm-gateway-protocol.md#gateway-hint-headers), такие как `x-claude-code-request-class` и `x-claude-code-compaction`, через пользовательский прокси или стороннего провайдера, такого как Amazon Bedrock или Claude Platform on AWS. Установите `0`, чтобы прекратить их отправку при любом подключении, включая прямое подключение к Anthropic API, где Claude Code отправляет их по умолчанию. Требуется Claude Code v2.1.273 или новее |

errors.md +64 −7

Details

317| `Skipping connection (recent failure cached; retries automatically in 15 min, or edit the plugin config to retry now)` | [Plugin errors](#skipping-connection-recent-failure-cached) |317| `Skipping connection (recent failure cached; retries automatically in 15 min, or edit the plugin config to retry now)` | [Plugin errors](#skipping-connection-recent-failure-cached) |

318| `Error: No such tool available: <tool name>` | [Tool errors](#no-such-tool-available) |318| `Error: No such tool available: <tool name>` | [Tool errors](#no-such-tool-available) |

319| `MCP server "<name>" connection closed before the tool call was answered` | [Tool errors](#connection-closed-before-the-tool-call-was-answered) |319| `MCP server "<name>" connection closed before the tool call was answered` | [Tool errors](#connection-closed-before-the-tool-call-was-answered) |

320| `MCP server "<name>" is disabled — re-enable it via /mcp to use its tools` | [Ошибки инструментов](#mcp-server-is-disabled) |

321| `MCP server "<name>" tool "<tool>" timed out after <N>s. The server asked the user a question, and no answer came before the time limit.` | [Tool errors](#mcp-tool-call-timed-out-with-the-servers-question-unanswered) |

320| `would be spawned with zero tools — refusing` | [Tool errors](#agent-would-be-spawned-with-zero-tools) |322| `would be spawned with zero tools — refusing` | [Tool errors](#agent-would-be-spawned-with-zero-tools) |

321| `File is covered by a Read deny rule in your permission settings` | [Tool errors](#file-is-covered-by-a-read-deny-rule) |323| `File is covered by a Read deny rule in your permission settings` | [Tool errors](#file-is-covered-by-a-read-deny-rule) |

322| `cannot contain null bytes (\0)` | [Tool errors](#path-cannot-contain-null-bytes) |324| `cannot contain null bytes (\0)` | [Tool errors](#path-cannot-contain-null-bytes) |


348| `Your disk quota is full on the filesystem with Claude Code's temp directory <dir> (EDQUOT)` / `The filesystem with Claude Code's temp directory <dir>, or your disk quota on it, is full (ENOSPC)` | [Tool errors](#disk-quota-or-temp-filesystem-is-full) |350| `Your disk quota is full on the filesystem with Claude Code's temp directory <dir> (EDQUOT)` / `The filesystem with Claude Code's temp directory <dir>, or your disk quota on it, is full (ENOSPC)` | [Tool errors](#disk-quota-or-temp-filesystem-is-full) |

349| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [Tool errors](#disk-quota-or-temp-filesystem-is-full) |351| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [Tool errors](#disk-quota-or-temp-filesystem-is-full) |

350| `File is not valid UTF-8. It may use a legacy encoding such as Windows-1252, Shift-JIS or GBK, or be binary` | [Tool errors](#file-is-not-valid-utf-8) |352| `File is not valid UTF-8. It may use a legacy encoding such as Windows-1252, Shift-JIS or GBK, or be binary` | [Tool errors](#file-is-not-valid-utf-8) |

353| `git is not installed on this Mac. To install it, run xcode-select --install, then try again.` | [Ошибки инструментов](#git-is-not-installed-on-this-mac) |

351| `the source file is not valid UTF-8 text` / `the source file is not valid UTF-16 text` | [Tool errors](#the-source-file-is-not-valid-utf-8-text) |354| `the source file is not valid UTF-8 text` / `the source file is not valid UTF-16 text` | [Tool errors](#the-source-file-is-not-valid-utf-8-text) |

352| `the source file has the replacement character U+FFFD` | [Tool errors](#the-source-file-is-not-valid-utf-8-text) |355| `the source file has the replacement character U+FFFD` | [Tool errors](#the-source-file-is-not-valid-utf-8-text) |

353| `Not published: that file is on a network share` | [Tool errors](#not-published-that-file-is-on-a-network-share) |356| `Not published: that file is on a network share` | [Tool errors](#not-published-that-file-is-on-a-network-share) |


487 490 

488Пока Claude консультируется с [advisor](https://code.claude.com/docs/ru/advisor.md), баннер появляется через 90 секунд без данных вместо 20, потому что длительный обзор советника может не отправлять ничего более 20 секунд. До v2.1.214 порог в 20 секунд применялся и во время вызовов советника, поэтому баннер появлялся во время обзоров советника, даже когда всё было в порядке.491Пока Claude консультируется с [advisor](https://code.claude.com/docs/ru/advisor.md), баннер появляется через 90 секунд без данных вместо 20, потому что длительный обзор советника может не отправлять ничего более 20 секунд. До v2.1.214 порог в 20 секунд применялся и во время вызовов советника, поэтому баннер появлялся во время обзоров советника, даже когда всё было в порядке.

489 492 

493#### Баннер ожидания появляется и исчезает при работе через шлюз

494 

495Если баннер `Waiting for API response` появляется и исчезает, пока Claude размышляет, и вы подключаетесь через шлюз, [обновите Claude Code](https://code.claude.com/docs/ru/setup.md#update-claude-code) до v2.1.309 или более поздней версии. На этих соединениях баннер появляется через 45 секунд без данных:

496 

497* [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/ru/env-vars), указывающая на хост, отличный от Anthropic API, например на [LLM-шлюз](https://code.claude.com/docs/ru/llm-gateway)

498* Сессия [Claude apps gateway](https://code.claude.com/docs/ru/claude-apps-gateway)

499* [Claude Platform on AWS](https://code.claude.com/docs/ru/claude-platform-on-aws.md) с установленной `ANTHROPIC_AWS_BASE_URL`

500 

501До v2.1.309 баннер на этих соединениях появлялся через 20 секунд.

502 

490### Настройка поведения повторных попыток503### Настройка поведения повторных попыток

491 504 

492Вы можете настроить поведение повторных попыток с помощью этих переменных окружения:505Вы можете настроить поведение повторных попыток с помощью этих переменных окружения:


3256 3269 

3257**Что делать:**3270**Что делать:**

3258 3271 

3259* В скрипте или задании CI добавьте `--trust-workspace`, чтобы доверять рабочей копии только для этого запуска: `claude ultrareview --trust-workspace`. Добавляйте его только для кода, которому доверяете, потому что конфигурация git рабочей копии и настройки проекта Claude Code в этом случае могут запускать программы. Чтобы проверить pull request, коду которого вы не доверяете, см. [как проверить его из рабочей копии, которой вы доверяете](https://code.claude.com/docs/ru/ultrareview.md#trust-the-folder-before-the-review-runs).3272* В скрипте или задании CI добавьте `--trust-workspace`, чтобы доверять папке для этого запуска: `claude ultrareview --trust-workspace`. Добавляйте его только для кода, которому доверяете, потому что git и Claude Code смогут запускать программы, указанные в конфигурации git и настройках проекта этой папки. Для pull request с кодом, которому вы не доверяете, [запускайте ревью из ветки, которой доверяете](https://code.claude.com/docs/ru/ultrareview.md#trust-the-folder-before-the-review-runs).

3260* На своём компьютере выполните `claude` в этой папке и примите [диалог доверия к рабочему пространству](https://code.claude.com/docs/ru/permissions.md#project-allow-rules-and-workspace-trust), затем снова выполните исходную команду3273* На своём компьютере выполните `claude` в этой папке и примите [диалог доверия к рабочему пространству](https://code.claude.com/docs/ru/permissions.md#project-allow-rules-and-workspace-trust), затем снова выполните исходную команду

3261 3274 

3262Каждое из этих сообщений `claude ultrareview` означает, что ревью не началось, а код выхода равен 1:3275Каждое из этих сообщений `claude ultrareview` означает, что ревью не началось, а код выхода равен 1:


3265* **`Error: Workspace not trusted. <folder> is your home directory`**: поскольку доверие для домашнего каталога никогда не сохраняется, предварительный запуск `claude` там не поможет. Вместо этого выполните `claude ultrareview` из каталога проекта, предварительно один раз запустив там `claude`, чтобы принять диалог доверия, или добавьте `--trust-workspace`.3278* **`Error: Workspace not trusted. <folder> is your home directory`**: поскольку доверие для домашнего каталога никогда не сохраняется, предварительный запуск `claude` там не поможет. Вместо этого выполните `claude ultrareview` из каталога проекта, предварительно один раз запустив там `claude`, чтобы принять диалог доверия, или добавьте `--trust-workspace`.

3266* **`No answer in time.` с последующим `Error: Workspace not trusted`**: на вопрос `Trust <folder>? [y/N]` не было ответа в течение 5 минут. Снова выполните `claude ultrareview` и ответьте на него.3279* **`No answer in time.` с последующим `Error: Workspace not trusted`**: на вопрос `Trust <folder>? [y/N]` не было ответа в течение 5 минут. Снова выполните `claude ultrareview` и ответьте на него.

3267* **`Ultrareview did not start: <folder> is not trusted`**: вы отказались на вопрос `Trust <folder>? [y/N]`, например ответив `n` или нажав Enter. Чтобы начать ревью, снова выполните `claude ultrareview` и ответьте `y`.3280* **`Ultrareview did not start: <folder> is not trusted`**: вы отказались на вопрос `Trust <folder>? [y/N]`, например ответив `n` или нажав Enter. Чтобы начать ревью, снова выполните `claude ultrareview` и ответьте `y`.

3268* **``Ultrareview did not start: `--trust-workspace` takes no value``**: после `--trust-workspace` следует что-то, кроме флага, например номер PR или `false`. Если вы не доверяете папке, не указывайте этот флаг. Чтобы доверять ей для этого запуска, поставьте номер PR или базовую ветку перед флагом: `claude ultrareview 1234 --trust-workspace`.3281* **``Ultrareview did not start: `--trust-workspace` takes no value``**: после `--trust-workspace` следует что-то, кроме флага, например номер PR или `false`. Если вы не доверяете папке, не указывайте флаг. Чтобы доверять ей для этого запуска, поставьте номер PR или базовую ветку перед флагом: `claude ultrareview 1234 --trust-workspace`.

3269 3282 

3270До v2.1.309 `claude ultrareview` не принимал `--trust-workspace`.3283До v2.1.309 `claude ultrareview` не принимал `--trust-workspace`.

3271 3284 


3526 3539 

3527Родственные сообщения появляются ещё до запуска команды:3540Родственные сообщения появляются ещё до запуска команды:

3528 3541 

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

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

3531* `No shell command in <name> was run`: одна из команд `!` в файле содержит необработанный управляющий символ, отличный от табуляции или перевода строки, поэтому ни одна из них не выполняется. См. [как найти и удалить этот символ](#no-shell-command-was-run)3544* `No shell command in <name> was run`: одна из команд `!` в файле содержит необработанный управляющий символ, отличный от табуляции или перевода строки, поэтому ни одна из них не выполняется. См. [как найти и удалить этот символ](#no-shell-command-was-run)

3532 3545 


3678 3691 

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

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

3681* **Вы указали базовую ветку, которой не было в вашем клоне**: 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`.3694* **Вы указали базовую ветку, которой не было в вашем клоне**: 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`.

3682 3695 

3683**Что делать:**3696**Что делать:**

3684 3697 


4419* Если действие не произошло, попросите Claude снова запустить инструмент. Переподключать сервер заранее не нужно, потому что Claude Code снова подключается к нему при следующем вызове одного из его инструментов. Если и это подключение не удастся, см. [Обрывы соединения с удалённым сервером посреди сессии](https://code.claude.com/docs/ru/mcp.md#mid-session-drops-of-a-remote-server).4432* Если действие не произошло, попросите Claude снова запустить инструмент. Переподключать сервер заранее не нужно, потому что Claude Code снова подключается к нему при следующем вызове одного из его инструментов. Если и это подключение не удастся, см. [Обрывы соединения с удалённым сервером посреди сессии](https://code.claude.com/docs/ru/mcp.md#mid-session-drops-of-a-remote-server).

4420* Если вы разрабатываете сервер и инструмент безопасно вызывать дважды, [пометьте его как безопасный для повторения](https://code.claude.com/docs/ru/mcp.md#tool-calls-pending-when-a-connection-closes), чтобы Claude Code мог повторить потерянный вызов4433* Если вы разрабатываете сервер и инструмент безопасно вызывать дважды, [пометьте его как безопасный для повторения](https://code.claude.com/docs/ru/mcp.md#tool-calls-pending-when-a-connection-closes), чтобы Claude Code мог повторить потерянный вызов

4421 4434 

4435### MCP server is disabled

4436 

4437Это сообщение в результате инструмента означает, что Claude вызвал инструмент [MCP-сервера](https://code.claude.com/docs/ru/mcp.md), который [отключён](https://code.claude.com/docs/ru/mcp.md#disable-a-server-without-removing-it). Claude Code не подключался к серверу, поэтому инструмент не был выполнен, и Claude получил этот текст вместо результата:

4438 

4439```text wrap theme={null}

4440MCP server "<name>" is disabled — re-enable it via /mcp to use its tools

4441```

4442 

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

4444 

4445* Если вы намеренно отключили сервер, ничего делать не нужно

4446* Если Claude нужны инструменты сервера, снова включите его из `/mcp` в промпте Claude Code

4447* В приложении на [Agent SDK](https://code.claude.com/docs/ru/agent-sdk/overview.md) снова включите сервер, вызвав [`toggleMcpServer()`](https://code.claude.com/docs/ru/agent-sdk/typescript#togglemcpserver) в TypeScript с `enabled`, равным `true`, или [`toggle_mcp_server()`](https://code.claude.com/docs/ru/agent-sdk/python#claudesdkclient) в Python с `enabled`, равным `True`

4448 

4449### MCP tool call timed out with the server's question unanswered

4450 

4451В [неинтерактивном режиме](https://code.claude.com/docs/ru/headless.md) [MCP-сервер](https://code.claude.com/docs/ru/mcp.md) запросил ввод через [elicitation](https://code.claude.com/docs/ru/mcp.md#respond-to-mcp-elicitation-requests) во время вызова инструмента, и лимит времени вызова истёк до того, как пришёл ответ:

4452 

4453```text theme={null}

4454MCP server "<name>" tool "<tool>" timed out after <N>s. The server asked the user a question, and no answer came before the time limit. Do not call this tool again in this turn. Tell the user that the server's question got no answer, and wait for their reply.

4455```

4456 

4457До версии 2.1.310 результат заканчивался на `timed out after <N>s` и ничего не сообщал о вопросе.

4458 

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

4460 

4461* Настройте [хук `Elicitation`](https://code.claude.com/docs/ru/hooks#elicitation), который отвечает на запросы сервера

4462* В приложении на TypeScript Agent SDK сделайте так, чтобы ваш обратный вызов [`onElicitation`](https://code.claude.com/docs/ru/agent-sdk/typescript#options) возвращал ответ до истечения лимита

4463* Чтобы дать больше времени на ответ, задайте более длинный [`timeout`](https://code.claude.com/docs/ru/mcp#time-limits-on-mcp-tool-calls) в миллисекундах в записи конфигурации сервера, например `"timeout": 600000` для 10 минут

4464* Или выполните задачу в интерактивной сессии и сами ответьте в [диалоге](https://code.claude.com/docs/ru/mcp.md#respond-to-mcp-elicitation-requests) сервера

4465 

4422### Agent would be spawned with zero tools4466### Agent would be spawned with zero tools

4423 4467 

4424Каждая запись в [списке `tools`](https://code.claude.com/docs/ru/sub-agents#supported-frontmatter-fields) субагента не соответствовала ни одному используемому инструменту, поэтому Claude Code отказался запускать субагента: без инструментов он не мог действовать. Сообщение группирует ваши записи по причине ошибки:4468Каждая запись в [списке `tools`](https://code.claude.com/docs/ru/sub-agents#supported-frontmatter-fields) субагента не соответствовала ни одному используемому инструменту, поэтому Claude Code отказался запускать субагента: без инструментов он не мог действовать. Сообщение группирует ваши записи по причине ошибки:


4741The command was not started: this computer's disk is full (ENOSPC) on the volume holding /tmp/claude-501 (Claude Code's temporary directory), so the file that captures command output could not be created there and nothing ran. Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.4785The command was not started: this computer's disk is full (ENOSPC) on the volume holding /tmp/claude-501 (Claude Code's temporary directory), so the file that captures command output could not be created there and nothing ran. Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.

4742```4786```

4743 4787 

4744Три других сообщения появляются после команды, которая выполнилась и завершилась с ненулевым кодом. Этот пример — форма `Disk full:`:4788Сообщения `Disk full:`, `Disk quota used up:` и `Nearly out of inodes:` появляются после команды, которая выполнилась и завершилась с ненулевым кодом. Например:

4745 4789 

4746```text wrap theme={null}4790```text wrap theme={null}

4747Disk full: this computer's volume holding /tmp/claude-501 (Claude Code's temporary directory) has 3 MB free, so whatever this command printed was lost and its own writes may have failed with "No space left on device". Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.4791Disk full: this computer's volume holding /tmp/claude-501 (Claude Code's temporary directory) has 3 MB free, so whatever this command printed was lost and its own writes may have failed with "No space left on device". Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.


4751 4795 

4752* В macOS и Linux выполните `df -h <dir>` в оболочке, чтобы узнать, на каком томе находится каталог и насколько он заполнен. `df -i <dir>` показывает, сколько индексных дескрипторов свободно. `<dir>` — это каталог, который называет ваше сообщение, например `df -i /tmp/claude-501`4796* В macOS и Linux выполните `df -h <dir>` в оболочке, чтобы узнать, на каком томе находится каталог и насколько он заполнен. `df -i <dir>` показывает, сколько индексных дескрипторов свободно. `<dir>` — это каталог, который называет ваше сообщение, например `df -i /tmp/claude-501`

4753* **`Disk full: this computer's volume` или `disk is full (ENOSPC)`**: удалите ненужные файлы в любом месте этого тома4797* **`Disk full: this computer's volume` или `disk is full (ENOSPC)`**: удалите ненужные файлы в любом месте этого тома

4754* **`Disk quota used up:` или `Disk full: a test write`**: удалите свои собственные файлы на этом томе, даже если на нём ещё отображается свободное место4798* **`Disk quota used up:`, `disk quota is used up (EDQUOT)` или `Disk full: a test write`**: удалите свои собственные файлы на этом томе, даже если на нём ещё отображается свободное место

4755* **`disk quota is used up (EDQUOT)`**: удалите свои собственные файлы на этом томе

4756* **`Nearly out of inodes:`**: удалите много файлов на этом томе. Каждый файл занимает один индексный дескриптор независимо от размера, поэтому важно их количество, а не размер4799* **`Nearly out of inodes:`**: удалите много файлов на этом томе. Каждый файл занимает один индексный дескриптор независимо от размера, поэтому важно их количество, а не размер

4757* Или перезапустите Claude Code, установив [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/ru/env-vars) в каталог на томе со свободным местом4800* Или перезапустите Claude Code, установив [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/ru/env-vars) в каталог на томе со свободным местом

4758* Затем попросите Claude снова выполнить команду4801* Затем попросите Claude снова выполнить команду


4766 4809 

4767До версии 2.1.305 команда, которую Claude Code не смог запустить из-за заполненного диска, возвращала только текст ошибки операционной системы. Этот текст выглядел, например, как `ENOSPC: no space left on device, open <path>.output`.4810До версии 2.1.305 команда, которую Claude Code не смог запустить из-за заполненного диска, возвращала только текст ошибки операционной системы. Этот текст выглядел, например, как `ENOSPC: no space left on device, open <path>.output`.

4768 4811 

4812### git is not installed on this Mac

4813 

4814Это сообщение означает, что одному из шагов в Claude Code потребовался git, а найденный git — это заглушка Apple в `/usr/bin/git`. Инструменты разработчика, которые предоставляют git, не установлены.

4815 

4816Claude Code не запускает заглушку и вместо этого показывает этот текст, например внутри более длинного сообщения:

4817 

4818```text wrap theme={null}

4819git is not installed on this Mac. To install it, run xcode-select --install, then try again.

4820```

4821 

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

4823 

4824* В Terminal выполните `xcode-select --install`, завершите запущенную этой командой установку, а затем повторите то, что вы делали в Claude Code

4825 

4769### File is not valid UTF-84826### File is not valid UTF-8

4770 4827 

4771Claude использовал инструмент Edit или NotebookEdit для файла, байты которого не декодируются как UTF-8, и Claude Code отклонил изменение. Ничего не было записано, поэтому файл остался прежним. Эти инструменты сохраняют весь файл обратно в UTF-8, из-за чего каждый байт, который им не удалось декодировать, превратился бы в символ замены `U+FFFD`. Сообщение появляется в результате инструмента:4828Claude использовал инструмент Edit или NotebookEdit для файла, байты которого не декодируются как UTF-8, и Claude Code отклонил изменение. Ничего не было записано, поэтому файл остался прежним. Эти инструменты сохраняют весь файл обратно в UTF-8, из-за чего каждый байт, который им не удалось декодировать, превратился бы в символ замены `U+FFFD`. Сообщение появляется в результате инструмента:

fast-mode.md +21 −11

Details

155 155 

156Перед предложением быстрого режима Claude Code проверяет доступность быстрого режима вашей организации с помощью запроса непосредственно к `api.anthropic.com`. Проверка не следует [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential), поэтому в сети, которая маршрутизирует трафик Claude через [шлюз LLM](https://code.claude.com/docs/ru/llm-gateway) и блокирует прямой исходящий трафик к `api.anthropic.com`, проверка не удается, даже если запросы вывода работают. Проверка использует настроенный [HTTP прокси](https://code.claude.com/docs/ru/network-config.md#proxy-configuration), поэтому блокировка сети не удается проверке только там, где `api.anthropic.com` недостижим даже через прокси.156Перед предложением быстрого режима Claude Code проверяет доступность быстрого режима вашей организации с помощью запроса непосредственно к `api.anthropic.com`. Проверка не следует [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential), поэтому в сети, которая маршрутизирует трафик Claude через [шлюз LLM](https://code.claude.com/docs/ru/llm-gateway) и блокирует прямой исходящий трафик к `api.anthropic.com`, проверка не удается, даже если запросы вывода работают. Проверка использует настроенный [HTTP прокси](https://code.claude.com/docs/ru/network-config.md#proxy-configuration), поэтому блокировка сети не удается проверке только там, где `api.anthropic.com` недостижим даже через прокси.

157 157 

158Когда проверка не удается, `/fast` сообщает "Fast mode unavailable due to network connectivity issues", и запросы выполняются на стандартной скорости, даже если ваша организация имеет включенный быстрый режим. Проверка, которая была успешной в прошлом, продолжает работать из своего кэшированного результата, поэтому заблокированная проверка в основном влияет на новые установки.158Если в вашей организации быстрый режим включен, а `/fast` сообщает обратное, найдите показанное сообщение среди следующих случаев.

159 159 

160То же сообщение о подключении появляется в открытой сети, когда проверка достигает `api.anthropic.com`, но представляет учетные данные, которые Anthropic отклоняет. Сеанс, чей разрешенный ключ является учетными данными, выданными шлюзом, хранящимися в [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential) или созданными [`apiKeyHelper`](https://code.claude.com/docs/ru/settings-reference#apikeyhelper), отправляет проверку с этим ключом, и отклоненный запрос сообщается как сбой подключения.160#### Fast mode unavailable due to network connectivity issues

161 161 

162Чтобы восстановить быстрый режим, разрешите прямой исходящий трафик к `api.anthropic.com`, где причина — блокировка сети, или установите переменную, которая соответствует тому, как проверка не удается:162Проверка доступности завершилась неудачей, например потому что ваша сеть блокирует `api.anthropic.com`, и запросы выполняются на стандартной скорости. Проверка, которая была успешной в прошлом, продолжает работать на основе своего кэшированного результата, поэтому заблокированная проверка в основном влияет на новые установки.

163 163 

164* `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1` рассматривает неудачную проверку как доступную и все еще соблюдает ответ "disabled by your organization". Используйте его, когда ваша сеть отказывает в соединении или когда Anthropic отклоняет учетные данные шлюза; разрешение не помогает в случае учетных данных, так как ничего не блокируется.164Чтобы восстановить быстрый режим, добавьте прямой исходящий трафик к `api.anthropic.com` в список разрешённых или установите `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`, что заставляет считать неудачную проверку успешной и при этом по-прежнему учитывает ответ "disabled by your organization".

165* `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1` пропускает проверку полностью. Используйте его, когда ваша сеть перехватывает запрос вместо того, чтобы отказать в нем.

166 165 

167Две конфигурации шлюза сообщают "Fast mode has been disabled by your organization" вместо сообщения о подключении, даже если ваша организация имеет включенный быстрый режим:166#### Fast mode is currently unavailable

168 167 

169* Сеанс, который аутентифицируется только с помощью [`ANTHROPIC_AUTH_TOKEN`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential), пропускает проверку: без входа в claude.ai или ключа Anthropic API и без кэшированной успешной проверки, Claude Code рассматривает быстрый режим как отключенный вашей организацией без отправки запроса.168При работе через шлюз проверьте наличие следующих конфигураций, в которых Claude Code не отправляет проверку доступности и не имеет кэшированной ранее успешной проверки:

170* Прокси, который перехватывает проверку и отвечает своей собственной страницей, например TLS-инспектирующий прокси, возвращающий страницу блокировки HTTP 200, читается как ответ, говорящий, что ваша организация отключила быстрый режим.

171 169 

172В обоих случаях установите `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1` для восстановления быстрого режима. `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS` не применяется ни к одному из этих случаев, так как он только обходит неудачные проверки, а оба эти случая производят ответ об отключении. Разрешение прямого исходящего трафика не помогает в случае токена-носителя, который никогда не отправляет запрос.170* Вы указываете в `ANTHROPIC_BASE_URL` свой шлюз и задаете в [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential) ключ, выданный шлюзом, который не соответствует формату API-ключа Anthropic. Claude Code не отправляет такой ключ на `api.anthropic.com`.

171* Вы устанавливаете [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/ru/env-vars), поэтому Claude Code пропускает проверку.

173 172 

174Переменные влияют только на проверку на стороне клиента. Когда ваша организация имеет отключенный быстрый режим, API отклоняет запросы быстрого режима независимо от того, установлены ли они. Отклонение от API остается в силе даже с установленной переменной пропуска. Claude Code повторяет отклоненный запрос на стандартной скорости, отключает быстрый режим и `/fast` сообщает, что ваша организация отключила быстрый режим.173Чтобы восстановить быстрый режим в любой из этих конфигураций, установите `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`.

175 174 

176Установка `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` также подавляет проверку доступности. Без ранее кэшированной успешной проверки `/fast` сообщает "Fast mode is currently unavailable"; обе переменные пропуска восстанавливают быстрый режим в этой конфигурации также.175#### Fast mode has been disabled by your organization

176 

177При работе через шлюз вы можете увидеть это сообщение, даже если в вашей организации быстрый режим включен, в любой из следующих конфигураций:

178 

179* Вы аутентифицируетесь только с помощью [`ANTHROPIC_AUTH_TOKEN`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential), без входа в claude.ai, без API-ключа и без кэшированной успешной проверки. В этом случае Claude Code считает быстрый режим отключенным вашей организацией, не отправляя запрос.

180* Прокси перехватывает проверку и отвечает собственной страницей, например прокси с TLS-инспекцией возвращает страницу блокировки с HTTP 200. Claude Code воспринимает эту страницу как ответ о том, что в вашей организации быстрый режим отключен.

181 

182В обоих случаях установите `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`, что полностью пропускает проверку, а не `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS`, которая ни к одному из этих случаев не применяется.

183 

184> [!NOTE]

185>

186> Переменные пропуска изменяют только проверку на стороне клиента. Когда в вашей организации быстрый режим отключен, API отклоняет запросы быстрого режима независимо от того, установлены ли они. В этом случае Claude Code повторяет запрос на стандартной скорости, отключает быстрый режим, а `/fast` сообщает, что ваша организация отключила быстрый режим.

177 187 

178### Требование явного согласия для каждого сеанса188### Требование явного согласия для каждого сеанса

179 189 

hooks.md +16 −5

Details

961blocking because Git Bash wasn't found, so only exit code 0 or 2 counts as this hook's verdict.961blocking because Git Bash wasn't found, so only exit code 0 or 2 counts as this hook's verdict.

962```962```

963 963 

964Чтобы узнать причину сбоя хука, проверьте [отладочный лог](#debug-hooks). Выберите исправление, подходящее для вашего хука:964Если ошибка также содержит `PowerShell started no program`, начните с [исправлений для `command`, состоящего только из строк в кавычках](#powershell-started-no-program), которые PowerShell выводит вместо того, чтобы выполнять.

965 

966Без Git Bash любой код выхода этого хука, отличный от 0 или 2, считается [сбоем](#block-the-action-when-a-hook-fails), даже если хук выводит JSON, который не отклоняет вызов. Чтобы узнать причину сбоя хука, проверьте [отладочный лог](#debug-hooks). Затем выберите исправление, подходящее для вашего хука:

965 967 

966* **Действие должно выполняться при сбое хука**: добавьте в хук [`"onFailure": "continue"`](#block-the-action-when-a-hook-fails)968* **Действие должно выполняться при сбое хука**: добавьте в хук [`"onFailure": "continue"`](#block-the-action-when-a-hook-fails)

967* **Хук написан для Bash**: хук в [форме оболочки](#exec-form-and-shell-form) без заданного `shell` выполняется в PowerShell, если Git Bash не установлен, а скрипт, написанный для Bash, может не работать там в исходном виде. Установите [Git for Windows](https://git-scm.com/downloads/win) или задайте [`CLAUDE_CODE_GIT_BASH_PATH`](https://code.claude.com/docs/ru/env-vars), если Git Bash установлен там, где Claude Code его не находит, а затем начните новую сессию969* **Хук завершается с кодом 1 для предупреждения, но должен блокировать при падении**: с `"onFailure": "continue"` вызов выполняется при коде выхода 1 — как при предупреждении, так и при падении. Вместо этого добавьте `"onFailure": "block"` и завершайте скрипт с кодом 0 там, где он выдаёт предупреждение, чтобы такие вызовы выполнялись. Чтобы по-прежнему показывать предупреждение для `PreToolUse`, выведите его в stdout в поле [`systemMessage`](#json-output) одного объекта JSON.

970* **Хук написан для Bash**: без Git Bash хук в [форме оболочки](#exec-form-and-shell-form) без заданного `shell` выполняется в PowerShell, где он может завершиться сбоем. Установите [Git for Windows](https://git-scm.com/downloads/win) или задайте [`CLAUDE_CODE_GIT_BASH_PATH`](https://code.claude.com/docs/ru/env-vars), если Git Bash установлен там, где Claude Code его не находит. Затем начните новую сессию.

968* **Хук запускает один файл `.exe`, а не файл `.cmd` или `.bat`**: укажите программу в `command`, а её аргументы в `args`, чтобы использовать форму exec, и добавьте `"onFailure": "block"`. Тогда Claude Code запускает программу без оболочки. Без `"onFailure": "block"` вызов может выполниться, если программа завершается сбоем, отсутствует или превышает таймаут971* **Хук запускает один файл `.exe`, а не файл `.cmd` или `.bat`**: укажите программу в `command`, а её аргументы в `args`, чтобы использовать форму exec, и добавьте `"onFailure": "block"`. Тогда Claude Code запускает программу без оболочки. Без `"onFailure": "block"` вызов может выполниться, если программа завершается сбоем, отсутствует или превышает таймаут

969* **Хук завершается с кодом 1 для предупреждения, но должен блокировать при падении**: с `"onFailure": "continue"` вызов выполняется при коде выхода 1 — как при предупреждении, так и при падении. Вместо этого добавьте `"onFailure": "block"` и завершайте скрипт с кодом 0 там, где он выдаёт предупреждение, чтобы такие вызовы выполнялись. Чтобы показать предупреждение для `PreToolUse` после кода выхода 0, выведите его в stdout в поле [`systemMessage`](#json-output) одного объекта JSON

970* **Защитный хук PowerShell, который должен блокировать при сбое**: при незаданном `onFailure` он перестаёт это делать, как только установлен Git for Windows и Claude Code находит Git Bash. Добавьте `"onFailure": "block"`, чтобы сбой или таймаут блокировал вызов как с Git Bash, так и без него. Также задайте `"shell": "powershell"`, чтобы хук и дальше выполнялся в PowerShell, а не в Git Bash972* **Защитный хук PowerShell, который должен блокировать при сбое**: при незаданном `onFailure` он перестаёт это делать, как только установлен Git for Windows и Claude Code находит Git Bash. Добавьте `"onFailure": "block"`, чтобы сбой или таймаут блокировал вызов как с Git Bash, так и без него. Также задайте `"shell": "powershell"`, чтобы хук и дальше выполнялся в PowerShell, а не в Git Bash

971 973 

972Для хука, который показывает эту ошибку, любой код выхода, отличный от 0 или 2, считается [сбоем](#block-the-action-when-a-hook-fails), даже если хук выводит JSON, который не отклоняет вызов.

973 

974До версии v2.1.309 сообщение выглядело так: `blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.`974До версии v2.1.309 сообщение выглядело так: `blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.`

975 975 

976#### PowerShell started no program

977 

978Хук с этой ошибкой выполнялся в PowerShell, который выводит `command`, состоящий только из строк в кавычках, например `"command": "\"C:\\Tools\\guard.exe\""`, вместо того чтобы его выполнить.

979 

980* **Чтобы вывести текст, например JSON**: задайте `"shell": "powershell"`, и хук завершится с кодом 0

981* **Чтобы запустить файл `.ps1`, `.cmd` или `.bat` либо `.exe`, путь к которому содержит переменную**: задайте `"shell": "powershell"` и поставьте `&` перед путём в кавычках. Оставьте `$HOME` как есть, а переменные окружения записывайте так, как [пример `check.ps1`](#reference-scripts-by-path-in-powershell-hooks) записывает `$env:CLAUDE_PROJECT_DIR`

982* **Чтобы запустить один `.exe` по пути без `$`**: удалите внутренние кавычки из `command`, затем примените [исправление для хука, запускающего один `.exe`](#failed-hooks-on-windows-without-git-bash), указав `"args": []`, если программа не принимает аргументов

983* **Чтобы запустить скрипт, написанный для Bash**: примените [исправление для хука, написанного для Bash](#failed-hooks-on-windows-without-git-bash)

984 

976#### Поведение кода выхода 2 для каждого события985#### Поведение кода выхода 2 для каждого события

977 986 

978Код выхода 2 — это способ, которым хук сигнализирует «стоп, не делай этого». Эффект зависит от события, потому что одни события представляют действия, которые можно заблокировать (например, вызов инструмента, который ещё не произошёл), а другие — то, что уже произошло или не может быть предотвращено.987Код выхода 2 — это способ, которым хук сигнализирует «стоп, не делай этого». Эффект зависит от события, потому что одни события представляют действия, которые можно заблокировать (например, вызов инструмента, который ещё не произошёл), а другие — то, что уже произошло или не может быть предотвращено.


4187}4196}

4188```4197```

4189 4198 

4199### Ссылки на скрипты по пути в хуках PowerShell

4200 

4190Чтобы ссылаться на корневой каталог проекта из команды PowerShell в форме shell, напишите `${CLAUDE_PROJECT_DIR}` или `$env:CLAUDE_PROJECT_DIR`. Claude Code переписывает заполнители `${CLAUDE_PROJECT_DIR}`, `${CLAUDE_PLUGIN_ROOT}` и `${CLAUDE_PLUGIN_DATA}` в команде PowerShell в форме shell в форму `${env:NAME}` PowerShell, независимо от того, определён ли хук в `settings.json`, плагине или скилле. PowerShell затем разрешает значение из экспортированного окружения после анализа, поэтому заполнитель работает внутри строк в двойных кавычках, но не внутри строк в одинарных кавычках, где PowerShell никогда не расширяет переменные.4201Чтобы ссылаться на корневой каталог проекта из команды PowerShell в форме shell, напишите `${CLAUDE_PROJECT_DIR}` или `$env:CLAUDE_PROJECT_DIR`. Claude Code переписывает заполнители `${CLAUDE_PROJECT_DIR}`, `${CLAUDE_PLUGIN_ROOT}` и `${CLAUDE_PLUGIN_DATA}` в команде PowerShell в форме shell в форму `${env:NAME}` PowerShell, независимо от того, определён ли хук в `settings.json`, плагине или скилле. PowerShell затем разрешает значение из экспортированного окружения после анализа, поэтому заполнитель работает внутри строк в двойных кавычках, но не внутри строк в одинарных кавычках, где PowerShell никогда не расширяет переменные.

4191 4202 

4192Не пишите простое написание `$CLAUDE_PROJECT_DIR` в hook PowerShell. PowerShell анализирует его как неопределённую локальную переменную и разрешает её в `$null`, что оставляет путь скрипта без префикса корневого каталога проекта. Claude Code не переписывает эту форму; вместо этого она регистрирует предупреждение в [debug log](#debug-hooks).4203Не пишите простое написание `$CLAUDE_PROJECT_DIR` в hook PowerShell. PowerShell анализирует его как неопределённую локальную переменную и разрешает её в `$null`, что оставляет путь скрипта без префикса корневого каталога проекта. Claude Code не переписывает эту форму; вместо этого она регистрирует предупреждение в [debug log](#debug-hooks).

jetbrains.md +1 −1

Details

61/ide61/ide

62```62```

63 63 

64Когда соединение установлено успешно, Claude Code подтверждает это сообщением вроде `Connected to IntelliJ IDEA.` Если Claude Code обнаружит запущенную IDE, в которой нет плагина, `/ide` установит плагин для вас и попросит перезагрузить IDE.64Когда соединение установлено успешно, Claude Code подтверждает это сообщением вроде `Connected to IntelliJ IDEA.`

65 65 

66Если вы хотите, чтобы Claude имел доступ к тем же файлам, что и ваша IDE, запустите Claude Code из того же каталога, что и корень проекта вашей IDE.66Если вы хотите, чтобы Claude имел доступ к тем же файлам, что и ваша IDE, запустите Claude Code из того же каталога, что и корень проекта вашей IDE.

67 67 

Details

519| Ошибки `400` на каждом запросе, в собственных словах шлюза отклоняющие входную схему инструмента или его `pattern`, на Claude Code v2.1.265 через v2.1.267 | При постепенном развертывании на этих версиях схема [инструмента Artifact](https://code.claude.com/docs/ru/artifacts.md#availability) содержит регулярное выражение с классами символов Unicode `\p{...}`. API Anthropic его принимает, но шлюз или вышестоящий, который проверяет `pattern` каждой схемы инструмента с помощью собственного механизма regex, отклоняет весь запрос | Обновитесь до v2.1.268 или позже, которая не отправляет регулярное выражение. На затронутой версии [отключите артефакты](https://code.claude.com/docs/ru/artifacts.md#disable-artifacts), что удаляет инструмент и его схему из запросов |519| Ошибки `400` на каждом запросе, в собственных словах шлюза отклоняющие входную схему инструмента или его `pattern`, на Claude Code v2.1.265 через v2.1.267 | При постепенном развертывании на этих версиях схема [инструмента Artifact](https://code.claude.com/docs/ru/artifacts.md#availability) содержит регулярное выражение с классами символов Unicode `\p{...}`. API Anthropic его принимает, но шлюз или вышестоящий, который проверяет `pattern` каждой схемы инструмента с помощью собственного механизма regex, отклоняет весь запрос | Обновитесь до v2.1.268 или позже, которая не отправляет регулярное выражение. На затронутой версии [отключите артефакты](https://code.claude.com/docs/ru/artifacts.md#disable-artifacts), что удаляет инструмент и его схему из запросов |

520| Ошибки `400` на каждом запросе, в собственных словах шлюза отклоняющие неузнанный тип инструмента, такие как `Input tag 'advisor_20260301'`, на Claude Code v2.1.275 | При постепенном развертывании на этой версии запросы содержат запись [инструмента advisor](https://code.claude.com/docs/ru/advisor.md) даже с отключенным advisor. API Anthropic его принимает, но шлюз или вышестоящий, который проверяет типы инструментов, отклоняет весь запрос; тот, который [пересылает поля тела запроса без изменений](https://code.claude.com/docs/ru/llm-gateway-protocol.md#forward-as-open-lists), пропускает его без влияния. Запись является объявлением, которое не содержит содержимого разговора | Обновитесь до v2.1.276 или позже, которая не отправляет запись за шлюзом `ANTHROPIC_BASE_URL`, если вы не включите advisor. На v2.1.275 установите [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/ru/env-vars), что удаляет запись из запросов |520| Ошибки `400` на каждом запросе, в собственных словах шлюза отклоняющие неузнанный тип инструмента, такие как `Input tag 'advisor_20260301'`, на Claude Code v2.1.275 | При постепенном развертывании на этой версии запросы содержат запись [инструмента advisor](https://code.claude.com/docs/ru/advisor.md) даже с отключенным advisor. API Anthropic его принимает, но шлюз или вышестоящий, который проверяет типы инструментов, отклоняет весь запрос; тот, который [пересылает поля тела запроса без изменений](https://code.claude.com/docs/ru/llm-gateway-protocol.md#forward-as-open-lists), пропускает его без влияния. Запись является объявлением, которое не содержит содержимого разговора | Обновитесь до v2.1.276 или позже, которая не отправляет запись за шлюзом `ANTHROPIC_BASE_URL`, если вы не включите advisor. На v2.1.275 установите [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/ru/env-vars), что удаляет запись из запросов |

521| Модели отсутствуют в средстве выбора `/model` | Имена моделей шлюза отсутствуют во встроенном списке Claude Code, или Claude Code показывает [`modelPicker`](https://code.claude.com/docs/ru/settings-reference#modelpicker) набор, который заменяет встроенные параметры | Включите [обнаружение модели шлюза](#add-gateway-models-to-the-model-picker) или добавьте имена с переменными [конфигурации модели](https://code.claude.com/docs/ru/model-config.md). Если Claude Code показывает заменяющий набор `modelPicker`, добавьте модели шлюза в него, или попросите администратора добавить их, когда управляемые параметры его предоставляют |521| Модели отсутствуют в средстве выбора `/model` | Имена моделей шлюза отсутствуют во встроенном списке Claude Code, или Claude Code показывает [`modelPicker`](https://code.claude.com/docs/ru/settings-reference#modelpicker) набор, который заменяет встроенные параметры | Включите [обнаружение модели шлюза](#add-gateway-models-to-the-model-picker) или добавьте имена с переменными [конфигурации модели](https://code.claude.com/docs/ru/model-config.md). Если Claude Code показывает заменяющий набор `modelPicker`, добавьте модели шлюза в него, или попросите администратора добавить их, когда управляемые параметры его предоставляют |

522| `/fast` сообщает `Fast mode unavailable due to network connectivity issues` в то время как запросы вывода работают | Проверка доступности [быстрого режима](https://code.claude.com/docs/ru/fast-mode.md) идет непосредственно на `api.anthropic.com` и не следует `ANTHROPIC_BASE_URL`, поэтому заблокированный прямой исходящий трафик не проходит проверку. То же сообщение появляется в открытой сети, когда проверка представляет ключ, выданный шлюзом, из `ANTHROPIC_API_KEY` или `apiKeyHelper`, и Anthropic его отклоняет | Добавьте в список разрешений `api.anthropic.com`, если исходящий трафик заблокирован, или установите переменную пропуска; для отклоненного ключа шлюза помогают только переменные пропуска. См. [использование быстрого режима за прокси и LLM шлюзами](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |522| `/fast` сообщает `Fast mode unavailable due to network connectivity issues`, в то время как запросы вывода работают | Проверка доступности [быстрого режима](https://code.claude.com/docs/ru/fast-mode.md) идёт непосредственно на `api.anthropic.com` и не следует `ANTHROPIC_BASE_URL`, поэтому заблокированный прямой исходящий трафик не проходит проверку | Добавьте `api.anthropic.com` в список разрешённых доменов, если исходящий трафик заблокирован, или установите переменную пропуска. См. [использование быстрого режима за прокси и LLM-шлюзами](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

523| `/fast` сообщает `Fast mode has been disabled by your organization` в сеансе, аутентифицированном с помощью `ANTHROPIC_AUTH_TOKEN`, даже если организация имеет включенный быстрый режим | Проверка доступности требует входа claude.ai или ключа API Anthropic; только с токеном-носителем Claude Code рассматривает быстрый режим как отключенный без отправки проверки | Установите `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`; см. [использование быстрого режима за прокси и LLM шлюзами](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |523| `/fast` сообщает `Fast mode is currently unavailable` в сессии, которая аутентифицируется с помощью выданного шлюзом ключа в `ANTHROPIC_API_KEY` | Пока `ANTHROPIC_BASE_URL` указывает на ваш шлюз, Claude Code не передаёт на `api.anthropic.com` ключ, который не соответствует формату API-ключа Anthropic. В этом случае проверка доступности [быстрого режима](https://code.claude.com/docs/ru/fast-mode.md) не отправляется, и при отсутствии закэшированной ранее успешной проверки Claude Code считает быстрый режим недоступным | Установите `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`; см. [использование быстрого режима за прокси и LLM-шлюзами](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| `/fast` сообщает `Fast mode has been disabled by your organization` в сессии, аутентифицированной с помощью `ANTHROPIC_AUTH_TOKEN`, даже если в организации включён быстрый режим | Проверка доступности требует входа в claude.ai или API-ключа; при наличии только Bearer-токена Claude Code считает быстрый режим отключённым, не отправляя проверку | Установите `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`; см. [использование быстрого режима за прокси и LLM-шлюзами](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| Claude Code просит вас войти, даже если [тест curl](#verify-the-connection) успешен | CLI не имеет собственных учетных данных: достижимый базовый URL не является одним, и в интерактивном сеансе блок `env` в `.claude/settings.json` или `.claude/settings.local.json` проекта применяется только после мастера первого запуска и [подсказки доверия](https://code.claude.com/docs/ru/permissions.md#what-runs-before-you-trust-a-folder) | Установите `ANTHROPIC_AUTH_TOKEN` где-то, где Claude Code читает перед первоначальной настройкой: экспорт оболочки, блок `env` в `~/.claude/settings.json` или управляемые параметры |525| Claude Code просит вас войти, даже если [тест curl](#verify-the-connection) успешен | CLI не имеет собственных учетных данных: достижимый базовый URL не является одним, и в интерактивном сеансе блок `env` в `.claude/settings.json` или `.claude/settings.local.json` проекта применяется только после мастера первого запуска и [подсказки доверия](https://code.claude.com/docs/ru/permissions.md#what-runs-before-you-trust-a-folder) | Установите `ANTHROPIC_AUTH_TOKEN` где-то, где Claude Code читает перед первоначальной настройкой: экспорт оболочки, блок `env` в `~/.claude/settings.json` или управляемые параметры |

525| `ANTHROPIC_API_KEY` установлен, но игнорируется, без подсказки | Ключ требует одобрения один раз в интерактивных сеансах, и ранее отклоненный ключ игнорируется без повторного запроса | Включите его под `/config` с опцией `Use custom API key` |526| `ANTHROPIC_API_KEY` установлен, но игнорируется, без подсказки | Ключ требует одобрения один раз в интерактивных сеансах, и ранее отклоненный ключ игнорируется без повторного запроса | Включите его под `/config` с опцией `Use custom API key` |

526| `This machine's managed settings require a first-party login`, или [`Administrator policy requires a Cloud gateway sign-in`](https://code.claude.com/docs/ru/errors#administrator-policy-requires-a-cloud-gateway-sign-in) когда управляемые параметры устанавливают `forceLoginMethod` на `"gateway"` или также устанавливают `forceLoginGatewayUrl` | Управляемые параметры включают `forceLoginMethod` или `forceLoginOrgUUID`, которые не могут сосуществовать с `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN` или `apiKeyHelper` | Администратор должен удалить `forceLoginMethod`, `forceLoginOrgUUID` и `forceLoginGatewayUrl` из управляемых параметров, чтобы использовать учетные данные шлюза, или удалить учетные данные шлюза и использовать вход, который требуют управляемые параметры. Эти два не могут быть объединены |527| `This machine's managed settings require a first-party login`, или [`Administrator policy requires a Cloud gateway sign-in`](https://code.claude.com/docs/ru/errors#administrator-policy-requires-a-cloud-gateway-sign-in) когда управляемые параметры устанавливают `forceLoginMethod` на `"gateway"` или также устанавливают `forceLoginGatewayUrl` | Управляемые параметры включают `forceLoginMethod` или `forceLoginOrgUUID`, которые не могут сосуществовать с `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN` или `apiKeyHelper` | Администратор должен удалить `forceLoginMethod`, `forceLoginOrgUUID` и `forceLoginGatewayUrl` из управляемых параметров, чтобы использовать учетные данные шлюза, или удалить учетные данные шлюза и использовать вход, который требуют управляемые параметры. Эти два не могут быть объединены |

mcp.md +4 −4

Details

250 250 

251Статусы из этого списка отражают решение конфигурации, а не попытку подключения, поэтому Claude Code выводит их без подключения к серверу:251Статусы из этого списка отражают решение конфигурации, а не попытку подключения, поэтому Claude Code выводит их без подключения к серверу:

252 252 

253* ``⏸ Pending approval (run `claude` to approve)``: сервер с областью действия проекта из `.mcp.json`, который вы ещё не подтвердили. Claude Code показывает его и в `claude mcp list`, и в `claude mcp get <name>`. Запустите `claude` в интерактивном режиме, чтобы просмотреть и подтвердить его.253* ``⏸ Pending approval (run `claude` to approve)``: сервер из `.mcp.json` с областью действия проекта, который вы ещё не подтвердили. Claude Code показывает его и в `claude mcp list`, и в `claude mcp get <name>`. Запустите `claude` в интерактивном режиме, чтобы просмотреть и подтвердить его.

254* `✘ Rejected (see disabledMcpjsonServers in settings)`: сервер из `.mcp.json`, который отклоняет запись [`disabledMcpjsonServers`](https://code.claude.com/docs/ru/settings-reference#disabledmcpjsonservers). Claude Code показывает его только в `claude mcp get <name>`.254* `✘ Rejected (see disabledMcpjsonServers in settings)`: сервер из `.mcp.json`, который отклоняет запись [`disabledMcpjsonServers`](https://code.claude.com/docs/ru/settings-reference#disabledmcpjsonservers). Claude Code показывает его только в `claude mcp get <name>`.

255* `⊘ Disabled for this project (re-enable via /mcp)`: сервер, указанный в списке [`disabledMcpServers`](#disable-a-server-without-removing-it) проекта. Claude Code показывает его и в `claude mcp list`, и в `claude mcp get <name>`. Включите сервер обратно в панели `/mcp`.255* `⊘ Disabled for this project (re-enable via /mcp)`: сервер, указанный в списке [`disabledMcpServers`](#disable-a-server-without-removing-it) проекта. Claude Code показывает его и в `claude mcp list`, и в `claude mcp get <name>`. Включите сервер обратно в панели `/mcp`.

256 256 


384Эти повторные попытки не применяются в следующих случаях:384Эти повторные попытки не применяются в следующих случаях:

385 385 

386* Первое подключение stdio-сервера. Чтобы попробовать снова, см. [Stdio-серверы, которые завершаются или не запускаются](#stdio-servers-that-exit-or-fail-to-start)386* Первое подключение stdio-сервера. Чтобы попробовать снова, см. [Stdio-серверы, которые завершаются или не запускаются](#stdio-servers-that-exit-or-fail-to-start)

387* Первое подключение WebSocket-сервера387* Первое подключение WebSocket-сервера. Чтобы попробовать снова в интерактивной сессии в терминале, выберите **Reconnect** в меню сервера в `/mcp`

388* Ошибка аутентификации или «не найдено», потому что для её устранения требуется изменить конфигурацию. Когда [`headersHelper`](#use-dynamic-headers-for-custom-authentication) — единственный источник заголовка `Authorization` для сервера, Claude Code всё равно повторяет попытку при ошибке аутентификации, потому что перезапускает helper при каждой попытке и может получить свежие учётные данные388* Ошибка аутентификации или «не найдено», потому что для её устранения требуется изменить конфигурацию. Когда [`headersHelper`](#use-dynamic-headers-for-custom-authentication) — единственный источник заголовка `Authorization` для сервера, Claude Code всё равно повторяет попытку при ошибке аутентификации, потому что перезапускает helper при каждой попытке и может получить свежие учётные данные

389 389 

390#### Stdio-серверы, которые завершаются или не запускаются390#### Stdio-серверы, которые завершаются или не запускаются


403 403 

404#### Самостоятельная повторная попытка для сбойных серверов404#### Самостоятельная повторная попытка для сбойных серверов

405 405 

406Чтобы повторить попытку для каждого сервера, у которого произошёл сбой или который требует аутентификации, выполните `/mcp reconnect all`. В интерактивном терминале для этого требуется Claude Code v2.1.284 или новее; более ранние версии выводят там `MCP server "all" not found`.406Чтобы повторить попытку для всех серверов, которые дали сбой или требуют аутентификации, выполните `/mcp reconnect all` в промпте Claude Code в интерактивной сессии в терминале. Для этого требуется Claude Code v2.1.284 или новее. Более ранние версии выводят `MCP server "all" not found`.

407 407 

408#### Как Claude узнаёт о сбое сервера408#### Как Claude узнаёт о сбое сервера

409 409 


1332 1332 

1333Серверы из claude.ai появляются в списке с индикаторами, показывающими, что они поступают из claude.ai.1333Серверы из claude.ai появляются в списке с индикаторами, показывающими, что они поступают из claude.ai.

1334 1334 

1335Anthropic также предоставляет некоторые connectors самостоятельно, без добавления вами или администратором. На учётных записях, где доступны [Claude Docs](https://code.claude.com/docs/ru/artifacts.md#write-a-document-with-claude-docs), `/mcp` отображает `claude.ai Claude Docs` без настройки, и Claude использует его, когда вы просите документ, предназначенный для других людей. Чтобы отключить его, добавьте запись `serverName` со значением `"claude.ai Claude Docs"` в `deniedMcpServers` или используйте переключатель `/mcp`, оба описаны в разделе [Отключение connectors claude.ai](#disable-claude-ai-connectors).1335Anthropic также предоставляет некоторые коннекторы самостоятельно, без добавления вами или администратором. На учётных записях, где доступен [Claude Docs](https://code.claude.com/docs/ru/artifacts.md#write-a-document-with-claude-docs), `/mcp` отображает `claude.ai Claude Docs` без какой-либо настройки, и Claude использует его, когда вы просите документ, предназначенный для других людей. Чтобы отключить только этот коннектор, см. раздел [Отключение коннекторов claude.ai](#disable-claude-ai-connectors).

1336 1336 

1337Claude Code помечает connector как `managed` в `/mcp` и в менеджере [`/plugin`](https://code.claude.com/docs/ru/plugins/install) когда ваша организация управляет его аутентификацией в claude.ai. Статус managed не изменяет способ подключения Claude Code к connector или применение [инструментов управления](#organization-controls-on-connector-tools) вашей организации.1337Claude Code помечает connector как `managed` в `/mcp` и в менеджере [`/plugin`](https://code.claude.com/docs/ru/plugins/install) когда ваша организация управляет его аутентификацией в claude.ai. Статус managed не изменяет способ подключения Claude Code к connector или применение [инструментов управления](#organization-controls-on-connector-tools) вашей организации.

1338 1338 

model-config.md +7 −2

Details

349 349 

350Когда управляемые параметры, которые применяет Claude Code, определяют `availableModels`, этот список один применяется, кроме [платформы хоста, которая предоставляет свой собственный](https://code.claude.com/docs/ru/settings.md#exceptions-to-managed-settings-precedence): записи в параметрах пользователя, проекта или локальных параметрах не могут расширить его, и Claude Code никогда не объединяет `availableModels` между управляемыми источниками либо; [как Claude Code объединяет управляемые источники](https://code.claude.com/docs/ru/managed-settings.md#how-claude-code-combines-managed-sources) указывает, какой список источника применяется. В противном случае списки из параметров пользователя, проекта и локальных параметров [объединяются и дедублицируются](https://code.claude.com/docs/ru/settings.md#settings-precedence) как другие параметры массива. До Claude Code v2.1.175 записи из областей с более низким приоритетом объединялись с управляемым списком, а не заменялись им.350Когда управляемые параметры, которые применяет Claude Code, определяют `availableModels`, этот список один применяется, кроме [платформы хоста, которая предоставляет свой собственный](https://code.claude.com/docs/ru/settings.md#exceptions-to-managed-settings-precedence): записи в параметрах пользователя, проекта или локальных параметрах не могут расширить его, и Claude Code никогда не объединяет `availableModels` между управляемыми источниками либо; [как Claude Code объединяет управляемые источники](https://code.claude.com/docs/ru/managed-settings.md#how-claude-code-combines-managed-sources) указывает, какой список источника применяется. В противном случае списки из параметров пользователя, проекта и локальных параметров [объединяются и дедублицируются](https://code.claude.com/docs/ru/settings.md#settings-precedence) как другие параметры массива. До Claude Code v2.1.175 записи из областей с более низким приоритетом объединялись с управляемым списком, а не заменялись им.

351 351 

352В пределах эффективного списка запись, называющая конкретную модель в семействе, будь то префикс версии или полный идентификатор модели, отключает запись подстановочного знака семейства: `["sonnet", "claude-sonnet-4-5"]` разрешает только версии Sonnet 4.5, а не каждую модель Sonnet.352В действующем списке запись, называющая конкретную модель семейства — префикс версии или полный идентификатор модели, — отключает запись-подстановку для этого семейства. Например, с `["sonnet", "claude-sonnet-4-5"]` пользователи могут выбрать только те идентификаторы моделей, которым [соответствует](#restrict-model-selection) `claude-sonnet-4-5`, а не любую модель Sonnet.

353 353 

354### Идентификаторы моделей Mantle354### Идентификаторы моделей Mantle

355 355 


947>947>

948> Список разрешённых моделей `availableModels`, доставленный через [MDM или файл управляемых настроек](https://code.claude.com/docs/ru/managed-settings.md#delivery-mechanisms), по-прежнему применяется при использовании сторонних поставщиков; [настройки, управляемые сервером, туда не доставляются](https://code.claude.com/docs/ru/server-managed-settings.md#platform-availability).948> Список разрешённых моделей `availableModels`, доставленный через [MDM или файл управляемых настроек](https://code.claude.com/docs/ru/managed-settings.md#delivery-mechanisms), по-прежнему применяется при использовании сторонних поставщиков; [настройки, управляемые сервером, туда не доставляются](https://code.claude.com/docs/ru/server-managed-settings.md#platform-availability).

949>949>

950> Фильтрация соответствует псевдониму модели, такому как `opus`, префиксу версии, такому как `claude-opus-4-8`, или полному идентификатору модели в форме поставщика. Префиксы, специфичные для поставщика, такие как `us.anthropic.`, не удаляются, поэтому чтобы разрешить конкретную модель, укажите её полный идентификатор в форме поставщика или отобразите её через [`modelOverrides`](#override-model-ids-per-version). Для закреплённой модели этот идентификатор является значением, которое вы установили в её переменной `ANTHROPIC_DEFAULT_*_MODEL`. Любой суффикс `[1m]` удаляется из записи списка разрешённых моделей и запрошенной модели перед сопоставлением.950> Фильтрация соответствует псевдониму модели, такому как `opus`, префиксу версии, такому как `claude-opus-4-8`, или полному идентификатору модели в форме поставщика. Префиксы, специфичные для поставщика, такие как `us.anthropic.`, не удаляются, поэтому чтобы разрешить конкретную модель, отобразите её через [`modelOverrides`](#override-model-ids-per-version) или укажите её полный идентификатор в форме поставщика:

951>

952> * **Google Cloud's Agent Platform**: когда идентификатор, который запрашивает Claude Code, содержит дату после `@`, например `claude-sonnet-4-5@20250929`, включите дату в запись списка разрешённых моделей. Сам по себе `claude-sonnet-4-5` не соответствует этому идентификатору ни при одном значении настройки [`availableModelsMatch`](https://code.claude.com/docs/ru/settings-reference#availablemodelsmatch).

953> * **Закреплённые модели**: укажите значение, которое вы установили в переменной `ANTHROPIC_DEFAULT_*_MODEL` этой модели

954>

955> Любой суффикс `[1m]` удаляется из записи списка разрешённых моделей и запрошенной модели перед сопоставлением.

951 956 

952### Настройка отображения и возможностей закреплённой модели957### Настройка отображения и возможностей закреплённой модели

953 958 

Details

605 605 

606* `prompt.id`: UUID, связывающий промпт пользователя со всеми последующими событиями до следующего промпта. См. [Атрибуты корреляции событий](#event-correlation-attributes).606* `prompt.id`: UUID, связывающий промпт пользователя со всеми последующими событиями до следующего промпта. См. [Атрибуты корреляции событий](#event-correlation-attributes).

607* `workspace.host_paths`: каталоги рабочего пространства хоста, выбранные в настольном приложении, в виде массива строк607* `workspace.host_paths`: каталоги рабочего пространства хоста, выбранные в настольном приложении, в виде массива строк

608* `workflow.run_id`: идентификатор запуска с префиксом `wf_` в событиях API и инструментов, генерируемых агентами, которые относятся к запуску инструмента [Workflow](https://code.claude.com/docs/ru/workflows.md). Фильтрация событий по одному `workflow.run_id` позволяет восстановить API-запросы и результаты инструментов этого запуска. Идентификатор охватывает агентов, которых порождает скрипт workflow, а также любых агентов, которых порождают уже они, например при вызовах скиллов. Он совпадает с идентификатором запуска, сообщаемым в результате инструмента Workflow. Отсутствует во всех остальных событиях.608* `workflow.run_id`: идентификатор запуска с префиксом `wf_` в событиях API и инструментов, которые генерируют агенты, относящиеся к запуску инструмента [Workflow](https://code.claude.com/docs/ru/workflows.md). Фильтрация событий по одному `workflow.run_id` позволяет восстановить API-запросы и результаты инструментов этого запуска. Идентификатор охватывает агентов, порождаемых скриптом workflow, и всех агентов, которых порождают уже они, например вызовы скиллов. Он совпадает с идентификатором запуска, сообщаемым в результате инструмента Workflow.

609* `workflow.name`: имя workflow, `meta.name` его скрипта, генерируется вместе с `workflow.run_id`. Имена встроенных workflow отображаются как есть, когда запуск выполняет неизменённый встроенный скрипт. Имена, заданные пользователем, включая отредактированные копии встроенных скриптов, заменяются на `custom`, если не задано `OTEL_LOG_TOOL_DETAILS=1`.609* `workflow.name`: имя workflow, `meta.name` его скрипта, генерируется вместе с `workflow.run_id`. Имена встроенных workflow отображаются как есть, когда запуск выполняет неизменённый встроенный скрипт. Имена, заданные пользователем, включая отредактированные копии встроенных скриптов, заменяются на `custom`, если не задано `OTEL_LOG_TOOL_DETAILS=1`.

610* `agent_id`: идентификатор [субагента](https://code.claude.com/docs/ru/sub-agents.md), вызвавшего событие, например `a3f2c1b4d5e6f7a80`. Он присутствует в событиях API и инструментов субагента, в его событиях [`assistant_response`](#assistant-response-event) и в [`subagent_completed`](#subagent-completed-event) для завершённого субагента. Отсутствует в событиях основной сессии и [внутрипроцессных участников команды](https://code.claude.com/docs/ru/agent-teams.md#choose-a-display-mode). [`agent_id` спана](#span-attributes) субагента имеет то же значение или добавляет метку после начальной `a`, как в `acompact-3f2c1b4d5e6f7a80`. Требуется Claude Code v2.1.310 или новее

611* `parent_agent_id`: `agent_id` агента, который породил или последним возобновил субагента, вызвавшего событие. Отсутствует, если этот агент — основная сессия. Требуется Claude Code v2.1.310 или новее

610 612 

611#### Атрибуты репозитория613#### Атрибуты репозитория

612 614 


755| `prompt.id` | Идентификатор UUID v4, связывающий все события, созданные при обработке одного промпта пользователя |757| `prompt.id` | Идентификатор UUID v4, связывающий все события, созданные при обработке одного промпта пользователя |

756| `event.sequence` | Счётчик с отсчётом от 0 для упорядочивания событий, ведущийся для каждого процесса Claude Code, а не для каждой сессии |758| `event.sequence` | Счётчик с отсчётом от 0 для упорядочивания событий, ведущийся для каждого процесса Claude Code, а не для каждой сессии |

757| `message.uuid` | UUID сообщения в том виде, в каком оно сохранено в транскрипте сессии — файлах `~/.claude/projects/*/*.jsonl`. Присутствует в `assistant_response`, в `api_response_body` и в `user_prompt`, за исключением вызовов команд, которые могут породить ноль или много сообщений. В `assistant_response` и `api_response_body` это последняя запись ответа в транскрипте, от которой выстраивается цепочка `parentUuid` следующего хода. Для `api_response_body` требуется Claude Code v2.1.274 или новее |759| `message.uuid` | UUID сообщения в том виде, в каком оно сохранено в транскрипте сессии — файлах `~/.claude/projects/*/*.jsonl`. Присутствует в `assistant_response`, в `api_response_body` и в `user_prompt`, за исключением вызовов команд, которые могут породить ноль или много сообщений. В `assistant_response` и `api_response_body` это последняя запись ответа в транскрипте, от которой выстраивается цепочка `parentUuid` следующего хода. Для `api_response_body` требуется Claude Code v2.1.274 или новее |

758| `request_id` | Назначенный сервером ID API-запроса, считываемый из заголовка ответа `request-id`, например `req_011...`. Для ответа без заголовка `request-id`, как в [Amazon Bedrock](https://code.claude.com/docs/ru/amazon-bedrock.md), значение берётся из заголовка `x-amzn-requestid`. Присутствует в `api_request`, `api_error`, `api_refusal`, `assistant_response` и `api_response_body`, если ответ содержит любой из этих заголовков. Совпадает с одноимённым атрибутом в span трассировки `llm_request`. Источник `x-amzn-requestid` требует Claude Code v2.1.282 или новее |760| `request_id` | Назначенный сервером ID API-запроса, считываемый из заголовка ответа `request-id`, например `req_011...`. Для ответа без заголовка `request-id`, как в [Amazon Bedrock](https://code.claude.com/docs/ru/amazon-bedrock.md), значение берётся из заголовка `x-amzn-requestid`. Присутствует в `api_request`, `api_error`, `api_refusal`, `assistant_response`, `api_response_body`, [`tool_result`](#tool-result-event) и [`tool_decision`](#tool-decision-event), если ответ содержит любой из этих заголовков. Совпадает с одноимённым атрибутом спана трассировки `llm_request`. Источник `x-amzn-requestid` требует Claude Code v2.1.282 или новее |

759| `client_request_id` | Сгенерированный клиентом UUID, отправляемый в заголовке запроса `x-client-request-id`. Присутствует в `api_request` и `api_error` при прямых подключениях к API; отсутствует при использовании бэкендов сторонних провайдеров и когда запрос был повторён через непотоковый резервный вариант. Связывает запрос с его ответом и остаётся доступным при сбоях, например таймаутах, которые так и не дали серверный `request_id`. Совпадает с одноимённым атрибутом в span трассировки `llm_request` |761| `client_request_id` | Сгенерированный клиентом UUID, отправляемый в заголовке запроса `x-client-request-id`. Присутствует в `api_request` и `api_error` при прямых подключениях к API; отсутствует при использовании бэкендов сторонних провайдеров и когда запрос был повторён через непотоковый резервный вариант. Связывает запрос с его ответом и остаётся доступным при сбоях, например таймаутах, которые так и не дали серверный `request_id`. Совпадает с одноимённым атрибутом в span трассировки `llm_request` |

760 762 

761Чтобы отследить всю активность, вызванную одним промптом, отфильтруйте события по конкретному значению `prompt.id`. Так вы получите событие user\_prompt, все события api\_request и все события tool\_result, произошедшие при обработке этого промпта.763Чтобы отследить всю активность, вызванную одним промптом, отфильтруйте события по конкретному значению `prompt.id`. Так вы получите событие user\_prompt, все события api\_request и все события tool\_result, произошедшие при обработке этого промпта.


820* `event.sequence`: счётчик процесса для упорядочивания событий, описанный в разделе [Атрибуты корреляции событий](#event-correlation-attributes)822* `event.sequence`: счётчик процесса для упорядочивания событий, описанный в разделе [Атрибуты корреляции событий](#event-correlation-attributes)

821* `tool_name`: Имя инструмента823* `tool_name`: Имя инструмента

822* `tool_use_id`: Уникальный идентификатор этого вызова инструмента. Совпадает с `tool_use_id`, передаваемым хукам, что позволяет сопоставлять события OTel с данными, собранными хуками.824* `tool_use_id`: Уникальный идентификатор этого вызова инструмента. Совпадает с `tool_use_id`, передаваемым хукам, что позволяет сопоставлять события OTel с данными, собранными хуками.

825* `request_id`: [`request_id`](#event-correlation-attributes) ответа API, содержавшего этот вызов инструмента, чтобы вы могли связать вызов с событиями API этого ответа. Отсутствует, если у этого ответа не было ID запроса или если ни один ответ API не содержал этот вызов. Требуется Claude Code v2.1.310 или новее

823* `success`: `"true"` или `"false"`826* `success`: `"true"` или `"false"`

824* `duration_ms`: Время выполнения в миллисекундах827* `duration_ms`: Время выполнения в миллисекундах

825* `error_type`: Строка категории ошибки, если инструмент завершился сбоем, например `"Error:ENOENT"` или `"ShellError"`828* `error_type`: Строка категории ошибки, если инструмент завершился сбоем, например `"Error:ENOENT"` или `"ShellError"`


972* `event.sequence`: счётчик процесса для упорядочивания событий, описанный в разделе [Атрибуты корреляции событий](#event-correlation-attributes)975* `event.sequence`: счётчик процесса для упорядочивания событий, описанный в разделе [Атрибуты корреляции событий](#event-correlation-attributes)

973* `tool_name`: Имя инструмента (например, "Read", "Edit", "Write", "NotebookEdit")976* `tool_name`: Имя инструмента (например, "Read", "Edit", "Write", "NotebookEdit")

974* `tool_use_id`: Уникальный идентификатор этого вызова инструмента. Совпадает с `tool_use_id`, передаваемым хукам, что позволяет сопоставлять события OTel с данными, собранными хуками.977* `tool_use_id`: Уникальный идентификатор этого вызова инструмента. Совпадает с `tool_use_id`, передаваемым хукам, что позволяет сопоставлять события OTel с данными, собранными хуками.

978* `request_id`: [`request_id`](#event-correlation-attributes) ответа API, содержавшего этот вызов инструмента, чтобы вы могли связать вызов с событиями API этого ответа. Отсутствует, если у этого ответа не было ID запроса или если ни один ответ API не содержал этот вызов. Требуется Claude Code v2.1.310 или новее

975* `decision`: Либо `"accept"`, либо `"reject"`979* `decision`: Либо `"accept"`, либо `"reject"`

976* `tool_source`: Присутствует всегда. Происхождение инструмента в виде закрытого набора значений, заданных CLI:980* `tool_source`: Присутствует всегда. Происхождение инструмента в виде закрытого набора значений, заданных CLI:

977 * `"builtin"`: собственные инструменты CLI981 * `"builtin"`: собственные инструменты CLI


1024 * Для инструмента Skill: включает `skill_name`1028 * Для инструмента Skill: включает `skill_name`

1025 * Для инструмента Agent или устаревшего инструмента Task: включает `subagent_type`1029 * Для инструмента Agent или устаревшего инструмента Task: включает `subagent_type`

1026 1030 

1027Если вы снизите `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` в SDK OpenTelemetry ниже количества атрибутов в событии `tool_decision`, SDK отбросит атрибуты, которые Claude Code установил последними. SDK отбрасывает сначала `permission_mode`, затем `classifier_category`, затем `classifier_verdict`, и только после этих трёх — остальные атрибуты события. Такой порядок требует Claude Code v2.1.302 или новее.1031Если вы снизите `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` в OpenTelemetry SDK ниже количества атрибутов события `tool_decision`, SDK отбросит атрибуты, которые Claude Code установил последними. SDK отбрасывает их раньше любых других атрибутов в следующем порядке, пропуская те, которых в событии нет:

1032 

10331. `parent_agent_id`

10342. `agent_id`

10353. `request_id`

10364. `permission_mode`

10375. `classifier_category`

10386. `classifier_verdict`

1039 

1040`permission_mode`, `classifier_category` и `classifier_verdict` отбрасываются в этом порядке в Claude Code v2.1.302 или новее. `parent_agent_id`, `agent_id` и `request_id` требуют v2.1.310 или новее.

1028 1041 

1029#### Событие безопасности1042#### Событие безопасности

1030 1043 

Details

240 240 

241Два хоста приема Datadog содержат только опциональную операционную телеметрию, и установка [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/ru/env-vars) отключает обе. Сеансы на сторонних поставщиках никогда не отправляют на эти хосты, даже когда платформа устанавливает [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](https://code.claude.com/docs/ru/env-vars) и метрики телеметрии включены по умолчанию. См. [Telemetry services](https://code.claude.com/docs/ru/data-usage.md#telemetry-services) для всего, что отправляет Claude Code и как это отключить перед финализацией вашего белого списка.241Два хоста приема Datadog содержат только опциональную операционную телеметрию, и установка [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/ru/env-vars) отключает обе. Сеансы на сторонних поставщиках никогда не отправляют на эти хосты, даже когда платформа устанавливает [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](https://code.claude.com/docs/ru/env-vars) и метрики телеметрии включены по умолчанию. См. [Telemetry services](https://code.claude.com/docs/ru/data-usage.md#telemetry-services) для всего, что отправляет Claude Code и как это отключить перед финализацией вашего белого списка.

242 242 

243### Маршрутизация через облачных поставщиков и LLM-шлюзы

244 

243При использовании [Amazon Bedrock](https://code.claude.com/docs/ru/amazon-bedrock.md), [Google Cloud's Agent Platform](https://code.claude.com/docs/ru/google-vertex-ai.md), [Microsoft Foundry](https://code.claude.com/docs/ru/microsoft-foundry.md) или вошедшего в систему сеанса [Claude apps gateway](https://code.claude.com/docs/ru/claude-apps-gateway), трафик модели и аутентификация идут к вашему поставщику или шлюзу вместо `api.anthropic.com`, `claude.ai` или `platform.claude.com`. Инструмент WebFetch по-прежнему вызывает `api.anthropic.com` для своей [проверки безопасности домена](https://code.claude.com/docs/ru/data-usage.md#webfetch-domain-safety-check), если вы не установите `skipWebFetchPreflight: true` в [settings](https://code.claude.com/docs/ru/settings.md).245При использовании [Amazon Bedrock](https://code.claude.com/docs/ru/amazon-bedrock.md), [Google Cloud's Agent Platform](https://code.claude.com/docs/ru/google-vertex-ai.md), [Microsoft Foundry](https://code.claude.com/docs/ru/microsoft-foundry.md) или вошедшего в систему сеанса [Claude apps gateway](https://code.claude.com/docs/ru/claude-apps-gateway), трафик модели и аутентификация идут к вашему поставщику или шлюзу вместо `api.anthropic.com`, `claude.ai` или `platform.claude.com`. Инструмент WebFetch по-прежнему вызывает `api.anthropic.com` для своей [проверки безопасности домена](https://code.claude.com/docs/ru/data-usage.md#webfetch-domain-safety-check), если вы не установите `skipWebFetchPreflight: true` в [settings](https://code.claude.com/docs/ru/settings.md).

244 246 

245При маршрутизации через [LLM gateway](https://code.claude.com/docs/ru/llm-gateway) с [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential), проверка доступности [fast mode](https://code.claude.com/docs/ru/fast-mode.md) по-прежнему вызывает `api.anthropic.com` вместо базового URL шлюза. Проверка соблюдает настроенный HTTP-прокси, поэтому там, где причиной является блокировка сети, запись белого списка для `api.anthropic.com` в прокси является исправлением. Блокировка сети не проходит проверку только там, где хост недостижим даже через прокси, и fast mode затем сообщает об ошибке подключения. Та же ошибка подключения появляется, когда проверка представляет выданное шлюзом учетные данные, которые Anthropic отклоняет; белый список не помогает там, так как ничего не блокируется. См. [use fast mode behind proxies and LLM gateways](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) для переменных, которые его восстанавливают.247Если ваши разработчики используют [быстрый режим](https://code.claude.com/docs/ru/fast-mode.md) за [LLM-шлюзом](https://code.claude.com/docs/ru/llm-gateway), заданным через [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/ru/llm-gateway-connect#set-the-base-url-and-credential), оставьте `api.anthropic.com` доступным через ваш прокси. Когда Claude Code отправляет проверку доступности быстрого режима, она идет на этот хост через любой настроенный HTTP-прокси и никогда не идет на шлюз. О том, когда проверка не отправляется, и о переменной, которая восстанавливает быстрый режим в каждом случае, см. [Использование быстрого режима за прокси и LLM-шлюзами](https://code.claude.com/docs/ru/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways).

246 248 

247### Белые списки IP организации и выход прокси249### Белые списки IP организации и выход прокси

248 250 

Details

106 106 

107Код в модуле хуков вложен слишком глубоко или его цепочка импортов слишком длинная, чтобы Claude Code мог его загрузить. Строка начинается с имени мода и `hooks module did not load:`, затем указывает имя файла и эту причину.107Код в модуле хуков вложен слишком глубоко или его цепочка импортов слишком длинная, чтобы Claude Code мог его загрузить. Строка начинается с имени мода и `hooks module did not load:`, затем указывает имя файла и эту причину.

108 108 

109Просмотрите этот файл и файлы, к которым ведут его импорты, найдите наиболее глубоко вложенную часть и перепишите её так, чтобы вложенность была меньше, или сократите цепочку импортов. Если вы установили мод, а не написали его, попросите об этом его автора.109Просмотрите этот файл и файлы, к которым ведут его импорты, найдите наиболее глубоко вложенную часть и перепишите её так, чтобы вложенность была меньше, или сократите цепочку импортов. Если мод написали не вы, попросите его автора исправить это.

110 110 

111### `the parser stopped` или `the engine ran out of stack loading the file`111### `the parser stopped` или `the engine ran out of stack loading the file`

112 112 

routines.md +20 −2

Details

25* Задача только с триггером API запускается, когда вы вызываете её эндпоинт.25* Задача только с триггером API запускается, когда вы вызываете её эндпоинт.

26* Задача только с триггером GitHub запускается, когда происходит соответствующее событие репозитория.26* Задача только с триггером GitHub запускается, когда происходит соответствующее событие репозитория.

27 27 

28Запланированные задачи доступны в планах Pro, Max, Team и Enterprise. Создавайте их и управляйте ими на [claude.ai/code/routines](https://claude.ai/code/routines) или из CLI с помощью `/schedule`. Прежнее название, routines, [по-прежнему встречается](#where-the-name-routines-still-appears) в веб-адресе, CLI и API.28Запланированные задачи доступны в планах Pro, Max, Team и Enterprise. Создавайте их и управляйте ими на [claude.ai/code/routines](https://claude.ai/code/routines) или из CLI с помощью `/schedule`. Прежнее название, routines, [по-прежнему встречается](#where-the-name-routines-still-appears).

29 29 

30> [!NOTE]30> [!NOTE]

31>31>


66 66 

67**1. Откройте диалоговое окно создания**67**1. Откройте диалоговое окно создания**

68 68 

69Перейдите на [claude.ai/code/routines](https://claude.ai/code/routines) и нажмите **New task**. Если сначала откроется меню, выберите **Set up manually**. Откроется диалоговое окно **New scheduled task**. Другой вариант в меню, **Create with Claude**, позволяет описать задачу в чате, чтобы Claude создал её вместо вас.69Перейдите на [claude.ai/code/routines](https://claude.ai/code/routines) и нажмите **New task**, чтобы открыть диалоговое окно **New scheduled task**. Прежде чем продолжить, проверьте, не появился ли один из этих экранов:

70 

71* Если на кнопке написано **New routine** вместо **New task**, нажмите **New routine** и продолжайте по разделу [Полностраничная форма](#full-page-form).

72* Если в приложении Desktop открывается меню с пунктами **Local** и **Cloud**, перейдите к разделу [Полностраничная форма](#full-page-form).

73* Если открывается меню с пунктами **Create with Claude** и **Set up manually**, выберите **Set up manually**, чтобы открыть диалоговое окно. Вариант **Create with Claude** позволяет описать задачу в чате, чтобы Claude создал её вместо вас.

74* Если вместо диалогового окна открывается целая страница, перейдите к разделу [Полностраничная форма](#full-page-form).

70 75 

71Если при открытии диалогового окна уже отображаются **Repositories** и **Environment**, см. [чем отличается это диалоговое окно](#dialog-with-repositories-and-environment-in-the-main-view). В противном случае это диалоговое окно также создаёт запланированные задачи для чата claude.ai. Чтобы ваша задача стала тем, что диалоговое окно называет задачей Claude Code, выберите репозиторий или добавьте триггер события GitHub или API на следующих шагах. Задача такого типа запускает Claude Code в облачной сессии.76Если при открытии диалогового окна уже отображаются **Repositories** и **Environment**, см. [чем отличается это диалоговое окно](#dialog-with-repositories-and-environment-in-the-main-view). В противном случае это диалоговое окно также создаёт запланированные задачи для чата claude.ai. Чтобы ваша задача стала тем, что диалоговое окно называет задачей Claude Code, выберите репозиторий или добавьте триггер события GitHub или API на следующих шагах. Задача такого типа запускает Claude Code в облачной сессии.

72 77 


126 131 

127Выберите репозиторий до того, как добавлять триггер события GitHub, поскольку этот триггер недоступен, пока репозиторий не выбран.132Выберите репозиторий до того, как добавлять триггер события GitHub, поскольку этот триггер недоступен, пока репозиторий не выбран.

128 133 

134#### Полностраничная форма

135 

136Если в приложении Desktop открывается меню с пунктами **Local** и **Cloud**, выберите **Cloud**. Откроется страница с заголовком **New routine** или **New scheduled task**. Заполните её поля:

137 

138* **Name**: введите имя.

139* **Instructions**: введите промпт. В том же поле выберите модель, репозитории и окружение. О том, что определяет каждый из этих параметров, см. шаги в разделе [Создание в веб-версии](#create-from-the-web).

140* **Select a trigger**: выберите **Schedule**, **GitHub event** или **API**. Для расписания см. [Добавление триггера расписания](#add-a-schedule-trigger). Для [события GitHub](#add-a-github-trigger) выберите репозиторий. Для [триггера API](#add-an-api-trigger) скопируйте токен из диалогового окна **API token**, которое откроется после нажатия **Create**, поскольку он показывается один раз. Чтобы объединить несколько триггеров, нажмите **Add another trigger**.

141* **Connectors**: все ваши подключённые коннекторы включены по умолчанию, поэтому удалите те, что не нужны задаче.

142 

143Если кнопка **Create** недоступна, наведите на неё курсор, чтобы увидеть, чего ещё не хватает в форме. Нажмите **Create**, и откроется страница сведений о задаче.

144 

129### Создание из CLI145### Создание из CLI

130 146 

131Выполните `/schedule` в любой сессии, чтобы создать запланированную задачу в формате диалога. Можно также сразу передать описание: для повторяющейся задачи, например `/schedule daily PR review at 9am`, или для однократной, например `/schedule clean up feature flag in one week`. Claude соберёт ту же информацию, что и веб-форма, а затем сохранит задачу в вашей учётной записи. Команда также доступна под псевдонимом `/routines`.147Выполните `/schedule` в любой сессии, чтобы создать запланированную задачу в формате диалога. Можно также сразу передать описание: для повторяющейся задачи, например `/schedule daily PR review at 9am`, или для однократной, например `/schedule clean up feature flag in one week`. Claude соберёт ту же информацию, что и веб-форма, а затем сохранит задачу в вашей учётной записи. Команда также доступна под псевдонимом `/routines`.


152* **Запуски ровно в начале часа**: если запланировать запуск ровно на начало часа, например на 9:00, он может начаться на несколько минут позже. Чтобы запуск начинался ближе к запланированному времени, выберите несколько минут после начала часа, например 9:07.168* **Запуски ровно в начале часа**: если запланировать запуск ровно на начало часа, например на 9:00, он может начаться на несколько минут позже. Чтобы запуск начинался ближе к запланированному времени, выберите несколько минут после начала часа, например 9:07.

153* **Пользовательские интервалы**: для частоты, которой нет среди предустановленных вариантов, создайте задачу и выберите **Custom** в её [диалоговом окне редактирования](#edit-and-control-scheduled-tasks). Затем введите выражение cron, например `0 */2 * * *` для запуска каждые два часа. Чтобы задать его из CLI, выполните [`/schedule update`](#manage-scheduled-tasks-from-the-cli). Выражения с запуском чаще одного раза в час отклоняются.169* **Пользовательские интервалы**: для частоты, которой нет среди предустановленных вариантов, создайте задачу и выберите **Custom** в её [диалоговом окне редактирования](#edit-and-control-scheduled-tasks). Затем введите выражение cron, например `0 */2 * * *` для запуска каждые два часа. Чтобы задать его из CLI, выполните [`/schedule update`](#manage-scheduled-tasks-from-the-cli). Выражения с запуском чаще одного раза в час отклоняются.

154* **Часовой пояс**: при выборе предустановленной частоты вводите время в вашем локальном часовом поясе.170* **Часовой пояс**: при выборе предустановленной частоты вводите время в вашем локальном часовом поясе.

171* **Часовой пояс выражения cron**: если выражение состоит только из пяти полей, указывайте часы в UTC, так что `0 9 * * 1-5` запускается в 9:00 UTC по будним дням. Если поле начинается с префикса `CRON_TZ=`, сохраните его и указывайте часы в его часовом поясе или удалите его и указывайте часы в UTC.

155 172 

156#### Однократный запуск173#### Однократный запуск

157 174 


455 472 

456Ранее запланированные задачи назывались routines, и в следующих местах сохраняется прежнее название. Все они относятся к той же функции:473Ранее запланированные задачи назывались routines, и в следующих местах сохраняется прежнее название. Все они относятся к той же функции:

457 474 

475* **Приложение**: в некоторых аккаунтах пункт боковой панели и заголовок страницы называются **Routines**, кнопка называется **New routine**, а в других подписях используется слово routine. Чтобы создать задачу там, см. [Полностраничная форма](#full-page-form).

458* **Веб-адрес**: `claude.ai/code/routines`476* **Веб-адрес**: `claude.ai/code/routines`

459* **CLI**: псевдоним `/routines` для `/schedule`, описание команды и ответы Claude при настройке задачи477* **CLI**: псевдоним `/routines` для `/schedule`, описание команды и ответы Claude при настройке задачи

460* **API**: путь эндпоинта `/fire`, его бета-заголовок, `type` в его ответе, тег `<routine-fire-payload>` и справочная страница [Trigger a routine through the API](https://platform.claude.com/docs/en/api/claude-code/routines-fire)478* **API**: путь эндпоинта `/fire`, его бета-заголовок, `type` в его ответе, тег `<routine-fire-payload>` и справочная страница [Trigger a routine through the API](https://platform.claude.com/docs/en/api/claude-code/routines-fire)

sandboxing.md +13 −1

Details

537 537 

538* **В рабочем каталоге и каталогах выше него**: файлы настроек `.claude`, каталоги `.claude/skills`, `.claude/agents`, `.claude/commands` и `.claude/hooks`, `.mcp.json`, а также файлы, которые Claude Code запускает самостоятельно, например `.claude/workflows` и `.claude/scheduled_tasks.json`538* **В рабочем каталоге и каталогах выше него**: файлы настроек `.claude`, каталоги `.claude/skills`, `.claude/agents`, `.claude/commands` и `.claude/hooks`, `.mcp.json`, а также файлы, которые Claude Code запускает самостоятельно, например `.claude/workflows` и `.claude/scheduled_tasks.json`

539* **Только в рабочем каталоге**: файлы запуска оболочки, такие как `.bashrc` и `.zshrc`, `.gitconfig`, каталоги `.vscode` и `.idea`, а также `hooks` и `config` внутри `.git`539* **Только в рабочем каталоге**: файлы запуска оболочки, такие как `.bashrc` и `.zshrc`, `.gitconfig`, каталоги `.vscode` и `.idea`, а также `hooks` и `config` внутри `.git`

540* **Файлы, которые превратили бы рабочий каталог в bare-репозиторий git**: `HEAD`, `objects` и `refs` на верхнем уровне, а также существующие там записи `config` и `hooks`, когда рядом с ними находится `HEAD`. Файл с именем `config` запрещён даже при отсутствии `HEAD`. В Linux и WSL2 песочница удаляет файл `HEAD` или каталог `objects` или `refs` верхнего уровня, появившийся во время выполнения команды в песочнице540* **Файлы, которые превратили бы рабочий каталог в bare-репозиторий git**: `HEAD`, `objects` и `refs` на верхнем уровне, а также существующие там записи `config` и `hooks`, когда рядом с ними находится файл или символическая ссылка `HEAD`. Файл с именем `config` запрещён даже при отсутствии `HEAD`. [`HEAD`, `objects` или `refs`, появившиеся позже, могут быть удалены](#when-the-sandbox-deletes-head-objects-or-refs). В Linux и WSL2 команда в песочнице может создать такую запись там, где её нет.

541* **В `~/.claude` или каталоге, на который указывает `CLAUDE_CONFIG_DIR`**: большая часть его содержимого, а также `~/.claude.json` и хранилище учётных данных `.credentials.json`541* **В `~/.claude` или каталоге, на который указывает `CLAUDE_CONFIG_DIR`**: большая часть его содержимого, а также `~/.claude.json` и хранилище учётных данных `.credentials.json`

542 542 

543Если во время сессии по пути защищённого файла настроек появляется символическая ссылка, песочница, начиная со следующей команды, также запрещает запись в файл, на который она указывает.543Если во время сессии по пути защищённого файла настроек появляется символическая ссылка, песочница, начиная со следующей команды, также запрещает запись в файл, на который она указывает.


552 552 

553Если `git merge` или `git checkout` завершается ошибкой `unable to unlink old` на одном из этих путей, см. раздел [Команда git завершается ошибкой `unable to unlink old`](#a-git-command-fails-with-unable-to-unlink-old).553Если `git merge` или `git checkout` завершается ошибкой `unable to unlink old` на одном из этих путей, см. раздел [Команда git завершается ошибкой `unable to unlink old`](#a-git-command-fails-with-unable-to-unlink-old).

554 554 

555#### Когда песочница удаляет `HEAD`, `objects` или `refs`

556 

557После завершения команды в песочнице более новая запись `HEAD`, `objects` или `refs` верхнего уровня в вашем рабочем каталоге удаляется, если только это не папка с содержимым. Более новая означает, что записи не было, когда песочница в последний раз строила свою конфигурацию: при запуске сессии или после изменения, например после [`/cd`](https://code.claude.com/docs/ru/commands).

558 

559Более новая папка `objects` или `refs` с содержимым тоже удаляется вместе с содержимым, если в момент последнего построения конфигурации песочницей там находился файл или символическая ссылка `HEAD`. Чтобы сохранить папку, см. раздел [Папка с именем `objects` или `refs` исчезает после выполнения команды](#a-folder-named-objects-or-refs-disappears-after-a-command).

560 

555#### Запрещённые пути, проходящие через символическую ссылку561#### Запрещённые пути, проходящие через символическую ссылку

556 562 

557В macOS, когда запрещённый путь проходит через символическую ссылку, например `~/.claude`, являющийся ссылкой в репозиторий dotfiles, песочница также запрещает реальное расположение этого пути. Это распространяется на собственные запреты песочницы и на ваши буквальные записи `denyWrite` и `denyRead`.563В macOS, когда запрещённый путь проходит через символическую ссылку, например `~/.claude`, являющийся ссылкой в репозиторий dotfiles, песочница также запрещает реальное расположение этого пути. Это распространяется на собственные запреты песочницы и на ваши буквальные записи `denyWrite` и `denyRead`.


881 887 

882После сбоя Claude может [предложить повторно запустить команду вне песочницы](#the-unsandboxed-retry-escape-hatch). Одобрите эту повторную попытку или запустите команду git самостоятельно в другом терминале. Если вы установили `allowUnsandboxedCommands` в `false`, Claude не может предложить повторную попытку, поэтому запустите команду самостоятельно.888После сбоя Claude может [предложить повторно запустить команду вне песочницы](#the-unsandboxed-retry-escape-hatch). Одобрите эту повторную попытку или запустите команду git самостоятельно в другом терминале. Если вы установили `allowUnsandboxedCommands` в `false`, Claude не может предложить повторную попытку, поэтому запустите команду самостоятельно.

883 889 

890### Папка с именем `objects` или `refs` исчезает после выполнения команды

891 

892Папка `objects` или `refs` верхнего уровня, появившаяся во время сессии, может быть [удалена после завершения изолированной команды](#when-the-sandbox-deletes-head-objects-or-refs). Неважно, кто её создал: команда, Claude или вы. Чтобы сохранить папку, оставьте в ней что-нибудь. Если файл или символическая ссылка `HEAD` находились на верхнем уровне во время сессии, переместите их в другое место, затем перезапустите все сессии Claude Code, открытые там.

893 

894До версии 2.1.307 папка удалялась, даже если в ней что-то было, а `HEAD` отсутствовал. Если у вас более ранняя версия, [обновите Claude Code](https://code.claude.com/docs/ru/setup.md#update-claude-code).

895 

884### Bubblewrap не запускается внутри контейнера896### Bubblewrap не запускается внутри контейнера

885 897 

886В непривилегированном контейнере [bubblewrap](#os-level-enforcement) не может смонтировать новую файловую систему `/proc`, поэтому изолированные команды завершаются ошибкой `bwrap`, например `Can't mount proc on /newroot/proc: Operation not permitted`. Установите [`enableWeakerNestedSandbox`](https://code.claude.com/docs/ru/settings-reference#sandbox-enableweakernestedsandbox) в `true`, чтобы песочница вместо этого выполняла bind-монтирование существующего `/proc` контейнера. Используйте эту настройку только тогда, когда внешний контейнер уже обеспечивает нужную вам границу изоляции, так как она раскрывает изолированным командам информацию о процессах, которую скрыло бы новое монтирование `/proc`.898В непривилегированном контейнере [bubblewrap](#os-level-enforcement) не может смонтировать новую файловую систему `/proc`, поэтому изолированные команды завершаются ошибкой `bwrap`, например `Can't mount proc on /newroot/proc: Operation not permitted`. Установите [`enableWeakerNestedSandbox`](https://code.claude.com/docs/ru/settings-reference#sandbox-enableweakernestedsandbox) в `true`, чтобы песочница вместо этого выполняла bind-монтирование существующего `/proc` контейнера. Используйте эту настройку только тогда, когда внешний контейнер уже обеспечивает нужную вам границу изоляции, так как она раскрывает изолированным командам информацию о процессах, которую скрыло бы новое монтирование `/proc`.

Details

30 30 

31Два поля Claude Code на диаграмме — это процессы сеанса: один runner, выполняющий два сеанса одновременно, до его настроенной емкости. Runner служит одному [владельцу](#key-concepts) за раз и закрепляется за этим владельцем, когда берёт в работу свой первый сеанс, поэтому проверенный код никогда не смешивается между владельцами; [Жизненный цикл runner](#runner-lifecycle) охватывает правило.31Два поля Claude Code на диаграмме — это процессы сеанса: один runner, выполняющий два сеанса одновременно, до его настроенной емкости. Runner служит одному [владельцу](#key-concepts) за раз и закрепляется за этим владельцем, когда берёт в работу свой первый сеанс, поэтому проверенный код никогда не смешивается между владельцами; [Жизненный цикл runner](#runner-lifecycle) охватывает правило.

32 32 

33Вы можете запустить runners самостоятельно и держать их работающими, или запустить [автомасштабирующийся оркестратор](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners), второй процесс, который вы размещаете, который запускает runners по мере очереди сеансов; каждый runner выходит самостоятельно, когда его работа завершается. В любом случае вы настраиваете окружение один раз, и оно появляется в средстве выбора на каждой поддерживаемой поверхности.33Вы можете запустить runners самостоятельно и держать их работающими, или запустить [автомасштабирующийся оркестратор](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners) — второй процесс, который вы размещаете и который запускает runners по мере постановки сессий в очередь. В любом случае вы настраиваете окружение один раз, и оно появляется в средстве выбора в каждом поддерживаемом интерфейсе.

34 34 

35## Доступность и ограничения35## Доступность и ограничения

36 36 


122 122 

123Корпоративные прокси выхода поддерживаются. Runner и дополнительный [автомасштабирующийся оркестратор](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners) соблюдают прокси и переменные mTLS, описанные в [Конфигурация сети](https://code.claude.com/docs/ru/network-config.md), такие как `HTTPS_PROXY` и `NO_PROXY`; установите их в окружение каждого процесса. Переменные охватывают вызовы плоскости управления, WebSocket [SCM connector](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#scm-connector-flags) оркестратора и встроенный клон для HTTPS remotes, и сеансы наследуют их от runner. Потоковая передача сеанса использует события, отправляемые сервером, по HTTPS, поэтому прокси в пути не должен буферизировать ответы.123Корпоративные прокси выхода поддерживаются. Runner и дополнительный [автомасштабирующийся оркестратор](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners) соблюдают прокси и переменные mTLS, описанные в [Конфигурация сети](https://code.claude.com/docs/ru/network-config.md), такие как `HTTPS_PROXY` и `NO_PROXY`; установите их в окружение каждого процесса. Переменные охватывают вызовы плоскости управления, WebSocket [SCM connector](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#scm-connector-flags) оркестратора и встроенный клон для HTTPS remotes, и сеансы наследуют их от runner. Потоковая передача сеанса использует события, отправляемые сервером, по HTTPS, поэтому прокси в пути не должен буферизировать ответы.

124 124 

125Если ваш прокси также требует заголовка `Proxy-Authorization`, runner может добавить его к каждому соединению, которое он открывает на прокси; смотрите [Аутентификация на прокси выхода](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy).125* **Аутентификация на прокси**: если ваш прокси также требует заголовок `Proxy-Authorization`, runner может добавлять его к каждому соединению, которое он открывает к прокси; см. раздел [Аутентификация на прокси для исходящего трафика](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy).

126* **Долгоживущие ответы**: если runner берёт сессию в работу, но Claude так и не отвечает на её первое сообщение, причиной может быть ваш прокси. См. раздел [Сессия взята в работу, но Claude так и не отвечает на её первое сообщение](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#when-a-sessions-first-message-is-never-answered).

126 127 

127## Что остается на вашей инфраструктуре128## Что остается на вашей инфраструктуре

128 129 

Details

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

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

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

39| `CLAUDE_CODE_REMOTE_SLACK_CHANNEL_ID` | Для сессии Claude Tag — ID канала Slack или личного сообщения, которое обслуживает сессия или в котором находится её ветка, например `C0123ABCDE`. Временная метка Slack идентифицирует сообщение в пределах одного канала, поэтому записывайте этот ID вместе с `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS`. Не установлена для других сессий и может быть не установлена и для сессии Claude Tag. |

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

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

41| `CLAUDE_CODE_REMOTE_MCP_CONFIG` | Путь к файлу в `CLAUDE_CONFIG_DIR`, содержащему определения MCP-серверов, которые плоскость управления Anthropic доставила для этой сессии. Если ваша обёртка перестраивает окружение дочернего процесса, перенесите эту переменную. Без неё, когда плоскость управления обновляет доставленные серверы, дочерний процесс завершает работу любого сервера stdio, HTTP или SSE, добавленного вашей обёрткой с помощью [`--mcp-config`](https://code.claude.com/docs/ru/cli-reference#cli-flags), которого нет в обновлении. Требует Claude Code v2.1.299 или новее. |42| `CLAUDE_CODE_REMOTE_MCP_CONFIG` | Путь к файлу в `CLAUDE_CONFIG_DIR`, содержащему определения MCP-серверов, которые плоскость управления Anthropic доставила для этой сессии. Если ваша обёртка перестраивает окружение дочернего процесса, перенесите эту переменную. Без неё, когда плоскость управления обновляет доставленные серверы, дочерний процесс завершает работу любого сервера stdio, HTTP или SSE, добавленного вашей обёрткой с помощью [`--mcp-config`](https://code.claude.com/docs/ru/cli-reference#cli-flags), которого нет в обновлении. Требует Claude Code v2.1.299 или новее. |


44 45 

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

46 47 

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

48 49 

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

50 51 

51Каждая из переменных `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:-}"`.52Если ваш скрипт использует `set -u`, раскрывайте `CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` и `CLAUDE_CODE_REMOTE_SLACK_CHANNEL_ID` со значением по умолчанию, например `"${CCR_SESSION_ACCOUNT_EMAIL:-}"`. Каждая из них может быть не установлена, а при `set -u` Bash останавливается с ошибкой `unbound variable`, когда раскрывает неустановленную переменную.

52 53 

53### Заключайте в кавычки аргументы и переменные, которые раскрывает ваш скрипт54### Заключайте в кавычки аргументы и переменные, которые раскрывает ваш скрипт

54 55 


89* **Передавайте их дальше**: завершайте обёртку командой `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`, которая передаёт файловые флаги вместе со всеми остальными аргументами. Не удаляйте и не переписывайте их. Если сессия теряет файловый флаг промпта, она работает без инструкций, которые для неё отправила плоскость управления.90* **Передавайте их дальше**: завершайте обёртку командой `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`, которая передаёт файловые флаги вместе со всеми остальными аргументами. Не удаляйте и не переписывайте их. Если сессия теряет файловый флаг промпта, она работает без инструкций, которые для неё отправила плоскость управления.

90* **На средстве выполнения версии v2.1.281 или новее добавленный вами файловый флаг заменяет серверный, а не дополняет его**: каждый файловый флаг промпта принимает одно значение, и Claude Code использует последнее вхождение, поэтому если вы добавите `--append-system-prompt-file <path>` после `"$@"`, содержимое вашего файла заменит дополнительные инструкции сервера. Чтобы добавить инструкции поверх серверных, поместите их в `CLAUDE.md` образа средства выполнения, который средство выполнения [добавляет в пользовательскую конфигурацию каждой сессии](#how-each-session’s-config-is-assembled).91* **На средстве выполнения версии v2.1.281 или новее добавленный вами файловый флаг заменяет серверный, а не дополняет его**: каждый файловый флаг промпта принимает одно значение, и Claude Code использует последнее вхождение, поэтому если вы добавите `--append-system-prompt-file <path>` после `"$@"`, содержимое вашего файла заменит дополнительные инструкции сервера. Чтобы добавить инструкции поверх серверных, поместите их в `CLAUDE.md` образа средства выполнения, который средство выполнения [добавляет в пользовательскую конфигурацию каждой сессии](#how-each-session’s-config-is-assembled).

91 92 

93#### Исправление `Argument list too long` при запуске сессии

94 

95В Linux, если вы объединяете промпт плоскости управления и собственный текст в один аргумент `--append-system-prompt`, средство выполнения записывает в лог строку такого вида, как только аргумент достигает 128 КБ:

96 

97```text theme={null}

98Session <id> finished: failed — reason: child exited 126: /opt/wrapper.sh: line 9: /usr/local/bin/claude: Argument list too long

99```

100 

101Linux ограничивает каждый отдельный аргумент 32 страницами памяти, то есть 128 КБ при обычных страницах размером 4 КБ. Значение `getconf ARG_MAX`, часто равное 2 МБ, — это отдельное ограничение на все аргументы и окружение вместе.

102 

103На Claude Code v2.1.283 или новее оставьте файловые флаги в `"$@"` и передавайте как `--append-system-prompt` только собственный текст. Claude Code [использует оба](https://code.claude.com/docs/ru/cli-reference.md#system-prompt-flags): сначала промпт плоскости управления, затем ваш собственный текст:

104 

105```bash theme={null}

106exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@" --append-system-prompt "$(cat /opt/team-instructions.md)"

107```

108 

109В Linux, если ваш собственный текст достигает 128 КБ, перенесите его в `CLAUDE.md` образа средства выполнения, поскольку это по-прежнему один аргумент.

110 

111На v2.1.281 или v2.1.282 эта команда завершается с ошибкой `Cannot use both --append-system-prompt and --append-system-prompt-file`. На более ранних версиях ваш текст без какой-либо ошибки заменяет промпт плоскости управления. В любом из этих случаев сначала обновитесь или перенесите собственный текст в `CLAUDE.md`.

112 

92### Подготовка учётных данных, ограниченных создателем сессии113### Подготовка учётных данных, ограниченных создателем сессии

93 114 

94Используйте подкоманду `decode-token` для чтения утверждений из JWT сессии. Она читает токен из аргумента, из `CLAUDE_CODE_SESSION_ACCESS_TOKEN` или из stdin, в этом порядке; о том, что она проверяет, см. [Проверка токена внутри сессии](https://code.claude.com/docs/ru/self-hosted-environments-identity.md#verify-the-token-inside-the-session). Пример ниже декодирует идентичность создателя, обменивает её на краткосрочные учётные данные AWS и выполняет exec в Claude Code:115Используйте подкоманду `decode-token` для чтения утверждений из JWT сессии. Она читает токен из аргумента, из `CLAUDE_CODE_SESSION_ACCESS_TOKEN` или из stdin, в этом порядке; о том, что она проверяет, см. [Проверка токена внутри сессии](https://code.claude.com/docs/ru/self-hosted-environments-identity.md#verify-the-token-inside-the-session). Пример ниже декодирует идентичность создателя, обменивает её на краткосрочные учётные данные AWS и выполняет exec в Claude Code:


122| Variable | Description |143| Variable | Description |

123| :- | :- |144| :- | :- |

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

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

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

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

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


303 324 

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

305 326 

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

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

3083. **Соблюдайте контракт кода выхода.** Завершайтесь со статусом, соответствующим результату:3293. **Соблюдайте контракт кода выхода.** Завершайтесь со статусом, соответствующим результату:

309 330 

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

311 * **Выход 1 или хук всё ещё выполняется по истечении `--hook-timeout`**: сбой, допускающий повторную попытку. Сессия выжидает и предлагается снова.332 * **Выход 1 или хук всё ещё выполняется по истечении `--hook-timeout`**: сбой, допускающий повторную попытку. Сессия выжидает и предлагается снова. После 10 неудачных запросов подряд она блокируется так же, как после выхода 2 или выше.

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

313 334 

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


318 339 

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

320 341 

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

343 

344Если повторно открытые сессии остаются в статусе **Queued** или отображаются как **Failed**, либо ваш хук завершается для них по таймауту, одна из возможных причин — хук, который называет или дедуплицирует рабочие нагрузки по ID сессии. Сессия открывается повторно, когда её пользователь отправляет ей сообщение после того, как её средство выполнения завершилось. Например, возьмём хук, который формирует имя каждой рабочей нагрузки так:

345 

346```bash theme={null}

347name="runner-${CLAUDE_RUNNER_SESSION_ID}"

348```

349 

3501. При первом запросе на порождение для сессии хук создаёт рабочую нагрузку с этим именем, и средство выполнения запускается

3512. Средство выполнения завершается, например после [`--release-idle-session-min`](#make-on-demand-runners-exit-when-idle), а позже пользователь повторно открывает сессию

3523. Следующий запрос на порождение для сессии содержит тот же ID сессии и новый ID заказа, поэтому хук формирует то же имя

3534. Если на вашей платформе всё ещё есть рабочая нагрузка от первого запроса, потому что ничто её не [удалило](#make-on-demand-runners-exit-when-idle) при завершении её средства выполнения, хук не создаёт новую рабочую нагрузку, и средство выполнения не запускается

3545. Каждый последующий запрос на порождение для сессии заканчивается так же

355 

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

357 

358| Когда рабочая нагрузка существует, ваш хук | **Queued** меняется на **Failed** | Ошибка порождения |

359| :- | :- | :- |

360| Завершается с кодом 0, ничего не создав | После 10 таких запросов подряд | `runner did not register within ETA after max attempts` |

361| Завершается с кодом 1 | После 10 таких запросов подряд | Последние строки stderr вашего хука или `exit 1`, если он ничего не записал в stderr |

362| Завершается с кодом 2 или выше | Сразу | Последние строки stderr вашего хука или `exit` и код, например `exit 2`, если он ничего не записал в stderr |

363| Ждёт, пока не истечёт `--hook-timeout` | После 10 таких запросов подряд | Последние строки stderr вашего хука или `spawn-runner hook timed out after 60000ms`, если он ничего не записал в stderr |

364 

365В ошибке порождения из последней строки `60000` — это ваш `--hook-timeout` в миллисекундах. Когда хук ждёт, пока не истечёт `--hook-timeout`, в лог оркестратора также попадает строка `timed out after`.

366 

367Чтобы исправить хук, формируйте каждое имя или ключ из `CLAUDE_RUNNER_ORDER_ID`, как требует [правило 1 контракта хука](#the-spawn-runner-hook). В примере имя становится таким:

368 

369```bash theme={null}

370name="runner-${CLAUDE_RUNNER_ORDER_ID}"

371```

372 

373Если ваш хук ждёт, также сделайте так, чтобы он завершался после отправки рабочей нагрузки, потому что ожидающий хук [задерживает следующие хуки своего оркестратора](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#orchestrator-cli-flags). После изменения хука проверьте статус каждой зависшей сессии на вкладке **Activity**:

374 

375* **Queued**: сессия получит следующий запрос на порождение самостоятельно

376* **Failed**: выберите для неё **Retry** как Owner или попросите её пользователя отправить ей новое сообщение

322 377 

323#### Настройте завершение средств выполнения по требованию при простое378#### Настройте завершение средств выполнения по требованию при простое

324 379 


698>753>

699> Хуки выполняются вне песочницы Bash, поэтому вызовы git в текущем скрипте пропускают некоторые функции git, способные запустить программу, указанную в настройках git в checkout. Но пропускают не все. Не полагайтесь только на песочницу и изолируйте сессии, как описано в разделе [Усиление защиты развёртывания](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#harden-your-deployment).754> Хуки выполняются вне песочницы Bash, поэтому вызовы git в текущем скрипте пропускают некоторые функции git, способные запустить программу, указанную в настройках git в checkout. Но пропускают не все. Не полагайтесь только на песочницу и изолируйте сессии, как описано в разделе [Усиление защиты развёртывания](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#harden-your-deployment).

700 755 

701## Разрешения и одобрение инструментов756## Разрешения и подтверждение инструментов

702 757 

703Самостоятельно размещаемый сеанс не имеет прикрепленного терминала, поэтому неотвеченная подсказка разрешения блокирует ход до тех пор, пока пользователь не ответит в UI. Плоскость управления Anthropic отправляет список инструментов каждого сеанса и правила разрешений с полезной нагрузкой работы; конфигурация по умолчанию предварительно одобряет обычные вызовы инструментов, включая `Bash`, и облачные сеансы [предварительно одобряют редактирование файлов независимо от режима](https://code.claude.com/docs/ru/permission-modes.md#switch-permission-modes). Вызов, который ничто не предварительно одобряет, подсказывает через UI сеанса.758К self-hosted сессии не подключён терминал, поэтому запрос разрешения, оставшийся без ответа, приостанавливает ход, пока пользователь не ответит в интерфейсе. Управляющий уровень Anthropic передаёт список инструментов и правила разрешений каждой сессии вместе с данными задания; конфигурация по умолчанию заранее разрешает рутинные вызовы инструментов, включая `Bash`, а облачные сессии [заранее разрешают редактирование файлов независимо от режима](https://code.claude.com/docs/ru/permission-modes.md#switch-permission-modes). Для вызова, который ничто заранее не разрешает, запрос выводится в интерфейсе сессии.

704 759 

705> [!NOTE]760> [!NOTE]

706>761>

707> Закрепляйте только автоматический режим в окружении, контейнеры сеансов которого работают с [сетевым исходящим трафиком по умолчанию запретить](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#default-deny-egress) и остальной частью [раздела hardening](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#harden-your-deployment). Обычные вызовы инструментов, включая запросы сети `Bash`, запускаются без человека в цикле как на наборе инструментов по умолчанию предварительно одобренных, так и в автоматическом режиме, поэтому граница сети — это то, что ограничивает, где эти вызовы могут достичь.762> Закрепляйте авторежим только в тех окружениях, где контейнеры сессий работают с [запретом исходящего сетевого трафика по умолчанию](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#default-deny-egress) и применены остальные меры из [раздела об усилении защиты](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#harden-your-deployment). Рутинные вызовы инструментов, включая сетевые запросы `Bash`, выполняются без участия человека как с набором инструментов, разрешённых по умолчанию, так и в авторежиме, поэтому именно сетевая граница ограничивает, куда могут обращаться эти вызовы.

708 763 

709Чтобы минимизировать подсказки независимо от того, что отправляет плоскость управления, закрепите [автоматический режим](https://code.claude.com/docs/ru/permission-modes.md#eliminate-prompts-with-auto-mode) из вашего скрипта-оболочки или хука [`command`](#command). Автоматический режим позволяет сеансам запускаться без обычных подсказок разрешения: отдельная модель классификатора проверяет действия перед их запуском и блокирует те, которые она отклоняет, и явные правила запроса по-прежнему вынуждают подсказку; страница режимов разрешений охватывает то, что классификатор проверяет. Средство выполнения добавляет вычисленные сервером флаги перед вызовом оболочки, и для флагов с одним значением, таких как `--permission-mode`, парсер соблюдает последнее вхождение, поэтому флаг, который вы добавляете после `"$@"`, переопределяет значение, отправленное сервером:764Чтобы свести запросы к минимуму независимо от того, что передаёт управляющий уровень, закрепите [авторежим](https://code.claude.com/docs/ru/permission-modes.md#eliminate-prompts-with-auto-mode) в своём скрипте-обёртке или [хуке `command`](#command). Авторежим позволяет сессиям работать без рутинных запросов разрешений: отдельная модель-классификатор проверяет действия перед выполнением и блокирует отклонённые, а явные правила ask по-прежнему принудительно вызывают запрос; о том, что проверяет классификатор, рассказано на странице о режимах разрешений. Раннер добавляет вычисленные сервером флаги перед вызовом обёртки, а для флагов с одним значением, таких как `--permission-mode`, парсер учитывает последнее вхождение, поэтому флаг, добавленный после `"$@"`, переопределяет значение, переданное сервером:

710 765 

711```bash theme={null}766```bash theme={null}

712#!/bin/bash767#!/bin/bash

713exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@" --permission-mode auto768exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@" --permission-mode auto

714```769```

715 770 

716Чтобы предварительно одобрить конкретные инструменты вместо этого, добавьте `--allowed-tools` с вашими правилами, например `--allowed-tools "Bash(bazel *) Bash(yarn *) mcp__internal__*"`. Флаги списков, такие как `--allowed-tools` и `--disallowed-tools`, накапливаются при вхождениях вместо переопределения, поэтому ваши правила применяются поверх любых правил, которые отправляет плоскость управления. Чтобы сузить, добавьте `--disallowed-tools`, который отрицает инструменты, даже если другое правило их разрешает.771Чтобы вместо этого заранее разрешить конкретные инструменты, добавьте `--allowed-tools` со своими правилами, например `--allowed-tools "Bash(bazel *) Bash(yarn *) mcp__internal__*"`. Списочные флаги, такие как `--allowed-tools` и `--disallowed-tools`, накапливаются между вхождениями, а не переопределяют друг друга, поэтому ваши правила применяются поверх любых правил, переданных управляющим уровнем. Чтобы сузить набор, добавьте `--disallowed-tools`: этот флаг запрещает инструменты, даже если другое правило их разрешает.

717 772 

718### Как собирается конфигурация каждого сеанса773### Как собирается конфигурация каждой сессии

719 774 

720Средство выполнения дает каждому сеансу свой собственный каталог конфигурации, заполненный из снимка в памяти `~/.claude/` хоста, который средство выполнения захватывает один раз при запуске: `settings.json`, `CLAUDE.md`, хуки, агенты, команды и навыки в вашем образе средства выполнения применяются к каждому сеансу как базовая линия уровня пользователя. Если вы измените конфигурацию на работающем хосте, изменение вступает в силу только после перезагрузки средства выполнения.775Раннер выдаёт каждой сессии собственный каталог конфигурации, заполняемый из снимка `~/.claude/` хоста, который раннер делает один раз при запуске: `settings.json`, `CLAUDE.md`, хуки, агенты, команды и скиллы в образе раннера применяются к каждой сессии как базовый пользовательский уровень. Если вы измените конфигурацию на работающем хосте, изменение вступит в силу только после перезапуска раннера.

721 776 

722Установите `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` для заполнения из другого пути или укажите его на пустой каталог для отключения заполнения.777Задайте `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR`, чтобы заполнять каталог из другого пути, или укажите пустой каталог, чтобы отключить заполнение.

723 778 

724Сессии также читают следующие файлы настроек:779Сессии также читают следующие файлы настроек:

725 780 

726* **Настройки проекта**: вне треда [проекта](https://code.claude.com/docs/ru/claude-projects.md#what-threads-pick-up-from-your-repositories) закоммиченный в репозиторий `.claude/settings.json` накладывается поверх базовой конфигурации уровня пользователя. В сессии с несколькими репозиториями [действует файл не более чем одного репозитория](#repository-settings-in-sessions-with-several-repositories).781* **Настройки проекта**: вне треда [проекта](https://code.claude.com/docs/ru/claude-projects.md#what-threads-pick-up-from-your-repositories) закоммиченный в репозиторий `.claude/settings.json` накладывается поверх базового пользовательского уровня. В сессии с несколькими репозиториями [действует файл не более чем одного репозитория](#repository-settings-in-sessions-with-several-repositories).

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

728 783 

729О порядке применения этих источников см. [приоритет настроек](https://code.claude.com/docs/ru/settings.md#settings-precedence).784О порядке применения этих источников см. [приоритет настроек](https://code.claude.com/docs/ru/settings.md#settings-precedence).

730 785 

731Когда плоскость управления Anthropic предоставляет сеансу [хуки Claude Code](https://code.claude.com/docs/ru/hooks.md), средство выполнения устанавливает их рядом, а не над вашей собственной конфигурацией. Требует Claude Code v2.1.229 или позже.786Когда управляющий уровень Anthropic передаёт сессии [хуки Claude Code](https://code.claude.com/docs/ru/hooks.md), раннер устанавливает их рядом с вашей собственной конфигурацией, а не поверх неё. Требуется Claude Code v2.1.229 или новее.

787 

788* **Куда они попадают**: раннер записывает каждый переданный скрипт хука в зарезервированный подкаталог `hooks/.ccr-launcher/` каталога конфигурации сессии и регистрирует скрипты в отдельном файле настроек, который передаёт сессии через `--settings`, не затрагивая заполненный `settings.json` и ваши собственные скрипты в `hooks/<name>`. Раннер пересоздаёт зарезервированный подкаталог для каждой сессии и не переносит в сессии содержимое хоста из `~/.claude/hooks/.ccr-launcher/`.

789* **Кто их создаёт**: управляющий уровень заполняет скрипты из фиксированных констант собственного развёртывания, никогда — из данных конкретной сессии или сторонних данных.

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

791 

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

732 793 

733* **Где они приземляются**: средство выполнения пишет каждый предоставленный скрипт хука в зарезервированный подкаталог `hooks/.ccr-launcher/` каталога конфигурации сеанса и регистрирует скрипты в отдельном файле настроек, который он передает сеансу с помощью `--settings`, оставляя заполненный `settings.json` и ваши собственные скрипты в `hooks/<name>` нетронутыми. Средство выполнения пересоздает зарезервированный подкаталог для каждого сеанса и не заполняет содержимое хоста в `~/.claude/hooks/.ccr-launcher/` в сеансы.794За пределами сессий [Claude Tag](https://claude.com/docs/claude-tag/overview) сессия в self-hosted окружении по умолчанию работает с отключённой [автоматической памятью](https://code.claude.com/docs/ru/memory.md#auto-memory). Для инструкций, которые должны сохраняться между сессиями, используйте `CLAUDE.md` в образе раннера или в репозитории.

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

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

736 795 

737Когда пользователь сам запускает свою сессию, Claude Code загружает [скиллы, включённые для его учётной записи claude.ai](https://code.claude.com/docs/ru/skills.md#skills-in-cowork-and-cloud-sessions), в каталог конфигурации этой сессии. Запуск [облачной запланированной задачи](https://code.claude.com/docs/ru/routines.md) не получает скиллы её владельца, а сессия, которая [отправляет запросы к модели в Bedrock или Agent Platform](#send-model-requests-to-bedrock-or-agent-platform), не загружает никаких скиллов. Если таким сессиям нужен скилл, добавьте его в образ средства выполнения или, вне треда [проекта](https://code.claude.com/docs/ru/claude-projects.md#what-threads-pick-up-from-your-repositories), сделайте его коммит в `.claude/skills/` репозитория.796Снимок `~/.claude/` хоста, который делает раннер, не включает каталог `projects/`. Место хранения автоматической памяти по умолчанию находится в этом каталоге. Если вы положите туда файлы памяти, раннер не перенесёт их в сессии, и они не включат автоматическую память.

797 

798### Остановка сессий, которым не удалось получить настройки, управляемые сервером

799 

800Чтобы сессия, получающая [настройки, управляемые сервером](https://code.claude.com/docs/ru/server-managed-settings.md), не запускалась, если получить их не удалось, задайте [`forceRemoteSettingsRefresh`](https://code.claude.com/docs/ru/settings-reference#forceremotesettingsrefresh) значение `true` в [`managed-settings.json`](https://code.claude.com/docs/ru/settings#where-settings-live) в образе раннера. Ответ API Anthropic о том, что у вашей организации нет настроек, управляемых сервером, считается успешным получением.

801 

802Прежде чем добавлять ключ, проверьте, запускает ли окружение сессии каналов Claude Tag и отправляет ли оно запросы к модели в Bedrock или Agent Platform:

803 

804* **Сессии каналов Claude Tag**: не задавайте ключ на раннерах в окружении, на которое Owner [направляет каналы Claude Tag](https://code.claude.com/docs/ru/cloud-environments.md#set-the-environment-a-claude-tag-channel-uses). API Anthropic отклоняет запрос этих сессий на получение настроек, управляемых сервером, поэтому при заданном ключе они не запускаются. Поместите их правила в `managed-settings.json` образа раннера, который [они по-прежнему читают](https://code.claude.com/docs/ru/managed-settings.md#where-and-when-a-policy-applies). Чтобы использовать ключ для других сессий, запускайте их в отдельном окружении.

805* **Bedrock или Agent Platform**: сессии у этих провайдеров [не получают настройки, управляемые сервером](#what-differs-from-sessions-on-the-anthropic-api), поэтому они запускаются независимо от того, задан ли ключ. Вместо этого применяйте свои правила через тот же `managed-settings.json`.

806 

807Этот `managed-settings.json` задаёт ключ:

808 

809```json managed-settings.json theme={null}

810{

811 "forceRemoteSettingsRefresh": true

812}

813```

738 814 

739Вне сессий [Claude Tag](https://claude.com/docs/claude-tag/overview) сессия в самостоятельно размещаемом окружении по умолчанию работает с отключённой [автоматической памятью](https://code.claude.com/docs/ru/memory.md#auto-memory). Для инструкций, которые должны сохраняться между сессиями, используйте `CLAUDE.md` в вашем образе средства выполнения или в репозитории.815Задайте ключ в этом файле, даже если вы также задали его в консоли администратора claude.ai. У новой сессии нет [кэшированной копии](https://code.claude.com/docs/ru/server-managed-settings.md#fetch-and-caching-behavior) ваших настроек, управляемых сервером, поэтому если ключ задан только в консоли, у сессии его ещё нет. Если затем получение настроек завершится неудачей, сессия будет работать без этих настроек, пока следующая попытка не окажется успешной.

740 816 

741Снимок `~/.claude/` хоста, который делает средство выполнения, не включает каталог `projects/`. Место хранения автоматической памяти по умолчанию находится внутри этого каталога. Если вы поместите туда файлы памяти, средство выполнения не перенесёт их в сессии, и они не включат автоматическую память.817Чтобы убедиться, что сессия не запустилась из-за неудачного получения настроек, посмотрите [последний вывод Claude Code](#keep-stdin-and-file-descriptor-3-attached) в сессии или лог раннера. В нём будет `Your organization requires remote managed settings to load, but they could not be loaded.`

742 818 

743### Настройки репозиториев в сессиях с несколькими репозиториями819### Настройки репозиториев в сессиях с несколькими репозиториями

744 820 

745В треде [проекта](https://code.claude.com/docs/ru/claude-projects.md#what-threads-pick-up-from-your-repositories) `.claude/settings.json` ни одного репозитория не действует как настройки проекта, и не загружаются ни `.mcp.json`, ни скиллы ни одного репозитория, где бы ни запускался тред. Чтобы предоставить таким тредам скилл, добавьте его в образ средства выполнения.821В треде [проекта](https://code.claude.com/docs/ru/claude-projects.md#what-threads-pick-up-from-your-repositories) `.claude/settings.json` ни одного репозитория не действует как настройки проекта, а `.mcp.json` и скиллы ни одного репозитория не загружаются, где бы ни начинался тред. Чтобы дать таким тредам скилл, добавьте его в образ раннера.

746 822 

747В любой другой сессии с несколькими репозиториями Claude Code читает настройки проекта из каталога, в котором запускается сессия, поэтому как настройки проекта действует `.claude/settings.json` не более чем одного репозитория. Хук, определённый в файле другого репозитория, не выполняется, правило deny в нём не применяется, а его `env` не задаётся.823В любой другой сессии с несколькими репозиториями Claude Code читает настройки проекта из каталога, в котором начинается сессия, поэтому как настройки проекта действует `.claude/settings.json` не более чем одного репозитория. Хук, определённый в файле другого репозитория, не выполняется, правило запрета в нём не применяется, а его `env` не задаётся.

748 824 

749* **`--capacity 1` (по умолчанию) со встроенным извлечением репозиториев**: сессия запускается в первом репозитории из своего списка репозиториев. `.claude/settings.json` этого репозитория действует как настройки проекта, и загружается его `.mcp.json`, а файлы остальных репозиториев — нет.825* **`--capacity 1` (по умолчанию) со встроенным checkout**: сессия начинается в первом репозитории из своего списка репозиториев. `.claude/settings.json` этого репозитория действует как настройки проекта, и его `.mcp.json` загружается, а у остальных репозиториев — нет.

750* **`--capacity` больше единицы или [хук `checkout`](#checkout)**: сессия запускается в отдельном каталоге сессии, содержащем извлечённые репозитории. Ни один `.claude/settings.json` репозиториев не действует как настройки проекта, ни один `.mcp.json` репозиториев не загружается, а [`$CLAUDE_PROJECT_DIR`](https://code.claude.com/docs/ru/hooks#reference-scripts-by-path) в команде хука указывает на этот каталог, а не на извлечённый репозиторий.826* **`--capacity` больше единицы или [хук `checkout`](#checkout)**: сессия начинается в отдельном каталоге сессии, содержащем checkout-копии. `.claude/settings.json` ни одного репозитория не действует как настройки проекта, `.mcp.json` ни одного репозитория не загружается, а [`$CLAUDE_PROJECT_DIR`](https://code.claude.com/docs/ru/hooks#reference-scripts-by-path) в команде хука указывает на этот каталог, а не на checkout-копию.

751 827 

752`CLAUDE.md` каждого репозитория загружается независимо от того, где запускается сессия. Вне треда проекта загружаются и его скиллы. Средство выполнения передаёт каждый репозиторий в Claude Code как [дополнительный каталог](https://code.claude.com/docs/ru/permissions.md#additional-directories-grant-file-access-not-configuration), поэтому Claude Code также читает ключи `enabledPlugins` и `extraKnownMarketplaces` из `.claude/settings.json` каждого репозитория.828`CLAUDE.md` каждого репозитория загружается, где бы ни начиналась сессия. Вне треда проекта загружаются и его скиллы. Раннер передаёт каждый репозиторий в Claude Code как [дополнительный каталог](https://code.claude.com/docs/ru/permissions.md#additional-directories-grant-file-access-not-configuration), поэтому Claude Code также читает ключи `enabledPlugins` и `extraKnownMarketplaces` из `.claude/settings.json` каждого репозитория.

753 829 

754Чтобы хук выполнялся или правило разрешений применялось в каждой сессии, поместите его в `~/.claude/settings.json` на хосте средства выполнения. Средство выполнения [переносит файл хоста в каждую сессию](#how-each-session’s-config-is-assembled), где бы сессия ни запускалась. Указывайте путь в правиле `Read` или `Edit` как абсолютный [шаблон](https://code.claude.com/docs/ru/permissions.md#read-and-edit) с `//` или шаблон относительно домашнего каталога с `~/`, поскольку другие шаблоны привязываются к источнику настроек или к текущему каталогу.830Чтобы запускать хук или применять правило разрешений в каждой сессии, поместите его в `~/.claude/settings.json` на хосте раннера. Раннер [переносит файл хоста в каждую сессию](#how-each-session’s-config-is-assembled), где бы она ни начиналась. Указывайте путь в правиле `Read` или `Edit` как абсолютный [шаблон](https://code.claude.com/docs/ru/permissions.md#read-and-edit) с `//` или относительный от домашнего каталога с `~/`, потому что другие шаблоны привязываются к источнику настроек или текущему каталогу.

755 831 

756### Правила разрешений, зафиксированные в репозитории832### Правила разрешений, закоммиченные в репозиторий

757 833 

758Не помещайте запись `"Edit"`, `"Write"` или `"NotebookEdit"` без квалификации в зафиксированный в репозитории `permissions.allow`. Правило инструмента файла без квалификации соответствует инструменту независимо от пути, предоставляя записи в любом месте на хосте вместо только рабочей области, поэтому охрана ограничения области записи средства выполнения отмечает сеанс; с [`--confine-repo-settings enforce`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags) она отказывает в порождении сеанса вместо логирования и продолжения. См. [раздел hardening](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#harden-your-deployment).834Не добавляйте голую запись `"Edit"`, `"Write"` или `"NotebookEdit"` в закоммиченный в репозиторий `permissions.allow`. Голое правило для файлового инструмента соответствует инструменту независимо от пути и разрешает запись в любом месте хоста, а не только в рабочем пространстве, поэтому защита раннера, ограничивающая область записи, помечает сессию; с [`--confine-repo-settings enforce`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags) раннер отказывается запускать сессию, вместо того чтобы записать предупреждение в лог и продолжить. См. [раздел об усилении защиты](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#harden-your-deployment).

759 835 

760Репозиторий не нуждается в правиле инструмента файла вообще: облачные сеансы [предварительно одобряют редактирование файлов независимо от режима](https://code.claude.com/docs/ru/permission-modes.md#switch-permission-modes). Если вы все же зафиксируете правило, ограничьте его рабочей областью, такой как `"Edit(/**)"`; одна ведущая косая черта относительна к корню проекта, который является рабочей областью сеанса. Правила инструмента файла без квалификации в порядке в `settings.json` оператора на уровне хоста, так как этот файл не зафиксирован в репозитории.836Репозиторию вообще не нужно правило для файловых инструментов: облачные сессии [заранее разрешают редактирование файлов независимо от режима](https://code.claude.com/docs/ru/permission-modes.md#switch-permission-modes). Если вы всё же делаете коммит правила, ограничьте его рабочим пространством, например `"Edit(/**)"`; одиночная косая черта в начале указывает путь относительно корня проекта, которым является рабочее пространство сессии. Голые правила для файловых инструментов допустимы в `settings.json` уровня хоста, который ведёт оператор, поскольку этот файл не коммитится в репозиторий.

761 837 

762`defaultMode` из `auto` соблюдается только из файла настроек на уровне образа или пользователя, поэтому проверенный репозиторий не может предоставить себе автоматический режим. Для того, какие режимы облачные сеансы принимают и полный синтаксис правила, см. [режимы разрешений](https://code.claude.com/docs/ru/permission-modes.md).838`defaultMode` со значением `auto` учитывается только из файла настроек уровня образа или пользовательского уровня, поэтому извлечённый репозиторий не может сам предоставить себе авторежим. О том, какие режимы принимают облачные сессии, и о полном синтаксисе правил см. [режимы разрешений](https://code.claude.com/docs/ru/permission-modes.md).

763 839 

764## Что дальше840## Что дальше

765 841 

Details

119 119 

120## Настройка git120## Настройка git

121 121 

122Раннер управляет извлечением репозиториев, но по умолчанию не настраивает идентификацию или учётные данные git. Вы контролируете образ раннера и окружение его процесса, поэтому конфигурация git тоже в ваших руках. Выберите один из двух подходов:122Раннер управляет извлечением репозиториев, но по умолчанию не настраивает идентичность git и учётные данные. Вы контролируете образ раннера и окружение его процесса, а значит, и конфигурацию git. Выберите один из двух подходов:

123 123 

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

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

126 126 

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

128 128 

129Минимальные версии 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`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags), — 2.29 или новее. Git 2.24 достаточно, если вы не используете ни одну из этих трёх возможностей и управляете идентификацией git самостоятельно.129Минимальные версии 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`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags), требует 2.29 или новее. Git 2.24 достаточно, если вы не используете ни одну из этих трёх возможностей и управляете идентичностью git самостоятельно.

130 130 

131### Позвольте раннеру настроить git131### Позволить раннеру настроить git

132 132 

133Запустите раннер с `--configure-git` или задайте `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1`, чтобы при запуске он записал глобальную конфигурацию git:133Запустите раннер с `--configure-git` или задайте `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1`, чтобы при запуске он записал глобальную конфигурацию git:

134 134 

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

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

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

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

139 139 

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

141 141 

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

143 143 

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

145 145 

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

147 147 

148Идентификация git требуется для любого коммита. Задайте её на уровне системы в своём Dockerfile, чтобы конфигурация применялась независимо от того, от имени какого пользователя запущен процесс раннера:148Идентичность git необходима для любого коммита. Задайте её на уровне системы в Dockerfile, чтобы конфигурация применялась независимо от того, от имени какого пользователя работает процесс раннера:

149 149 

150```dockerfile theme={null}150```dockerfile theme={null}

151RUN git config --system user.name "Claude" && \151RUN git config --system user.name "Claude" && \

152 git config --system user.email "noreply@anthropic.com"152 git config --system user.email "noreply@anthropic.com"

153```153```

154 154 

155Без идентификации `git commit` завершается ошибкой `Please tell me who you are`, и сессии не могут продвигаться. Вместо этого можно использовать идентификацию собственного бота; раннер не переопределяет эти значения.155Без идентичности `git commit` завершается ошибкой `Please tell me who you are`, и сессии не могут продвинуться. Вместо этого можно использовать идентичность собственного бота; раннер не переопределяет эти значения.

156 156 

157Не встраивайте долгоживущие или широко ограниченные учётные данные для push в общий образ раннера: учётные данные в образе доступны каждой сессии, которую запускает этот образ, кто бы её ни начал. Вместо этого выпускайте краткосрочный токен с минимальной областью действия для каждой сессии в своём [скрипте-обёртке](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#wrapper-scripts), используя идентификацию создателя сессии, декодированную из JWT сессии. Сочетайте это с эфемерным контейнером на каждую сессию, для чего требуется `--capacity 1`, чтобы никакие учётные данные не переживали сессию, которая их выпустила; см. [раздел об усилении защиты](#harden-your-deployment).157Не встраивайте долгоживущие учётные данные для push или учётные данные с широкими правами в общий образ раннера: учётные данные в образе доступны каждой сессии, которую запускает этот образ, кто бы её ни создал. Вместо этого выпускайте для каждой сессии краткоживущий токен с минимально необходимыми правами из своего [скрипта-обёртки](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#wrapper-scripts), используя идентичность создателя сессии, декодированную из JWT сессии. Сочетайте это с эфемерным контейнером для каждой сессии, что требует `--capacity 1`, чтобы никакие учётные данные не пережили сессию, для которой они были выпущены; см. [раздел об усилении защиты](#harden-your-deployment).

158 158 

159Если вам необходимо настроить учётные данные для push на уровне образа, например для ключа развёртывания только для чтения, ограничьте их настолько жёстко, насколько позволяет ваш git-хостинг:159Если необходимо настроить учётные данные для push на уровне образа, например для ключа развёртывания только для чтения, ограничьте их настолько жёстко, насколько позволяет ваш git-хост:

160 160 

161* Ключ развёртывания SSH, ограниченный одним репозиторием, с перезаписью `url.<base>.insteadOf`161* Ключ развёртывания SSH, ограниченный одним репозиторием, с перезаписью `url.<base>.insteadOf`

162* `credential.helper`, возвращающий токен с минимальной областью действия162* `credential.helper`, возвращающий токен с минимальной областью действия

163* `GIT_SSH_COMMAND`, указывающий на ключ с узкой областью действия163* `GIT_SSH_COMMAND`, указывающий на ключ с узкой областью действия

164 164 

165Какой бы механизм вы ни настроили, он должен работать без запроса ввода, потому что встроенные операции clone и fetch раннера отключают запросы, которые иначе показали бы git, SSH и Git Credential Manager:165Какой бы механизм вы ни настроили, он должен работать без интерактивного запроса, поскольку встроенные клонирование и fetch раннера отключают запросы, которые иначе показали бы git, SSH и Git Credential Manager:

166 166 

167* Раннер задаёт `GIT_TERMINAL_PROMPT=0`, поэтому git не запрашивает имя пользователя или пароль.167* Раннер задаёт `GIT_TERMINAL_PROMPT=0`, поэтому git не запрашивает имя пользователя или пароль.

168* Раннер запускает SSH с `BatchMode=yes`, добавленным к вашему `GIT_SSH_COMMAND`, если вы его задали, поэтому SSH не запрашивает парольную фразу или подтверждение хоста.168* Раннер запускает SSH с `BatchMode=yes`, добавленным к вашему `GIT_SSH_COMMAND`, если вы его задали, поэтому SSH не запрашивает парольную фразу или подтверждение хоста.

169* Раннер задаёт `GCM_INTERACTIVE=never`, поэтому Git Credential Manager не открывает диалог входа.169* Раннер задаёт `GCM_INTERACTIVE=never`, поэтому Git Credential Manager не открывает диалог входа.

170* Раннер очищает `core.askPass`, поэтому если вы используете вспомогательную программу askpass, задайте её через переменную окружения `GIT_ASKPASS`.170* Раннер очищает `core.askPass`, поэтому, если вы используете askpass-помощник, задайте его через переменную окружения `GIT_ASKPASS`.

171 171 

172Если ваш git-хостинг отклоняет учётные данные или вы их не настроили, раннер делает несколько повторных попыток, а затем завершает подготовку репозитория с ошибкой, если это репозиторий, в который сессия отправляет результаты. Для репозитория, который сессия только читает, в разделе [Устранение неполадок](#troubleshooting) описано, когда раннер вместо этого его пропускает. Раннер не передаёт эти настройки в окружение сессии.172Если ваш git-хост отклоняет учётные данные или вы их не настроили, раннер делает несколько повторных попыток, а затем прерывает подготовку репозитория, если это репозиторий, в который сессия отправляет результаты. О том, когда раннер вместо этого пропускает репозиторий, который сессия только читает, рассказано в разделе [Устранение неполадок](#troubleshooting). Раннер не передаёт эти настройки в окружение сессии.

173 173 

174Храните любую программу, указанную в `GIT_SSH_COMMAND` или `GIT_ASKPASS`, там, куда сессии не могут записывать, — так же, как [контрольный список усиления защиты](#harden-your-deployment) требует для каталога хуков и скрипта-обёртки. То же относится к любому ключу или файлу в командной строке этой программы. Собственный git раннера запускает эту программу при выполнении clone или fetch.174Храните любую программу, указанную в `GIT_SSH_COMMAND` или `GIT_ASKPASS`, там, куда сессии не могут писать, — так же, как [контрольный список усиления защиты](#harden-your-deployment) требует для каталога хуков и скрипта-обёртки. То же относится к любому ключу или файлу в командной строке этой программы. Собственный git раннера запускает эту программу при клонировании или fetch.

175 175 

176Если каталоги извлечения принадлежат другому uid, чем процесс раннера, git отказывается с ними работать; добавьте `safe.directory`:176Если каталоги извлечения принадлежат другому uid, чем процесс раннера, git отказывается с ними работать; добавьте `safe.directory`:

177 177 


179RUN git config --system --add safe.directory '*'179RUN git config --system --add safe.directory '*'

180```180```

181 181 

182### Используйте git-прокси Anthropic182### Использование git-прокси Anthropic

183 183 

184С 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).184С git-прокси Anthropic, также называемым управляемым Anthropic git, образу раннера не нужны ключи SSH, помощник учётных данных, `.netrc` или другие учётные данные git для самой сессии. Вместо этого раннер просит Anthropic обслуживать git для своих сессий. Для пользовательской сессии, которую обслуживает Anthropic, клонирование раннера и собственные fetch и push сессии проходят через Anthropic, которая использует OAuth-токен GitHub, сохранённый для создателя сессии. Сессии ботов и агентов описаны в разделе [Как Anthropic обслуживает git для сессии](#how-anthropic-serves-git-for-a-session).

185 185 

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

187 187 

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

189 189 

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

191* **Учётные данные только для репозиториев сессии**: Anthropic предоставляет учётные данные git для репозиториев, входящих в сессию, но не для других репозиториев на том же git-хостинге. Приватный субмодуль, зависимость, которую ваш менеджер пакетов получает через git, или маркетплейс плагинов в другом репозитории не получают учётных данных от Anthropic. Попросите тех, кто создаёт сессии, [добавлять каждый репозиторий](https://code.claude.com/docs/ru/web-quickstart.md#start-a-task), который нужен сессии, при её создании.191* **Учётные данные только для репозиториев сессии**: Anthropic предоставляет учётные данные git для репозиториев, входящих в сессию, но не для других репозиториев на том же git-хосте. Приватный подмодуль, зависимость, которую ваш менеджер пакетов получает через git, или маркетплейс плагинов в другом репозитории не получают учётных данных от Anthropic. Попросите тех, кто создаёт сессии, [добавлять каждый репозиторий](https://code.claude.com/docs/ru/web-quickstart.md#start-a-task), который нужен сессии, при её создании.

192 192 

193 Каждый запуск [облачной запланированной задачи](https://code.claude.com/docs/ru/routines.md) — это сессия с репозиториями задачи, поэтому попросите владельца каждой задачи [добавить каждый репозиторий, который нужен её запускам](https://code.claude.com/docs/ru/routines.md#edit-and-control-routines).193 Каждый запуск [облачной запланированной задачи](https://code.claude.com/docs/ru/routines.md) — это сессия с репозиториями задачи, поэтому попросите владельца каждой задачи [добавить все репозитории, которые нужны её запускам](https://code.claude.com/docs/ru/routines.md#edit-and-control-routines).

194* **Только push веток**: push, который удаляет ветку, завершается ошибкой, как и push в ref любого другого типа, например в тег. О том, какие ветки может обновлять push, см. [GitHub-прокси](https://code.claude.com/docs/ru/cloud-environments.md#github-proxy).194* **Только push веток**: push, удаляющий ветку, завершается ошибкой, как и push в ref любого другого типа, например в тег. О том, какие ветки может обновлять push, см. [GitHub-прокси](https://code.claude.com/docs/ru/cloud-environments.md#github-proxy).

195* **Подключённые аккаунты GitHub**: попросите каждого, кто создаёт пользовательские сессии с репозиторием, [подключить GitHub](https://code.claude.com/docs/ru/web-quickstart.md#connect-github). Без собственного подключения такие сессии [не запускаются](#creator-has-no-github-connection).195* **Подключённые аккаунты GitHub**: попросите каждого, кто создаёт пользовательские сессии с репозиторием, [подключить GitHub](https://code.claude.com/docs/ru/web-quickstart.md#connect-github). Без собственного подключения такие сессии [не запускаются](#creator-has-no-github-connection).

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

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

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

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

200 200 

201> [!WARNING]201> [!WARNING]

202>202>

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

204 204 

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

206 206 

207#### Включение git-прокси Anthropic207#### Включение git-прокси Anthropic

208 208 

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

210 210 

211* **Claude Code v2.1.267 или новее**: более ранние версии принимают флаг, но не сообщают Anthropic о запросе на обслуживание git и не выводят строку `Registering as opted in`, поэтому Anthropic не обслуживает их сессии.211* **Claude Code v2.1.267 или новее**: более ранние версии принимают флаг, но не сообщают запрос на обслуживание git Anthropic и не выводят строку `Registering as opted in`, поэтому Anthropic не обслуживает их сессии.

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

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

214 214 

215> [!WARNING]215> [!WARNING]

216>216>

217> Рецепты для [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) показана строка, которую выводит раннер.217> Рецепты [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).

218 218 

219Чтобы включить git-прокси, добавьте `--use-anthropic-git-proxy` в команду раннера или задайте `CLAUDE_RUNNER_USE_GIT_PROXY=1` в окружении раннера. Эта команда, выполненная в оболочке на хосте раннера, запускает раннер из [быстрого старта](https://code.claude.com/docs/ru/self-hosted-environments-quickstart.md#set-up-manually) с включённым git-прокси:219Чтобы включить git-прокси, добавьте `--use-anthropic-git-proxy` в команду раннера или задайте `CLAUDE_RUNNER_USE_GIT_PROXY=1` в окружении раннера. Эта команда, выполненная в оболочке на хосте раннера, запускает раннер из [быстрого старта](https://code.claude.com/docs/ru/self-hosted-environments-quickstart.md#set-up-manually) с включённым git-прокси:

220 220 


226 226 

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

228 228 

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

230 230 

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

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


236 236 

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

238 238 

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

240 240 

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

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

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

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

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

246* **`GitHub authentication required`**: появляется, когда у создателя сессии нет работающего подключения GitHub на claude.ai. Clone сессии завершается ошибкой, и ошибка git гласит `GitHub authentication required. Please reconnect your GitHub account.` Попросите этого человека подключить или переподключить GitHub в настройках claude.ai.246* **`GitHub authentication required`**: появляется, когда у создателя сессии нет рабочего подключения GitHub на claude.ai. Клонирование сессии завершается ошибкой, и ошибка git содержит `GitHub authentication required. Please reconnect your GitHub account.` Попросите этого человека подключить или переподключить GitHub в настройках claude.ai.

247 247 

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

249 249 

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

251 251 

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

253 253 

254**1. Удалите флаг**254**1. Удалите флаг**

255 255 

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

257 257 

258```bash theme={null}258```bash theme={null}

259unset CLAUDE_RUNNER_USE_GIT_PROXY259unset CLAUDE_RUNNER_USE_GIT_PROXY


261 261 

262**2. Предоставьте раннеру учётные данные git**262**2. Предоставьте раннеру учётные данные git**

263 263 

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

265 265 

266**3. Откройте сетевой путь**266**3. Откройте сетевой путь**

267 267 

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

269 269 

270**4. Перезапустите раннеры**270**4. Перезапустите раннеры**

271 271 


273 273 

274#### Доступ к API GitHub без GitHub CLI274#### Доступ к API GitHub без GitHub CLI

275 275 

276Если в вашем образе раннера нет GitHub CLI, Claude Code может предоставить встроенный `gh`, чтобы Claude всё равно мог открывать pull request, оставлять комментарии и читать результаты CI. Встроенный `gh` предназначен для раннеров, использующих git под управлением Anthropic. Он поддерживает одну команду, `gh api`, которая вызывает REST API GitHub. Требуется Claude Code v2.1.287 или новее в образе раннера.276Если ваш образ раннера не включает GitHub CLI, Claude Code может предоставить встроенный `gh`, чтобы Claude всё равно мог открывать pull request, оставлять комментарии и читать результаты CI. Встроенный `gh` предназначен для раннеров, использующих управляемый Anthropic git. Он поддерживает одну команду, `gh api`, которая вызывает REST API GitHub. Требуется Claude Code v2.1.287 или новее в образе раннера.

277 277 

278Эта команда открывает pull request вместо `gh pr create`. Встроенный `gh` подставляет `{owner}` и `{repo}` для текущего репозитория:278Эта команда открывает pull request вместо `gh pr create`. Встроенный `gh` подставляет `{owner}` и `{repo}` для текущего репозитория:

279 279 


281gh api repos/{owner}/{repo}/pulls -f title='Fix' -f head='my-branch' -f base='main'281gh api repos/{owner}/{repo}/pulls -f title='Fix' -f head='my-branch' -f base='main'

282```282```

283 283 

284* **Учётные данные**: встроенный `gh` отправляет свои REST-запросы через git под управлением Anthropic, который предоставляет учётные данные GitHub на стороне Anthropic, поэтому образу не нужен токен GitHub для этого284* **Учётные данные**: встроенный `gh` отправляет свои REST-запросы через управляемый Anthropic git, который предоставляет учётные данные GitHub на стороне Anthropic, поэтому образу не нужен токен GitHub для этого

285* **Какие сессии его получают**: Anthropic решает для каждой сессии, обслуживает ли git под управлением Anthropic `gh` этой сессии. Если да, строка `[runner:session] governed git ACTIVE`, которую раннер записывает в лог для сессии, показывает `gh_path_shim=true`. Если нет, у сессии нет `gh`285* **Какие сессии его получают**: Anthropic решает для каждой сессии, обслуживает ли управляемый Anthropic git `gh` этой сессии. Если да, строка `[runner:session] governed git ACTIVE`, которую раннер записывает в лог для сессии, показывает `gh_path_shim=true`. Если нет, у сессии нет `gh`

286* **`jq`**: установите `jq` в образ, если хотите, чтобы работал `--jq`286* **`jq`**: установите `jq` в образ, если хотите, чтобы работал `--jq`

287* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/ru/env-vars)**: если окружение сессии задаёт эту переменную, Claude Code не предоставляет встроенный `gh`, и у сессии нет `gh`287* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/ru/env-vars)**: если окружение сессии задаёт эту переменную, Claude Code не предоставляет встроенный `gh`, и у сессии нет `gh`

288 288 

289Если образ включает GitHub CLI, сессии используют его.289Если образ включает GitHub CLI, сессии используют его.

290 290 

291#### Доверие частному центру сертификации при использовании git под управлением Anthropic291#### Доверие частному центру сертификации при использовании управляемого Anthropic git

292 292 

293Этот раздел применим, если вы задаёте `GIT_SSL_CAINFO` или `GIT_SSL_NO_VERIFY` в окружении раннера, сессии которого используют git под управлением Anthropic. Описанная обработка требует, чтобы раннер работал на Claude Code v2.1.283 или новее.293Этот раздел применим, если вы задаёте `GIT_SSL_CAINFO` или `GIT_SSL_NO_VERIFY` в окружении раннера, сессии которого используют управляемый Anthropic git. Описанная обработка требует, чтобы раннер работал на Claude Code v2.1.283 или новее.

294 294 

295Когда git на раннере должен доверять частному центру сертификации (CA), например тому, которым подписывает сертификаты прокси с TLS-инспекцией, обычные подходы работают следующим образом:295Когда git на раннере должен доверять частному центру сертификации (CA), например тому, которым подписывает прокси с инспекцией TLS, обычные подходы работают следующим образом:

296 296 

297* **Системное хранилище сертификатов**: установите свой CA в системное хранилище сертификатов хоста раннера, и git будет доверять ему без обеих переменных.297* **Системное хранилище сертификатов**: установите свой CA в системное хранилище сертификатов хоста раннера, и git будет доверять ему без каких-либо из этих переменных.

298* **`GIT_SSL_CAINFO`**: задайте в ней PEM-файл ваших CA, например `GIT_SSL_CAINFO=/etc/ssl/corp-ca.pem`.298* **`GIT_SSL_CAINFO`**: задайте путь к PEM-файлу с вашими CA, например `GIT_SSL_CAINFO=/etc/ssl/corp-ca.pem`.

299* **`GIT_SSL_NO_VERIFY`**: не помогает за прокси, переподписывающим сертификаты. Собственный clone раннера через git под управлением Anthropic проверяет сертификаты, даже когда переменная задана, поэтому этот clone завершается ошибкой, пока git не начнёт доверять вашему CA одним из двух других способов.299* **`GIT_SSL_NO_VERIFY`**: не помогает за повторно подписывающим прокси. Собственное клонирование раннера через управляемый Anthropic git проверяет сертификаты, даже если эта переменная задана, поэтому такое клонирование завершается ошибкой, пока git не начнёт доверять вашему CA одним из двух других способов.

300 300 

301Для git-соединений, которые передают токен сессии в git под управлением Anthropic, раннер применяет эти две переменные следующим образом. [Хук `command`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#command) запускается с окружением сессии, поэтому получает то же, что и git внутри сессии:301Для git-соединений, передающих токен сессии в управляемый Anthropic git, раннер применяет эти две переменные следующим образом. [Хук `command`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#command) запускается с окружением сессии, поэтому получает то же, что и git внутри сессии:

302 302 

303* **`GIT_SSL_CAINFO`**: по чему git проверяет git под управлением Anthropic, зависит от того, где запущен git:303* **`GIT_SSL_CAINFO`**: то, с чем git сверяет управляемый Anthropic git, зависит от того, где запускается git:

304 * **Собственные clone и fetch раннера**: выполняются без переменной и проверяют git под управлением Anthropic по файлу сертификатов для отдельной сессии, который записывает раннер. Раннер собирает этот файл из системного пакета CA хоста раннера и сертификатов из вашего файла.304 * **Собственные клонирование и fetch раннера**: выполняются без переменной и сверяют управляемый Anthropic git с посессионным файлом сертификатов, который записывает раннер. Раннер собирает этот файл из системного пакета CA хоста раннера и сертификатов из вашего файла.

305 * **Git внутри сессии**: получает конфигурацию `http.sslCAInfo` с указанием вашего файла вместо переменной, а также записи `http.<url>.sslCAInfo`, которые проверяют git под управлением Anthropic по файлу для отдельной сессии.305 * **Git внутри сессии**: получает конфигурацию `http.sslCAInfo` с указанием вашего файла вместо переменной, а также записи `http.<url>.sslCAInfo`, которые сверяют управляемый Anthropic git с посессионным файлом.

306 * **Хуки `checkout` и `post-session`**: наследуют переменную без изменений.306 * **Хуки `checkout` и `post-session`**: наследуют переменную без изменений.

307* **`GIT_SSL_NO_VERIFY`**: какие проверки сертификатов остаются отключёнными, зависит от того, где запущен git:307* **`GIT_SSL_NO_VERIFY`**: какие проверки сертификатов остаются отключёнными, зависит от того, где запускается git:

308 * **Собственные clone и fetch раннера**: выполняются без переменной и проверяют предъявленный им сертификат.308 * **Собственные клонирование и fetch раннера**: выполняются без переменной и проверяют предъявленный им сертификат.

309 * **Git внутри сессии**: получает конфигурацию `http.sslVerify=false` вместо переменной, поэтому проверки остаются отключёнными для других хостов. Он также получает записи `http.<url>.sslVerify=true`, которые сохраняют проверки включёнными для git под управлением Anthropic.309 * **Git внутри сессии**: получает конфигурацию `http.sslVerify=false` вместо переменной, поэтому проверки остаются отключёнными для других хостов. Он также получает записи `http.<url>.sslVerify=true`, которые сохраняют проверки включёнными для управляемого Anthropic git.

310 * **Хуки `checkout` и `post-session`**: когда у сессии есть репозиторий в git под управлением Anthropic, получают конфигурацию `http.sslVerify=false` вместо переменной. Они также получают записи `http.<url>.sslVerify=true`, которые сохраняют проверки включёнными для git под управлением Anthropic.310 * **Хуки `checkout` и `post-session`**: если у сессии есть репозиторий на управляемом Anthropic git, получают конфигурацию `http.sslVerify=false` вместо переменной. Они также получают записи `http.<url>.sslVerify=true`, которые сохраняют проверки включёнными для управляемого Anthropic git.

311 311 

312Для файла сертификатов отдельной сессии нужен системный пакет CA по пути `/etc/ssl/certs/ca-certificates.crt` или `/etc/pki/tls/certs/ca-bundle.crt` на хосте раннера. Также нужен файл `GIT_SSL_CAINFO`, который может прочитать пользователь раннера, который содержит PEM-блоки `CERTIFICATE` и размер которого не превышает 1 МиБ. Если раннер не может собрать файл для отдельной сессии, он записывает в лог строку `[runner:warn]`, содержащую `did not build the certificate file` и причину. Тогда git использует ваш файл как есть для git под управлением Anthropic. Исправьте то, что указано в строке.312Для посессионного файла сертификатов нужен системный пакет CA по пути `/etc/ssl/certs/ca-certificates.crt` или `/etc/pki/tls/certs/ca-bundle.crt` на хосте раннера. Также нужен файл `GIT_SSL_CAINFO`, который может прочитать пользователь раннера, который содержит PEM-блоки `CERTIFICATE` и размер которого не превышает 1 МиБ. Если раннер не может собрать посессионный файл, он записывает в лог строку `[runner:warn]`, содержащую `did not build the certificate file` и причину. Тогда git использует ваш файл как есть для управляемого Anthropic git. Исправьте то, что указано в строке.

313 313 

314Для каждой сессии, использующей git под управлением Anthropic, раннер также записывает в лог строку `[runner:warn]`, которая начинается с `governed git: GIT_SSL_CAINFO is set` или `governed git: GIT_SSL_NO_VERIFY is set`. Строка сообщает, что раннер сделал с этой переменной для собственного git, для git внутри сессии и для ваших хуков жизненного цикла. В конце она указывает, нужно ли вам что-либо менять.314Для каждой сессии, использующей управляемый Anthropic git, раннер также записывает в лог строку `[runner:warn]`, начинающуюся с `governed git: GIT_SSL_CAINFO is set` или `governed git: GIT_SSL_NO_VERIFY is set`. В строке сказано, что раннер сделал с этой переменной для собственного git, для git внутри сессии и для ваших хуков жизненного цикла. Она завершается указанием, нужно ли вам что-либо менять.

315 

316### Добавление репозиториев github.com в сессии каналов Claude Tag

317 

318Если Claude не может добавить репозиторий github.com в сессию канала Claude Tag, убедитесь, что у канала есть к нему доступ, даже если ваш раннер может его клонировать. Этот доступ определяется настройками на GitHub и в вашей организации Claude, а не учётными данными git вашего раннера.

319 

320**1. Установите Claude GitHub App**

321 

322Установите [Claude GitHub App](https://github.com/apps/claude) в организацию или аккаунт GitHub, которому принадлежит репозиторий, и включите этот репозиторий в установку.

323 

324**2. Свяжите организацию или аккаунт GitHub**

325 

326В разделе [**Organization settings > Git providers**](https://claude.ai/admin-settings/source-control) свяжите эту организацию или аккаунт со своей организацией Claude. Связать её может Owner вашей организации Claude, который также является владельцем организации GitHub. См. [Связывание организации GitHub](https://claude.com/docs/claude-tag/admins/configure-github#link-your-github-organization).

327 

328**3. Предоставьте доступ к репозиторию**

329 

330В [настройках администратора Claude Tag](https://claude.ai/admin-settings/claude-tag) предоставьте репозиторий каналу или более широкой области действия, включающей канал: его рабочему пространству Slack или всему Slack. Предоставить его может пользователь с ролью Owner или разрешением Claude Tag Admin. Менеджер канала также может добавить его в свой канал, если его аккаунт GitHub является администратором репозитория. См. [Предоставление доступа к репозиторию](https://claude.com/docs/claude-tag/admins/configure-github#grant-repository-access).

331 

332Затем начните новую ветку обсуждения в канале и [назовите репозиторий](https://claude.com/docs/claude-tag/admins/configure-github#how-granted-repositories-reach-a-session) в первом сообщении.

333 

334Если Claude по-прежнему не может добавить репозиторий, см. [Если Claude не может получить доступ к репозиторию](https://claude.com/docs/claude-tag/admins/configure-github#if-claude-can%E2%80%99t-reach-a-repository), где описано, как проверить связь с GitHub и предоставление доступа к репозиторию.

315 335 

316### Перезапись URL git для частных сетей336### Перезапись URL git для частных сетей

317 337 

318URL репозиториев поступают из плоскости управления в формате HTTPS с именем хоста вашего git-хостинга; для GitHub Enterprise это имя хоста, которое вы настроили для [интеграции GitHub Enterprise](https://code.claude.com/docs/ru/github-enterprise-server.md) на claude.ai. Два повторяемых флага перезаписывают эти URL перед clone:338URL репозиториев поступают из control plane в формате HTTPS с именем хоста вашего git-хоста; для GitHub Enterprise это имя хоста, которое вы настроили для [интеграции GitHub Enterprise](https://code.claude.com/docs/ru/github-enterprise-server.md) на claude.ai. Два повторяемых флага перезаписывают эти URL перед клонированием:

319 339 

320* `--git-host-rewrite <from>=<to>`: для split-horizon DNS, когда Anthropic обращается к вашему git-хостингу по внешнему имени хоста, а раннеры должны использовать внутреннее340* `--git-host-rewrite <from>=<to>`: для split-horizon DNS, когда Anthropic обращается к вашему git-хосту по внешнему имени хоста, а раннеры должны использовать внутреннее

321* `--git-ssh-rewrite <host>`: для git-хостингов, принимающих только SSH, или для хоста раннера, у которого есть только ключ SSH. Например, чтобы клонировать репозитории github.com через SSH, добавьте `--git-ssh-rewrite github.com` в команду раннера. Тогда раннер перезаписывает `https://github.com/owner/repo` в `git@github.com:owner/repo`. SSH должен [подключаться без запроса ввода](#git-must-work-without-a-prompt).341* `--git-ssh-rewrite <host>`: для git-хостов, которые принимают только SSH, или для хоста раннера, у которого есть только ключ SSH. Например, чтобы клонировать репозитории github.com по SSH, добавьте `--git-ssh-rewrite github.com` в команду раннера. Тогда раннер перезаписывает `https://github.com/owner/repo` в `git@github.com:owner/repo`. SSH должен [подключаться без интерактивного запроса](#git-must-work-without-a-prompt).

322 342 

323Перезапись хоста выполняется первой, поэтому если вам нужны обе, укажите в `--git-ssh-rewrite` внутреннее имя хоста. Для полного контроля над извлечением используйте [хук жизненного цикла `checkout`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#checkout).343Перезапись хоста выполняется первой, поэтому, если вам нужны обе, указывайте в `--git-ssh-rewrite` внутреннее имя хоста. Для полного контроля над извлечением используйте [хук жизненного цикла `checkout`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#checkout).

324 344 

325## Постройте образ runner345## Постройте образ runner

326 346 


376 396 

377Сборки и тесты обычно являются самой большой и наиболее переменной частью нагрузки сеанса, поэтому запустите репрезентативную сборку вашего репозитория, измерьте его пиковый CPU и память и поднимите любое начальное значение, которое не оставляет места для процесса Claude Code на вершине этого пика.397Сборки и тесты обычно являются самой большой и наиболее переменной частью нагрузки сеанса, поэтому запустите репрезентативную сборку вашего репозитория, измерьте его пиковый CPU и память и поднимите любое начальное значение, которое не оставляет места для процесса Claude Code на вершине этого пика.

378 398 

379Runner использует `--capacity` для ограничения количества сеансов, которые он запускает одновременно. Он не делит CPU или память между ними, поэтому сеансы на runner делят CPU и память контейнера. Чтобы ограничить долю одного сеанса, применяйте лимиты из вашего [скрипта-обертки](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#wrapper-scripts). То, что дать одному контейнеру, поэтому зависит от того, сколько сеансов он обслуживает одновременно:399Runner использует `--capacity`, чтобы ограничить число одновременно запускаемых сессий. Он не распределяет CPU или память между ними, поэтому сессии на одном runner делят CPU и память контейнера. Чтобы потребление памяти одной сессией не приводило к завершению остальных, запускайте одну сессию на runner с [собственным лимитом памяти](#give-each-session-its-own-memory-limit).

380 400 

381* **Один сеанс на runner**: дайте каждому контейнеру значения одного сеанса. Используйте эту размер на `--capacity 1`, которую [раздел усиления безопасности](#harden-your-deployment) рекомендует, и для [on-demand runners](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners), где вы устанавливаете значения на рабочую нагрузку, которую ваш [`spawn-runner` hook](https://code.claude.com/docs/ru/self-hosted-environments-configuration#the-spawn-runner-hook) отправляет, такую как шаблон pod Kubernetes Job.401* **Один сеанс на runner**: дайте каждому контейнеру значения одного сеанса. Используйте эту размер на `--capacity 1`, которую [раздел усиления безопасности](#harden-your-deployment) рекомендует, и для [on-demand runners](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners), где вы устанавливаете значения на рабочую нагрузку, которую ваш [`spawn-runner` hook](https://code.claude.com/docs/ru/self-hosted-environments-configuration#the-spawn-runner-hook) отправляет, такую как шаблон pod Kubernetes Job.

382* **Несколько сеансов на runner**: на `--capacity` выше одного, умножьте значения одного сеанса на емкость, потому что до такого количества сеансов может работать в контейнере одновременно. Рецепты [Kubernetes](#kubernetes) и [Docker Compose](#docker-compose) запускают `--capacity 4` без лимитов CPU или памяти, поэтому добавьте лимиты, размер которых соответствует емкости, которую вы запускаете.402* **Несколько сеансов на runner**: на `--capacity` выше одного, умножьте значения одного сеанса на емкость, потому что до такого количества сеансов может работать в контейнере одновременно. Рецепты [Kubernetes](#kubernetes) и [Docker Compose](#docker-compose) запускают `--capacity 4` без лимитов CPU или памяти, поэтому добавьте лимиты, размер которых соответствует емкости, которую вы запускаете.

403* **Несколько контейнеров runner на одном хосте**: рассчитывайте размер хоста на сумму capacity всех runner, потому что каждый runner учитывает в `--capacity` только собственные сессии:

404 

405 * **Память**: умножьте память одной сессии на эту сумму, затем добавьте то, что потребляют собственные процессы хоста

406 * **CPU**: умножьте request CPU одной сессии на эту сумму. Чтобы все сессии могли одновременно превышать request, умножайте вместо этого её limit CPU.

407 

408 Выделите каждому runner собственный контейнер. Используйте в каждом [один и тот же путь `--base-dir`](#keep-the-base-directory-and-capacity-identical-across-runners) на хранилище, которое не монтирует контейнер никакого другого runner, чтобы у каждого runner был [собственный рабочий каталог](#harden-your-deployment).

409 

410### Задайте каждой сессии собственный лимит памяти

411 

412Чтобы при нехватке памяти одна сессия не приводила к завершению остальных, запускайте каждый runner с `--capacity 1` под собственным лимитом памяти, равным памяти одной сессии:

413 

414* **В контейнере**: запускайте один runner на контейнер и задайте лимит памяти контейнера, например `limits.memory` в Kubernetes, `--memory` в Docker или `mem_limit` в файле Compose. Следите, чтобы сумма лимитов контейнеров была меньше памяти хоста, потому что когда память заканчивается на самом хосте, ядро может завершать процессы в любом месте хоста.

415* **Под systemd без контейнера**: задайте `MemoryMax` для unit-а runner и запускайте один runner на хост, потому что runner, [использующие один и тот же `--base-dir`](#keep-the-base-directory-and-capacity-identical-across-runners) в одной файловой системе, совместно используют клонированные туда репозитории. Например, при `--capacity 1` и без хука `checkout` их сессии в одном репозитории могут одновременно работать в одном и том же checkout. Чтобы запустить несколько runner на одном хосте, выделите каждому контейнер.

416 

417Когда контейнер или unit достигает лимита памяти, ядро завершает процессы только внутри него. Если задать `--capacity` больше единицы, сессии делят один лимит. Когда они его достигают, ядро выбирает, какие процессы завершить, без учёта сессий, поэтому потребление памяти одной сессией может завершить остальные.

418 

419В Kubernetes разделить сессии не удастся ни при одном значении настройки kubelet `singleProcessOOMKill`. Ограничить общую память сессии с помощью `ulimit` для памяти в вашем [скрипте-обёртке](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#wrapper-scripts) тоже не получится. Ядро применяет значение вроде `ulimit -v` к каждому процессу отдельно.

420 

421### Оставьте запас под лимитами процессов и потоков

422 

423Чтобы подобрать лимит процессов и потоков, измерьте, сколько нужно одной сессии, и умножьте это на число сессий, которые делят лимит. Когда эти сессии достигают лимита, ядро отказывает в создании новых процессов и потоков, поэтому команды, сборки и тесты в любой из них могут завершаться ошибкой. Отклонённый вызов возвращает `EAGAIN`, стандартное сообщение которого — `Resource temporarily unavailable`.

424 

425Допустим, одна сессия достигает пика в 300 процессов и потоков, и четыре сессии делят лимит. Вместе им нужно 1 200, а при лимите 2 400 вы оставляете запас для сборок, которым нужно вдвое больше.

426 

427#### Где задать каждый лимит

428 

429Каждый лимит в этой таблице учитывает потоки наравне с процессами, а `pids.max` — это файл, в котором хранится лимит cgroup:

430 

431| Лимит | Где его задать | Кто его делит |

432| :- | :- | :- |

433| `pids.max` в Kubernetes | `podPidsLimit` в конфигурации kubelet узлов, на которых работают runner. Задать его в спецификации Pod нельзя. | Контейнеры одного Pod |

434| `pids.max` в Docker | `--pids-limit` или `pids_limit` в файле Compose | Один контейнер |

435| `pids.max` под systemd | `TasksMax` для unit-а runner | Один unit |

436| `ulimit -u` | Оболочка или служба, запускающая runner | Всё на хосте, что работает под ID пользователя runner. Не применяется для root. |

437 

438Если вы не задали `TasksMax`, systemd применяет `DefaultTasksMax`, который по умолчанию равен 15% от наименьшего из значений `kernel.pid_max`, `kernel.threads-max` и `pids.max` корневой cgroup.

439 

440#### Измерьте пик одной сессии

441 

442Чтобы получить значения для ваших runner, измерьте одну сессию на её хосте, которым в Kubernetes является узел:

443 

444**1. Запустите один runner отдельно**

445 

446Запустите один runner с `--capacity 1`, ничего больше не размещая в его контейнере или unit-е systemd, так чтобы он был один на своём хосте и в своём окружении:

447 

448* **Его хост**: используйте хост, на котором не работает ни один другой runner. Тогда на следующем шаге вы сможете найти его процесс.

449* **Его окружение**: сделайте его единственным runner в окружении, например в окружении, которое вы [создадите для теста](https://code.claude.com/docs/ru/self-hosted-environments-quickstart.md#set-up-manually). Сессии направляются в окружение, а не на конкретный runner.

450 

451Пока не запускайте сессию, потому что каталог из следующего шага нужен вам до начала сборки.

452 

453**2. Найдите каталог cgroup runner**

454 

455На хосте, а не внутри контейнера, найдите ID процесса runner, например с помощью `ps`. Прочитайте `/proc/<pid>/cgroup` для этого ID:

456 

457* **Есть строка, содержащая `:pids:`**: хост использует cgroup v1, а каталог — это `/sys/fs/cgroup/pids`, за которым следует текст после `:pids:`

458* **Единственная строка начинается с `0::`**: хост использует cgroup v2, а каталог — это `/sys/fs/cgroup`, за которым следует текст после `0::`

459 

460**3. Выполните репрезентативную сборку и запишите пик**

461 

462Проведите одну сессию через репрезентативную сборку и возьмите пиковое значение из каталога cgroup runner:

463 

464* **В каталоге есть `pids.peak`**: прочитайте этот файл после завершения сборки

465* **В каталоге нет `pids.peak`**: читайте `pids.current` раз в секунду во время сборки и сохраняйте наибольшее значение. Пик между двумя чтениями останется незамеченным, поэтому считайте это значение заниженной оценкой.

466 

467**4. Умножьте на число сессий, делящих лимит**

468 

469* **Pod, контейнер или unit одного runner**: умножьте пик на `--capacity` этого runner

470* **Лимит, который делят несколько runner**: умножьте пик на сумму их capacity

471 

472Затем добавьте пик всего остального, что делит лимит, например другого контейнера в Pod.

473 

474**5. Задайте лимит выше полученного результата**

475 

476Более высокий лимит оставляет запас для более тяжёлых сборок, а более низкий быстрее останавливает fork-бомбу.

477 

478#### Проверьте лимит `pids.max`

479 

480* **Проверьте, был ли достигнут `pids.max`**: найдите в логе ядра хоста, например с помощью `dmesg`, строку, содержащую `cgroup: fork rejected by pids controller in` и путь cgroup. Ядро записывает её в лог только в первый раз, когда отказывает в создании процесса или потока в этой cgroup, поэтому ищите по всему логу.

481* **Узнайте действующий лимит**: прочитайте `pids.max` в каталоге cgroup runner и в каждом каталоге выше него. Наименьшее значение и есть действующий лимит, а `max` означает отсутствие лимита на этом уровне.

383 482 

384## Kubernetes483## Kubernetes

385 484 


577 676 

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

579 678 

580* **Любая форма клона работает**: полный, неглубокий или однозвездный клон на пути используется как есть. Runner никогда не передает `--depth` при получении в существующий клон, поэтому полный pre-warm держит свою полную историю и неглубокий остается неглубоким. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0` или число; по умолчанию 50) контролирует только холодный клон, который runner делает, когда клон еще не существует.679* **Глубина клона**: создавайте клон без `--depth`, с `--single-branch` или без него. Runner никогда не передает `--depth` при выполнении fetch в клон с удаленным репозиторием `origin`, даже если вы задали [`CLAUDE_RUNNER_FETCH_DEPTH`](https://code.claude.com/docs/ru/self-hosted-environments-reference#environment-variable-only-settings). С полным клоном каждая сессия загружает только те коммиты, которых нет в клоне. С неглубоким клоном сессия в ветке, ответвившейся до самого старого коммита клона, загружает всю историю этой ветки.

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

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

583 682 


587* **С git proxy pre-warm в формате `reftable` теряет свои refs**: очищая `.git/` перед каждой сессией, runner сохраняет `.git/refs/` и удаляет каталог `.git/reftable/`. Клон, подготовленный в формате refs `reftable` в git, при этом теряет свои refs, поэтому выполняйте pre-warm клона в формате refs `files`.686* **С git proxy pre-warm в формате `reftable` теряет свои refs**: очищая `.git/` перед каждой сессией, runner сохраняет `.git/refs/` и удаляет каталог `.git/reftable/`. Клон, подготовленный в формате refs `reftable` в git, при этом теряет свои refs, поэтому выполняйте pre-warm клона в формате refs `files`.

588* **Длинные клоны не нуждаются в обходном пути**: runner ограничивает каждую операцию git с помощью 120-секундного наблюдателя без прогресса и 30-минутного жесткого лимита, а не плоского тайм-аута, поэтому медленный холодный клон, который продолжает сообщать о прогрессе, завершается.687* **Длинные клоны не нуждаются в обходном пути**: runner ограничивает каждую операцию git с помощью 120-секундного наблюдателя без прогресса и 30-минутного жесткого лимита, а не плоского тайм-аута, поэтому медленный холодный клон, который продолжает сообщать о прогрессе, завершается.

589 688 

689### Убедитесь, что runner использует ваш клон

690 

691Чтобы убедиться, что runner использует ваш клон, запустите его с [`--log-level debug`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags) и начните сессию в репозитории. Runner записывает в лог `Prefetched repo found at` и путь к клону. Если вместо этого он записывает `No prefetched repo, fresh init at`, значит, по пути, указанному в этой строке, он не нашел пригодного клона. Проверьте, что ваш клон находится по этому пути, принадлежит пользователю runner и имеет удаленный репозиторий с именем `origin`.

692 

693Если runner находит ваш клон, но сессии по-прежнему запускаются медленно, проверьте, не является ли клон неглубоким.

694 

590## Закрепите версию695## Закрепите версию

591 696 

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


609* **Фиксированный флот**: запустите статический набор реплик runner и масштабируйте на [Prometheus metrics](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#prometheus-metrics), которые обслуживает каждый runner714* **Фиксированный флот**: запустите статический набор реплик runner и масштабируйте на [Prometheus metrics](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#prometheus-metrics), которые обслуживает каждый runner

610* **On-demand runners**: запустите подкоманду `claude self-hosted-runner orchestrator`, которая опрашивает Anthropic для сеансов, которые поставлены в очередь без доступного runner и вызывает ваш hook `spawn-runner` для загрузки одного на сеанс. См. [On-demand runners](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners).715* **On-demand runners**: запустите подкоманду `claude self-hosted-runner orchestrator`, которая опрашивает Anthropic для сеансов, которые поставлены в очередь без доступного runner и вызывает ваш hook `spawn-runner` для загрузки одного на сеанс. См. [On-demand runners](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners).

611 716 

717### Освобождение простаивающих сессий во фиксированном флоте

718 

719Если сессии остаются в очереди во фиксированном флоте, хотя все runners в сети, причиной могут быть простаивающие сессии. По умолчанию сессия сохраняет свой слот после завершения своего хода, а её runner остаётся заблокированным за [владельцем](https://code.claude.com/docs/ru/self-hosted-environments#key-concepts) этой сессии. Если [облачная запланированная задача](https://code.claude.com/docs/ru/routines.md) вашей команды запускает новую сессию при каждом выполнении, её простаивающие сессии могут занять все слоты.

720 

721Чтобы проверить это, посмотрите `claude_code_self_hosted_runner_session_idle_seconds` в [Prometheus metrics](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#prometheus-metrics) каждого runner. У каждой сессии, которую удерживает runner, есть собственный ряд: `0`, пока сессия занята, в противном случае — количество секунд с момента перехода в простой. Выберите допустимое время простоя: дольше пауз, которые люди делают посреди задачи, и достаточно короткое, чтобы каждое выполнение освобождалось до начала следующего выполнения запланированной задачи. Сравните ряды с этим временем.

722 

723* **Ряды выше этого времени, например `1800` для 30 минут**: простаивающие сессии удерживают эти слоты, поэтому задайте `--release-idle-session-min`

724* **Все ряды ниже него**: ни одна сессия не простаивала так долго. Добавьте runners или задайте [`--kill-session-after-min`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags) для [сессий, которые никогда не переходят в простой](#some-sessions-don’t-count-as-idle).

725* **Runner без рядов**: его не удерживает ни одна сессия. См. **Sessions stay queued** в разделе [Устранение неполадок](#troubleshooting).

726* **Runner, метрики которого не отвечают**: его процесс мог завершиться. См. **An environment that looks healthy** в разделе [Когда runner завершает работу](#when-the-runner-exits).

727 

728Чтобы освобождать простаивающие сессии, запускайте каждый runner с [`--release-idle-session-min`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags) и этим временем в минутах, например `--release-idle-session-min 30`. Тогда runner освобождает любую сессию, которая простаивает так долго, независимо от того, запустила её запланированная задача или человек.

729 

730* **Неотправленная работа**: освобождённая сессия возобновляется при следующем сообщении, но без работы, которую она не отправила (push). Чтобы сохранить её коммиты, см. [Resumed sessions lose unpushed work](#additional-limitations).

731* **Завершение runner**: runner, освободивший свою последнюю сессию, начинает [обычное завершение](#when-the-runner-exits). Настройте ваш супервизор так, чтобы он перезапускал его на чистой файловой системе, как описано в разделе [Усиление защиты развёртывания](#harden-your-deployment).

732* **Сессии, которые никогда не переходят в простой**: также задайте [`--kill-session-after-min`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags), потому что [некоторые сессии не считаются простаивающими](#some-sessions-don’t-count-as-idle)

733 

612## Известные проблемы и ограничения734## Известные проблемы и ограничения

613 735 

614Ниже приведены ограничения в этом выпуске с обходными путями, где они существуют.736Ниже приведены ограничения в этом выпуске с обходными путями, где они существуют.


642### Дополнительные ограничения764### Дополнительные ограничения

643 765 

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

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

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

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

770 * **Незакоммиченные изменения всё равно теряются**: чтобы побудить Claude делать коммит и push по завершении ответа, см. [Побуждение сессий отправлять свою работу](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)

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

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

650* **Когда кто-то архивирует или удаляет сессию либо освобождает её runner из меню сессии**: не рассчитывайте на push через [`--push-outcome-on-release`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags). Чтобы сохранить коммиты в этих случаях, отправляйте `HEAD` в резервную ветку из [хука `post-session`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#post-session). Если вы берёте за основу приведённый там пример, сделайте так, чтобы он выполнял push, даже когда незакоммиченных изменений нет, поскольку он выполняет push только после коммита-снимка.773* **Когда кто-то архивирует или удаляет сессию либо освобождает её runner из меню сессии**: не рассчитывайте на push через [`--push-outcome-on-release`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags). Чтобы сохранить коммиты в этих случаях, отправляйте `HEAD` в резервную ветку из [хука `post-session`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#post-session). Если вы берёте за основу приведённый там пример, сделайте так, чтобы он выполнял push, даже когда незакоммиченных изменений нет, поскольку он выполняет push только после коммита-снимка.


684* **Сессии завершаются сбоем сразу после принятия**: откройте сессию в claude.ai/code, чтобы увидеть ошибку. Если ошибка показывает, что git не смог пройти аутентификацию, проверьте [учётные данные git](#configure-git) runner'а. Для runner'а, запущенного с `--use-anthropic-git-proxy`, см. [Если сессии не запускаются на runner'е с git-прокси](#when-anthropic-doesnt-serve-a-session).807* **Сессии завершаются сбоем сразу после принятия**: откройте сессию в claude.ai/code, чтобы увидеть ошибку. Если ошибка показывает, что git не смог пройти аутентификацию, проверьте [учётные данные git](#configure-git) runner'а. Для runner'а, запущенного с `--use-anthropic-git-proxy`, см. [Если сессии не запускаются на runner'е с git-прокси](#when-anthropic-doesnt-serve-a-session).

685 808 

686 Базовый каталог, недоступный для записи, останавливает runner при запуске, а не приводит к сбою сессий. См. пункт **Runner завершается при запуске с `cannot create or write to base directory`** в этом списке.809 Базовый каталог, недоступный для записи, останавливает runner при запуске, а не приводит к сбою сессий. См. пункт **Runner завершается при запуске с `cannot create or write to base directory`** в этом списке.

810* **Сессия принята, но Claude так и не отвечает на её первое сообщение**: если ваши runner'ы подключаются к `api.anthropic.com` через прокси, настройте его так, чтобы ответ `/worker/events/stream` сессии передавался по мере поступления. Увеличение таймаутов runner'а не поможет. Чтобы подтвердить причину по логу runner'а, см. [Сессия принята, но Claude так и не отвечает на её первое сообщение](#when-a-sessions-first-message-is-never-answered).

687* **Сессии не запускаются на 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).811* **Сессии не запускаются на 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).

688* **Сессии не могут выйти в сеть через исходящий прокси с аутентификацией**: когда источник, заданный с помощью [`--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-слушатель.812* **Сессии не могут выйти в сеть через исходящий прокси с аутентификацией**: когда источник, заданный с помощью [`--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-слушатель.

689* **Runner записывает в лог строки `Poll failed`, содержащие `rejecting the malformed poll response`**: runner получил ответ на опрос очереди работ, тело которого не является ожидаемым JSON очереди. Одна из причин — перехватывающий прокси или captive portal, отвечающий собственной страницей. Если runner подключается через прокси, настройте прокси так, чтобы ответы от `api.anthropic.com` передавались без изменений.813* **Runner записывает в лог строки `Poll failed`, содержащие `rejecting the malformed poll response`**: runner получил ответ на опрос очереди работ, тело которого не является ожидаемым JSON очереди. Одна из причин — перехватывающий прокси или captive portal, отвечающий собственной страницей. Если runner подключается через прокси, настройте прокси так, чтобы ответы от `api.anthropic.com` передавались без изменений.


708* **Сессия не запускается с `This runner couldn't read`**: runner запросил у git-хоста репозиторий со своими [учётными данными git](#configure-git) и получил ответ «не найдено». Репозиторий не существует, или эти учётные данные не дают доступа к репозиторию.832* **Сессия не запускается с `This runner couldn't read`**: runner запросил у git-хоста репозиторий со своими [учётными данными git](#configure-git) и получил ответ «не найдено». Репозиторий не существует, или эти учётные данные не дают доступа к репозиторию.

709 * **Если вы администрируете runner**: предоставьте его учётным данным git доступ на чтение к репозиторию, затем запустите новую сессию.833 * **Если вы администрируете runner**: предоставьте его учётным данным git доступ на чтение к репозиторию, затем запустите новую сессию.

710 * **Если вы запустили сессию**: если репозиторий не существует, запустите новую сессию с правильным репозиторием. Если у runner'а нет доступа к репозиторию, попросите администратора runner'а предоставить доступ, затем запустите новую сессию.834 * **Если вы запустили сессию**: если репозиторий не существует, запустите новую сессию с правильным репозиторием. Если у runner'а нет доступа к репозиторию, попросите администратора runner'а предоставить доступ, затем запустите новую сессию.

711* **Сессии запускаются несколько минут**: обычно основное время занимает первоначальное клонирование. Чтобы убедиться в этом, следите за [метрикой](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds`, и сократите клонирование с помощью [предварительно подготовленного checkout](#reuse-a-pre-warmed-checkout) или меньшего значения `CLAUDE_RUNNER_FETCH_DEPTH`.835* **Сессии запускаются или возобновляются несколько минут**: одна из причин — клонирование с нуля. В парке, где каждый runner запускается на пустом диске без [хука `checkout`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#checkout), runner заново клонирует репозитории сессии, прежде чем запустить Claude Code. Сессия, которая возобновляется на пустом диске, снова ждёт того же клонирования.

836 

837 Чтобы избежать клонирования с нуля, предоставьте [предварительно подготовленный checkout](#reuse-a-pre-warmed-checkout). Если вы уже его предоставляете, [убедитесь, что runner его использует](#confirm-that-the-runner-uses-your-clone). Если runner сам создаёт клон и завершается после одной сессии, уменьшите [`CLAUDE_RUNNER_FETCH_DEPTH`](https://code.claude.com/docs/ru/self-hosted-environments-reference#environment-variable-only-settings) со значения по умолчанию в 50 коммитов, чтобы получать меньше истории.

838 

839 Если вы используете хук, он выполняется вместо клонирования runner'ом, поэтому вместо этого проверьте, что делает ваш хук. Следите за [метрикой](https://code.claude.com/docs/ru/self-hosted-environments-reference.md#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds`, чтобы видеть, сколько времени занимают запуски.

712* **Ходы завершаются с ошибкой 401**: когда ход заканчивается ответом 401 или 403 от Anthropic API, runner получает новый [`CLAUDE_CODE_OAUTH_TOKEN`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#wrapper-scripts) от Anthropic и передаёт его сессии. Неудавшийся ход не повторяется. Этот токен краткосрочный, и runner ротирует его через stdin сессии.840* **Ходы завершаются с ошибкой 401**: когда ход заканчивается ответом 401 или 403 от Anthropic API, runner получает новый [`CLAUDE_CODE_OAUTH_TOKEN`](https://code.claude.com/docs/ru/self-hosted-environments-configuration#wrapper-scripts) от Anthropic и передаёт его сессии. Неудавшийся ход не повторяется. Этот токен краткосрочный, и runner ротирует его через stdin сессии.

713 841 

714 Когда получение токена не удаётся, runner записывает в лог строку `inference_token refresh failed` с указанием, когда будет повторная попытка, и продолжает повторять попытки, пока работает сессия.842 Когда получение токена не удаётся, runner записывает в лог строку `inference_token refresh failed` с указанием, когда будет повторная попытка, и продолжает повторять попытки, пока работает сессия.


788 916 

789Для пошаговой диагностики на хосте runner'а запустите [подкоманду doctor](#troubleshooting).917Для пошаговой диагностики на хосте runner'а запустите [подкоманду doctor](#troubleshooting).

790 918 

919### Сессия принята, но Claude так и не отвечает на её первое сообщение

920 

921Если runner принимает сессию, но Claude так и не отвечает на первое сообщение, а ваши runner'ы подключаются к `api.anthropic.com` через прокси, причиной может быть прокси. Anthropic отправляет сессии её сообщения через один потоковый ответ, который остаётся открытым. Если ваш прокси буферизует его или закрывает, прежде чем что-либо передать, первое сообщение так и не доходит. Другие запросы сессии при этом выполняются успешно.

922 

923Чтобы это исправить, измените то, как прокси обрабатывает этот запрос:

924 

925```text theme={null}

926GET https://api.anthropic.com/v1/code/sessions/<session-id>/worker/events/stream

927```

928 

929* **Не буферизуйте ответ**: передавайте его по мере поступления. Его тип содержимого — `text/event-stream`.

930* **Позвольте ответу оставаться открытым**: он может оставаться открытым до часа. Если у прокси есть таймаут бездействия, сделайте его значительно больше 15 секунд, поскольку по умолчанию Anthropic отправляет keep-alive как минимум с такой частотой.

931 

932Затем запустите новую сессию и проверьте, что Claude отвечает. Увеличение таймаутов runner'а не поможет: вы лишь дольше ждёте, прежде чем runner остановит сессию.

933 

934#### Подтвердите причину по логу runner'а

935 

936Эти шаги предназначены для runner'ов на Claude Code v2.1.287 или новее с уровнем логирования по умолчанию `--log-level info`. Более старые runner'ы записывают эти строки позже или не записывают вовсе.

937 

9381. Дождитесь истечения [`--startup-timeout-min`](https://code.claude.com/docs/ru/self-hosted-environments-reference#runner-cli-flags), по умолчанию 15 минут. Затем runner останавливает сессию и записывает в лог строку, которая содержит `no child output for` и заканчивается на `— releasing`.

9392. Найдите в логе runner'а `SDKStartup: SSE`. Эти строки следуют за строкой `finished: interrupted`, через несколько строк после строки из шага 1. У большинства из них нет временной метки, поэтому сборщик логов может показывать их в другом месте.

9403. Найдите строку в этой таблице:

941 

942| Строка лога содержит | Что делать |

943| :- | :- |

944| `SSE connect failed (no response in 30s)` или `SSE liveness timeout` | Проверьте, что прокси пересылает запрос, передаёт заголовки и данные ответа по мере поступления и не разрывает соединение |

945| `SSE connect failed (HTTP` и код состояния | Проверьте собственный лог прокси. Если прокси сам ответил на запрос, пропустите запрос через него. |

946| `SSE connect failed (` и любой другой текст | Текст в скобках — это ошибка. Найдите то же соединение в собственном логе прокси. |

947| `SSE stream ended by server`, снова и снова | Проверьте ограничение прокси по времени для долгоживущих ответов. Одна такая строка — это нормально. |

948| `SSE reconnected after` | Ищите после неё одну из других строк. Эта строка не означает, что что-либо дошло до сессии. |

949 

950Если в логе нет ни одной из этих строк или в логе прокси нет признаков проблемы, [сообщите о проблеме](#report-an-issue).

951 

952#### Остановите повторные попытки сессии

953 

954Сессия сохраняет сообщение как ожидающее, и runner, который может обслуживать владельца сессии, снова принимает сессию. Пока вы не измените прокси, сессия каждый раз ждёт так же. Чтобы это прекратить, архивируйте сессию в claude.ai/code.

955 

791## Что дальше956## Что дальше

792 957 

793* [Customize sessions](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md): скрипты-обертки, lifecycle hooks, on-demand runners, MCP servers и разрешения958* [Customize sessions](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md): скрипты-обертки, lifecycle hooks, on-demand runners, MCP servers и разрешения

Details

121* **Сессия не запускается из-за ошибки git**: если ошибка содержит `could not read Username for` из git, за которым следует URL вашего git-хоста, у runner не было учётных данных HTTPS для этого хоста.121* **Сессия не запускается из-за ошибки git**: если ошибка содержит `could not read Username for` из git, за которым следует URL вашего git-хоста, у runner не было учётных данных HTTPS для этого хоста.

122 * **Предоставьте учётные данные HTTPS**: см. [Настройка git](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#configure-git)122 * **Предоставьте учётные данные HTTPS**: см. [Настройка git](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#configure-git)

123 * **Клонируйте через SSH**: если на хосте runner уже есть SSH-ключ, см. [Перезапись git URL для частных сетей](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#rewrite-git-urls-for-private-networks)123 * **Клонируйте через SSH**: если на хосте runner уже есть SSH-ключ, см. [Перезапись git URL для частных сетей](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#rewrite-git-urls-for-private-networks)

124 * **После любого из этих исправлений**: снова запустите runner и следите за неудавшейся сессией, а не запускайте новую. Если она уже завершилась неудачей несколько раз, подождите несколько минут, пока runner не запишет в лог `Picked up session`.

125 * **Чтобы вместо этого использовать другой репозиторий**: [архивируйте](https://code.claude.com/docs/ru/claude-code-on-the-web.md#archive-sessions) или [удалите](https://code.claude.com/docs/ru/claude-code-on-the-web.md#delete-sessions) неудавшуюся сессию, затем снова запустите runner и начните новую сессию. Иначе runner может подхватить неудавшуюся сессию вместо новой.

124 126 

125### Если runner завершился127### Если runner завершился

126 128 

Details

83 83 

84| Флаг | По умолчанию | Описание |84| Флаг | По умолчанию | Описание |

85| :- | :- | :- |85| :- | :- | :- |

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

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

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

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


116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | Как долго runner ждет после того, как сеанс достигает своего лимита `--kill-session-after-min`, чтобы текущий ход завершился или отпуск завершился, перед завершением сеанса |116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | Как долго runner ждет после того, как сеанс достигает своего лимита `--kill-session-after-min`, чтобы текущий ход завершился или отпуск завершился, перед завершением сеанса |

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

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

119| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Глубина выборки Git для свежих клонов. Установите положительное целое число или `full` или `0` для полной выборки. Репозитории, уже присутствующие в рабочем пространстве, сохраняют свою существующую глубину. |119| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Глубина выборки Git для свежих клонов. Установите положительное целое число или `full` или `0` для полной выборки. Для клона, который уже находится в рабочем пространстве, см. [Повторное использование заранее подготовленного checkout](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout). |

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

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

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


231 interval: 30s231 interval: 30s

232```232```

233 233 

234### Примеры правил оповещений

235 

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

235 237 

236```yaml theme={null}238```yaml theme={null}


252 annotations:254 annotations:

253 summary: "Runners are running mixed versions"255 summary: "Runners are running mixed versions"

254 - alert: ClaudeRunnerInitErrorsHigh256 - alert: ClaudeRunnerInitErrorsHigh

255 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3257 expr: sum by (namespace) (increase(claude_code_self_hosted_runner_session_init_errors_total[10m])) > 3

256 for: 5m258 for: 5m

257 labels: {severity: warning}259 labels: {severity: warning}

258 annotations:260 annotations:

259 summary: "Runner {{ $labels.pod }}: >3 session init failures in 10m (checkout hook / git / token / pre-init crash)"261 summary: "Sessions are failing before init (checkout hook / git / token / pre-init crash)"

260 - alert: ClaudeRunnerPollErrors262 - alert: ClaudeRunnerPollErrors

261 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0263 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0

262 for: 2m264 for: 2m


264 annotations:266 annotations:

265 summary: "Runner {{ $labels.pod }}: PollWork failing ({{ $value | humanize }}/s over 5m)"267 summary: "Runner {{ $labels.pod }}: PollWork failing ({{ $value | humanize }}/s over 5m)"

266 - alert: ClaudeRunnerSessionStartHookErrors268 - alert: ClaudeRunnerSessionStartHookErrors

267 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3269 expr: sum by (namespace) (increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m])) > 3

268 for: 5m270 for: 5m

269 labels: {severity: warning}271 labels: {severity: warning}

270 annotations:272 annotations:

271 summary: "Runner {{ $labels.pod }}: >3 SessionStart hook failures in 10m"273 summary: "SessionStart hooks are failing"

272 274 

273 - name: claude-code-self-hosted-orchestrator275 - name: claude-code-self-hosted-orchestrator

274 rules:276 rules:


285 annotations:287 annotations:

286 summary: "Orchestrator {{ $labels.pod }} has not polled in >90s (poll loop waits on hook execution)"288 summary: "Orchestrator {{ $labels.pod }} has not polled in >90s (poll loop waits on hook execution)"

287 - alert: ClaudeOrchestratorCircuitBroken289 - alert: ClaudeOrchestratorCircuitBroken

288 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0290 expr: max by (namespace) (claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions and on (instance) max_over_time(claude_code_self_hosted_orchestrator_connected[2m]) == 1) > 0

289 for: 1m291 for: 1m

290 labels: {severity: critical}292 labels: {severity: critical}

291 annotations:293 annotations:


304 summary: "Orchestrator {{ $labels.pod }}: >3 spawn-runner hook failures in 5m"306 summary: "Orchestrator {{ $labels.pod }}: >3 spawn-runner hook failures in 5m"

305```307```

306 308 

309### Оповещения о потере runner и ожидающих сессиях

310 

311Для [фиксированного парка](https://code.claude.com/docs/ru/self-hosted-environments-deploy.md#scale-the-fleet) загрузите `ClaudeRunnersBelowFloor`. При использовании [runner по требованию](https://code.claude.com/docs/ru/self-hosted-environments-configuration.md#on-demand-runners) вместо этого загрузите `ClaudeOrchestratorSessionsWaiting` и `ClaudeOrchestratorQueueWaitHigh`.

312 

313#### Оповещение о потере runner в фиксированном парке

314 

315`ClaudeRunnersBelowFloor` срабатывает, когда в течение 10 минут зарегистрированных runner, с которых собираются метрики, остаётся меньше минимального порога:

316 

317```yaml theme={null}

318groups:

319 # Fixed fleets only. With on-demand runners the count follows demand,

320 # so ClaudeRunnersBelowFloor would fire whenever demand is low.

321 - name: claude-code-self-hosted-fixed-fleet-capacity

322 rules:

323 - alert: ClaudeRunnersBelowFloor

324 expr: (count(claude_code_self_hosted_runner_info{namespace="claude-runners"}) or vector(0)) < 2

325 for: 10m

326 labels: {severity: critical, namespace: claude-runners}

327 annotations:

328 summary: "Runners registered and scraped: {{ $value }}, below the floor. Check the runner workloads first, then the scrape targets if all are running."

329```

330 

331* **Минимальный порог**: задайте `2` в `expr` примерно равным половине числа реплик с округлением вверх. При трёх репликах оставьте `2`, и оповещение сработает, когда останется один runner или ни одного.

332* **Пространство имён**: замените `claude-runners` в matcher и в `labels` и скопируйте оповещение для каждого дополнительного пространства имён. Если у ваших целей нет метки `namespace`, удалите matcher и метку, иначе оповещение получит 0 и сработает.

333* **`ClaudeRunnerPollStale` и `ClaudeRunnerPollErrors`**: оставьте их загруженными из [примеров правил оповещений](#sample-alert-rules), поскольку `ClaudeRunnersBelowFloor` по-прежнему учитывает runner, который не может выполнить опрос

334 

335#### Оповещение об ожидании сессиями runner по требованию

336 

337`ClaudeOrchestratorSessionsWaiting` срабатывает, когда число сессий, ожидающих runner, остаётся выше 0 в течение 10 минут. `ClaudeOrchestratorQueueWaitHigh` срабатывает, когда более 1% ожиданий в очереди за последние 10 минут превысили 160 секунд и это сохраняется в течение 5 минут:

338 

339```yaml theme={null}

340groups:

341 # On-demand runners only. Needs no edit for the namespace.

342 - name: claude-code-self-hosted-on-demand-capacity

343 rules:

344 - alert: ClaudeOrchestratorSessionsWaiting

345 expr: |

346 max by (namespace) (

347 claude_code_self_hosted_orchestrator_pool_pending_sessions

348 and on (instance)

349 max_over_time(claude_code_self_hosted_orchestrator_connected[2m]) == 1

350 ) > 0

351 for: 10m

352 labels: {severity: warning}

353 annotations:

354 summary: "Sessions waiting for a runner: {{ $value }}, above the threshold for 10 minutes. Check claude_code_self_hosted_orchestrator_spawn_hooks_total by result, then runner workloads that don't start."

355 - alert: ClaudeOrchestratorQueueWaitHigh

356 expr: |

357 histogram_quantile(0.99, sum by (namespace, le) (

358 rate(claude_code_self_hosted_orchestrator_session_queue_wait_seconds_bucket[10m])

359 )) > 160

360 for: 5m

361 labels: {severity: warning}

362 annotations:

363 summary: "Over 1% of queue waits in the last 10 minutes exceeded 160 seconds. Check whether ClaudeOrchestratorDisconnected is firing, then claude_code_self_hosted_orchestrator_spawn_hooks_total by result and claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds."

364```

365 

366* **Порог**: если какая-то сессия ожидает постоянно, поднимите `> 0` в `ClaudeOrchestratorSessionsWaiting` выше значения, которое вы обычно наблюдаете

367* **`ClaudeOrchestratorDisconnected`**: оставьте его загруженным из [примеров правил оповещений](#sample-alert-rules), поскольку `ClaudeOrchestratorSessionsWaiting` перестаёт срабатывать примерно через 2 минуты после отключения последнего оркестратора в пространстве имён

368 

307### Проброс метрик дочерних процессов сессий369### Проброс метрик дочерних процессов сессий

308 370 

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

Details

324}324}

325```325```

326 326 

327Запись с ID модели, например `"claude-opus-5"`, также разрешает более поздние версии, которые его расширяют, например Opus 5.5. Чтобы заблокировать одну из этих версий, используйте [`deniedModels`](#deniedmodels). Чтобы каждая запись с ID модели разрешала только указанную в ней версию, используйте [`availableModelsMatch`](#availablemodelsmatch). См. [Ограничение выбора модели](https://code.claude.com/docs/ru/model-config.md#restrict-model-selection).327Запись с ID модели, например `"claude-opus-5"`, также разрешает более поздние версии, которые его расширяют, например Opus 5.5. Чтобы заблокировать одну из этих версий, используйте [`deniedModels`](#deniedmodels). Чтобы каждая запись с ID модели разрешала только указанную в ней версию, используйте [`availableModelsMatch`](#availablemodelsmatch). См. [Ограничение выбора модели](https://code.claude.com/docs/ru/model-config.md#restrict-model-selection). Об ID сторонних провайдеров см. [Закрепление моделей для сторонних развёртываний](https://code.claude.com/docs/ru/model-config.md#pin-models-for-third-party-deployments).

328 328 

329### `availableModelsMatch`329### `availableModelsMatch`

330 330 


333* **Область действия**: [`Managed`](#scopes). Claude Code игнорирует ключ в пользовательских, проектных и локальных настройках, а также в `--settings`, с предупреждением333* **Область действия**: [`Managed`](#scopes). Claude Code игнорирует ключ в пользовательских, проектных и локальных настройках, а также в `--settings`, с предупреждением

334* **Тип**: строка, одно из значений:334* **Тип**: строка, одно из значений:

335 * `"prefix"`: запись с ID модели разрешает свою версию и любой ID модели, который расширяет его ещё одним сегментом335 * `"prefix"`: запись с ID модели разрешает свою версию и любой ID модели, который расширяет его ещё одним сегментом

336 * `"exact"`: запись с ID модели разрешает только указанную в ней версию, включая ID этой версии с датами, поэтому `"claude-opus-5"` разрешает Opus 5, но не `claude-opus-5-5`. Псевдоним семейства, например `"opus"`, по-прежнему разрешает всё семейство, а записи `best`, `opusplan` и `default` игнорируются336 * `"exact"`: запись с ID модели разрешает только указанную в ней версию, поэтому `"claude-opus-5"` разрешает Opus 5, но не `claude-opus-5-5`. Запись вроде `"claude-opus-4-5"` также разрешает свой ID модели Anthropic с датой `claude-opus-4-5-20251101`. Псевдоним семейства, например `"opus"`, по-прежнему разрешает всё семейство, а записи `best`, `opusplan` и `default` игнорируются

337* **По умолчанию**: `"prefix"`337* **По умолчанию**: `"prefix"`

338 338 

339В этом примере разрешены Opus 5 и Sonnet 5 и никакие более поздние выпуски этих моделей:339В этом примере разрешены Opus 5 и Sonnet 5 и никакие более поздние выпуски этих моделей:


1371 1371 

1372Claude Code удаляет конечный слэш из пути каталога, поэтому `~/.aws` и `~/.aws/` совпадают с одним и тем же каталогом. До v2.1.224 Claude Code передавал конечный слэш в песочницу, и Claude всё ещё мог читать или записывать пути под записью `denyRead` или `denyWrite`, написанной с ним.1372Claude Code удаляет конечный слэш из пути каталога, поэтому `~/.aws` и `~/.aws/` совпадают с одним и тем же каталогом. До v2.1.224 Claude Code передавал конечный слэш в песочницу, и Claude всё ещё мог читать или записывать пути под записью `denyRead` или `denyWrite`, написанной с ним.

1373 1373 

1374Claude Code также удаляет конечный `/**`, поэтому `~/build/**` и `~/build` охватывают один и тот же каталог. Работает ли подстановка, такая как `*`, зависит от того, в каком списке находится запись, и от платформы:1374##### Где подстановочные знаки работают в путях песочницы

1375 1375 

1376* **`allowWrite` и `denyWrite`**: на macOS подстановки работают. На Linux и WSL2 песочница монтирует конкретные пути, поэтому Claude Code пропускает запись, содержащую `*`, `?` или `[` после удаления конечного `/**`, и эта запись не имеет эффекта. Claude Code добавляет пути из ваших правил разрешений `Edit` в эти списки, поэтому то же ограничение действует и для них, а вкладка **Config** в `/sandbox` предупреждает о правилах разрешений `Edit` и `Read`, содержащих подстановки.1376Подстановочные знаки `*`, `?` и `**` работают во всех четырёх списках путей `sandbox.filesystem` в macOS и в меньшем числе мест в Linux и WSL2:

1377* **`denyRead` и `allowRead`**: подстановки работают на каждой платформе. На Linux и WSL2 Claude Code разворачивает запись чтения в конкретные пути, с которыми она совпадает, чего он не делает для списков записи.

1378 1377 

1379Фигурные скобки сопоставляются как обычные символы в имени, поэтому `~/data/{keys,tokens}` охватывает каталог, буквально названный `{keys,tokens}`, а не два альтернативных варианта. Чтобы охватить `~/data/keys` и `~/data/tokens`, добавьте каждый из них отдельной записью.1378| Список `sandbox.filesystem` | Что работает в Linux и WSL2 | Пример, который не работает в Linux и WSL2 | Что написать вместо этого |

1379| :- | :- | :- | :- |

1380| `denyRead`, `allowRead` | Работает завершающий `/**`, поэтому `~/build/**` охватывает тот же каталог, что и `~/build`. Любой другой подстановочный знак работает только после имени первого каталога в [полном пути](#sandbox-path-prefixes) записи. | `/**/*.pem` в `denyRead` ничего не охватывает, поэтому не блокирует чтение | `/srv/**/*.pem`, по одной записи для каждого каталога верхнего уровня |

1381| `allowWrite`, `denyWrite` | Работает только завершающий `/**`, поэтому `~/build/**` охватывает тот же каталог, что и `~/build` | `./src/*` охватывает только файл или каталог в `src`, который сам называется `*`, и ничего, если такого нет | `./src`, который охватывает всё внутри `src`, или по одной записи для каждого пути |

1382 

1383В `~/keys/*.pem` подстановочный знак стоит после имени первого каталога, которым при домашнем каталоге `/home/alice` является `home`:

1384 

1385```text theme={null}

1386~/keys/*.pem the entry

1387/home/alice/keys/*.pem its full path

1388 ^^^^ the first directory name, home

1389```

1390 

1391В Linux и WSL2 вкладка **Config** панели `/sandbox` в сессии предупреждает о правилах разрешений `Edit`, содержащих подстановочный знак, отличный от завершающего `/**`. Такие подстановочные знаки не работают для команд в песочнице. Добавьте каждый путь, который должно охватывать правило, или содержащий их каталог в `allowWrite` для разрешающего правила или в `denyWrite` для запрещающего.

1392 

1393##### Имена каталогов с квадратными, фигурными или круглыми скобками

1394 

1395Чтобы разрешить или заблокировать каталог, имя которого содержит квадратные скобки, напишите имя как есть, например `./app/[slug]`. В этой записи `[slug]` — это настоящее имя каталога вместе со скобками:

1396 

1397```text theme={null}

1398app/

1399└── [slug]/

1400 └── page.tsx

1401```

1402 

1403Такая запись охватывает всё внутри каталога, поэтому не добавляйте завершающий `/**`. В macOS, а также в Linux и WSL2 каталог `app/[slug]` должен существовать в момент запуска команды в песочнице.

1404 

1405* **Квадратные скобки, например `[slug]`**: во всех списках в macOS, а также в `denyRead` и `allowRead` в Linux и WSL2 скобки в `./app/[slug]` также являются шаблоном. Тогда запись также соответствует любому пути внутри `app`, имя которого состоит из одного символа из `slug`, например `app/s` или `app/g`. Если эта запись находится в `allowRead` или в `allowWrite` в macOS, команды в песочнице также получают доступ к этим путям. Переименуйте те, к которым у них не должно быть доступа.

1406* **Квадратные скобки, например `[user-id]` или `[post-id]`, где символ слева от дефиса при сортировке идёт после символа справа**: `./app/[user-id]` охватывает только каталог с точно таким именем во всех списках на всех платформах. До v2.1.304 команды в песочнице в Linux и WSL2 не запускались, пока `denyRead` или `allowRead` содержали такую запись.

1407* **Фигурные и круглые скобки**: это обычные символы, поэтому `~/data/{keys,tokens}` охватывает один каталог с именем `{keys,tokens}`, а не два варианта. Чтобы охватить `~/data/keys` и `~/data/tokens`, добавьте каждый отдельной записью.

1380 1408 

1381### `sandbox.filesystem.allowWrite`1409### `sandbox.filesystem.allowWrite`

1382 1410 


3470 3498 

3471Сопоставление имён хостов не зависит от регистра и рассматривает `hooks.example.com.` с конечной точкой, которая обозначает полное доменное имя, так же, как `hooks.example.com`, что соответствует тому, как это делает DNS. Список разрешённых URL-адресов применяется к хукам из каждого источника, включая управляемые настройки.3499Сопоставление имён хостов не зависит от регистра и рассматривает `hooks.example.com.` с конечной точкой, которая обозначает полное доменное имя, так же, как `hooks.example.com`, что соответствует тому, как это делает DNS. Список разрешённых URL-адресов применяется к хукам из каждого источника, включая управляемые настройки.

3472 3500 

3473В параметре `managedSettings` Agent SDK Claude Code игнорирует этот ключ, если его список содержит записи, поэтому вместо этого передавайте список в параметре `settings` SDK. См. [что делает каждое значение в родительских настройках](https://code.claude.com/docs/ru/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).3501В параметре `managedSettings` Agent SDK Claude Code игнорирует список, содержащий записи, поэтому вместо этого передавайте его в [параметре `settings`](https://code.claude.com/docs/ru/agent-sdk/typescript#options) SDK. См. [что делает пустой список в родительских настройках](https://code.claude.com/docs/ru/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).

3474 3502 

3475### `allowManagedHooksOnly`3503### `allowManagedHooksOnly`

3476 3504 


3520Охват зависит от того, в каком файле находится ключ:3548Охват зависит от того, в каком файле находится ключ:

3521 3549 

3522* **В управляемых настройках**: Claude Code отключает каждый настроенный хук, включая управляемые, и продолжает запускать хуки, которые [Agent SDK](https://code.claude.com/docs/ru/agent-sdk/overview.md) регистрирует в процессе3550* **В управляемых настройках**: Claude Code отключает каждый настроенный хук, включая управляемые, и продолжает запускать хуки, которые [Agent SDK](https://code.claude.com/docs/ru/agent-sdk/overview.md) регистрирует в процессе

3523* **В параметре `managedSettings` Agent SDK**: Claude Code обрабатывает ключ как `allowManagedHooksOnly: true`, поэтому о том, какие хуки останавливаются, см. [что запускается при `allowManagedHooksOnly`](#what-runs-under-allowmanagedhooksonly). На компьютере, где администратор развёртывает управляемые настройки, Claude Code игнорирует этот ключ, если только администратор не [разрешит встраивающему хосту добавлять политику](https://code.claude.com/docs/ru/managed-settings.md#let-an-embedding-host-add-policy). Требуется Claude Code v2.1.309 или новее.3551* **В параметре `managedSettings` Agent SDK**: на компьютере, где администратор развёртывает управляемые настройки, Claude Code игнорирует этот ключ, если только администратор не [разрешит встраивающему хосту добавлять политику](https://code.claude.com/docs/ru/managed-settings.md#let-an-embedding-host-add-policy). Там, где ключ действует, останавливаются пользовательские, проектные, локальные хуки и хуки плагинов, а также все хуки в параметре `settings` SDK. Управляемые хуки администратора, хуки [принудительно включённых](#enabledplugins) плагинов и ваши [функции обратного вызова хуков SDK](https://code.claude.com/docs/ru/agent-sdk/hooks.md) продолжают запускаться. Требуется Claude Code v2.1.309 или новее.

3524* **В любом другом файле настроек**: Claude Code отключает пользовательские, проектные, локальные хуки и хуки плагинов; управляемые хуки, хуки Agent SDK и хуки из плагинов, принудительно включённых в управляемых [`enabledPlugins`](#enabledplugins), продолжают запускаться3552* **В любом другом файле настроек**: Claude Code отключает пользовательские, проектные, локальные хуки и хуки плагинов; управляемые хуки, хуки Agent SDK и хуки из плагинов, принудительно включённых в управляемых [`enabledPlugins`](#enabledplugins), продолжают запускаться

3525 3553 

3526Ключ также останавливает [mods](https://code.claude.com/docs/ru/plugins/mods/overview.md) — плагины, код которых регистрирует хуки:3554Ключ также останавливает [mods](https://code.claude.com/docs/ru/plugins/mods/overview.md) — плагины, код которых регистрирует хуки:


3624 3652 

3625Список разрешённых переменных применяется к хукам из каждого источника, включая управляемые настройки.3653Список разрешённых переменных применяется к хукам из каждого источника, включая управляемые настройки.

3626 3654 

3627В параметре `managedSettings` Agent SDK Claude Code игнорирует этот ключ, если его список содержит записи, поэтому вместо этого передавайте список в параметре `settings` SDK. См. [что делает каждое значение в родительских настройках](https://code.claude.com/docs/ru/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).3655В параметре `managedSettings` Agent SDK Claude Code игнорирует список, содержащий записи, поэтому вместо этого передавайте его в [параметре `settings`](https://code.claude.com/docs/ru/agent-sdk/typescript#options) SDK. См. [что делает пустой список в родительских настройках](https://code.claude.com/docs/ru/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).

3628 3656 

3629### `workflowKeywordTriggerEnabled`3657### `workflowKeywordTriggerEnabled`

3630 3658 


3841* **Type**: Boolean3869* **Type**: Boolean

3842 * `true`: Claude Code никогда не запускает объявленную маркетплейсом команду, не устанавливает и не обновляет плагины, полученные из command, и прекращает загрузку уже установленных3870 * `true`: Claude Code никогда не запускает объявленную маркетплейсом команду, не устанавливает и не обновляет плагины, полученные из command, и прекращает загрузку уже установленных

3843 * `false`: Claude Code явно разрешает плагины, полученные из command3871 * `false`: Claude Code явно разрешает плагины, полученные из command

3844* **Default**: не установлено, поэтому Claude Code следует [`allowManagedHooksOnly`](#allowmanagedhooksonly): организация, которая ограничивает выполнение hook только управляемыми параметрами, также получает отключённые command источники3872* **Default**: не установлено, поэтому Claude Code следует [`allowManagedHooksOnly`](#allowmanagedhooksonly): у организации, которая ограничивает выполнение хуков только управляемыми настройками, источники command тоже отключены. Приложение, которое передаёт [`disableAllHooks: true`](#disableallhooks) в параметре `managedSettings` Agent SDK, само по себе не отключает источники command.

3845 3873 

3846```json managed-settings.json theme={null}3874```json managed-settings.json theme={null}

3847{3875{

Details

127 127 

128```bash ~/.tmux.conf theme={null}128```bash ~/.tmux.conf theme={null}

129set -g allow-passthrough on129set -g allow-passthrough on

130set -g focus-events on

130set -s extended-keys on131set -s extended-keys on

131set -as terminal-features 'xterm*:extkeys'132set -as terminal-features 'xterm*:extkeys'

132```133```

133 134 

134Строка `allow-passthrough` позволяет уведомлениям и обновлениям прогресса достигать внешнего терминала вместо того, чтобы быть поглощенными tmux. Строки `extended-keys` позволяют tmux различать Shift+Enter и простой Enter, чтобы сочетание клавиш для новой строки работало.135Строка `allow-passthrough` позволяет уведомлениям и обновлениям прогресса достигать внешнего терминала вместо того, чтобы быть поглощенными tmux. Строки `extended-keys` позволяют tmux различать Shift+Enter и простой Enter, чтобы сочетание клавиш для новой строки работало.

135 136 

137Элементу [`Image` мода](https://code.claude.com/docs/ru/plugins/mods/reference#elements) нужны строки `allow-passthrough` и `focus-events`, а также выполнение остальных [требований для отрисовки внутри tmux](https://code.claude.com/docs/ru/plugins/mods/gallery.md#draw-an-image-inside-tmux). После добавления строк также отключитесь от tmux, подключитесь снова и перезапустите Claude Code.

138 

136## Исправление удаления целого слова при нажатии Backspace на Windows139## Исправление удаления целого слова при нажатии Backspace на Windows

137 140 

138На Windows Claude Code читает Backspace, поступающий как `^H`, как Ctrl+Backspace, который [удаляет предыдущее слово](https://code.claude.com/docs/ru/interactive-mode.md#text-editing), за исключением случаев, когда `TERM_PROGRAM` имеет значение `mintty` или `TERM` имеет значение `cygwin`. На macOS и Linux Claude Code читает его как обычный Backspace.141На Windows Claude Code читает Backspace, поступающий как `^H`, как Ctrl+Backspace, который [удаляет предыдущее слово](https://code.claude.com/docs/ru/interactive-mode.md#text-editing), за исключением случаев, когда `TERM_PROGRAM` имеет значение `mintty` или `TERM` имеет значение `cygwin`. На macOS и Linux Claude Code читает его как обычный Backspace.

ultrareview.md +2 −2

Details

176Подкоманда завершается с одним из трёх кодов:176Подкоманда завершается с одним из трёх кодов:

177 177 

178* **0**: обзор завершился, с результатами или без них178* **0**: обзор завершился, с результатами или без них

179* **1**: обзор не запустился или был остановлен до завершения, в облачной сессии произошла ошибка или истёк таймаут. Код также равен 1, когда [папке нет доверия](#trust-the-folder-before-the-review-runs), в том числе когда вы отвечаете `n` или нажимаете Ctrl-C на вопросе о доверии.179* **1**: обзор не запустился или был остановлен до завершения, в облачной сессии произошла ошибка или истёк таймаут. Код также равен 1, когда [папке нет доверия](#trust-the-folder-before-the-review-runs), в том числе когда вы отвечаете `n`, нажимаете Enter или нажимаете Ctrl-C на вопросе о доверии.

180* **130**: вы нажали Ctrl-C, пока подкоманда запускала обзор, ожидала результатов или отправляла комментарий `--post`, а не на вопросе о доверии180* **130**: вы нажали Ctrl-C, пока подкоманда запускала обзор, ожидала результатов или отправляла комментарий `--post`, а не на вопросе о доверии

181 181 

182Если подкоманда завершится до получения результатов, они так и не попадут в ваш терминал. Обзор при этом может всё ещё выполняться в облаке. Повторный запуск подкоманды начнёт новый обзор, а не продолжит прежний, и новый обзор [использует бесплатный запуск или оплачивается кредитами использования](#pricing-and-free-runs).182Если подкоманда завершится до получения результатов, они так и не попадут в ваш терминал. Обзор при этом может всё ещё выполняться в облаке. Повторный запуск подкоманды начнёт новый обзор, а не продолжит прежний, и новый обзор [использует бесплатный запуск или оплачивается кредитами использования](#pricing-and-free-runs).


198claude ultrareview 1234 --trust-workspace198claude ultrareview 1234 --trust-workspace

199```199```

200 200 

201Чтобы проверить pull request, которому нет доверия, выполните `claude ultrareview <PR number> --trust-workspace` из ветки, которой вы доверяете. В отличие от `y`, флаг ничего не сохраняет. PR [клонируется в облаке](#review-a-pull-request), поэтому его ветка не нужна вам локально.201Чтобы проверить pull request, которому нет доверия, выполните `claude ultrareview <PR number> --trust-workspace` из ветки, которой вы доверяете. PR [клонируется в облаке](#review-a-pull-request), поэтому его ветка не нужна вам локально.

202 202 

203## Сравнение ultrareview и /code-review203## Сравнение ultrareview и /code-review

204 204 

vs-code.md +6 −1

Details

1001 1001 

1002### Диктовка или вкладка Web не работают за прокси с TLS-инспекцией1002### Диктовка или вкладка Web не работают за прокси с TLS-инспекцией

1003 1003 

1004Если диктовка или вкладка Web завершаются с ошибкой сертификата, например `unable to get local issuer certificate`, задайте [`NODE_EXTRA_CA_CERTS`](https://code.claude.com/docs/ru/network-config#custom-ca-certificates) в блоке `env` файла `~/.claude/settings.json`. Укажите в ней путь к PEM-файлу с корневым CA-сертификатом вашего прокси, который может предоставить ваша IT-команда. Текст этой ошибки отображается на кнопке микрофона или в логах расширения:1004Если диктовка или вкладка Web завершаются с ошибкой сертификата, например `unable to get local issuer certificate`, задайте [`NODE_EXTRA_CA_CERTS`](https://code.claude.com/docs/ru/network-config#custom-ca-certificates) в блоке `env` файла `~/.claude/settings.json`. Укажите в ней путь к PEM-файлу с корневым CA-сертификатом вашего прокси, который может предоставить ваша IT-команда. Сбой отображается на кнопке микрофона или вкладке Web либо в логах:

1005 1005 

1006* **Диктовка**: кнопка микрофона показывает текст ошибки после `Dictation error: WebSocket error:`.1006* **Диктовка**: кнопка микрофона показывает текст ошибки после `Dictation error: WebSocket error:`.

1007* **Вкладка Web**: вкладка со списком [облачных сессий](#resume-cloud-sessions-from-claude-ai) показывает `Remote server is not connected` без текста ошибки. Чтобы прочитать его в логах:1007* **Вкладка Web**: вкладка со списком [облачных сессий](#resume-cloud-sessions-from-claude-ai) показывает `Remote server is not connected` без текста ошибки. Чтобы прочитать его в логах:

1008 1. Выполните **Claude Code: Show Logs** из [палитры команд](#vs-code-commands-and-shortcuts), чтобы открыть канал вывода `Claude VSCode`.1008 1. Выполните **Claude Code: Show Logs** из [палитры команд](#vs-code-commands-and-shortcuts), чтобы открыть канал вывода `Claude VSCode`.

1009 2. Нажмите **Reconnect** на вкладке и подождите, пока она перестанет показывать `Connecting…`.1009 2. Нажмите **Reconnect** на вкладке и подождите, пока она перестанет показывать `Connecting…`.

1010 3. Найдите в канале `Error fetching remote sessions:` или `Failed to fetch organization UUID:`, затем прочитайте текст ошибки после этого префикса в самой новой подходящей строке.1010 3. Найдите в канале `Error fetching remote sessions:` или `Failed to fetch organization UUID:`, затем прочитайте текст ошибки после этого префикса в самой новой подходящей строке.

1011* **Предупреждение в логе**: предупреждение, в котором упоминается `an authority that Claude Code does not trust`, сообщает об ошибке сертификата. За прокси с TLS-инспекцией задайте `NODE_EXTRA_CA_CERTS` в `env` в `~/.claude/settings.json`. Версии до v2.1.309 не записывают это предупреждение в лог.

1011 1012 

1012Для этого исправления требуется расширение версии 2.1.307 или новее, поэтому сначала обновите расширение. Затем задайте в `NODE_EXTRA_CA_CERTS` полный путь к файлу сертификата без `~`. Для пути Windows в `settings.json` пишите каждую обратную косую черту дважды, например `C:\\certs\\example-ca.pem`.1013Для этого исправления требуется расширение версии 2.1.307 или новее, поэтому сначала обновите расширение. Затем задайте в `NODE_EXTRA_CA_CERTS` полный путь к файлу сертификата без `~`. Для пути Windows в `settings.json` пишите каждую обратную косую черту дважды, например `C:\\certs\\example-ca.pem`.

1013 1014 

1015> [!NOTE]

1016>

1017> В окне, подключённом к WSL, SSH-хосту, dev-контейнеру или другой системе, сохраните файл сертификата и отредактируйте `~/.claude/settings.json` в этой системе, а не на вашем локальном компьютере.

1018 

1014В этом примере указан файл сертификата по пути Linux или macOS `/etc/ssl/certs/example-ca.pem`:1019В этом примере указан файл сертификата по пути Linux или macOS `/etc/ssl/certs/example-ca.pem`:

1015 1020 

1016```json ~/.claude/settings.json theme={null}1021```json ~/.claude/settings.json theme={null}