SpyBara
Go Premium

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

31 files changed +677 −100. 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 llega a Claude Code como un [conector](https://code.claude.com/docs/es/mcp.md#use-mcp-servers-from-claude-ai) de claude.ai en lugar de un comando. Cuando está conectado, `/mcp` lo enumera como `claude.ai Claude Docs`. Una solicitud de un documento destinado a otras personas va a Claude Docs en lugar de una página de artefactos: una especificación, una propuesta o un resumen del plan que trabajó en la sesión. Claude le proporciona el enlace del documento cuando está redactado.341Claude Docs llega a Claude Code como un [conector](https://code.claude.com/docs/es/mcp.md#use-mcp-servers-from-claude-ai) de claude.ai en lugar de un comando. Cuando está conectado, `/mcp` lo enumera como `claude.ai Claude Docs`. Una solicitud de un documento destinado a otras personas va a Claude Docs en lugar de una página de artefactos: una especificación, una propuesta o un resumen del plan que trabajó en la sesión. Claude le proporciona el enlace del documento cuando está redactado.

342 342 

343Un documento que pertenece al repositorio de código, como un README, permanece como un archivo. Para obtener un archivo para algo que Claude de otro modo pondría en Claude Docs, nombre el formato, como `.docx` o un archivo Markdown en el repositorio.343Un documento que pertenece a la base de código, como un README, permanece como un archivo. Para obtener un archivo para algo que Claude de otro modo pondría en Claude Docs, nombra el formato, como `.docx` o un archivo Markdown en el repositorio. Para desactivar solo el conector `claude.ai Claude Docs`, consulta [Desactivar conectores de claude.ai](https://code.claude.com/docs/es/mcp.md#disable-claude-ai-connectors).

344 

345Para desactivar el conector, agregue `claude.ai Claude Docs` a `deniedMcpServers` o use el botón de alternancia `/mcp`, ambos descritos en [Desactivar conectores de claude.ai](https://code.claude.com/docs/es/mcp.md#disable-claude-ai-connectors).

346 344 

347## Restricciones de página345## Restricciones de página

348 346 

Details

458 458 

459#### Cómo surten efecto las claves de hooks y skills en la configuración del proceso padre459#### Cómo surten efecto las claves de hooks y skills en la configuración del proceso padre

460 460 

461Si pasas `disableAllHooks: true` como ajuste del proceso padre mediante la opción `managedSettings` del Agent SDK, no todos los hooks se detienen. Tus [callbacks de hooks del SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md) siguen ejecutándose, al igual que los hooks del administrador, que tu aplicación no puede desactivar.461Las claves que tu aplicación pasa en la opción [`managedSettings`](https://code.claude.com/docs/es/agent-sdk/typescript#options) del Agent SDK son configuración del proceso padre. En una máquina en la que un administrador implementa configuración administrada, Claude Code ignora la configuración del proceso padre a menos que el administrador [permita que un host integrador agregue políticas](https://code.claude.com/docs/es/managed-settings.md#let-an-embedding-host-add-policy).

462 462 

463En una máquina en la que un administrador implementa configuración administrada, Claude Code ignora la configuración del proceso padre a menos que el administrador [permita que un host integrador agregue políticas](https://code.claude.com/docs/es/managed-settings.md#let-an-embedding-host-add-policy).463Si pasas [`disableAllHooks: true`](https://code.claude.com/docs/es/settings-reference#disableallhooks) en `managedSettings`:

464 

465* **Se detienen**: los hooks de usuario, de proyecto y locales, además de los hooks declarados en el frontmatter de un agente o en la [opción `settings`](https://code.claude.com/docs/es/agent-sdk/typescript#options) del SDK.

466* **Siguen ejecutándose**: los [callbacks de hooks del SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md) de tu aplicación y los hooks de un administrador definidos en la configuración administrada. Tu aplicación no puede desactivar los hooks del administrador.

464 467 

465| Lo que pasas | Lo que sucede |468| Lo que pasas | Lo que sucede |

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

467| `disableAllHooks: true` | Se trata como `allowManagedHooksOnly: true`, por lo que los hooks enumerados como [bloqueados con `allowManagedHooksOnly`](https://code.claude.com/docs/es/settings-reference#what-runs-under-allowmanagedhooksonly) se detienen, y también los hooks de la [opción `settings`](https://code.claude.com/docs/es/agent-sdk/typescript#options) del SDK. |470| `hooks`, o `allowedHttpHookUrls` o `httpHookAllowedEnvVars` con entradas | Claude Code ignora la clave. Usa en su lugar la opción `settings` del SDK. |

468| [`disableSkillShellExecution: true`](https://code.claude.com/docs/es/settings-reference#disableskillshellexecution) | Surte efecto. |

469| `allowedHttpHookUrls: []` | Surte efecto a menos que el administrador defina `hooks` o habilite un plugin. No se ejecuta ningún hook HTTP, excepto para las URL que enumere otra fuente de configuración. |471| `allowedHttpHookUrls: []` | Surte efecto a menos que el administrador defina `hooks` o habilite un plugin. No se ejecuta ningún hook HTTP, excepto para las URL que enumere otra fuente de configuración. |

470| `httpHookAllowedEnvVars: []` | Surte efecto a menos que el administrador defina `hooks` o habilite un plugin. Los encabezados de los hooks HTTP solo pueden incluir las variables de entorno que enumere otra fuente de configuración. |472| `httpHookAllowedEnvVars: []` | Surte efecto a menos que el administrador defina `hooks` o habilite un plugin. Los encabezados de los hooks HTTP solo pueden incluir las variables de entorno que enumere otra fuente de configuración. |

471| `allowedHttpHookUrls` o `httpHookAllowedEnvVars` con entradas | Claude Code lo ignora, ya que combinarlo ampliaría la lista de un administrador. Usa en su lugar la opción `settings` del SDK. |473| [`disableSkillShellExecution: true`](https://code.claude.com/docs/es/settings-reference#disableskillshellexecution) | Surte efecto. |

472 474 

473Pasar estas claves en `managedSettings` requiere Claude Code v2.1.309 o posterior, o el Agent SDK de TypeScript v0.3.309 o posterior.475Pasar estas claves en `managedSettings` requiere Claude Code v2.1.309 o posterior, o el Agent SDK de TypeScript v0.3.309 o posterior.

474 476 

Details

8 8 

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

10>10>

11> Las sesiones en la nube están disponibles en los planes Pro, Max y Team, y para usuarios Enterprise con asientos premium o asientos Chat + Claude Code. Si tu organización Enterprise administra tu acceso con [roles personalizados](https://support.claude.com/en/articles/13930452), también necesitas un rol que incluya el permiso de sesiones en la nube. Pídele a un Owner que revise tus roles y lo agregue en [**Organization settings > Roles**](https://claude.ai/admin-settings/roles) si falta.11> Las sesiones en la nube están disponibles en los planes Pro, Max y Team, y para usuarios Enterprise con asientos premium o asientos Chat + Claude Code. Si tu acceso se rige por [roles personalizados](https://support.claude.com/en/articles/13930452), también necesitas un rol con el permiso de sesiones en la nube para iniciar sesiones en la infraestructura de Anthropic desde el navegador, las aplicaciones o la terminal. Pídele a un Owner que lo agregue a uno de tus roles en [**Organization settings > Roles**](https://claude.ai/admin-settings/roles).

12 12 

13Una sesión en la nube es una sesión de Claude Code que se ejecuta en infraestructura en la nube en lugar de en tu máquina. De forma predeterminada, se ejecuta en infraestructura que Anthropic administra, o en el [entorno autohospedado](https://code.claude.com/docs/es/self-hosted-environments) de tu organización cuando se enruta allí. La sesión sigue ejecutándose después de cerrar tu portátil, y puedes verificarla o dirigirla desde cualquier dispositivo. Cuenta para los límites de uso de tu plan junto con el resto de tu uso de Claude y Claude Code, y no hay un cargo aparte por la VM en la nube.13Una sesión en la nube es una sesión de Claude Code que se ejecuta en infraestructura en la nube en lugar de en tu máquina. De forma predeterminada, se ejecuta en infraestructura que Anthropic administra, o en el [entorno autohospedado](https://code.claude.com/docs/es/self-hosted-environments) de tu organización cuando se enruta allí. La sesión sigue ejecutándose después de cerrar tu portátil, y puedes verificarla o dirigirla desde cualquier dispositivo. Cuenta para los límites de uso de tu plan junto con el resto de tu uso de Claude y Claude Code, y no hay un cargo aparte por la VM en la nube.

14 14 

Details

109 109 

110#### Agregar un secreto110#### Agregar un secreto

111 111 

112Agregas secretos uno a la vez, y no puedes editar un secreto después de agregarlo. Para cambiar los hosts o el valor de un secreto, elimínalo y agrégalo de nuevo.112Agregas secretos uno a la vez. Para cambiar los hosts o el valor de un secreto, elimínalo y agrégalo de nuevo.

113 113 

114Para agregar un secreto a un [entorno compartido](#organization-shared-environments), ábrelo para editar desde la página **Entornos en la nube** en la [configuración de administración](https://claude.ai/admin-settings) y luego continúa desde el paso 2 en su sección **Secretos de red**. Si estás en un plan Team y no tienes un [rol de administrador de la organización](#requirements), sigue el paso 1 en tu propio entorno y luego [completa el formulario más corto](#add-a-secret-without-the-role).114Para agregar un secreto a un [entorno compartido](#organization-shared-environments), ábrelo para editar desde la página **Entornos en la nube** en la [configuración de administración](https://claude.ai/admin-settings) y luego continúa desde el paso 2 en su sección **Secretos de red**. Si estás en un plan Team y no tienes un [rol de administrador de la organización](#requirements), sigue el paso 1 en tu propio entorno y luego [completa el formulario más corto](#add-a-secret-without-the-role).

115 115 


119 119 

120**2. Agregar el secreto**120**2. Agregar el secreto**

121 121 

122Selecciona **Agregar secreto** y completa el formulario. Mantén el **Tipo de secreto** predeterminado, **Bearer**, para una clave de API que viaja en un encabezado de solicitud, y completa estos campos:122Selecciona **Agregar secreto**, con la etiqueta **Agregar** en la configuración de administración, y completa el formulario. Mantén el **Tipo de secreto** predeterminado, **Bearer**, para una clave de API que viaja en un encabezado de solicitud, y completa estos campos:

123 123 

124* **Nombre**: una etiqueta para el secreto, como `Internal billing API`124* **Nombre**: una etiqueta para el secreto, como `Internal billing API`

125* **Sitios web permitidos**: los hosts de la API, como `api.example.com`. Un `*.` inicial coincide con cada subdominio125* **Sitios web permitidos**: los hosts de la API, como `api.example.com`. Un `*.` inicial coincide con cada subdominio


443 443 

444### Requisitos del script444### Requisitos del script

445 445 

446Un script de configuración tiene tres restricciones para escribir:446Un script de configuración tiene cuatro restricciones que debes tener en cuenta al escribirlo:

447 447 

448* **Salir con cero**: si el script sale con un valor distinto de cero, la sesión no se inicia. Agregue `|| true` a comandos no críticos para que una falla de instalación intermitente no bloquee la sesión.448* **Salir con cero**: si el script sale con un valor distinto de cero, la sesión no se inicia. Agregue `|| true` a comandos no críticos para que una falla de instalación intermitente no bloquee la sesión.

449* **Terminar dentro de cinco minutos**: mantenga el tiempo de ejecución total del script por debajo de aproximadamente cinco minutos para que el [almacenamiento en caché del entorno](#environment-caching) pueda compilarse. Cuando la configuración tarda más que eso, el entorno no se almacena en caché. Ejecute instalaciones independientes en paralelo con `&` y `wait`, y mueva cualquier descarga única que no quepa a un hook [SessionStart](#setup-scripts-vs-sessionstart-hooks) que lo inicie en segundo plano. Si las nuevas sesiones se atascan o fallan durante la configuración, consulte [Las nuevas sesiones se cuelgan o agotan el tiempo de espera durante la configuración](https://code.claude.com/docs/es/web-quickstart.md#new-sessions-hang-or-time-out-during-setup).449* **Terminar dentro de cinco minutos**: mantenga el tiempo de ejecución total del script por debajo de aproximadamente cinco minutos para que el [almacenamiento en caché del entorno](#environment-caching) pueda compilarse. Cuando la configuración tarda más que eso, el entorno no se almacena en caché. Ejecute instalaciones independientes en paralelo con `&` y `wait`, y mueva cualquier descarga única que no quepa a un hook [SessionStart](#setup-scripts-vs-sessionstart-hooks) que lo inicie en segundo plano. Si las nuevas sesiones se atascan o fallan durante la configuración, consulte [Las nuevas sesiones se cuelgan o agotan el tiempo de espera durante la configuración](https://code.claude.com/docs/es/web-quickstart.md#new-sessions-hang-or-time-out-during-setup).

450* **Acceso a la red para instalaciones**: las instalaciones de paquetes necesitan alcanzar registros. El nivel **Trusted** predeterminado cubre [registros de paquetes comunes](#default-allowed-domains) incluyendo npm, PyPI, RubyGems y crates.io; con acceso a la red **None**, las instalaciones fallan.450* **Acceso a la red para instalaciones**: las instalaciones de paquetes necesitan alcanzar registros. El nivel **Trusted** predeterminado cubre [registros de paquetes comunes](#default-allowed-domains) incluyendo npm, PyPI, RubyGems y crates.io; con acceso a la red **None**, las instalaciones fallan.

451* **Las variables del entorno aún no están definidas**: el script se ejecuta antes de que la sesión defina las [variables de entorno](#set-environment-variables) del entorno. Define en el propio script cualquier valor que el script necesite.

451 452 

452### Almacenamiento en caché del entorno453### Almacenamiento en caché del entorno

453 454 

Details

123 123 

124Cuando una revisión no aplica un archivo incluido, comprueba cada uno de estos puntos:124Cuando una revisión no aplica un archivo incluido, comprueba cada uno de estos puntos:

125 125 

126* **Ubicación**: mueve el archivo a la raíz del repositorio. Una ruta hacia un subdirectorio, como `@docs/review-rules.md`, no se incluye.126* **Ubicación**: mueve el archivo a la raíz del repositorio. Salvo en el caso de un [archivo de skill](#include-a-skill-file), una ruta hacia un subdirectorio, como `@docs/review-rules.md`, no se incluye.

127* **Nombre**: haz coincidir el nombre del archivo exactamente, incluidas mayúsculas y minúsculas, y usa un nombre sin espacios. Una línea cuyo nombre no coincide con ningún archivo junto a `REVIEW.md` permanece en `REVIEW.md` como texto sin formato, y la ejecución de comprobación no la reporta como una inclusión omitida.127* **Nombre**: haz coincidir el nombre del archivo exactamente, incluidas mayúsculas y minúsculas, y usa un nombre sin espacios. Una línea cuyo nombre no coincide con ningún archivo junto a `REVIEW.md` permanece en `REVIEW.md` como texto sin formato, y la ejecución de comprobación no la reporta como una inclusión omitida.

128* **Un solo nivel**: enumera todos los archivos en el `REVIEW.md` raíz. Una línea `@` en un archivo incluido o en un `REVIEW.md` de subdirectorio permanece como texto sin formato, y un enlace de markdown a otro archivo no es una inclusión.128* **Un solo nivel**: enumera todos los archivos en el `REVIEW.md` raíz. Una línea `@` en un archivo incluido o en un `REVIEW.md` de subdirectorio permanece como texto sin formato ([los archivos de skill son distintos](#include-a-skill-file)), y un enlace de markdown a otro archivo no es una inclusión.

129* **Límites**: incluye como máximo ocho archivos distintos y mantén `REVIEW.md` y los archivos que incluye por debajo de 150,000 bytes en conjunto. Un archivo que alcanzaría el límite de bytes se omite por completo, no se recorta. La ejecución de comprobación reporta cuántas líneas de inclusión omitió por cualquiera de los dos límites.129* **Límites**: incluye como máximo ocho archivos distintos y mantén `REVIEW.md` y los archivos que incluye por debajo de 150,000 bytes en conjunto. Un archivo que alcanzaría el límite de bytes se omite por completo, no se recorta. La ejecución de comprobación reporta cuántas líneas de inclusión omitió por cualquiera de los dos límites.

130* **Enlaces**: mantén 64 enlaces de markdown o menos entre `REVIEW.md` y los archivos que incluye. Los enlaces a direcciones `http`, `https` o `mailto` y a anclas `#` no cuentan. Si se supera ese límite, la revisión omite todo tu `REVIEW.md` raíz, no solo los archivos incluidos. La ejecución de comprobación entonces [indica que las instrucciones no se aplicaron](https://code.claude.com/docs/es/code-review-troubleshooting.md#the-check-run-mentions-review-md).130* **Enlaces**: mantén 64 enlaces de markdown o menos entre `REVIEW.md` y los archivos que incluye. Los enlaces a direcciones `http`, `https` o `mailto` y a anclas `#` no cuentan, ni tampoco los enlaces de un [archivo de skill](#include-a-skill-file). Si se supera ese límite, la revisión omite todo tu `REVIEW.md` raíz, no solo los archivos incluidos. La ejecución de comprobación entonces [indica que las instrucciones no se aplicaron](https://code.claude.com/docs/es/code-review-troubleshooting.md#the-check-run-mentions-review-md).

131* **Copia fusionada**: fusiona el archivo incluido en la [rama desde la que se lee `REVIEW.md`](#which-branch-review-md-is-read-from). La revisión lee ambos desde el mismo commit, nunca desde los propios cambios del pull request.131* **Copia fusionada**: fusiona el archivo incluido en la [rama desde la que se lee `REVIEW.md`](#which-branch-review-md-is-read-from). La revisión lee ambos desde el mismo commit, nunca desde los propios cambios del pull request.

132 132 

133### Incluye un archivo de skill

134 

135Para que las revisiones sigan las pautas que mantienes en un [skill](https://code.claude.com/docs/es/skills.md), incluye el `SKILL.md` del skill en tu `REVIEW.md` raíz. Code Review no ejecuta skills.

136 

137Agrega `@` y la ruta a `SKILL.md`, con la forma `.claude/skills/<folder>/SKILL.md`, en una línea propia:

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 

149Protege la [rama desde la que se lee `REVIEW.md`](#which-branch-review-md-is-read-from), porque Code Review incluye un archivo de skill solo cuando lee `REVIEW.md` desde una rama protegida. El archivo de skill cuenta para los límites de ocho archivos y 150,000 bytes, y tiene su propio límite de 30,000 bytes.

150 

151#### Escribe una línea de skill que Code Review incluya

152 

153Usa un nombre de carpeta sin espacios. Una línea con un espacio en su ruta permanece en `REVIEW.md` como texto sin formato, y la ejecución de comprobación no la reporta como una inclusión omitida.

154 

155Si la línea `@` de un skill incumple alguna de las reglas siguientes, Code Review no incluye el skill desde esa línea:

156 

157* **Ruta**: escribe la ruta como `.claude/skills/<folder>/SKILL.md` desde la raíz del repositorio, con la carpeta del skill directamente bajo `skills/`. A diferencia de un nombre de archivo en la raíz, una ruta de esta forma que no coincide con ningún archivo se omite y se cuenta.

158* **Origen**: copia las pautas de cualquier otro archivo bajo `.claude/`, o de un [skill integrado, personal o de plugin](https://code.claude.com/docs/es/skills.md#where-skills-live), en un archivo junto a `REVIEW.md`. No puedes incluirlos directamente.

159* **Archivo**: haz commit de `SKILL.md` como un archivo de texto normal. Code Review no sigue enlaces simbólicos, ya sea que el enlace sea el archivo o una carpeta de su ruta.

160* **Tamaño**: mantén `SKILL.md` en 30,000 bytes o menos, incluido el frontmatter

161* **Cantidad**: escribe como máximo ocho líneas de skill. Una línea repetida vuelve a contar para las ocho.

162* **Bloques en `REVIEW.md`**: mantén la línea `@` fuera de los bloques de código delimitados. Cierra cada comentario HTML y cada bloque `<pre>`, `<script>`, `<style>` o `<textarea>` que esté por encima de ella.

163 

164Cuando Code Review omite una línea de skill por incumplir la regla de Archivo, Tamaño, Cantidad o Bloques, el [mensaje sobre líneas de inclusión omitidas](https://code.claude.com/docs/es/code-review-troubleshooting.md#the-check-run-mentions-review-md) de la ejecución de comprobación la cuenta. El mensaje aparece solo cuando la revisión aplica `REVIEW.md` desde una rama protegida.

165 

166#### Comprueba qué obtiene una revisión de un skill

167 

168Cuando el skill se incluye, una revisión obtiene el cuerpo de `SKILL.md` y nada más del skill, así que revisa el skill con la lista siguiente.

169 

170* **Frontmatter**: repite en el cuerpo todo lo que una revisión necesite del [frontmatter](https://code.claude.com/docs/es/skills.md#frontmatter-reference), por ejemplo, las condiciones que `description` indica para usar el skill

171* **Comandos inyectados**: escribe explícitamente lo que proporcionaría un [comando `!`](https://code.claude.com/docs/es/skills#inject-dynamic-context). Code Review no ejecuta el comando y reemplaza toda la línea o el bloque que lo contiene con un marcador de posición.

172* **Sustituciones**: reemplaza `$ARGUMENTS` y otras [sustituciones](https://code.claude.com/docs/es/skills.md#available-string-substitutions) con texto fijo, porque una revisión no pasa argumentos y las deja tal como están escritas

173* **Archivos de apoyo**: copia en `SKILL.md` lo que una revisión necesite, porque Code Review no carga scripts, archivos enlazados ni referencias `@file`

174* **Exclusiones y límites de Nit**: escribe las instrucciones que excluyen hallazgos o limitan los Nits en `REVIEW.md` o en un archivo junto a él, no en el skill. Code Review no acepta el texto de un skill como motivo para ninguna de las dos cosas.

175* **Enlaces a archivos del repositorio**: indica con palabras a qué apunta un enlace o una referencia `@file`. La revisión ve la ruta como texto sin formato o como un marcador de posición.

176 

177Si editas los comandos `!`, `$ARGUMENTS` o los enlaces del skill, también cambias cómo funciona en Claude Code. Si tu equipo depende de ellos, copia las pautas en un archivo junto a `REVIEW.md` e incluye ese archivo en lugar del skill.

178 

179#### Caracteres que Code Review cambia en el texto de un skill

180 

181Code Review cambia algunos caracteres del texto del skill, por lo que tus ejemplos de código llegan a una revisión con la forma siguiente.

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 

191Cuando una regla dependa de uno de esos caracteres, indícala también con palabras.

192 

133### Desde qué rama se lee REVIEW\.md193### Desde qué rama se lee REVIEW\.md

134 194 

135Code Review lee `REVIEW.md` desde la rama base del pull request o desde la rama predeterminada, nunca desde los propios cambios del pull request. Para cambiar el comportamiento de la revisión, fusiona primero el cambio en `REVIEW.md`.195Code Review lee `REVIEW.md` desde la rama base del pull request o desde la rama predeterminada, nunca desde los propios cambios del pull request. Para cambiar el comportamiento de la revisión, fusiona primero el cambio en `REVIEW.md`.


140* Excluir rutas, archivos o clases de problemas200* Excluir rutas, archivos o clases de problemas

141* Limitar los comentarios de tipo nit201* Limitar los comentarios de tipo nit

142 202 

203Escribe las exclusiones y los límites de Nit en `REVIEW.md` o en un archivo junto a él, no en un [skill incluido](#include-a-skill-file).

204 

143#### Qué cuenta como protección de rama205#### Qué cuenta como protección de rama

144 206 

145Code Review considera protección los siguientes ajustes:207Code Review considera protección los siguientes ajustes:

Details

67 67 

68## El check run menciona REVIEW\.md68## El check run menciona REVIEW\.md

69 69 

70Estos son tres de los mensajes que un check run puede incluir sobre `REVIEW.md`:70Estos son cuatro de los mensajes que un check run puede incluir sobre `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."**: la revisión leyó solo el archivo de la raíz. Consulta [De qué rama se lee REVIEW.md](https://code.claude.com/docs/es/code-review-customize.md#which-branch-review-md-is-read-from) para saber qué cambia al proteger la rama.72* **"This review applied the repository's review instructions (REVIEW\.md) from its default branch, which is not protected against direct pushes."**: la revisión leyó solo el archivo de la raíz. Consulta [De qué rama se lee REVIEW.md](https://code.claude.com/docs/es/code-review-customize.md#which-branch-review-md-is-read-from) para saber qué cambia al proteger la rama.

73* **"were not applied to this review: branch protection could not be confirmed"**: la revisión no leyó ningún `REVIEW.md`.73* **"were not applied to this review: branch protection could not be confirmed"**: la revisión no leyó ningún `REVIEW.md`.


75 * **Demasiados enlaces**: contiene más de 64 enlaces de Markdown. Reduce los enlaces a [64 o menos](https://code.claude.com/docs/es/code-review-customize.md#include-other-files-in-review-md).75 * **Demasiados enlaces**: contiene más de 64 enlaces de Markdown. Reduce los enlaces a [64 o menos](https://code.claude.com/docs/es/code-review-customize.md#include-other-files-in-review-md).

76 * **Un enlace que la revisión no puede analizar**: tiene un enlace de Markdown mal formado. Corrige o elimina el enlace.76 * **Un enlace que la revisión no puede analizar**: tiene un enlace de Markdown mal formado. Corrige o elimina el enlace.

77 * **Un enlace a un archivo modificado**: enlaza a un archivo o carpeta que este pull request modifica, y la revisión no pudo dejar fuera solo las líneas con ese enlace. Escribe la regla directamente en `REVIEW.md`.77 * **Un enlace a un archivo modificado**: enlaza a un archivo o carpeta que este pull request modifica, y la revisión no pudo dejar fuera solo las líneas con ese enlace. Escribe la regla directamente en `REVIEW.md`.

78* **"include line(s) in the root REVIEW\.md were skipped on this review"**: tu `REVIEW.md` de la raíz se aplicó, pero los archivos que nombran esas líneas no. Revisa las listas en [Incluir otros archivos en REVIEW.md](https://code.claude.com/docs/es/code-review-customize.md#include-other-files-in-review-md) y, en el caso de un skill, en [Incluir un archivo de skill](https://code.claude.com/docs/es/code-review-customize.md#include-a-skill-file).

78 79 

79## Problemas de configuración80## Problemas de configuración

80 81 

desktop.md +4 −4

Details

844| [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/es/env-vars#variables) o [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/es/env-vars#variables) | Defínela en [uno de los lugares donde definirías una variable para servidores de desarrollo](#set-environment-variables-for-dev-servers) y luego cierra y vuelve a abrir Desktop |844| [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/es/env-vars#variables) o [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/es/env-vars#variables) | Defínela en [uno de los lugares donde definirías una variable para servidores de desarrollo](#set-environment-variables-for-dev-servers) y luego cierra y vuelve a abrir Desktop |

845| `API_TIMEOUT_MS`, `ANTHROPIC_BASE_URL` u otra variable que Desktop define por sí mismo | Consulta [Variables de entorno que Desktop define por sí mismo](#environment-variables-desktop-sets-itself) |845| `API_TIMEOUT_MS`, `ANTHROPIC_BASE_URL` u otra variable que Desktop define por sí mismo | Consulta [Variables de entorno que Desktop define por sí mismo](#environment-variables-desktop-sets-itself) |

846 846 

847En macOS o Linux, si ya definiste tu variable con `export` en `~/.zshrc` o `~/.bashrc`, consulta [Variable exportada ausente o incorrecta en los comandos que ejecuta Claude](#exported-variable-missing-or-wrong-in-commands-claude-runs).847En macOS o Linux, si una variable que estableciste con `export` falta o tiene un valor incorrecto en un comando que ejecuta Claude, consulta [Variable exportada ausente o incorrecta en los comandos que ejecuta Claude](#exported-variable-missing-or-wrong-in-commands-claude-runs).

848 848 

849#### Establecer variables de entorno para sesiones locales849#### Establecer variables de entorno para sesiones locales

850 850 


896 896 

897**1. Inicia una nueva sesión**897**1. Inicia una nueva sesión**

898 898 

899Pídele a Claude que vuelva a ejecutar el comando.899Pídele a Claude que ejecute el comando de nuevo.

900 900 

901**2. Cierra y vuelve a abrir Desktop**901**2. Cierra y vuelve a abrir Desktop**

902 902 


904 904 

905**3. Revisa tus variables guardadas**905**3. Revisa tus variables guardadas**

906 906 

907Si un comando recibe el valor incorrecto, comprueba si también definiste la variable en un [entorno guardado](#use-edit-or-remove-a-saved-environment) o en el [editor del entorno local](#use-the-local-environment-editor). Si es así, cambia ahí el valor e inicia una nueva sesión.907Si un comando recibe un valor incorrecto, comprueba si también estableciste la variable en un [entorno guardado](#use-edit-or-remove-a-saved-environment) o en el [editor del entorno local](#use-the-local-environment-editor). Si es así, cambia el valor allí e inicia una nueva sesión.

908 908 

909**4. Usa un entorno guardado**909**4. Usa un entorno guardado**

910 910 

911Agrega la variable a un [entorno local guardado](#set-environment-variables-for-local-sessions) y luego inicia una nueva sesión desde ese entorno. Para una variable como `PATH` o `CLAUDE_CONFIG_DIR`, sigue en su lugar [sus propias instrucciones](#environment-variables-in-local-sessions).911Agrega la variable a un [entorno local guardado](#set-environment-variables-for-local-sessions) y luego inicia una nueva sesión desde ese entorno. Para una variable como `PATH`, `CLAUDE_CONFIG_DIR` o `API_TIMEOUT_MS`, sigue en su lugar [sus propias instrucciones](#environment-variables-in-local-sessions).

912 912 

913Antes de v2.1.304, Claude Code no pasa las variables exportadas a los comandos, así que [comprueba qué versión ejecuta la sesión](#claude-code-version-in-the-code-tab).913Antes de v2.1.304, Claude Code no pasa las variables exportadas a los comandos, así que [comprueba qué versión ejecuta la sesión](#claude-code-version-in-the-code-tab).

914 914 

Details

15 15 

16Esta página cubre las tareas programadas locales; para las tareas programadas en la nube y sus opciones de activación, consulta [Automatizar el trabajo con tareas programadas](https://code.claude.com/docs/es/routines.md).16Esta página cubre las tareas programadas locales; para las tareas programadas en la nube y sus opciones de activación, consulta [Automatizar el trabajo con tareas programadas](https://code.claude.com/docs/es/routines.md).

17 17 

18> [!NOTE]

19>

20> Si tu aplicación muestra la función con su [nombre anterior](https://code.claude.com/docs/es/routines.md#where-the-name-routines-still-appears), haz clic en **Routines** dondequiera que esta página diga **Scheduled** y en **New routine** donde diga **New task**.

21 

18## Comparar opciones de programación22## Comparar opciones de programación

19 23 

20Claude Code ofrece tres formas de programar trabajo recurrente o puntual:24Claude Code ofrece tres formas de programar trabajo recurrente o puntual:


45 49 

46**1. Abre la página de tareas programadas**50**1. Abre la página de tareas programadas**

47 51 

48En la [pestaña **Code**](https://code.claude.com/docs/es/desktop.md), haz clic en **Scheduled** en la barra lateral o en el menú **More** de la barra lateral.52En la [pestaña **Code**](https://code.claude.com/docs/es/desktop.md), haz clic en **Scheduled** en la barra lateral o en el menú **More** de la barra lateral. Si la barra lateral muestra **Routines** en lugar de **Scheduled**, haz clic en **Routines**, luego haz clic en **New routine** y continúa con [Formulario de página completa](#full-page-form).

49 53 

50**2. Inicia una nueva tarea**54**2. Inicia una nueva tarea**

51 55 

52Haz clic en **New task**. Si se abre un menú con **Create with Claude** y **Set up manually**, selecciona **Set up manually**. Se abre el cuadro de diálogo **New scheduled task**. Si **Only on this computer** aparece en la parte superior del cuadro de diálogo, ve a [Cuadro de diálogo con Only on this computer en la parte superior](#dialog-with-only-on-this-computer-at-the-top) antes de ingresar cualquier dato.56Haz clic en **New task** para abrir el cuadro de diálogo **New scheduled task**. Revisa si aparecen estas pantallas antes de continuar:

57 

58* Si se abre un menú con **Create with Claude** y **Set up manually**, selecciona **Set up manually** para abrir el cuadro de diálogo.

59* Si **Only on this computer** aparece en la parte superior del cuadro de diálogo, ve a [Cuadro de diálogo con Only on this computer en la parte superior](#dialog-with-only-on-this-computer-at-the-top) antes de ingresar cualquier dato.

60* Si se abre un menú con **Local** y **Cloud**, o se abre una página completa en lugar del cuadro de diálogo, ve a [Formulario de página completa](#full-page-form).

53 61 

54**3. Ponle nombre a la tarea**62**3. Ponle nombre a la tarea**

55 63 


99 107 

100Haz clic en **Create**. Se abre la página de detalles de la tarea.108Haz clic en **Create**. Se abre la página de detalles de la tarea.

101 109 

110### Formulario de página completa

111 

112Si se abre un menú con **Local** y **Cloud**, selecciona **Local**. Se abre una página titulada **New local routine** o **New local scheduled task**. Completa sus campos:

113 

114* **Name**: ingresa un nombre que sea único entre todas tus tareas.

115* **Description**: ingresa una.

116* **Instructions**: ingresa lo que Claude debe hacer cuando se ejecute la tarea. En el mismo cuadro, selecciona el modo de permisos, el modelo y la carpeta en la que se ejecuta la tarea.

117* **Schedule**: selecciona una de las [opciones de programación](#schedule-options).

118 

119Si **Create** no está disponible, pasa el cursor sobre el botón para ver qué le falta todavía al formulario. Haz clic en **Create** y se abre la página de detalles de la tarea.

120 

102## Opciones de programación121## Opciones de programación

103 122 

104Cuando activas **Only on this computer** en **Advanced settings**, la tarjeta **Trigger** ofrece Hourly, Daily, Weekdays y Weekly. Para obtener **Manual** o **Custom** en una tarea así, abre su [formulario **Edit**](#manage-scheduled-tasks) después de crearla. Ese formulario y el [diálogo con **Only on this computer** en la parte superior](#dialog-with-only-on-this-computer-at-the-top) ofrecen estas seis opciones:123Cuando activas **Only on this computer** en **Advanced settings**, la tarjeta **Trigger** ofrece Hourly, Daily, Weekdays y Weekly. Para obtener **Manual** o **Custom** en una tarea así, abre su [formulario **Edit**](#manage-scheduled-tasks) después de crearla. Ese formulario, el [diálogo con **Only on this computer** en la parte superior](#dialog-with-only-on-this-computer-at-the-top) y el [formulario de página completa](#full-page-form) ofrecen estas seis opciones:

105 124 

106* **Hourly**: se ejecuta cada hora125* **Hourly**: se ejecuta cada hora

107* **Daily**: se ejecuta todos los días a la hora local que seleccione126* **Daily**: se ejecuta todos los días a la hora local que seleccione

env-vars.md +1 −1

Details

298| `CLAUDE_CODE_FORCE_SESSION_PERSISTENCE` | Establécela en `1` para forzar la persistencia de la transcripción, el historial de prompts y el registro en `claude agents` incluso cuando este `claude` se haya iniciado desde dentro de otra sesión de Claude Code. Úsala cuando un valor heredado de `CLAUDE_CODE_CHILD_SESSION`, por ejemplo de una sesión de `screen` o de un lanzador en segundo plano iniciado por primera vez por la herramienta Bash de Claude Code, haga que una sesión genuina de nivel superior se clasifique erróneamente como anidada. A partir de la v2.1.178, Claude Code detecta automáticamente el caso de tmux e ignora el marcador heredado, por lo que tmux ya no necesita esta variable. También se respeta en la v2.1.169 y anteriores; no tiene efecto en la v2.1.170 ni en la v2.1.171, donde se eliminó la detección de sesiones anidadas que sobrescribe |298| `CLAUDE_CODE_FORCE_SESSION_PERSISTENCE` | Establécela en `1` para forzar la persistencia de la transcripción, el historial de prompts y el registro en `claude agents` incluso cuando este `claude` se haya iniciado desde dentro de otra sesión de Claude Code. Úsala cuando un valor heredado de `CLAUDE_CODE_CHILD_SESSION`, por ejemplo de una sesión de `screen` o de un lanzador en segundo plano iniciado por primera vez por la herramienta Bash de Claude Code, haga que una sesión genuina de nivel superior se clasifique erróneamente como anidada. A partir de la v2.1.178, Claude Code detecta automáticamente el caso de tmux e ignora el marcador heredado, por lo que tmux ya no necesita esta variable. También se respeta en la v2.1.169 y anteriores; no tiene efecto en la v2.1.170 ni en la v2.1.171, donde se eliminó la detección de sesiones anidadas que sobrescribe |

299| `CLAUDE_CODE_FORCE_STRIKETHROUGH` | Establécela en `1` para forzar la representación tachada de `~~text~~` en las respuestas de Claude cuando tu terminal lo admite pero no se detecta automáticamente, por ejemplo a través de SSH sin reenviar `TERM_PROGRAM`. Sin esto, las terminales no detectadas muestran los marcadores `~~` literales en lugar de representar el texto tachado. Requiere Claude Code v2.1.186 o posterior |299| `CLAUDE_CODE_FORCE_STRIKETHROUGH` | Establécela en `1` para forzar la representación tachada de `~~text~~` en las respuestas de Claude cuando tu terminal lo admite pero no se detecta automáticamente, por ejemplo a través de SSH sin reenviar `TERM_PROGRAM`. Sin esto, las terminales no detectadas muestran los marcadores `~~` literales en lugar de representar el texto tachado. Requiere Claude Code v2.1.186 o posterior |

300| `CLAUDE_CODE_FORCE_SYNC_OUTPUT` | Establécela en `1` para forzar la activación de la [salida sincronizada](https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036) del modo privado DEC 2026 cuando tu terminal la admite pero no se detecta automáticamente. Útil para emuladores como `eat` de Emacs que implementan BSU/ESU pero no responden a la sonda de capacidades. No tiene efecto bajo tmux. A diferencia de `CLAUDE_CODE_NO_FLICKER`, que cambia a la [representación en pantalla completa](https://code.claude.com/docs/es/fullscreen.md), esta no cambia el renderizador |300| `CLAUDE_CODE_FORCE_SYNC_OUTPUT` | Establécela en `1` para forzar la activación de la [salida sincronizada](https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036) del modo privado DEC 2026 cuando tu terminal la admite pero no se detecta automáticamente. Útil para emuladores como `eat` de Emacs que implementan BSU/ESU pero no responden a la sonda de capacidades. No tiene efecto bajo tmux. A diferencia de `CLAUDE_CODE_NO_FLICKER`, que cambia a la [representación en pantalla completa](https://code.claude.com/docs/es/fullscreen.md), esta no cambia el renderizador |

301| `CLAUDE_CODE_FORCE_TERMINAL_IMAGES` | Establécela en `1` para dibujar los [elementos `Image` de los mods](https://code.claude.com/docs/es/plugins/mods/reference#elements) como imágenes cuando tu terminal dibuja imágenes del protocolo de gráficos de kitty con marcadores de posición Unicode y aun así ves el texto `alt` atenuado de un `Image`. Consulta [qué terminales dibujan un `Image`](https://code.claude.com/docs/es/plugins/mods/gallery#image-and-client) y por qué esta variable no ayuda dentro de tmux o screen |301| `CLAUDE_CODE_FORCE_TERMINAL_IMAGES` | Establécelo en `1` para dibujar los [elementos `Image` de mods](https://code.claude.com/docs/es/plugins/mods/reference#elements) como imágenes cuando tu terminal dibuja imágenes del protocolo de gráficos de kitty con marcadores de posición Unicode y aun así ves el texto `alt` atenuado de un `Image`. Consulta [qué terminales dibujan un `Image` y dónde no establecer esta variable](https://code.claude.com/docs/es/plugins/mods/gallery#image-and-client) |

302| `CLAUDE_CODE_FORK_SUBAGENT` | Controla el modo fork, que está activado de forma predeterminada y permite que Claude inicie [forks](https://code.claude.com/docs/es/sub-agents.md#fork-the-current-conversation) por su cuenta. Mientras el modo fork está activado, Claude tampoco puede [esperar a un subagente](https://code.claude.com/docs/es/sub-agents.md#run-subagents-in-foreground-or-background) en sesiones interactivas de terminal, VS Code o escritorio en tu máquina. Establécela en `0` para desactivar el modo fork. Para las versiones, consulta [Desactivar el modo fork](https://code.claude.com/docs/es/sub-agents.md#turn-fork-mode-on-or-off) |302| `CLAUDE_CODE_FORK_SUBAGENT` | Controla el modo fork, que está activado de forma predeterminada y permite que Claude inicie [forks](https://code.claude.com/docs/es/sub-agents.md#fork-the-current-conversation) por su cuenta. Mientras el modo fork está activado, Claude tampoco puede [esperar a un subagente](https://code.claude.com/docs/es/sub-agents.md#run-subagents-in-foreground-or-background) en sesiones interactivas de terminal, VS Code o escritorio en tu máquina. Establécela en `0` para desactivar el modo fork. Para las versiones, consulta [Desactivar el modo fork](https://code.claude.com/docs/es/sub-agents.md#turn-fork-mode-on-or-off) |

303| `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT` | Establécela en `1` para emitir el texto y los bloques de pensamiento de los [subagentes](https://code.claude.com/docs/es/sub-agents.md) en la salida de `claude -p --output-format stream-json`, el mismo comportamiento que el flag [`--forward-subagent-text`](https://code.claude.com/docs/es/cli-reference#cli-flags). Usa la variable cuando un harness invoca `claude` y no puede pasar el flag por sí mismo. A diferencia del flag, que termina con un error fuera del modo no interactivo con salida stream-json, la variable se ignora en esos casos para que las invocaciones anidadas sigan funcionando cuando se establece para todo el proceso. Requiere Claude Code v2.1.211 o posterior |303| `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT` | Establécela en `1` para emitir el texto y los bloques de pensamiento de los [subagentes](https://code.claude.com/docs/es/sub-agents.md) en la salida de `claude -p --output-format stream-json`, el mismo comportamiento que el flag [`--forward-subagent-text`](https://code.claude.com/docs/es/cli-reference#cli-flags). Usa la variable cuando un harness invoca `claude` y no puede pasar el flag por sí mismo. A diferencia del flag, que termina con un error fuera del modo no interactivo con salida stream-json, la variable se ignora en esos casos para que las invocaciones anidadas sigan funcionando cuando se establece para todo el proceso. Requiere Claude Code v2.1.211 o posterior |

304| `CLAUDE_CODE_GATEWAY_HINT_HEADERS` | Establécela en `1` para enviar los [encabezados de sugerencia para gateways](https://code.claude.com/docs/es/llm-gateway-protocol.md#gateway-hint-headers), como `x-claude-code-request-class` y `x-claude-code-compaction`, en un proxy personalizado o en un proveedor externo como Amazon Bedrock o Claude Platform on AWS. Establécela en `0` para dejar de enviarlos en todas las conexiones, incluida una conexión directa a la API de Anthropic, donde Claude Code los envía de forma predeterminada. Requiere Claude Code v2.1.273 o posterior |304| `CLAUDE_CODE_GATEWAY_HINT_HEADERS` | Establécela en `1` para enviar los [encabezados de sugerencia para gateways](https://code.claude.com/docs/es/llm-gateway-protocol.md#gateway-hint-headers), como `x-claude-code-request-class` y `x-claude-code-compaction`, en un proxy personalizado o en un proveedor externo como Amazon Bedrock o Claude Platform on AWS. Establécela en `0` para dejar de enviarlos en todas las conexiones, incluida una conexión directa a la API de Anthropic, donde Claude Code los envía de forma predeterminada. Requiere Claude Code v2.1.273 o posterior |

errors.md +63 −6

Details

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

318| `Error: No such tool available: <tool name>` | [Errores de herramientas](#no-such-tool-available) |318| `Error: No such tool available: <tool name>` | [Errores de herramientas](#no-such-tool-available) |

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

320| `MCP server "<name>" is disabled — re-enable it via /mcp to use its tools` | [Errores de herramientas](#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.` | [Errores de herramientas](#mcp-tool-call-timed-out-with-the-servers-question-unanswered) |

320| `would be spawned with zero tools — refusing` | [Errores de herramientas](#agent-would-be-spawned-with-zero-tools) |322| `would be spawned with zero tools — refusing` | [Errores de herramientas](#agent-would-be-spawned-with-zero-tools) |

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

322| `cannot contain null bytes (\0)` | [Errores de herramientas](#path-cannot-contain-null-bytes) |324| `cannot contain null bytes (\0)` | [Errores de herramientas](#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)` | [Errores de herramientas](#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)` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |

349| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |351| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [Errores de herramientas](#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` | [Errores de herramientas](#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` | [Errores de herramientas](#file-is-not-valid-utf-8) |

353| `git is not installed on this Mac. To install it, run xcode-select --install, then try again.` | [Errores de herramientas](#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` | [Errores de herramientas](#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` | [Errores de herramientas](#the-source-file-is-not-valid-utf-8-text) |

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

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


487 490 

488Mientras Claude consulta al [asesor](https://code.claude.com/docs/es/advisor.md), el banner aparece después de 90 segundos sin datos en lugar de 20, porque una revisión larga del asesor puede no enviar nada durante bastante más de 20 segundos. Antes de v2.1.214, el umbral de 20 segundos también se aplicaba durante las llamadas al asesor, por lo que el banner aparecía durante las revisiones del asesor incluso cuando no pasaba nada malo.491Mientras Claude consulta al [asesor](https://code.claude.com/docs/es/advisor.md), el banner aparece después de 90 segundos sin datos en lugar de 20, porque una revisión larga del asesor puede no enviar nada durante bastante más de 20 segundos. Antes de v2.1.214, el umbral de 20 segundos también se aplicaba durante las llamadas al asesor, por lo que el banner aparecía durante las revisiones del asesor incluso cuando no pasaba nada malo.

489 492 

493#### El banner de espera aparece y desaparece detrás de un gateway

494 

495Si el banner `Waiting for API response` aparece y desaparece mientras Claude piensa y te conectas a través de un gateway, [actualiza Claude Code](https://code.claude.com/docs/es/setup.md#update-claude-code) a v2.1.309 o posterior. El banner aparece después de 45 segundos sin datos en estas conexiones:

496 

497* [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/es/env-vars) establecido en un host distinto de la API de Anthropic, como un [gateway de LLM](https://code.claude.com/docs/es/llm-gateway)

498* Una sesión de [Claude apps gateway](https://code.claude.com/docs/es/claude-apps-gateway)

499* [Claude Platform on AWS](https://code.claude.com/docs/es/claude-platform-on-aws.md) con `ANTHROPIC_AWS_BASE_URL` establecido

500 

501Antes de v2.1.309, el banner aparecía después de 20 segundos en estas conexiones.

502 

490### Ajustar el comportamiento de reintentos503### Ajustar el comportamiento de reintentos

491 504 

492Puedes ajustar el comportamiento de reintentos con estas variables de entorno:505Puedes ajustar el comportamiento de reintentos con estas variables de entorno:


3256 3269 

3257**Qué hacer:**3270**Qué hacer:**

3258 3271 

3259* En un script o trabajo de CI, agrega `--trust-workspace` al final para confiar en el checkout solo para esa ejecución: `claude ultrareview --trust-workspace`. Agrégalo solo para código en el que confíes, porque la configuración de git del checkout y la configuración de proyecto de Claude Code pueden entonces ejecutar programas. Para revisar un pull request cuyo código no es de confianza, consulta [cómo revisarlo desde un checkout en el que sí confías](https://code.claude.com/docs/es/ultrareview.md#trust-the-folder-before-the-review-runs).3272* En un script o un trabajo de CI, agrega `--trust-workspace` al final para confiar en la carpeta durante esa ejecución: `claude ultrareview --trust-workspace`. Agrégalo solo para código en el que confíes, porque git y Claude Code pueden entonces ejecutar programas nombrados en la configuración de git y en la configuración del proyecto de la carpeta. Para un pull request cuyo código no te inspira confianza, [ejecuta la revisión desde una rama en la que confíes](https://code.claude.com/docs/es/ultrareview.md#trust-the-folder-before-the-review-runs).

3260* En tu propia máquina, ejecuta `claude` en esa carpeta y acepta el [diálogo de confianza del espacio de trabajo](https://code.claude.com/docs/es/permissions.md#project-allow-rules-and-workspace-trust), y luego vuelve a ejecutar tu comando original3273* En tu propia máquina, ejecuta `claude` en esa carpeta y acepta el [diálogo de confianza del espacio de trabajo](https://code.claude.com/docs/es/permissions.md#project-allow-rules-and-workspace-trust), y luego vuelve a ejecutar tu comando original

3261 3274 

3262Cada uno de estos mensajes de `claude ultrareview` significa que no se inició ninguna revisión y que el código de salida es 1:3275Cada uno de estos mensajes de `claude ultrareview` significa que no se inició ninguna revisión y que el código de salida es 1:


3526 3539 

3527Hay cadenas similares que se activan antes de que el comando llegue a ejecutarse:3540Hay cadenas similares que se activan antes de que el comando llegue a ejecutarse:

3528 3541 

3529* `Shell command permission check failed for pattern "..."`: la verificación de permisos del comando no lo permitió. [Verificaciones de permisos en comandos inyectados](https://code.claude.com/docs/es/skills.md#permission-checks-on-injected-commands) explica qué resultados abortan en cada modo de permisos y cómo aprobar previamente un comando con `allowed-tools`3542* `Shell command permission check failed for pattern "..."`: la verificación de permisos del comando no lo permitió. [Verificaciones de permisos en comandos inyectados](https://code.claude.com/docs/es/skills.md#permission-checks-on-injected-commands) explica qué resultados abortan en cada modo de permisos y cómo preaprobar un comando con `allowed-tools`

3530* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``: el frontmatter del skill exige bash en una máquina que no lo tiene. Instala Git for Windows o cambia el frontmatter a `shell: powershell`. Consulta [Cómo se ejecutan los comandos inyectados](https://code.claude.com/docs/es/skills.md#how-injected-commands-run)3543* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``: el frontmatter del skill exige bash en una máquina que no lo tiene. Instala Git for Windows o cambia el frontmatter a `shell: powershell`. Consulta [Cómo se ejecutan los comandos inyectados](https://code.claude.com/docs/es/skills.md#how-injected-commands-run)

3531* `No shell command in <name> was run`: uno de los comandos `!` del archivo contiene un carácter de control sin procesar distinto de tabulación o salto de línea, así que ninguno de ellos se ejecuta. Consulta [cómo encontrar y eliminar el carácter](#no-shell-command-was-run)3544* `No shell command in <name> was run`: uno de los comandos `!` del archivo contiene un carácter de control sin procesar distinto de tabulación o salto de línea, así que ninguno de ellos se ejecuta. Consulta [cómo encontrar y eliminar el carácter](#no-shell-command-was-run)

3532 3545 


3678 3691 

3679* **No pasaste una rama base**: Claude Code comparó contra la rama predeterminada del repositorio y sugiere pasar tu base explícitamente, como en el ejemplo anterior3692* **No pasaste una rama base**: Claude Code comparó contra la rama predeterminada del repositorio y sugiere pasar tu base explícitamente, como en el ejemplo anterior

3680* **Pasaste una rama base que ya estaba en tu clon**: la sugerencia dice ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``3693* **Pasaste una rama base que ya estaba en tu clon**: la sugerencia dice ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``

3681* **Pasaste una rama base que no estaba en tu clon**: Claude Code la obtuvo de origin antes de comparar. La sugerencia dice ``<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>`)``; cuando Claude Code no puede determinar si tu clon es superficial, sugiere `git fetch --unshallow origin` en su lugar. Antes de v2.1.221, la sugerencia proponía `git fetch --unshallow origin` para cada rama base obtenida, y en un clon completo ese comando falla con `fatal: --unshallow on a complete repository does not make sense`.3694* **Pasaste una rama base que no estaba en tu clon**: Claude Code la obtuvo de origin antes de comparar. La sugerencia dice ``<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>`)``; cuando Claude Code no puede determinar si tu clon es superficial, sugiere `git fetch --unshallow origin` en su lugar. Antes de la v2.1.221, la sugerencia proponía `git fetch --unshallow origin` para toda rama base obtenida, y en un clon completo ese comando falla con `fatal: --unshallow on a complete repository does not make sense`.

3682 3695 

3683**Qué hacer:**3696**Qué hacer:**

3684 3697 


4419* Si la acción no ocurrió, pídele a Claude que vuelva a ejecutar la herramienta. No necesitas volver a conectar el servidor antes, porque Claude Code se conecta a él de nuevo para la siguiente llamada a una de sus herramientas. Si esa conexión también falla, consulta [Desconexiones de un servidor remoto a mitad de la sesión](https://code.claude.com/docs/es/mcp.md#mid-session-drops-of-a-remote-server).4432* Si la acción no ocurrió, pídele a Claude que vuelva a ejecutar la herramienta. No necesitas volver a conectar el servidor antes, porque Claude Code se conecta a él de nuevo para la siguiente llamada a una de sus herramientas. Si esa conexión también falla, consulta [Desconexiones de un servidor remoto a mitad de la sesión](https://code.claude.com/docs/es/mcp.md#mid-session-drops-of-a-remote-server).

4420* Si tú desarrollas el servidor y la herramienta se puede llamar dos veces de forma segura, [márcala como segura para repetir](https://code.claude.com/docs/es/mcp.md#tool-calls-pending-when-a-connection-closes) para que Claude Code pueda repetir una llamada perdida4433* Si tú desarrollas el servidor y la herramienta se puede llamar dos veces de forma segura, [márcala como segura para repetir](https://code.claude.com/docs/es/mcp.md#tool-calls-pending-when-a-connection-closes) para que Claude Code pueda repetir una llamada perdida

4421 4434 

4435### MCP server is disabled

4436 

4437Este mensaje en un resultado de herramienta significa que Claude llamó a una herramienta de un [servidor MCP](https://code.claude.com/docs/es/mcp.md) que está [desactivado](https://code.claude.com/docs/es/mcp.md#disable-a-server-without-removing-it). Claude Code no se conectó al servidor, así que la herramienta no se ejecutó, y Claude recibió este texto en lugar de un resultado:

4438 

4439```text wrap theme={null}

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

4441```

4442 

4443**Qué hacer:**

4444 

4445* Si querías desactivar el servidor, no necesitas hacer nada

4446* Si Claude necesita las herramientas del servidor, vuelve a activarlo desde `/mcp` en el prompt de Claude Code

4447* En una aplicación del [Agent SDK](https://code.claude.com/docs/es/agent-sdk/overview.md), vuelve a activar el servidor llamando a [`toggleMcpServer()`](https://code.claude.com/docs/es/agent-sdk/typescript#togglemcpserver) en TypeScript con `enabled` establecido en `true`, o a [`toggle_mcp_server()`](https://code.claude.com/docs/es/agent-sdk/python#claudesdkclient) en Python con `enabled` establecido en `True`

4448 

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

4450 

4451En [modo no interactivo](https://code.claude.com/docs/es/headless.md), un [servidor MCP](https://code.claude.com/docs/es/mcp.md) solicitó información mediante [elicitation](https://code.claude.com/docs/es/mcp.md#respond-to-mcp-elicitation-requests) durante una llamada a herramienta, y se agotó el límite de tiempo de la llamada antes de que llegara una respuesta:

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 

4457Antes de la v2.1.310, el resultado terminaba en `timed out after <N>s` y no decía nada sobre la pregunta.

4458 

4459**Qué hacer:**

4460 

4461* Configura un [hook `Elicitation`](https://code.claude.com/docs/es/hooks#elicitation) que responda las solicitudes del servidor

4462* En una aplicación del Agent SDK de TypeScript, haz que tu callback [`onElicitation`](https://code.claude.com/docs/es/agent-sdk/typescript#options) devuelva su respuesta antes de que se agote el límite

4463* Para darle más tiempo a una respuesta, establece un [`timeout`](https://code.claude.com/docs/es/mcp#time-limits-on-mcp-tool-calls) más largo en milisegundos en la entrada de configuración del servidor, como `"timeout": 600000` para 10 minutos

4464* Ejecuta la tarea en una sesión interactiva en su lugar y responde tú mismo el [diálogo](https://code.claude.com/docs/es/mcp.md#respond-to-mcp-elicitation-requests) del servidor

4465 

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

4423 4467 

4424Ninguna entrada de la [lista `tools`](https://code.claude.com/docs/es/sub-agents#supported-frontmatter-fields) del subagente coincidió con una herramienta utilizable, así que Claude Code se negó a iniciar el subagente: sin herramientas, no podría actuar. El mensaje agrupa tus entradas según lo que salió mal:4468Ninguna entrada de la [lista `tools`](https://code.claude.com/docs/es/sub-agents#supported-frontmatter-fields) del subagente coincidió con una herramienta utilizable, así que Claude Code se negó a iniciar el subagente: sin herramientas, no podría actuar. El mensaje agrupa tus entradas según lo que salió mal:


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 

4744Los otros tres mensajes aparecen después de un comando que se ejecutó y terminó con un código distinto de cero. Este ejemplo es la forma `Disk full:`:4788Los mensajes `Disk full:`, `Disk quota used up:` y `Nearly out of inodes:` aparecen después de un comando que se ejecutó y terminó con un código distinto de cero. Por ejemplo:

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* En macOS y Linux, ejecuta `df -h <dir>` en tu shell para ver qué volumen contiene el directorio y qué tan lleno está. `df -i <dir>` muestra cuántos inodos quedan libres. `<dir>` es el directorio que nombra tu mensaje, como en `df -i /tmp/claude-501`4796* En macOS y Linux, ejecuta `df -h <dir>` en tu shell para ver qué volumen contiene el directorio y qué tan lleno está. `df -i <dir>` muestra cuántos inodos quedan libres. `<dir>` es el directorio que nombra tu mensaje, como en `df -i /tmp/claude-501`

4753* **`Disk full: this computer's volume` o `disk is full (ENOSPC)`**: elimina archivos que no necesites en cualquier parte de ese volumen4797* **`Disk full: this computer's volume` o `disk is full (ENOSPC)`**: elimina archivos que no necesites en cualquier parte de ese volumen

4754* **`Disk quota used up:` o `Disk full: a test write`**: elimina tus propios archivos en ese volumen, aunque todavía muestre espacio libre4798* **`Disk quota used up:`, `disk quota is used up (EDQUOT)` o `Disk full: a test write`**: elimina tus propios archivos en ese volumen, aunque todavía muestre espacio libre

4755* **`disk quota is used up (EDQUOT)`**: elimina tus propios archivos en ese volumen

4756* **`Nearly out of inodes:`**: elimina muchos archivos en ese volumen. Cada uno ocupa un inodo sin importar su tamaño, así que lo que importa es su cantidad, no su tamaño4799* **`Nearly out of inodes:`**: elimina muchos archivos en ese volumen. Cada uno ocupa un inodo sin importar su tamaño, así que lo que importa es su cantidad, no su tamaño

4757* O reinicia Claude Code con [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/es/env-vars) establecida en un directorio de un volumen con espacio4800* O reinicia Claude Code con [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/es/env-vars) establecida en un directorio de un volumen con espacio

4758* Luego haz que Claude ejecute el comando de nuevo4801* Luego haz que Claude ejecute el comando de nuevo


4766 4809 

4767Antes de la v2.1.305, un comando que Claude Code no podía iniciar porque el disco estaba lleno devolvía solo el texto de error del sistema operativo. Ese texto decía, por ejemplo, `ENOSPC: no space left on device, open <path>.output`.4810Antes de la v2.1.305, un comando que Claude Code no podía iniciar porque el disco estaba lleno devolvía solo el texto de error del sistema operativo. Ese texto decía, por ejemplo, `ENOSPC: no space left on device, open <path>.output`.

4768 4811 

4812### git is not installed on this Mac

4813 

4814Este mensaje significa que un paso en Claude Code necesitaba git, y el git que encontró es el sustituto de Apple en `/usr/bin/git`. Las herramientas para desarrolladores que proporcionan git no están instaladas.

4815 

4816Claude Code no inicia el sustituto y muestra este texto en su lugar, por ejemplo dentro de un mensaje más largo:

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**Qué hacer:**

4823 

4824* En Terminal, ejecuta `xcode-select --install`, completa la instalación que inicia y luego vuelve a intentar lo que estabas haciendo en Claude Code

4825 

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

4770 4827 

4771Claude usó la herramienta Edit o NotebookEdit en un archivo cuyos bytes no se decodifican como UTF-8, y Claude Code rechazó el cambio. No se escribió nada, así que el archivo quedó como estaba. Esas herramientas guardan el archivo completo como UTF-8, lo que habría convertido cada byte que no pudieran decodificar en el carácter de reemplazo `U+FFFD`. El mensaje aparece en el resultado de la herramienta:4828Claude usó la herramienta Edit o NotebookEdit en un archivo cuyos bytes no se decodifican como UTF-8, y Claude Code rechazó el cambio. No se escribió nada, así que el archivo quedó como estaba. Esas herramientas guardan el archivo completo como UTF-8, lo que habría convertido cada byte que no pudieran decodificar en el carácter de reemplazo `U+FFFD`. El mensaje aparece en el resultado de la herramienta:

fast-mode.md +21 −11

Details

155 155 

156Antes de ofrecer el modo rápido, Claude Code verifica la disponibilidad del modo rápido de su organización con una solicitud directa a `api.anthropic.com`. La verificación no sigue [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential), por lo que en una red que enruta el tráfico de Claude a través de una [puerta de enlace LLM](https://code.claude.com/docs/es/llm-gateway) y bloquea la salida directa a `api.anthropic.com`, la verificación falla aunque las solicitudes de inferencia funcionen. La verificación utiliza un [proxy HTTP](https://code.claude.com/docs/es/network-config.md#proxy-configuration) configurado, por lo que un bloqueo de red falla la verificación solo donde `api.anthropic.com` es inaccesible incluso a través del proxy.156Antes de ofrecer el modo rápido, Claude Code verifica la disponibilidad del modo rápido de su organización con una solicitud directa a `api.anthropic.com`. La verificación no sigue [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential), por lo que en una red que enruta el tráfico de Claude a través de una [puerta de enlace LLM](https://code.claude.com/docs/es/llm-gateway) y bloquea la salida directa a `api.anthropic.com`, la verificación falla aunque las solicitudes de inferencia funcionen. La verificación utiliza un [proxy HTTP](https://code.claude.com/docs/es/network-config.md#proxy-configuration) configurado, por lo que un bloqueo de red falla la verificación solo donde `api.anthropic.com` es inaccesible incluso a través del proxy.

157 157 

158Cuando la verificación falla, `/fast` reporta "Fast mode unavailable due to network connectivity issues", y las solicitudes se ejecutan a velocidad estándar, incluso cuando su organización tiene el modo rápido habilitado. Una verificación que tuvo éxito en el pasado sigue funcionando desde su resultado en caché, por lo que una verificación bloqueada afecta principalmente a las nuevas instalaciones.158Si tu organización tiene el modo rápido habilitado y `/fast` indica lo contrario, busca el mensaje que muestra entre estos casos.

159 159 

160El mismo mensaje de conectividad aparece en una red abierta cuando la verificación llega a `api.anthropic.com` pero presenta una credencial que Anthropic rechaza. Una sesión cuya clave resuelta es una credencial emitida por la puerta de enlace, mantenida en [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential) o producida por un [`apiKeyHelper`](https://code.claude.com/docs/es/settings-reference#apikeyhelper), envía la verificación con esa clave, y la solicitud rechazada se reporta como un fallo de conectividad.160#### Fast mode unavailable due to network connectivity issues

161 161 

162Para restaurar el modo rápido, permita la salida directa a `api.anthropic.com` donde un bloqueo de red es la causa, o establezca cualquier variable que coincida con cómo falla la verificación:162La verificación de disponibilidad falló, por ejemplo porque tu red bloquea `api.anthropic.com`, y las solicitudes se ejecutan a velocidad estándar. Una verificación que tuvo éxito en el pasado sigue funcionando desde su resultado en caché, por lo que una verificación bloqueada afecta principalmente a las nuevas instalaciones.

163 163 

164* `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1` trata una verificación fallida como disponible y aún respeta una respuesta "disabled by your organization". Úselo cuando su red rechace la conexión, o cuando Anthropic rechace una credencial de puerta de enlace; la lista de permitidos no ayuda en el caso de credencial, ya que nada está bloqueado.164Para restaurar el modo rápido, agrega la salida directa a `api.anthropic.com` a la lista de permitidos, o establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`, que trata una verificación fallida como disponible y aún respeta una respuesta "disabled by your organization".

165* `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1` omite la verificación por completo. Úselo cuando su red intercepte la solicitud en lugar de rechazarla.

166 165 

167Dos configuraciones de puerta de enlace reportan "Fast mode has been disabled by your organization" en lugar del mensaje de conectividad, incluso cuando su organización tiene el modo rápido habilitado:166#### Fast mode is currently unavailable

168 167 

169* Una sesión que se autentica con [`ANTHROPIC_AUTH_TOKEN`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential) únicamente omite la verificación: sin un inicio de sesión en claude.ai o una clave de API de Anthropic, y sin una verificación exitosa en caché, Claude Code trata el modo rápido como deshabilitado por su organización sin enviar la solicitud.168Detrás de un gateway, revisa si tienes estas configuraciones, en las que Claude Code no envía la verificación de disponibilidad y no tiene en caché ninguna verificación exitosa anterior:

170* Un proxy que intercepta la verificación y responde con su propia página, por ejemplo un proxy que inspecciona TLS devolviendo una página de bloqueo HTTP 200, se lee como una respuesta que dice que su organización tiene el modo rápido deshabilitado.

171 169 

172En ambos casos, establezca `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1` para restaurar el modo rápido. `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS` no se aplica a ninguno de estos casos, ya que solo omite verificaciones fallidas y ambos producen una respuesta deshabilitada en su lugar. La lista de permitidos de salida directa no ayuda en el caso de token portador, que nunca envía la solicitud.170* Apuntas `ANTHROPIC_BASE_URL` a tu gateway y estableces [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential) en una clave emitida por el gateway que no tiene el formato de una clave de API de Anthropic. Claude Code no envía esa clave a `api.anthropic.com`.

171* Estableces [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/es/env-vars), por lo que Claude Code omite la verificación.

173 172 

174Las variables afectan solo la verificación del lado del cliente. Cuando su organización tiene el modo rápido deshabilitado, la API rechaza solicitudes de modo rápido independientemente de si están configuradas. Un rechazo de la API se mantiene incluso con una variable de omisión configurada. Claude Code reintenta la solicitud rechazada a velocidad estándar, desactiva el modo rápido, y `/fast` reporta que su organización ha deshabilitado el modo rápido.173Para restaurar el modo rápido en cualquiera de las dos configuraciones, establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`.

175 174 

176Establecer `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` también suprime la verificación de disponibilidad. Sin una verificación exitosa previamente en caché, `/fast` reporta "Fast mode is currently unavailable"; ambas variables de omisión restauran el modo rápido en esa configuración también.175#### Fast mode has been disabled by your organization

176 

177Detrás de un gateway, puedes ver este mensaje incluso cuando tu organización tiene el modo rápido habilitado, en cualquiera de estas configuraciones:

178 

179* Te autenticas solo con [`ANTHROPIC_AUTH_TOKEN`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential), sin inicio de sesión en claude.ai, sin clave de API y sin una verificación exitosa en caché. Claude Code entonces trata el modo rápido como deshabilitado por tu organización sin enviar la solicitud.

180* Un proxy intercepta la verificación y responde con su propia página, por ejemplo un proxy que inspecciona TLS y devuelve una página de bloqueo HTTP 200. Claude Code lee esa página como una respuesta que dice que tu organización tiene el modo rápido deshabilitado.

181 

182En ambos casos, establece `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`, que omite la verificación por completo, en lugar de `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS`, que no se aplica a ninguno de los dos.

183 

184> [!NOTE]

185>

186> Las variables de omisión cambian solo la verificación del lado del cliente. Cuando tu organización tiene el modo rápido deshabilitado, la API rechaza las solicitudes de modo rápido estén o no configuradas. Claude Code entonces reintenta la solicitud a velocidad estándar, desactiva el modo rápido, y `/fast` informa que tu organización ha deshabilitado el modo rápido.

177 187 

178### Requerir opción de participación por sesión188### Requerir opción de participación por sesión

179 189 

hooks.md +17 −6

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 

964Para averiguar por qué falló el hook, revisa el [registro de depuración](#debug-hooks). Elige la solución que corresponda a tu hook:964Si el error también dice `PowerShell started no program`, empieza por [las soluciones para un `command` que solo contiene cadenas entre comillas](#powershell-started-no-program), que PowerShell imprime en lugar de ejecutar.

965 965 

966* **La acción debe continuar cuando el hook falla**: agrega [`"onFailure": "continue"`](#block-the-action-when-a-hook-fails) al hook966Sin Git Bash, cualquier código de salida distinto de 0 o 2 de ese hook cuenta como un [fallo](#block-the-action-when-a-hook-fails), incluso cuando imprime JSON que no deniega la llamada. Para averiguar por qué falló el hook, revisa el [registro de depuración](#debug-hooks). Luego elige la solución que corresponda a tu hook:

967* **El hook está escrito para Bash**: un hook en [forma de shell](#exec-form-and-shell-form) sin `shell` establecido se ejecuta en PowerShell cuando Git Bash no está instalado, y allí es posible que un script escrito para Bash no se ejecute tal como está escrito. Instala [Git for Windows](https://git-scm.com/downloads/win), o establece [`CLAUDE_CODE_GIT_BASH_PATH`](https://code.claude.com/docs/es/env-vars) si Git Bash está instalado en un lugar donde Claude Code no lo encuentra, y luego inicia una nueva sesión967 

968* **La llamada debe continuar cuando el hook falla**: agrega [`"onFailure": "continue"`](#block-the-action-when-a-hook-fails) al hook

969* **El hook sale con 1 para advertir pero debe bloquear cuando se bloquea por un error**: con `"onFailure": "continue"`, la llamada continúa con el código de salida 1, tanto si es una advertencia como si es un error. Agrega `"onFailure": "block"` en su lugar, y haz que el script salga con 0 donde advierte, para que esas llamadas continúen. Para seguir mostrando la advertencia en `PreToolUse`, imprímela en stdout en el campo [`systemMessage`](#json-output) de un único objeto JSON.

970* **El hook está escrito para Bash**: sin Git Bash, un hook en [forma de shell](#exec-form-and-shell-form) sin `shell` establecido se ejecuta en PowerShell, donde puede fallar. Instala [Git for Windows](https://git-scm.com/downloads/win), o establece [`CLAUDE_CODE_GIT_BASH_PATH`](https://code.claude.com/docs/es/env-vars) si Git Bash está instalado en un lugar donde Claude Code no lo encuentra. Luego inicia una nueva sesión.

968* **El hook ejecuta un único `.exe`, no un archivo `.cmd` o `.bat`**: pon el programa en `command` y sus argumentos en `args` para usar la forma exec, y agrega `"onFailure": "block"`. Claude Code entonces inicia el programa sin shell. Sin `"onFailure": "block"`, la llamada puede continuar cuando el programa falla, no existe o agota su tiempo de espera971* **El hook ejecuta un único `.exe`, no un archivo `.cmd` o `.bat`**: pon el programa en `command` y sus argumentos en `args` para usar la forma exec, y agrega `"onFailure": "block"`. Claude Code entonces inicia el programa sin shell. Sin `"onFailure": "block"`, la llamada puede continuar cuando el programa falla, no existe o agota su tiempo de espera

969* **El hook sale con 1 para advertir pero debe bloquear cuando se bloquea por un error**: con `"onFailure": "continue"`, la llamada continúa con el código de salida 1, tanto si es una advertencia como si es un error. Agrega `"onFailure": "block"` en su lugar, y termina el script con el código de salida 0 donde advierte, para que esas llamadas continúen. Para mostrar la advertencia en `PreToolUse` después del código de salida 0, imprímela en stdout en el campo [`systemMessage`](#json-output) de un único objeto JSON

970* **Un hook de protección de PowerShell que debe bloquear cuando falla**: con `onFailure` sin establecer, deja de hacerlo una vez que Git for Windows está instalado y Claude Code encuentra Git Bash. Agrega `"onFailure": "block"` para que un fallo o un tiempo de espera agotado bloquee la llamada con o sin Git Bash. Establece también `"shell": "powershell"` para que el hook siga ejecutándose en PowerShell a partir de entonces en lugar de en Git Bash972* **Un hook de protección de PowerShell que debe bloquear cuando falla**: con `onFailure` sin establecer, deja de hacerlo una vez que Git for Windows está instalado y Claude Code encuentra Git Bash. Agrega `"onFailure": "block"` para que un fallo o un tiempo de espera agotado bloquee la llamada con o sin Git Bash. Establece también `"shell": "powershell"` para que el hook siga ejecutándose en PowerShell a partir de entonces en lugar de en Git Bash

971 973 

972Para un hook que muestra este error, cualquier código de salida distinto de 0 o 2 cuenta como un [fallo](#block-the-action-when-a-hook-fails), incluso cuando el hook imprime JSON que no deniega la llamada.

973 

974Antes de v2.1.309, el mensaje decía `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.`974Antes de v2.1.309, el mensaje decía `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 

978Un hook con este error se ejecutó en PowerShell, que imprime un `command` que solo contiene cadenas entre comillas, como `"command": "\"C:\\Tools\\guard.exe\""`, en lugar de ejecutarlo.

979 

980* **Para imprimir texto, como JSON**: establece `"shell": "powershell"`, y el hook sale con 0

981* **Para ejecutar un archivo `.ps1`, `.cmd` o `.bat`, o un `.exe` cuya ruta contiene una variable**: establece `"shell": "powershell"` y pon `&` antes de la ruta entre comillas. Deja `$HOME` tal como está escrito, y escribe las variables de entorno como el [ejemplo de `check.ps1`](#reference-scripts-by-path-in-powershell-hooks) escribe `$env:CLAUDE_PROJECT_DIR`

982* **Para ejecutar un único `.exe` en una ruta sin `$`**: quita las comillas internas de `command` y luego aplica la [solución para un hook que ejecuta un único `.exe`](#failed-hooks-on-windows-without-git-bash), escribiendo `"args": []` si el programa no recibe argumentos

983* **Para ejecutar un script escrito para Bash**: aplica la [solución para un hook escrito para Bash](#failed-hooks-on-windows-without-git-bash)

984 

976#### Comportamiento del código de salida 2 por evento985#### Comportamiento del código de salida 2 por evento

977 986 

978El código de salida 2 es la forma en que un hook señala "detente, no hagas esto". El efecto depende del evento, porque algunos eventos representan acciones que pueden bloquearse (como una llamada a herramienta que aún no ha sucedido) y otros representan cosas que ya sucedieron o no pueden evitarse.987El código de salida 2 es la forma en que un hook señala "detente, no hagas esto". El efecto depende del evento, porque algunos eventos representan acciones que pueden bloquearse (como una llamada a herramienta que aún no ha sucedido) y otros representan cosas que ya sucedieron o no pueden evitarse.


4187}4196}

4188```4197```

4189 4198 

4199### Hacer referencia a scripts por ruta en hooks de PowerShell

4200 

4190Para hacer referencia al directorio raíz del proyecto desde un comando de forma shell de PowerShell, escribe `${CLAUDE_PROJECT_DIR}` o `$env:CLAUDE_PROJECT_DIR`. Claude Code reescribe los marcadores de posición `${CLAUDE_PROJECT_DIR}`, `${CLAUDE_PLUGIN_ROOT}` y `${CLAUDE_PLUGIN_DATA}` en un comando de forma shell de PowerShell a la forma `${env:NAME}` de PowerShell, ya sea que el hook esté definido en `settings.json`, un plugin o un skill. PowerShell luego resuelve el valor del entorno exportado después del análisis, por lo que el marcador de posición funciona dentro de cadenas entre comillas dobles pero no dentro de cadenas entre comillas simples, donde PowerShell nunca expande variables.4201Para hacer referencia al directorio raíz del proyecto desde un comando de forma shell de PowerShell, escribe `${CLAUDE_PROJECT_DIR}` o `$env:CLAUDE_PROJECT_DIR`. Claude Code reescribe los marcadores de posición `${CLAUDE_PROJECT_DIR}`, `${CLAUDE_PLUGIN_ROOT}` y `${CLAUDE_PLUGIN_DATA}` en un comando de forma shell de PowerShell a la forma `${env:NAME}` de PowerShell, ya sea que el hook esté definido en `settings.json`, un plugin o un skill. PowerShell luego resuelve el valor del entorno exportado después del análisis, por lo que el marcador de posición funciona dentro de cadenas entre comillas dobles pero no dentro de cadenas entre comillas simples, donde PowerShell nunca expande variables.

4191 4202 

4192No escriba la ortografía desnuda `$CLAUDE_PROJECT_DIR` en un hook de PowerShell. PowerShell la analiza como una variable local indefinida y la resuelve a `$null`, lo que deja la ruta del script sin su prefijo de directorio raíz del proyecto. Claude Code no reescribe esa forma; en su lugar, registra una advertencia en el [registro de depuración](#debug-hooks).4203No escriba la ortografía desnuda `$CLAUDE_PROJECT_DIR` en un hook de PowerShell. PowerShell la analiza como una variable local indefinida y la resuelve a `$null`, lo que deja la ruta del script sin su prefijo de directorio raíz del proyecto. Claude Code no reescribe esa forma; en su lugar, registra una advertencia en el [registro de depuración](#debug-hooks).

jetbrains.md +1 −1

Details

61/ide61/ide

62```62```

63 63 

64Cuando la conexión se realiza correctamente, Claude Code confirma con un mensaje como `Connected to IntelliJ IDEA.` Si Claude Code detecta un IDE en ejecución que no tiene el plugin, `/ide` instala el plugin para ti y te pide que reinicies el IDE.64Cuando la conexión se realiza correctamente, Claude Code confirma con un mensaje como `Connected to IntelliJ IDEA.`

65 65 

66Si deseas que Claude tenga acceso a los mismos archivos que tu IDE, inicia Claude Code desde el mismo directorio que la raíz del proyecto de tu IDE.66Si deseas que Claude tenga acceso a los mismos archivos que tu IDE, inicia Claude Code desde el mismo directorio que la raíz del proyecto de tu IDE.

67 67 

Details

519| Errores `400` en cada solicitud, en las propias palabras de la puerta de enlace rechazando un esquema de entrada de herramienta o su `pattern`, en Claude Code v2.1.265 a v2.1.267 | En un despliegue gradual en esas versiones, el esquema de [herramienta Artifact](https://code.claude.com/docs/es/artifacts.md#availability) lleva una expresión regular con clases de caracteres Unicode `\p{...}`. La API de Anthropic la acepta, pero una puerta de enlace o upstream que verifica el `pattern` de cada esquema de herramienta con su propio motor de expresiones regulares rechaza toda la solicitud | Actualice a v2.1.268 o posterior, que no envía la expresión regular. En una versión afectada, [desactive los artefactos](https://code.claude.com/docs/es/artifacts.md#disable-artifacts), que elimina la herramienta y su esquema de las solicitudes |519| Errores `400` en cada solicitud, en las propias palabras de la puerta de enlace rechazando un esquema de entrada de herramienta o su `pattern`, en Claude Code v2.1.265 a v2.1.267 | En un despliegue gradual en esas versiones, el esquema de [herramienta Artifact](https://code.claude.com/docs/es/artifacts.md#availability) lleva una expresión regular con clases de caracteres Unicode `\p{...}`. La API de Anthropic la acepta, pero una puerta de enlace o upstream que verifica el `pattern` de cada esquema de herramienta con su propio motor de expresiones regulares rechaza toda la solicitud | Actualice a v2.1.268 o posterior, que no envía la expresión regular. En una versión afectada, [desactive los artefactos](https://code.claude.com/docs/es/artifacts.md#disable-artifacts), que elimina la herramienta y su esquema de las solicitudes |

520| Errores `400` en cada solicitud, en las propias palabras de la puerta de enlace rechazando un tipo de herramienta no reconocido, como `Input tag 'advisor_20260301'`, en Claude Code v2.1.275 | En un despliegue gradual en esa versión, las solicitudes llevan una entrada de [herramienta advisor](https://code.claude.com/docs/es/advisor.md) incluso con el advisor desactivado. La API de Anthropic la acepta, pero una puerta de enlace o upstream que valida tipos de herramientas rechaza toda la solicitud; una que [reenvía campos del cuerpo de la solicitud sin cambios](https://code.claude.com/docs/es/llm-gateway-protocol.md#forward-as-open-lists) la pasa sin afectar. La entrada es una declaración que no lleva contenido de conversación | Actualice a v2.1.276 o posterior, que no envía la entrada detrás de una puerta de enlace `ANTHROPIC_BASE_URL` a menos que active el advisor. En v2.1.275, establezca [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/es/env-vars), que elimina la entrada de las solicitudes |520| Errores `400` en cada solicitud, en las propias palabras de la puerta de enlace rechazando un tipo de herramienta no reconocido, como `Input tag 'advisor_20260301'`, en Claude Code v2.1.275 | En un despliegue gradual en esa versión, las solicitudes llevan una entrada de [herramienta advisor](https://code.claude.com/docs/es/advisor.md) incluso con el advisor desactivado. La API de Anthropic la acepta, pero una puerta de enlace o upstream que valida tipos de herramientas rechaza toda la solicitud; una que [reenvía campos del cuerpo de la solicitud sin cambios](https://code.claude.com/docs/es/llm-gateway-protocol.md#forward-as-open-lists) la pasa sin afectar. La entrada es una declaración que no lleva contenido de conversación | Actualice a v2.1.276 o posterior, que no envía la entrada detrás de una puerta de enlace `ANTHROPIC_BASE_URL` a menos que active el advisor. En v2.1.275, establezca [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/es/env-vars), que elimina la entrada de las solicitudes |

521| Modelos faltantes del selector `/model` | Los nombres de modelos de puerta de enlace no están en la lista integrada de Claude Code, o Claude Code está mostrando una alineación [`modelPicker`](https://code.claude.com/docs/es/settings-reference#modelpicker) que reemplaza las opciones integradas | Habilite [descubrimiento de modelos de puerta de enlace](#add-gateway-models-to-the-model-picker) o agregue nombres con las variables de [configuración de modelo](https://code.claude.com/docs/es/model-config.md). Si Claude Code muestra una alineación `modelPicker` que reemplaza, agregue los modelos de puerta de enlace a ella, o pida a su administrador que los agregue cuando la configuración administrada lo proporcione |521| Modelos faltantes del selector `/model` | Los nombres de modelos de puerta de enlace no están en la lista integrada de Claude Code, o Claude Code está mostrando una alineación [`modelPicker`](https://code.claude.com/docs/es/settings-reference#modelpicker) que reemplaza las opciones integradas | Habilite [descubrimiento de modelos de puerta de enlace](#add-gateway-models-to-the-model-picker) o agregue nombres con las variables de [configuración de modelo](https://code.claude.com/docs/es/model-config.md). Si Claude Code muestra una alineación `modelPicker` que reemplaza, agregue los modelos de puerta de enlace a ella, o pida a su administrador que los agregue cuando la configuración administrada lo proporcione |

522| `/fast` reporta `Fast mode unavailable due to network connectivity issues` mientras las solicitudes de inferencia funcionan | La verificación de disponibilidad de [modo rápido](https://code.claude.com/docs/es/fast-mode.md) va directamente a `api.anthropic.com` y no sigue `ANTHROPIC_BASE_URL`, por lo que el egreso directo bloqueado falla la verificación. El mismo mensaje aparece en una red abierta cuando la verificación presenta una clave emitida por puerta de enlace de `ANTHROPIC_API_KEY` o un `apiKeyHelper` y Anthropic la rechaza | Agregue a la lista blanca `api.anthropic.com` si el egreso está bloqueado, o establezca una variable de omisión; para una clave de puerta de enlace rechazada solo las variables de omisión ayudan. Consulte [usar modo rápido detrás de proxies y puertas de enlace LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |522| `/fast` reporta `Fast mode unavailable due to network connectivity issues` mientras las solicitudes de inferencia funcionan | La verificación de disponibilidad del [modo rápido](https://code.claude.com/docs/es/fast-mode.md) va directamente a `api.anthropic.com` y no sigue `ANTHROPIC_BASE_URL`, por lo que, si el tráfico de salida directo está bloqueado, la verificación falla | Agrega `api.anthropic.com` a la lista de dominios permitidos si el tráfico de salida está bloqueado, o establece una variable de omisión. Consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

523| `/fast` reporta `Fast mode has been disabled by your organization` en una sesión autenticada con `ANTHROPIC_AUTH_TOKEN`, aunque la organización tiene modo rápido habilitado | La verificación de disponibilidad requiere un inicio de sesión en claude.ai o una clave de API de Anthropic; con solo un token portador, Claude Code trata el modo rápido como deshabilitado sin enviar la verificación | Establezca `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`; consulte [usar modo rápido detrás de proxies y puertas de enlace LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |523| `/fast` reporta `Fast mode is currently unavailable` en una sesión que se autentica con una clave emitida por el gateway en `ANTHROPIC_API_KEY` | Mientras `ANTHROPIC_BASE_URL` apunta a tu gateway, Claude Code no envía a `api.anthropic.com` una clave que no tenga el formato de una clave de API de Anthropic. Entonces la verificación de disponibilidad del [modo rápido](https://code.claude.com/docs/es/fast-mode.md) no se envía y, sin una verificación exitosa previa en caché, Claude Code trata el modo rápido como no disponible | Establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`; consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| `/fast` reporta `Fast mode has been disabled by your organization` en una sesión autenticada con `ANTHROPIC_AUTH_TOKEN`, aunque la organización tiene el modo rápido habilitado | La verificación de disponibilidad requiere un inicio de sesión en claude.ai o una clave de API; con solo un token bearer, Claude Code trata el modo rápido como deshabilitado sin enviar la verificación | Establece `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`; consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| Claude Code le pide que inicie sesión aunque la [prueba de curl](#verify-the-connection) tenga éxito | La CLI no tiene credencial propia: una URL base alcanzable no es una, y en una sesión interactiva un bloque `env` en el `.claude/settings.json` o `.claude/settings.local.json` de un proyecto se aplica solo después del asistente de primera ejecución y la [solicitud de confianza](https://code.claude.com/docs/es/permissions.md#what-runs-before-you-trust-a-folder) | Establezca `ANTHROPIC_AUTH_TOKEN` en algún lugar que Claude Code lea antes de la configuración de primera ejecución: una exportación de shell, el bloque `env` en `~/.claude/settings.json`, o configuración administrada |525| Claude Code le pide que inicie sesión aunque la [prueba de curl](#verify-the-connection) tenga éxito | La CLI no tiene credencial propia: una URL base alcanzable no es una, y en una sesión interactiva un bloque `env` en el `.claude/settings.json` o `.claude/settings.local.json` de un proyecto se aplica solo después del asistente de primera ejecución y la [solicitud de confianza](https://code.claude.com/docs/es/permissions.md#what-runs-before-you-trust-a-folder) | Establezca `ANTHROPIC_AUTH_TOKEN` en algún lugar que Claude Code lea antes de la configuración de primera ejecución: una exportación de shell, el bloque `env` en `~/.claude/settings.json`, o configuración administrada |

525| `ANTHROPIC_API_KEY` está establecido pero ignorado, sin solicitud | La clave necesita una aprobación única en sesiones interactivas, y una clave previamente rechazada se ignora sin preguntar de nuevo | Habilítela bajo `/config` con la opción `Use custom API key` |526| `ANTHROPIC_API_KEY` está establecido pero ignorado, sin solicitud | La clave necesita una aprobación única en sesiones interactivas, y una clave previamente rechazada se ignora sin preguntar de nuevo | Habilítela bajo `/config` con la opción `Use custom API key` |

526| `This machine's managed settings require a first-party login`, o [`Administrator policy requires a Cloud gateway sign-in`](https://code.claude.com/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) cuando la configuración administrada establece `forceLoginMethod` en `"gateway"` o también establece `forceLoginGatewayUrl` | La configuración administrada incluye `forceLoginMethod` o `forceLoginOrgUUID`, que no pueden coexistir con `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, o `apiKeyHelper` | Su administrador debe eliminar `forceLoginMethod`, `forceLoginOrgUUID`, y `forceLoginGatewayUrl` de la configuración administrada para usar credenciales de puerta de enlace, o eliminar la credencial de puerta de enlace y usar el inicio de sesión que la configuración administrada requiere. Los dos no pueden combinarse |527| `This machine's managed settings require a first-party login`, o [`Administrator policy requires a Cloud gateway sign-in`](https://code.claude.com/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) cuando la configuración administrada establece `forceLoginMethod` en `"gateway"` o también establece `forceLoginGatewayUrl` | La configuración administrada incluye `forceLoginMethod` o `forceLoginOrgUUID`, que no pueden coexistir con `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, o `apiKeyHelper` | Su administrador debe eliminar `forceLoginMethod`, `forceLoginOrgUUID`, y `forceLoginGatewayUrl` de la configuración administrada para usar credenciales de puerta de enlace, o eliminar la credencial de puerta de enlace y usar el inicio de sesión que la configuración administrada requiere. Los dos no pueden combinarse |

mcp.md +4 −4

Details

250 250 

251Los estados en esta lista informan una decisión de configuración en lugar de un intento de conexión, por lo que Claude Code los imprime sin conectarse al servidor:251Los estados en esta lista informan una decisión de configuración en lugar de un intento de conexión, por lo que Claude Code los imprime sin conectarse al servidor:

252 252 

253* ``⏸ Pending approval (run `claude` to approve)``: un servidor con alcance de proyecto de `.mcp.json` que aún no has aprobado. Claude Code lo muestra tanto en `claude mcp list` como en `claude mcp get <name>`. Ejecuta `claude` de forma interactiva para revisarlo y aprobarlo.253* ``⏸ Pending approval (run `claude` to approve)``: un servidor con alcance de proyecto de `.mcp.json` que todavía no has aprobado. Claude Code lo muestra tanto en `claude mcp list` como en `claude mcp get <name>`. Ejecuta `claude` de forma interactiva para revisarlo y aprobarlo.

254* `✘ Rejected (see disabledMcpjsonServers in settings)`: un servidor `.mcp.json` que una entrada [`disabledMcpjsonServers`](https://code.claude.com/docs/es/settings-reference#disabledmcpjsonservers) rechaza. Claude Code lo muestra solo en `claude mcp get <name>`.254* `✘ Rejected (see disabledMcpjsonServers in settings)`: un servidor `.mcp.json` que una entrada [`disabledMcpjsonServers`](https://code.claude.com/docs/es/settings-reference#disabledmcpjsonservers) rechaza. Claude Code lo muestra solo en `claude mcp get <name>`.

255* `⊘ Disabled for this project (re-enable via /mcp)`: un servidor que la lista [`disabledMcpServers`](#disable-a-server-without-removing-it) del proyecto nombra. Claude Code lo muestra tanto en `claude mcp list` como en `claude mcp get <name>`. Vuelve a activar el servidor desde el panel `/mcp`.255* `⊘ Disabled for this project (re-enable via /mcp)`: un servidor que la lista [`disabledMcpServers`](#disable-a-server-without-removing-it) del proyecto nombra. Claude Code lo muestra tanto en `claude mcp list` como en `claude mcp get <name>`. Vuelve a activar el servidor desde el panel `/mcp`.

256 256 


384Esos reintentos no se aplican en estos casos:384Esos reintentos no se aplican en estos casos:

385 385 

386* La primera conexión de un servidor stdio. Para intentarla de nuevo, consulta [Servidores stdio que terminan o no logran iniciarse](#stdio-servers-that-exit-or-fail-to-start)386* La primera conexión de un servidor stdio. Para intentarla de nuevo, consulta [Servidores stdio que terminan o no logran iniciarse](#stdio-servers-that-exit-or-fail-to-start)

387* La primera conexión de un servidor WebSocket387* La primera conexión de un servidor WebSocket. Para intentarlo de nuevo en una sesión interactiva de terminal, selecciona **Reconnect** en el menú del servidor en `/mcp`

388* Un error de autenticación o de recurso no encontrado, porque requiere un cambio de configuración para resolverse. Cuando un [`headersHelper`](#use-dynamic-headers-for-custom-authentication) es la única fuente del encabezado `Authorization` del servidor, Claude Code reintenta un error de autenticación de todas formas, porque vuelve a ejecutar el helper en cada intento y puede obtener una credencial nueva388* Un error de autenticación o de recurso no encontrado, porque requiere un cambio de configuración para resolverse. Cuando un [`headersHelper`](#use-dynamic-headers-for-custom-authentication) es la única fuente del encabezado `Authorization` del servidor, Claude Code reintenta un error de autenticación de todas formas, porque vuelve a ejecutar el helper en cada intento y puede obtener una credencial nueva

389 389 

390#### Servidores stdio que terminan o no logran iniciarse390#### Servidores stdio que terminan o no logran iniciarse


403 403 

404#### Reintentar tú mismo los servidores fallidos404#### Reintentar tú mismo los servidores fallidos

405 405 

406Para reintentar todos los servidores que fallaron o necesitan autenticación, ejecuta `/mcp reconnect all`. En la terminal interactiva esto requiere Claude Code v2.1.284 o posterior, y las versiones anteriores imprimen `MCP server "all" not found` allí.406Para reintentar todos los servidores que fallaron o necesitan autenticación, ejecuta `/mcp reconnect all` en el prompt de Claude Code en una sesión interactiva de terminal. Esto requiere Claude Code v2.1.284 o posterior. Las versiones anteriores imprimen `MCP server "all" not found`.

407 407 

408#### Cómo Claude se entera de que un servidor falló408#### Cómo Claude se entera de que un servidor falló

409 409 


1332 1332 

1333Los servidores de claude.ai aparecen en la lista con indicadores que muestran que provienen de claude.ai.1333Los servidores de claude.ai aparecen en la lista con indicadores que muestran que provienen de claude.ai.

1334 1334 

1335Anthropic también proporciona algunos conectores por sí mismo, sin que usted o un administrador los añadan. En cuentas donde [Claude Docs](https://code.claude.com/docs/es/artifacts.md#write-a-document-with-claude-docs) está disponible, `/mcp` enumera `claude.ai Claude Docs` sin configuración, y Claude lo usa cuando le pide un documento destinado a otras personas. Para desactivarlo, añada una entrada `serverName` de `"claude.ai Claude Docs"` a `deniedMcpServers` o use el botón de alternancia `/mcp`, ambos descritos en [Desactivar conectores de claude.ai](#disable-claude-ai-connectors).1335Anthropic también proporciona algunos conectores por sí misma, sin que tú o un administrador los agreguen. En cuentas donde [Claude Docs](https://code.claude.com/docs/es/artifacts.md#write-a-document-with-claude-docs) está disponible, `/mcp` enumera `claude.ai Claude Docs` sin configuración, y Claude lo usa cuando le pides un documento destinado a otras personas. Para desactivar solo este conector, consulta [Desactivar conectores de claude.ai](#disable-claude-ai-connectors).

1336 1336 

1337Claude Code marca un conector como `managed` en `/mcp` y en el gestor de [`/plugin`](https://code.claude.com/docs/es/plugins/install) cuando su organización gestiona su autenticación en claude.ai. El estado managed no cambia cómo Claude Code se conecta al conector ni aplica los [controles de herramientas](#organization-controls-on-connector-tools) de su organización.1337Claude Code marca un conector como `managed` en `/mcp` y en el gestor de [`/plugin`](https://code.claude.com/docs/es/plugins/install) cuando su organización gestiona su autenticación en claude.ai. El estado managed no cambia cómo Claude Code se conecta al conector ni aplica los [controles de herramientas](#organization-controls-on-connector-tools) de su organización.

1338 1338 

model-config.md +7 −2

Details

349 349 

350Cuando la configuración administrada que Claude Code aplica define `availableModels`, esa lista sola se aplica, aparte de una [plataforma host que proporciona la suya propia](https://code.claude.com/docs/es/settings.md#exceptions-to-managed-settings-precedence): las entradas en la configuración de usuario, proyecto o local no pueden extenderla, y Claude Code nunca fusiona `availableModels` entre fuentes administradas tampoco; [cómo Claude Code combina fuentes administradas](https://code.claude.com/docs/es/managed-settings.md#how-claude-code-combines-managed-sources) indica qué lista de fuente se aplica. De lo contrario, las listas de la configuración de usuario, proyecto y local se [concatenan y desduplican](https://code.claude.com/docs/es/settings.md#settings-precedence) como otras configuraciones de matriz. Antes de Claude Code v2.1.175, las entradas de alcances de menor precedencia se fusionaban en la lista administrada en lugar de ser reemplazadas por ella.350Cuando la configuración administrada que Claude Code aplica define `availableModels`, esa lista sola se aplica, aparte de una [plataforma host que proporciona la suya propia](https://code.claude.com/docs/es/settings.md#exceptions-to-managed-settings-precedence): las entradas en la configuración de usuario, proyecto o local no pueden extenderla, y Claude Code nunca fusiona `availableModels` entre fuentes administradas tampoco; [cómo Claude Code combina fuentes administradas](https://code.claude.com/docs/es/managed-settings.md#how-claude-code-combines-managed-sources) indica qué lista de fuente se aplica. De lo contrario, las listas de la configuración de usuario, proyecto y local se [concatenan y desduplican](https://code.claude.com/docs/es/settings.md#settings-precedence) como otras configuraciones de matriz. Antes de Claude Code v2.1.175, las entradas de alcances de menor precedencia se fusionaban en la lista administrada en lugar de ser reemplazadas por ella.

351 351 

352Dentro de la lista efectiva, una entrada que nombra un modelo específico en una familia, ya sea un prefijo de versión o un ID de modelo completo, deshabilita la entrada de comodín de esa familia: `["sonnet", "claude-sonnet-4-5"]` permite solo versiones de Sonnet 4.5, no cada modelo de Sonnet.352Dentro de la lista efectiva, una entrada que nombra un modelo específico en una familia, ya sea un prefijo de versión o un ID de modelo completo, deshabilita la entrada de comodín de esa familia. Por ejemplo, con `["sonnet", "claude-sonnet-4-5"]`, los usuarios solo pueden elegir los IDs de modelo con los que `claude-sonnet-4-5` [coincide](#restrict-model-selection), no cualquier modelo de Sonnet.

353 353 

354### IDs de modelo de Mantle354### IDs de modelo de Mantle

355 355 


946>946>

947> Una lista de permitidos `availableModels` entregada a través de [MDM o un archivo de configuración administrada](https://code.claude.com/docs/es/managed-settings.md#delivery-mechanisms) aún se aplica cuando se utilizan proveedores de terceros; [la configuración administrada por servidor no se entrega allí](https://code.claude.com/docs/es/server-managed-settings.md#platform-availability).947> Una lista de permitidos `availableModels` entregada a través de [MDM o un archivo de configuración administrada](https://code.claude.com/docs/es/managed-settings.md#delivery-mechanisms) aún se aplica cuando se utilizan proveedores de terceros; [la configuración administrada por servidor no se entrega allí](https://code.claude.com/docs/es/server-managed-settings.md#platform-availability).

948>948>

949> El filtrado coincide con un alias de modelo como `opus`, un prefijo de versión como `claude-opus-4-8` o el ID de modelo completo en forma de proveedor. Los prefijos específicos del proveedor como `us.anthropic.` no se eliminan, por lo que para permitir un modelo específico, enumera su ID completo en forma de proveedor, o asígnalo a través de [`modelOverrides`](#override-model-ids-per-version). Para un modelo fijo, ese ID es el valor que estableces en su variable `ANTHROPIC_DEFAULT_*_MODEL`. Cualquier sufijo `[1m]` se elimina tanto de la entrada de la lista de permitidos como del modelo solicitado antes de la comparación.949> El filtrado coincide con un alias de modelo como `opus`, un prefijo de versión como `claude-opus-4-8` o el ID de modelo completo en forma de proveedor. Los prefijos específicos del proveedor como `us.anthropic.` no se eliminan, por lo que para permitir un modelo específico, asígnalo a través de [`modelOverrides`](#override-model-ids-per-version) o enumera su ID completo en forma de proveedor:

950>

951> * **Agent Platform de Google Cloud**: cuando el ID que solicita Claude Code lleva una fecha con `@`, como `claude-sonnet-4-5@20250929`, incluye la fecha en tu entrada de la lista de permitidos. Por sí solo, `claude-sonnet-4-5` no coincide con ese ID con ninguno de los dos valores del ajuste [`availableModelsMatch`](https://code.claude.com/docs/es/settings-reference#availablemodelsmatch).

952> * **Modelos fijos**: enumera el valor que estableces en la variable `ANTHROPIC_DEFAULT_*_MODEL` del modelo

953>

954> Cualquier sufijo `[1m]` se elimina tanto de la entrada de la lista de permitidos como del modelo solicitado antes de la comparación.

950 955 

951### Personalizar la visualización y capacidades del modelo fijo956### Personalizar la visualización y capacidades del modelo fijo

952 957 

Details

605 605 

606* `prompt.id`: UUID que correlaciona un prompt del usuario con todos los eventos posteriores hasta el siguiente prompt. Consulta [Atributos de correlación de eventos](#event-correlation-attributes).606* `prompt.id`: UUID que correlaciona un prompt del usuario con todos los eventos posteriores hasta el siguiente prompt. Consulta [Atributos de correlación de eventos](#event-correlation-attributes).

607* `workspace.host_paths`: directorios del espacio de trabajo del host seleccionados en la aplicación de escritorio, como un arreglo de cadenas607* `workspace.host_paths`: directorios del espacio de trabajo del host seleccionados en la aplicación de escritorio, como un arreglo de cadenas

608* `workflow.run_id`: identificador de ejecución, con el prefijo `wf_`, en los eventos de API y de herramientas emitidos por agentes que pertenecen a una ejecución de la herramienta [Workflow](https://code.claude.com/docs/es/workflows.md). Filtrar los eventos por un `workflow.run_id` reconstruye las solicitudes a la API y los resultados de herramientas de esa ejecución. El identificador abarca los agentes que genera el script del flujo de trabajo y cualquier agente que estos generen a su vez, como las invocaciones de skills. Coincide con el identificador de ejecución informado en el resultado de la herramienta Workflow. Ausente en todos los demás eventos.608* `workflow.run_id`: identificador de ejecución, con el prefijo `wf_`, en los eventos de API y de herramientas emitidos por agentes que pertenecen a una ejecución de la herramienta [Workflow](https://code.claude.com/docs/es/workflows.md). Filtrar eventos por un `workflow.run_id` reconstruye las solicitudes a la API y los resultados de herramientas de esa ejecución. El identificador abarca los agentes que genera el script del flujo de trabajo y cualquier agente que estos generen a su vez, como las invocaciones de skills. Coincide con el identificador de ejecución informado en el resultado de la herramienta Workflow.

609* `workflow.name`: nombre del flujo de trabajo, el `meta.name` de su script, emitido junto con `workflow.run_id`. Los nombres de flujos de trabajo integrados aparecen textualmente cuando la ejecución usa el script integrado sin modificar. Los nombres creados por el usuario, incluidas las copias editadas de scripts integrados, se reemplazan por `custom` a menos que se configure `OTEL_LOG_TOOL_DETAILS=1`.609* `workflow.name`: nombre del flujo de trabajo, el `meta.name` de su script, emitido junto con `workflow.run_id`. Los nombres de flujos de trabajo integrados aparecen textualmente cuando la ejecución usa el script integrado sin modificar. Los nombres creados por el usuario, incluidas las copias editadas de scripts integrados, se reemplazan por `custom` a menos que se configure `OTEL_LOG_TOOL_DETAILS=1`.

610* `agent_id`: identificador del [subagente](https://code.claude.com/docs/es/sub-agents.md) que generó el evento, como `a3f2c1b4d5e6f7a80`. Los eventos que lo llevan incluyen los eventos de API y de herramientas de un subagente, sus eventos [`assistant_response`](#assistant-response-event) y [`subagent_completed`](#subagent-completed-event) para el subagente finalizado. Ausente en los eventos de la sesión principal y de [compañeros de equipo en proceso](https://code.claude.com/docs/es/agent-teams.md#choose-a-display-mode). El [`agent_id` del span](#span-attributes) del subagente es el mismo valor, o agrega una etiqueta después de la `a` inicial, como en `acompact-3f2c1b4d5e6f7a80`. Requiere Claude Code v2.1.310 o posterior

611* `parent_agent_id`: el `agent_id` del agente que generó o reanudó por última vez al subagente que generó el evento. Ausente cuando ese agente es la sesión principal. Requiere Claude Code v2.1.310 o posterior

610 612 

611#### Atributos del repositorio613#### Atributos del repositorio

612 614 


755| `prompt.id` | Identificador UUID v4 que vincula todos los eventos producidos mientras se procesa un único prompt del usuario |757| `prompt.id` | Identificador UUID v4 que vincula todos los eventos producidos mientras se procesa un único prompt del usuario |

756| `event.sequence` | Contador basado en 0 para ordenar eventos, contado por proceso de Claude Code y no por sesión |758| `event.sequence` | Contador basado en 0 para ordenar eventos, contado por proceso de Claude Code y no por sesión |

757| `message.uuid` | UUID del mensaje tal como se guarda en la transcripción de la sesión, los archivos `~/.claude/projects/*/*.jsonl`. Presente en `assistant_response`, en `api_response_body` y en `user_prompt`, excepto en los despachos de comandos, que pueden producir cero o varios mensajes. En `assistant_response` y `api_response_body`, es la entrada final de la transcripción de la respuesta, desde la que se encadena el `parentUuid` del siguiente turno. Requiere Claude Code v2.1.274 o posterior en `api_response_body` |759| `message.uuid` | UUID del mensaje tal como se guarda en la transcripción de la sesión, los archivos `~/.claude/projects/*/*.jsonl`. Presente en `assistant_response`, en `api_response_body` y en `user_prompt`, excepto en los despachos de comandos, que pueden producir cero o varios mensajes. En `assistant_response` y `api_response_body`, es la entrada final de la transcripción de la respuesta, desde la que se encadena el `parentUuid` del siguiente turno. Requiere Claude Code v2.1.274 o posterior en `api_response_body` |

758| `request_id` | ID asignado por el servidor a la solicitud a la API, leído del encabezado de respuesta `request-id`, como `req_011...`. En una respuesta sin encabezado `request-id`, como en [Amazon Bedrock](https://code.claude.com/docs/es/amazon-bedrock.md), el valor proviene en cambio del encabezado `x-amzn-requestid`. Presente en `api_request`, `api_error`, `api_refusal`, `assistant_response` y `api_response_body` cuando la respuesta incluye cualquiera de los dos encabezados. Coincide con el mismo atributo en el span de traza `llm_request`. El origen `x-amzn-requestid` requiere Claude Code v2.1.282 o posterior |760| `request_id` | ID asignado por el servidor a la solicitud a la API, leído del encabezado de respuesta `request-id`, como `req_011...`. En una respuesta sin encabezado `request-id`, como en [Amazon Bedrock](https://code.claude.com/docs/es/amazon-bedrock.md), el valor proviene en su lugar del encabezado `x-amzn-requestid`. Presente en `api_request`, `api_error`, `api_refusal`, `assistant_response`, `api_response_body`, [`tool_result`](#tool-result-event) y [`tool_decision`](#tool-decision-event) cuando la respuesta lleva cualquiera de los dos encabezados. Coincide con el mismo atributo en el span de traza `llm_request`. La fuente `x-amzn-requestid` requiere Claude Code v2.1.282 o posterior |

759| `client_request_id` | UUID generado por el cliente y enviado como el encabezado de solicitud `x-client-request-id`. Presente en `api_request` y `api_error` en conexiones a la API de primera parte; ausente en backends de proveedores de terceros y cuando la solicitud se reintentó mediante el respaldo sin streaming. Empareja una solicitud con su respuesta y sigue disponible en fallas como los tiempos de espera agotados que nunca produjeron un `request_id` del servidor. Coincide con el mismo atributo en el span de traza `llm_request` |761| `client_request_id` | UUID generado por el cliente y enviado como el encabezado de solicitud `x-client-request-id`. Presente en `api_request` y `api_error` en conexiones a la API de primera parte; ausente en backends de proveedores de terceros y cuando la solicitud se reintentó mediante el respaldo sin streaming. Empareja una solicitud con su respuesta y sigue disponible en fallas como los tiempos de espera agotados que nunca produjeron un `request_id` del servidor. Coincide con el mismo atributo en el span de traza `llm_request` |

760 762 

761Para rastrear toda la actividad desencadenada por un único prompt, filtra tus eventos por un valor específico de `prompt.id`. Esto devuelve el evento user\_prompt, cualquier evento api\_request y cualquier evento tool\_result que haya ocurrido mientras se procesaba ese prompt.763Para rastrear toda la actividad desencadenada por un único prompt, filtra tus eventos por un valor específico de `prompt.id`. Esto devuelve el evento user\_prompt, cualquier evento api\_request y cualquier evento tool\_result que haya ocurrido mientras se procesaba ese prompt.


820* `event.sequence`: contador por proceso para ordenar eventos, descrito en [Atributos de correlación de eventos](#event-correlation-attributes)822* `event.sequence`: contador por proceso para ordenar eventos, descrito en [Atributos de correlación de eventos](#event-correlation-attributes)

821* `tool_name`: Nombre de la herramienta823* `tool_name`: Nombre de la herramienta

822* `tool_use_id`: Identificador único de esta invocación de la herramienta. Coincide con el `tool_use_id` que se pasa a los hooks, lo que permite correlacionar los eventos de OTel con los datos capturados por los hooks.824* `tool_use_id`: Identificador único de esta invocación de la herramienta. Coincide con el `tool_use_id` que se pasa a los hooks, lo que permite correlacionar los eventos de OTel con los datos capturados por los hooks.

825* `request_id`: el [`request_id`](#event-correlation-attributes) de la respuesta de la API que contenía esta llamada a herramienta, para que puedas unir la llamada con los eventos de API de esa respuesta. Ausente cuando esa respuesta no tenía ID de solicitud o cuando ninguna respuesta de la API contenía la llamada. Requiere Claude Code v2.1.310 o posterior

823* `success`: `"true"` o `"false"`826* `success`: `"true"` o `"false"`

824* `duration_ms`: Tiempo de ejecución en milisegundos827* `duration_ms`: Tiempo de ejecución en milisegundos

825* `error_type`: Cadena de categoría de error cuando la herramienta falló, como `"Error:ENOENT"` o `"ShellError"`828* `error_type`: Cadena de categoría de error cuando la herramienta falló, como `"Error:ENOENT"` o `"ShellError"`


972* `event.sequence`: contador por proceso para ordenar eventos, descrito en [Atributos de correlación de eventos](#event-correlation-attributes)975* `event.sequence`: contador por proceso para ordenar eventos, descrito en [Atributos de correlación de eventos](#event-correlation-attributes)

973* `tool_name`: Nombre de la herramienta (por ejemplo, "Read", "Edit", "Write", "NotebookEdit")976* `tool_name`: Nombre de la herramienta (por ejemplo, "Read", "Edit", "Write", "NotebookEdit")

974* `tool_use_id`: Identificador único de esta invocación de la herramienta. Coincide con el `tool_use_id` que se pasa a los hooks, lo que permite correlacionar los eventos de OTel con los datos capturados por los hooks.977* `tool_use_id`: Identificador único de esta invocación de la herramienta. Coincide con el `tool_use_id` que se pasa a los hooks, lo que permite correlacionar los eventos de OTel con los datos capturados por los hooks.

978* `request_id`: el [`request_id`](#event-correlation-attributes) de la respuesta de la API que contenía esta llamada a herramienta, para que puedas unir la llamada con los eventos de API de esa respuesta. Ausente cuando esa respuesta no tenía ID de solicitud o cuando ninguna respuesta de la API contenía la llamada. Requiere Claude Code v2.1.310 o posterior

975* `decision`: `"accept"` o `"reject"`979* `decision`: `"accept"` o `"reject"`

976* `tool_source`: Siempre presente. La procedencia de la herramienta, como un conjunto cerrado de valores definidos por la CLI:980* `tool_source`: Siempre presente. La procedencia de la herramienta, como un conjunto cerrado de valores definidos por la CLI:

977 * `"builtin"`: las herramientas propias de la CLI981 * `"builtin"`: las herramientas propias de la CLI


1024 * Para la herramienta Skill: incluye `skill_name`1028 * Para la herramienta Skill: incluye `skill_name`

1025 * Para la herramienta Agent o la herramienta Task heredada: incluye `subagent_type`1029 * Para la herramienta Agent o la herramienta Task heredada: incluye `subagent_type`

1026 1030 

1027Si reduces el `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` del SDK de OpenTelemetry por debajo del número de atributos de un evento `tool_decision`, el SDK descarta los atributos que Claude Code estableció al final. El SDK descarta primero `permission_mode`, en segundo lugar `classifier_category` y en tercer lugar `classifier_verdict`, y descarta los demás atributos del evento solo después de esos tres. Este orden requiere Claude Code v2.1.302 o posterior.1031Si reduces el `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` del SDK de OpenTelemetry por debajo del número de atributos de un evento `tool_decision`, el SDK descarta los atributos que Claude Code estableció al final. El SDK los descarta antes que cualquier otro atributo, en este orden, omitiendo los que el evento no lleve:

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` y `classifier_verdict` se descartan en este orden en Claude Code v2.1.302 o posterior. `parent_agent_id`, `agent_id` y `request_id` requieren v2.1.310 o posterior.

1028 1041 

1029#### Evento de seguridad1042#### Evento de seguridad

1030 1043 

Details

240 240 

241Los dos hosts de ingesta de Datadog llevan solo telemetría operativa opcional, y establecer [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/es/env-vars) deshabilita ambos. Las sesiones en proveedores de terceros nunca envían a estos hosts, incluso cuando una plataforma establece [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](https://code.claude.com/docs/es/env-vars) y las métricas de telemetría están habilitadas de forma predeterminada. Consulte [Servicios de telemetría](https://code.claude.com/docs/es/data-usage.md#telemetry-services) para todo lo que Claude Code envía y cómo deshabilitarlo antes de finalizar su lista de permitidos.241Los dos hosts de ingesta de Datadog llevan solo telemetría operativa opcional, y establecer [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/es/env-vars) deshabilita ambos. Las sesiones en proveedores de terceros nunca envían a estos hosts, incluso cuando una plataforma establece [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](https://code.claude.com/docs/es/env-vars) y las métricas de telemetría están habilitadas de forma predeterminada. Consulte [Servicios de telemetría](https://code.claude.com/docs/es/data-usage.md#telemetry-services) para todo lo que Claude Code envía y cómo deshabilitarlo antes de finalizar su lista de permitidos.

242 242 

243### Enrutamiento de proveedores de nube y gateways LLM

244 

243Cuando se usa [Amazon Bedrock](https://code.claude.com/docs/es/amazon-bedrock.md), [Agent Platform de Google Cloud](https://code.claude.com/docs/es/google-vertex-ai.md), [Microsoft Foundry](https://code.claude.com/docs/es/microsoft-foundry.md) o una sesión de [puerta de enlace de aplicaciones Claude](https://code.claude.com/docs/es/claude-apps-gateway) con sesión iniciada, el tráfico del modelo y la autenticación van a su proveedor o puerta de enlace en lugar de `api.anthropic.com`, `claude.ai` o `platform.claude.com`. La herramienta WebFetch aún llama a `api.anthropic.com` para su [verificación de seguridad de dominio](https://code.claude.com/docs/es/data-usage.md#webfetch-domain-safety-check) a menos que establezca `skipWebFetchPreflight: true` en [configuración](https://code.claude.com/docs/es/settings.md).245Cuando se usa [Amazon Bedrock](https://code.claude.com/docs/es/amazon-bedrock.md), [Agent Platform de Google Cloud](https://code.claude.com/docs/es/google-vertex-ai.md), [Microsoft Foundry](https://code.claude.com/docs/es/microsoft-foundry.md) o una sesión de [puerta de enlace de aplicaciones Claude](https://code.claude.com/docs/es/claude-apps-gateway) con sesión iniciada, el tráfico del modelo y la autenticación van a su proveedor o puerta de enlace en lugar de `api.anthropic.com`, `claude.ai` o `platform.claude.com`. La herramienta WebFetch aún llama a `api.anthropic.com` para su [verificación de seguridad de dominio](https://code.claude.com/docs/es/data-usage.md#webfetch-domain-safety-check) a menos que establezca `skipWebFetchPreflight: true` en [configuración](https://code.claude.com/docs/es/settings.md).

244 246 

245Cuando se enruta a través de una [puerta de enlace LLM](https://code.claude.com/docs/es/llm-gateway) con [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential), la verificación de disponibilidad de [modo rápido](https://code.claude.com/docs/es/fast-mode.md) aún llama a `api.anthropic.com` en lugar de la URL base de la puerta de enlace. La verificación respeta un proxy HTTP configurado, por lo que donde un bloqueo de red es la causa, una entrada de lista de permitidos para `api.anthropic.com` en el proxy es la solución. Un bloqueo de red falla la verificación solo donde el host es inaccesible incluso a través del proxy, y el modo rápido luego reporta un error de conectividad. El mismo error de conectividad aparece cuando la verificación presenta una credencial emitida por la puerta de enlace que Anthropic rechaza; la lista de permitidos no ayuda allí, ya que nada está bloqueado. Consulte [usar modo rápido detrás de proxies y puertas de enlace LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) para las variables que lo restauran.247Si tus desarrolladores usan el [modo rápido](https://code.claude.com/docs/es/fast-mode.md) detrás de un [gateway LLM](https://code.claude.com/docs/es/llm-gateway) configurado con [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential), mantén `api.anthropic.com` accesible a través de tu proxy. Cuando Claude Code envía la verificación de disponibilidad del modo rápido, esta va a ese host a través de cualquier proxy HTTP configurado, nunca al gateway. Para saber cuándo no se envía la verificación y qué variable restaura el modo rápido en cada caso, consulta [Usar el modo rápido detrás de proxies y gateways LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways).

246 248 

247### Listas de permitidos de IP de la organización y salida de proxy249### Listas de permitidos de IP de la organización y salida de proxy

248 250 

Details

106 106 

107El código del módulo de hooks está anidado con demasiada profundidad, o su cadena de importaciones es demasiado larga, para que Claude Code pueda cargarlo. La línea empieza con el nombre del mod y `hooks module did not load:`, y luego indica el nombre de un archivo y este motivo.107El código del módulo de hooks está anidado con demasiada profundidad, o su cadena de importaciones es demasiado larga, para que Claude Code pueda cargarlo. La línea empieza con el nombre del mod y `hooks module did not load:`, y luego indica el nombre de un archivo y este motivo.

108 108 

109Revisa ese archivo y los archivos a los que se llega a través de sus importaciones para encontrar la parte más profundamente anidada y reescríbela para que se anide menos, o acorta la cadena de importaciones. Si instalaste el mod y no lo escribiste tú, pídele a su autor que lo haga.109Revisa ese archivo y los archivos a los que se llega a través de sus importaciones para encontrar la parte más profundamente anidada y reescríbela para que se anide menos, o acorta la cadena de importaciones. Si no escribiste el mod, pídele a su autor que lo corrija.

110 110 

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

112 112 

routines.md +20 −2

Details

25* Una tarea con solo un disparador de API se ejecuta cuando llamas a su endpoint.25* Una tarea con solo un disparador de API se ejecuta cuando llamas a su endpoint.

26* Una tarea con solo un disparador de GitHub se ejecuta cuando ocurre un evento coincidente en el repositorio.26* Una tarea con solo un disparador de GitHub se ejecuta cuando ocurre un evento coincidente en el repositorio.

27 27 

28Las tareas programadas están disponibles en los planes Pro, Max, Team y Enterprise. Créalas y adminístralas en [claude.ai/code/routines](https://claude.ai/code/routines), o desde la CLI con `/schedule`. El nombre anterior, rutinas, [todavía aparece](#where-the-name-routines-still-appears) en la dirección web, la CLI y la API.28Las tareas programadas están disponibles en los planes Pro, Max, Team y Enterprise. Créalas y adminístralas en [claude.ai/code/routines](https://claude.ai/code/routines), o desde la CLI con `/schedule`. El nombre anterior, rutinas, [todavía aparece](#where-the-name-routines-still-appears).

29 29 

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

31>31>


66 66 

67**1. Abrir el diálogo de creación**67**1. Abrir el diálogo de creación**

68 68 

69Ve a [claude.ai/code/routines](https://claude.ai/code/routines) y haz clic en **New task**. Si primero se abre un menú, selecciona **Set up manually**. Se abre el diálogo **New scheduled task**. La otra opción del menú, **Create with Claude**, te permite describir la tarea en un chat y que Claude la cree por ti.69Ve a [claude.ai/code/routines](https://claude.ai/code/routines) y haz clic en **New task** para abrir el diálogo **New scheduled task**. Revisa si aparece alguna de estas pantallas antes de continuar:

70 

71* Si el botón dice **New routine** en lugar de **New task**, haz clic en **New routine** y continúa con [Formulario de página completa](#full-page-form).

72* En la aplicación de escritorio, si se abre un menú con **Local** y **Cloud**, ve a [Formulario de página completa](#full-page-form).

73* Si se abre un menú con **Create with Claude** y **Set up manually**, selecciona **Set up manually** para abrir el diálogo. **Create with Claude** te permite, en cambio, describir la tarea en un chat y que Claude la cree.

74* Si se abre una página completa en lugar del diálogo, ve a [Formulario de página completa](#full-page-form).

70 75 

71Si **Repositories** y **Environment** ya aparecen al abrirse el diálogo, consulta [en qué se diferencia ese diálogo](#dialog-with-repositories-and-environment-in-the-main-view). En caso contrario, este diálogo también crea tareas programadas para el chat de claude.ai. Para que la tuya sea lo que el diálogo llama una tarea de Claude Code, selecciona un repositorio o agrega un disparador de evento de GitHub o de API en los pasos siguientes. Ese tipo de tarea ejecuta Claude Code en una sesión en la nube.76Si **Repositories** y **Environment** ya aparecen al abrirse el diálogo, consulta [en qué se diferencia ese diálogo](#dialog-with-repositories-and-environment-in-the-main-view). En caso contrario, este diálogo también crea tareas programadas para el chat de claude.ai. Para que la tuya sea lo que el diálogo llama una tarea de Claude Code, selecciona un repositorio o agrega un disparador de evento de GitHub o de API en los pasos siguientes. Ese tipo de tarea ejecuta Claude Code en una sesión en la nube.

72 77 


126 131 

127Selecciona el repositorio antes de agregar un disparador de evento de GitHub, porque ese disparador no está disponible hasta que se selecciona un repositorio.132Selecciona el repositorio antes de agregar un disparador de evento de GitHub, porque ese disparador no está disponible hasta que se selecciona un repositorio.

128 133 

134#### Formulario de página completa

135 

136En la aplicación de escritorio, si se abre un menú con **Local** y **Cloud**, selecciona **Cloud**. Se abre una página titulada **New routine** o **New scheduled task**. Completa sus campos:

137 

138* **Name**: escribe uno.

139* **Instructions**: escribe el prompt. En el mismo cuadro, selecciona el modelo, los repositorios y el entorno. Para saber qué controla cada uno, consulta los pasos de [Crear desde la web](#create-from-the-web).

140* **Select a trigger**: selecciona **Schedule**, **GitHub event** o **API**. Para un horario, consulta [Agregar un disparador de horario](#add-a-schedule-trigger). Para un [evento de GitHub](#add-a-github-trigger), selecciona un repositorio. Para un [disparador de API](#add-an-api-trigger), copia el token del diálogo **API token** que se abre después de hacer clic en **Create**, porque se muestra una sola vez. Para combinar varios disparadores, haz clic en **Add another trigger**.

141* **Connectors**: todos tus conectores conectados se incluyen de forma predeterminada, así que elimina los que la tarea no necesite.

142 

143Si **Create** no está disponible, pasa el cursor sobre él para ver qué le falta aún al formulario. Haz clic en **Create** y se abre la página de detalles de la tarea.

144 

129### Crear desde la CLI145### Crear desde la CLI

130 146 

131Ejecuta `/schedule` en cualquier sesión para crear una tarea programada de forma conversacional. También puedes pasar una descripción directamente, para una tarea recurrente como `/schedule daily PR review at 9am` o una única como `/schedule clean up feature flag in one week`. Claude recorre la misma información que recopila el diálogo web y luego guarda la tarea en tu cuenta. El comando también está disponible con el alias `/routines`.147Ejecuta `/schedule` en cualquier sesión para crear una tarea programada de forma conversacional. También puedes pasar una descripción directamente, para una tarea recurrente como `/schedule daily PR review at 9am` o una única como `/schedule clean up feature flag in one week`. Claude recorre la misma información que recopila el diálogo web y luego guarda la tarea en tu cuenta. El comando también está disponible con el alias `/routines`.


152* **Ejecuciones en punto**: si programas una ejecución exactamente en punto, como a las 9:00, puede comenzar varios minutos tarde. Para comenzar cerca de la hora programada, elige unos minutos después de la hora, por ejemplo 9:07.168* **Ejecuciones en punto**: si programas una ejecución exactamente en punto, como a las 9:00, puede comenzar varios minutos tarde. Para comenzar cerca de la hora programada, elige unos minutos después de la hora, por ejemplo 9:07.

153* **Intervalos personalizados**: para una cadencia que no ofrecen los preestablecidos, crea la tarea y selecciona **Custom** en su [diálogo de edición](#edit-and-control-scheduled-tasks). Luego ingresa una expresión cron, como `0 */2 * * *` para cada dos horas. Para establecer una desde la CLI, ejecuta [`/schedule update`](#manage-scheduled-tasks-from-the-cli). Las expresiones que se ejecutan con más frecuencia que una vez por hora se rechazan.169* **Intervalos personalizados**: para una cadencia que no ofrecen los preestablecidos, crea la tarea y selecciona **Custom** en su [diálogo de edición](#edit-and-control-scheduled-tasks). Luego ingresa una expresión cron, como `0 */2 * * *` para cada dos horas. Para establecer una desde la CLI, ejecuta [`/schedule update`](#manage-scheduled-tasks-from-the-cli). Las expresiones que se ejecutan con más frecuencia que una vez por hora se rechazan.

154* **Zona horaria**: cuando elijas una frecuencia preestablecida, ingresa la hora en tu zona horaria local.170* **Zona horaria**: cuando elijas una frecuencia preestablecida, ingresa la hora en tu zona horaria local.

171* **Zona horaria de la expresión cron**: cuando la expresión consta solo de cinco campos, escribe las horas en UTC, de modo que `0 9 * * 1-5` se ejecuta a las 9:00 AM UTC los días laborables. Si el campo comienza con un prefijo `CRON_TZ=`, consérvalo y escribe las horas en su zona, o elimínalo y escríbelas en UTC.

155 172 

156#### Programar una ejecución única173#### Programar una ejecución única

157 174 


455 472 

456Las tareas programadas se llamaban antes rutinas, y estos lugares conservan el nombre anterior. Cada uno se refiere a la misma función:473Las tareas programadas se llamaban antes rutinas, y estos lugares conservan el nombre anterior. Cada uno se refiere a la misma función:

457 474 

475* **App**: en algunas cuentas, la entrada de la barra lateral y el título de la página dicen **Routines**, el botón dice **New routine** y otras etiquetas dicen rutina. Para crear una tarea allí, consulta [Formulario de página completa](#full-page-form).

458* **Dirección web**: `claude.ai/code/routines`476* **Dirección web**: `claude.ai/code/routines`

459* **CLI**: el alias `/routines` de `/schedule`, la descripción del comando y las respuestas de Claude mientras configura una tarea477* **CLI**: el alias `/routines` de `/schedule`, la descripción del comando y las respuestas de Claude mientras configura una tarea

460* **API**: la ruta del endpoint `/fire`, su encabezado beta, el `type` de su respuesta, la etiqueta `<routine-fire-payload>` y la página de referencia [Trigger a routine through the API](https://platform.claude.com/docs/en/api/claude-code/routines-fire)478* **API**: la ruta del endpoint `/fire`, su encabezado beta, el `type` de su respuesta, la etiqueta `<routine-fire-payload>` y la página de referencia [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* **En tu directorio de trabajo y los directorios superiores**: los archivos de configuración de `.claude`, los directorios `.claude/skills`, `.claude/agents`, `.claude/commands` y `.claude/hooks`, `.mcp.json`, y los archivos que Claude Code ejecuta por sí mismo, como `.claude/workflows` y `.claude/scheduled_tasks.json`538* **En tu directorio de trabajo y los directorios superiores**: los archivos de configuración de `.claude`, los directorios `.claude/skills`, `.claude/agents`, `.claude/commands` y `.claude/hooks`, `.mcp.json`, y los archivos que Claude Code ejecuta por sí mismo, como `.claude/workflows` y `.claude/scheduled_tasks.json`

539* **Solo en tu directorio de trabajo**: archivos de inicio del shell como `.bashrc` y `.zshrc`, `.gitconfig`, los directorios `.vscode` y `.idea`, y `hooks` y `config` dentro de `.git`539* **Solo en tu directorio de trabajo**: archivos de inicio del shell como `.bashrc` y `.zshrc`, `.gitconfig`, los directorios `.vscode` y `.idea`, y `hooks` y `config` dentro de `.git`

540* **Archivos que convertirían tu directorio de trabajo en un repositorio git bare**: `HEAD`, `objects` y `refs` en el nivel superior, además de las entradas `config` y `hooks` existentes allí cuando hay un `HEAD` junto a ellas. Un archivo llamado `config` se deniega incluso sin `HEAD`. En Linux y WSL2, el sandbox elimina un archivo `HEAD` o un directorio `objects` o `refs` de nivel superior que aparezca mientras se ejecuta un comando en el sandbox540* **Archivos que convertirían tu directorio de trabajo en un repositorio git bare**: `HEAD`, `objects` y `refs` en el nivel superior, además de las entradas `config` y `hooks` existentes allí cuando hay un archivo `HEAD` o un enlace simbólico junto a ellas. Un archivo llamado `config` se deniega incluso sin `HEAD`. [Un `HEAD`, `objects` o `refs` que aparezca más tarde puede eliminarse](#when-the-sandbox-deletes-head-objects-or-refs). En Linux y WSL2, un comando en el sandbox puede crear uno donde no exista ninguno.

541* **En `~/.claude`, o el directorio al que apunta `CLAUDE_CONFIG_DIR`**: la mayor parte de su contenido, además de `~/.claude.json` y el almacén de credenciales `.credentials.json`541* **En `~/.claude`, o el directorio al que apunta `CLAUDE_CONFIG_DIR`**: la mayor parte de su contenido, además de `~/.claude.json` y el almacén de credenciales `.credentials.json`

542 542 

543Si aparece un enlace simbólico en la ruta de un archivo de configuración protegido durante la sesión, el sandbox también deniega las escrituras en el archivo al que apunta, a partir del siguiente comando.543Si aparece un enlace simbólico en la ruta de un archivo de configuración protegido durante la sesión, el sandbox también deniega las escrituras en el archivo al que apunta, a partir del siguiente comando.


552 552 

553Si `git merge` o `git checkout` falla con `unable to unlink old` en una de estas rutas, consulta [Un comando de git falla con `unable to unlink old`](#a-git-command-fails-with-unable-to-unlink-old).553Si `git merge` o `git checkout` falla con `unable to unlink old` en una de estas rutas, consulta [Un comando de git falla con `unable to unlink old`](#a-git-command-fails-with-unable-to-unlink-old).

554 554 

555#### Cuándo el sandbox elimina `HEAD`, `objects` o `refs`

556 

557Después de que termina un comando en el sandbox, se elimina una entrada `HEAD`, `objects` o `refs` más reciente de nivel superior en tu directorio de trabajo, a menos que sea una carpeta con contenido. Más reciente significa que la entrada no estaba allí la última vez que el sandbox construyó su configuración: al inicio de la sesión o después de un cambio como [`/cd`](https://code.claude.com/docs/es/commands).

558 

559Una carpeta `objects` o `refs` más reciente con contenido también se elimina, junto con su contenido, cuando había un archivo `HEAD` o un enlace simbólico allí la última vez que el sandbox construyó su configuración. Para conservar una carpeta, consulta [Una carpeta llamada `objects` o `refs` desaparece después de un comando](#a-folder-named-objects-or-refs-disappears-after-a-command).

560 

555#### Rutas denegadas que pasan por un enlace simbólico561#### Rutas denegadas que pasan por un enlace simbólico

556 562 

557En macOS, cuando una ruta denegada pasa por un enlace simbólico, como un `~/.claude` que es un enlace a un repositorio de dotfiles, el sandbox también deniega la ubicación real de la ruta. Esto abarca las denegaciones propias del sandbox y tus entradas literales de `denyWrite` y `denyRead`.563En macOS, cuando una ruta denegada pasa por un enlace simbólico, como un `~/.claude` que es un enlace a un repositorio de dotfiles, el sandbox también deniega la ubicación real de la ruta. Esto abarca las denegaciones propias del sandbox y tus entradas literales de `denyWrite` y `denyRead`.


881 887 

882Después de la falla, Claude puede [ofrecer ejecutar nuevamente el comando fuera del sandbox](#the-unsandboxed-retry-escape-hatch). Aprueba ese reintento o ejecuta el comando git tú mismo en otra terminal. Si has establecido `allowUnsandboxedCommands` en `false`, Claude no puede ofrecer el reintento, así que ejecuta el comando tú mismo.888Después de la falla, Claude puede [ofrecer ejecutar nuevamente el comando fuera del sandbox](#the-unsandboxed-retry-escape-hatch). Aprueba ese reintento o ejecuta el comando git tú mismo en otra terminal. Si has establecido `allowUnsandboxedCommands` en `false`, Claude no puede ofrecer el reintento, así que ejecuta el comando tú mismo.

883 889 

890### Una carpeta llamada `objects` o `refs` desaparece después de un comando

891 

892Una carpeta `objects` o `refs` de nivel superior que apareció durante la sesión puede [eliminarse después de que termine un comando aislado](#when-the-sandbox-deletes-head-objects-or-refs). No importa si la creó un comando, Claude o tú. Para conservar una carpeta, deja algo dentro de ella. Si un archivo o enlace simbólico `HEAD` ha estado en el nivel superior durante la sesión, muévelo a otro lugar y luego reinicia todas las sesiones de Claude Code abiertas allí.

893 

894Antes de v2.1.307, la carpeta se eliminaba incluso si tenía algo dentro y no había `HEAD`. Si usas una versión anterior, [actualiza Claude Code](https://code.claude.com/docs/es/setup.md#update-claude-code).

895 

884### Bubblewrap falla al iniciarse dentro de un contenedor896### Bubblewrap falla al iniciarse dentro de un contenedor

885 897 

886En un contenedor sin privilegios, [bubblewrap](#os-level-enforcement) no puede montar un sistema de archivos `/proc` nuevo, por lo que los comandos aislados fallan con un error `bwrap` como `Can't mount proc on /newroot/proc: Operation not permitted`. Establece [`enableWeakerNestedSandbox`](https://code.claude.com/docs/es/settings-reference#sandbox-enableweakernestedsandbox) en `true` para que el sandbox monte mediante bind el `/proc` existente del contenedor en su lugar. Solo usa este ajuste cuando el contenedor externo ya proporcione el límite de aislamiento que necesitas, ya que el ajuste expone información de proceso a comandos aislados que un montaje `/proc` nuevo ocultaría.898En un contenedor sin privilegios, [bubblewrap](#os-level-enforcement) no puede montar un sistema de archivos `/proc` nuevo, por lo que los comandos aislados fallan con un error `bwrap` como `Can't mount proc on /newroot/proc: Operation not permitted`. Establece [`enableWeakerNestedSandbox`](https://code.claude.com/docs/es/settings-reference#sandbox-enableweakernestedsandbox) en `true` para que el sandbox monte mediante bind el `/proc` existente del contenedor en su lugar. Solo usa este ajuste cuando el contenedor externo ya proporcione el límite de aislamiento que necesitas, ya que el ajuste expone información de proceso a comandos aislados que un montaje `/proc` nuevo ocultaría.

Details

30 30 

31Los dos cuadros de Claude Code en el diagrama son procesos de sesión: un ejecutor ejecutando dos sesiones a la vez, hasta su capacidad configurada. Un ejecutor sirve a un [propietario](#key-concepts) a la vez y se bloquea a ese propietario cuando reclama su primera sesión, por lo que el código extraído nunca se mezcla entre propietarios; [Ciclo de vida del ejecutor](#runner-lifecycle) cubre la regla.31Los dos cuadros de Claude Code en el diagrama son procesos de sesión: un ejecutor ejecutando dos sesiones a la vez, hasta su capacidad configurada. Un ejecutor sirve a un [propietario](#key-concepts) a la vez y se bloquea a ese propietario cuando reclama su primera sesión, por lo que el código extraído nunca se mezcla entre propietarios; [Ciclo de vida del ejecutor](#runner-lifecycle) cubre la regla.

32 32 

33Puede iniciar ejecutores usted mismo y mantenerlos en ejecución, o ejecutar el [orquestador de escalado automático](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), un segundo proceso que hospeda, que inicia ejecutores a medida que las sesiones se colan; cada ejecutor sale por su cuenta cuando su trabajo termina. De cualquier manera, configura el entorno una vez, y aparece en el selector en cada superficie compatible.33Puedes iniciar ejecutores tú mismo y mantenerlos en ejecución, o ejecutar el [orquestador de escalado automático](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), un segundo proceso que hospedas, que inicia ejecutores a medida que las sesiones se encolan. De cualquier manera, configuras el entorno una vez, y aparece en el selector en cada superficie compatible.

34 34 

35## Disponibilidad y limitaciones35## Disponibilidad y limitaciones

36 36 


122 122 

123Los proxies de salida corporativos son compatibles. El ejecutor y el [orquestador de escalado automático](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners) opcional honran el proxy y las variables de entorno mTLS descritas en [Configuración de red](https://code.claude.com/docs/es/network-config.md), como `HTTPS_PROXY` y `NO_PROXY`; establézcalas en el entorno de cada proceso. Las variables cubren llamadas de plano de control, el WebSocket del [conector SCM](https://code.claude.com/docs/es/self-hosted-environments-reference.md#scm-connector-flags) del orquestador, y el clon integrado para remotos HTTPS, y las sesiones las heredan del ejecutor. El flujo de sesión utiliza eventos enviados por servidor sobre HTTPS, por lo que un proxy en la ruta no debe almacenar en búfer respuestas.123Los proxies de salida corporativos son compatibles. El ejecutor y el [orquestador de escalado automático](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners) opcional honran el proxy y las variables de entorno mTLS descritas en [Configuración de red](https://code.claude.com/docs/es/network-config.md), como `HTTPS_PROXY` y `NO_PROXY`; establézcalas en el entorno de cada proceso. Las variables cubren llamadas de plano de control, el WebSocket del [conector SCM](https://code.claude.com/docs/es/self-hosted-environments-reference.md#scm-connector-flags) del orquestador, y el clon integrado para remotos HTTPS, y las sesiones las heredan del ejecutor. El flujo de sesión utiliza eventos enviados por servidor sobre HTTPS, por lo que un proxy en la ruta no debe almacenar en búfer respuestas.

124 124 

125Si su proxy también requiere un encabezado `Proxy-Authorization`, el ejecutor puede agregarlo a cada conexión que abre al proxy; consulte [Autenticarse en un proxy de salida](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy).125* **Autenticación del proxy**: si tu proxy también requiere un encabezado `Proxy-Authorization`, el ejecutor puede agregarlo a cada conexión que abre al proxy; consulta [Autenticarse en un proxy de salida](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy).

126* **Respuestas de larga duración**: si un ejecutor recoge una sesión pero Claude nunca responde a su primer mensaje, tu proxy puede ser la causa. Consulta [Se recoge una sesión, pero Claude nunca responde a su primer mensaje](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#when-a-sessions-first-message-is-never-answered).

126 127 

127## Qué permanece en su infraestructura128## Qué permanece en su infraestructura

128 129 

Details

36| `CLAUDE_CODE_REMOTE_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica, para sistemas que usan UUID como clave. |36| `CLAUDE_CODE_REMOTE_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica, para sistemas que usan UUID como clave. |

37| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | Para una sesión de [Claude Tag](https://claude.com/docs/claude-tag/overview) que pertenece a un hilo de Slack, el enlace a ese hilo. No está establecida para otras sesiones, y también puede no estar establecida para una sesión de hilo. |37| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | Para una sesión de [Claude Tag](https://claude.com/docs/claude-tag/overview) que pertenece a un hilo de Slack, el enlace a ese hilo. No está establecida para otras sesiones, y también puede no estar establecida para una sesión de hilo. |

38| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | Para una sesión de Claude Tag que pertenece a un hilo de Slack, la marca de tiempo de Slack de ese hilo, como `1700000000.000100`. Puede no estar establecida, y puede estar establecida cuando `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` no lo está, así que comprueba cada variable por separado. |38| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | Para una sesión de Claude Tag que pertenece a un hilo de Slack, la marca de tiempo de Slack de ese hilo, como `1700000000.000100`. Puede no estar establecida, y puede estar establecida cuando `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` no lo está, así que comprueba cada variable por separado. |

39| `CLAUDE_CODE_REMOTE_SLACK_CHANNEL_ID` | Para una sesión de Claude Tag, el ID del canal de Slack o del mensaje directo al que sirve la sesión o en el que está su hilo, como `C0123ABCDE`. Una marca de tiempo de Slack identifica un mensaje dentro de un canal, así que registra este ID junto con `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS`. No está establecida para otras sesiones, y también puede no estar establecida para una sesión de Claude Tag. |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Ruta absoluta a un archivo por sesión que contiene el JWT de sesión actual, mantenido actualizado en los refrescos de token. Los subprocesos de shell lo leen para su encabezado `Authorization` al descargar archivos adjuntos que el usuario agregó a la sesión. `exec` preserva la variable automáticamente; un contenedor que reconstruye el entorno del hijo debe conservar la variable, o las descargas de archivos adjuntos dejan de funcionar silenciosamente. |40| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Ruta absoluta a un archivo por sesión que contiene el JWT de sesión actual, mantenido actualizado en los refrescos de token. Los subprocesos de shell lo leen para su encabezado `Authorization` al descargar archivos adjuntos que el usuario agregó a la sesión. `exec` preserva la variable automáticamente; un contenedor que reconstruye el entorno del hijo debe conservar la variable, o las descargas de archivos adjuntos dejan de funcionar silenciosamente. |

40| `CLAUDE_CONFIG_DIR` | Directorio de configuración de Claude por sesión, escrito al inicio de la sesión desde la instantánea de la configuración del host del ejecutor que el ejecutor captura al inicio; consulta [Permisos y aprobación de herramientas](#permissions-and-tool-approval). Las escrituras aquí se aíslan a esta sesión. El directorio permanece bajo `<base-dir>/_sessions/` después de que la sesión finaliza a menos que inicies el ejecutor con [`--remove-session-state`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags); consulta [Reutilizar un checkout precalentado](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout). |41| `CLAUDE_CONFIG_DIR` | Directorio de configuración de Claude por sesión, escrito al inicio de la sesión desde la instantánea de la configuración del host del ejecutor que el ejecutor captura al inicio; consulta [Permisos y aprobación de herramientas](#permissions-and-tool-approval). Las escrituras aquí se aíslan a esta sesión. El directorio permanece bajo `<base-dir>/_sessions/` después de que la sesión finaliza a menos que inicies el ejecutor con [`--remove-session-state`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags); consulta [Reutilizar un checkout precalentado](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout). |

41| `CLAUDE_CODE_REMOTE_MCP_CONFIG` | Ruta a un archivo en `CLAUDE_CONFIG_DIR` que contiene las definiciones de servidores MCP que el plano de control de Anthropic entregó para esta sesión. Si tu contenedor reconstruye el entorno del hijo, conserva esta variable. Sin ella, cuando el plano de control actualiza los servidores entregados, el hijo cierra cualquier servidor stdio, HTTP o SSE que tu contenedor agregue con [`--mcp-config`](https://code.claude.com/docs/es/cli-reference#cli-flags) y que no esté en la actualización. Requiere Claude Code v2.1.299 o posterior. |42| `CLAUDE_CODE_REMOTE_MCP_CONFIG` | Ruta a un archivo en `CLAUDE_CONFIG_DIR` que contiene las definiciones de servidores MCP que el plano de control de Anthropic entregó para esta sesión. Si tu contenedor reconstruye el entorno del hijo, conserva esta variable. Sin ella, cuando el plano de control actualiza los servidores entregados, el hijo cierra cualquier servidor stdio, HTTP o SSE que tu contenedor agregue con [`--mcp-config`](https://code.claude.com/docs/es/cli-reference#cli-flags) y que no esté en la actualización. Requiere Claude Code v2.1.299 o posterior. |


44 45 

45El contenedor también hereda el resto del entorno administrado del hijo, incluida cualquier variable de entorno proporcionada por el servidor. `exec` lo propaga todo automáticamente; si tu contenedor genera el hijo de otra manera, reenvía el entorno completo.46El contenedor también hereda el resto del entorno administrado del hijo, incluida cualquier variable de entorno proporcionada por el servidor. `exec` lo propaga todo automáticamente; si tu contenedor genera el hijo de otra manera, reenvía el entorno completo.

46 47 

47`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` y `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` llegan a tu contenedor o [hook `command`](#command). También llegan a lo que ejecuta la sesión, como comandos de shell, hooks de git y hooks de Claude Code. Los hooks `checkout`, `post-session` y `spawn-runner` no las reciben.48Puedes leer las variables `CLAUDE_CODE_REMOTE_SLACK_*` en tu contenedor o [hook `command`](#command), y en lo que ejecuta la sesión, como comandos de shell, hooks de git y hooks de Claude Code. Los hooks `checkout`, `post-session` y `spawn-runner` no las reciben.

48 49 

49### Dar un valor predeterminado a las variables que pueden no estar establecidas50### Dar un valor predeterminado a las variables que pueden no estar establecidas

50 51 

51`CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` y `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` pueden no estar establecidas. Si tu script usa `set -u`, Bash se detiene con `unbound variable` cuando expande una que no está establecida, así que expándelas con un valor predeterminado, como `"${CCR_SESSION_ACCOUNT_EMAIL:-}"`.52Si tu script usa `set -u`, expande `CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` y `CLAUDE_CODE_REMOTE_SLACK_CHANNEL_ID` con un valor predeterminado, como `"${CCR_SESSION_ACCOUNT_EMAIL:-}"`. Cada una puede no estar establecida, y con `set -u` Bash se detiene con `unbound variable` cuando expande una que no está establecida.

52 53 

53### Poner entre comillas los argumentos y las variables que expande tu script54### Poner entre comillas los argumentos y las variables que expande tu script

54 55 


89* **Transmítelos**: termina el contenedor con `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`, que reenvía los flags de archivo junto con todos los demás argumentos. No los descartes ni los reescribas. Si una sesión pierde un flag de archivo de prompt, se ejecuta sin las instrucciones que el plano de control envió para ella.90* **Transmítelos**: termina el contenedor con `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`, que reenvía los flags de archivo junto con todos los demás argumentos. No los descartes ni los reescribas. Si una sesión pierde un flag de archivo de prompt, se ejecuta sin las instrucciones que el plano de control envió para ella.

90* **En un ejecutor con v2.1.281 o posterior, un flag de archivo que agregues reemplaza el del servidor, nunca se suma a él**: cada flag de archivo de prompt toma un único valor y Claude Code conserva la última aparición, por lo que si agregas `--append-system-prompt-file <path>` después de `"$@"`, el contenido de tu archivo reemplaza las instrucciones anexadas del servidor. Para agregar instrucciones además de las del servidor, colócalas en el `CLAUDE.md` de la imagen del ejecutor, que el ejecutor [incorpora en la configuración a nivel de usuario de cada sesión](#how-each-session’s-config-is-assembled).91* **En un ejecutor con v2.1.281 o posterior, un flag de archivo que agregues reemplaza el del servidor, nunca se suma a él**: cada flag de archivo de prompt toma un único valor y Claude Code conserva la última aparición, por lo que si agregas `--append-system-prompt-file <path>` después de `"$@"`, el contenido de tu archivo reemplaza las instrucciones anexadas del servidor. Para agregar instrucciones además de las del servidor, colócalas en el `CLAUDE.md` de la imagen del ejecutor, que el ejecutor [incorpora en la configuración a nivel de usuario de cada sesión](#how-each-session’s-config-is-assembled).

91 92 

93#### Corregir `Argument list too long` al inicio de la sesión

94 

95En Linux, si unes el prompt del plano de control y tu propio texto en un único argumento `--append-system-prompt`, el ejecutor registra una línea como esta una vez que el argumento alcanza 128 KB:

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 limita cada argumento individual a 32 páginas de memoria, o 128 KB con las páginas habituales de 4 KB. La cifra de `getconf ARG_MAX`, a menudo 2 MB, es un límite distinto que se aplica a todos los argumentos y al entorno en conjunto.

102 

103En Claude Code v2.1.283 o posterior, deja los flags de archivo en `"$@"` y pasa solo tu propio texto como `--append-system-prompt`. Claude Code [usa ambos](https://code.claude.com/docs/es/cli-reference.md#system-prompt-flags), primero el prompt del plano de control y luego tu propio texto:

104 

105```bash theme={null}

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

107```

108 

109En Linux, si tu propio texto alcanza 128 KB, muévelo al `CLAUDE.md` de la imagen del ejecutor, porque sigue siendo un único argumento.

110 

111En v2.1.281 o v2.1.282, ese comando sale con `Cannot use both --append-system-prompt and --append-system-prompt-file`. En versiones anteriores, tu texto reemplaza el prompt del plano de control sin ningún error. En cualquiera de ellas, actualiza primero o mueve tu propio texto a `CLAUDE.md`.

112 

92### Aprovisionar credenciales limitadas al creador de la sesión113### Aprovisionar credenciales limitadas al creador de la sesión

93 114 

94Usa el subcomando `decode-token` para leer reclamaciones del JWT de sesión. Lee el token de un argumento, de `CLAUDE_CODE_SESSION_ACCESS_TOKEN` o de stdin, en ese orden; consulta [Verificar el token dentro de la sesión](https://code.claude.com/docs/es/self-hosted-environments-identity.md#verify-the-token-inside-the-session) para saber qué verifica. El ejemplo a continuación decodifica la identidad del creador, la intercambia por credenciales de AWS de corta duración y hace `exec` a Claude Code:115Usa el subcomando `decode-token` para leer reclamaciones del JWT de sesión. Lee el token de un argumento, de `CLAUDE_CODE_SESSION_ACCESS_TOKEN` o de stdin, en ese orden; consulta [Verificar el token dentro de la sesión](https://code.claude.com/docs/es/self-hosted-environments-identity.md#verify-the-token-inside-the-session) para saber qué verifica. El ejemplo a continuación decodifica la identidad del creador, la intercambia por credenciales de AWS de corta duración y hace `exec` a Claude Code:


122| Variable | Descripción |143| Variable | Descripción |

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

124| `CLAUDE_RUNNER_REPO_URL` | URL del repositorio a clonar, después de que se hayan aplicado `--git-host-rewrite` y `--git-ssh-rewrite` |145| `CLAUDE_RUNNER_REPO_URL` | URL del repositorio a clonar, después de que se hayan aplicado `--git-host-rewrite` y `--git-ssh-rewrite` |

125| `CLAUDE_RUNNER_REPO_REF` | Revisión a extraer, tal como la sesión la solicitó: una rama, una etiqueta, un SHA de commit o un nombre de referencia completo como `refs/pull/<number>/head`. Vacío significa la rama predeterminada del repositorio. |146| `CLAUDE_RUNNER_REPO_REF` | Revisión a extraer, tal como la sesión la solicitó: una rama, una etiqueta, un SHA de commit o un nombre de referencia completo como `refs/heads/<branch>` o `refs/pull/<number>/head`. Vacío significa la rama predeterminada del repositorio. |

126| `CLAUDE_RUNNER_CHECKOUT_PATH` | Ruta absoluta donde el árbol de trabajo debe dejarse |147| `CLAUDE_RUNNER_CHECKOUT_PATH` | Ruta absoluta donde el árbol de trabajo debe dejarse |

127| `CLAUDE_RUNNER_SESSION_ID` | ID de sesión en forma etiquetada `session_...`, para registro y correlación |148| `CLAUDE_RUNNER_SESSION_ID` | ID de sesión en forma etiquetada `session_...`, para registro y correlación |

128| `CLAUDE_RUNNER_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica |149| `CLAUDE_RUNNER_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica |


303 324 

304El contrato tiene cuatro reglas, sea cual sea la plataforma en la que tu hook aprovisiona:325El contrato tiene cuatro reglas, sea cual sea la plataforma en la que tu hook aprovisiona:

305 326 

3061. **Sea idempotente en `CLAUDE_RUNNER_ORDER_ID`.** La reentrega de la misma solicitud debe generar como máximo un ejecutor. Derive un nombre de recurso determinista del ID de orden y deje que su plataforma rechace el duplicado. No use `CLAUDE_RUNNER_SESSION_ID` como clave en su lugar. Cada resolicitud de una sesión lleva el mismo ID de sesión con un nuevo ID de orden, por lo que una carga de trabajo nombrada o deduplicada por el ID de sesión se crea una vez y nunca más para esa sesión.3271. **Sé idempotente en `CLAUDE_RUNNER_ORDER_ID`.** La reentrega de la misma solicitud debe generar como máximo un ejecutor. Deriva un nombre de recurso determinista del ID de orden y deja que tu plataforma rechace el duplicado. No uses `CLAUDE_RUNNER_SESSION_ID` como clave en su lugar. Cada resolicitud de una sesión lleva el mismo ID de sesión con un nuevo ID de orden. Una carga de trabajo nombrada o deduplicada por el ID de sesión no se vuelve a crear mientras exista la primera.

3072. **No reintente la carga de trabajo.** Un ID de orden significa como máximo una carga de trabajo creada. Si el ejecutor nunca se registra, Anthropic reintenta con un ID de orden nuevo después de `--expected-spawn-seconds`.3282. **No reintente la carga de trabajo.** Un ID de orden significa como máximo una carga de trabajo creada. Si el ejecutor nunca se registra, Anthropic reintenta con un ID de orden nuevo después de `--expected-spawn-seconds`.

3083. **Usa el contrato de código de salida.** Sal con el estado que corresponda al resultado:3293. **Usa el contrato de código de salida.** Sal con el estado que corresponda al resultado:

309 330 

310 * **Salida 0**: enviado.331 * **Salida 0**: enviado.

311 * **Salida 1, o si sigue en ejecución cuando termina `--hook-timeout`**: fallo reintentable. La sesión espera un tiempo y se vuelve a ofrecer.332 * **Salida 1, o si sigue en ejecución cuando termina `--hook-timeout`**: fallo reintentable. La sesión espera un tiempo y se vuelve a ofrecer. Después de 10 solicitudes fallidas seguidas, queda bloqueada igual que tras una salida 2 o superior.

312 * **Salida 2 o superior**: fallo no reintentable. La sesión queda bloqueada para generar nuevamente hasta que un usuario le envíe un mensaje nuevo o un [Propietario](https://code.claude.com/docs/es/cloud-environments.md#organization-shared-environments) seleccione **Retry** en ella en la pestaña **Activity** del entorno.333 * **Salida 2 o superior**: fallo no reintentable. La sesión queda bloqueada para generar nuevamente hasta que un usuario le envíe un mensaje nuevo o un [Propietario](https://code.claude.com/docs/es/cloud-environments.md#organization-shared-environments) seleccione **Retry** en ella en la pestaña **Activity** del entorno.

313 334 

314 Mientras una sesión espera para reintentar, aparece como **Queued** en la pestaña **Activity** sin error de generación, así que lee la salida del hook en el registro del orquestador. Una vez bloqueada, la sesión aparece como **Failed**. Expándela para leer el error de generación, tomado de los últimos 512 caracteres del stderr del hook. Escribe un error procesable en stderr, y ningún secreto. En un hook de shell, [mantén los fallos transitorios reintentables](#keep-transient-failures-retryable-in-a-shell-hook).335 Mientras una sesión espera para reintentar, aparece como **Queued** en la pestaña **Activity** sin error de generación, así que lee la salida del hook en el registro del orquestador. Una vez bloqueada, la sesión aparece como **Failed**. Expándela para leer el error de generación, tomado de los últimos 512 caracteres del stderr del hook. Escribe un error procesable en stderr, y ningún secreto. En un hook de shell, [mantén los fallos transitorios reintentables](#keep-transient-failures-retryable-in-a-shell-hook).


318 339 

319Todo lo que el hook escribe a stdout o stderr aparece en el registro del orquestador con credenciales automáticamente redactadas. Si las sesiones permanecen en cola, verifique el cuerpo `/healthz` del orquestador para contar colas, luego abra la pestaña **Activity** de su entorno en la [página de administración **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): expanda una sesión fallida allí para su error de generación, y seleccione **Retry** para reintentarla.340Todo lo que el hook escribe a stdout o stderr aparece en el registro del orquestador con credenciales automáticamente redactadas. Si las sesiones permanecen en cola, verifique el cuerpo `/healthz` del orquestador para contar colas, luego abra la pestaña **Activity** de su entorno en la [página de administración **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): expanda una sesión fallida allí para su error de generación, y seleccione **Retry** para reintentarla.

320 341 

321Una sesión que permanece en cola sin error de generación en la pestaña **Activity** puede significar que el hook está codificado en el ID de sesión. Para confirmar, verifique si su plataforma tiene una carga de trabajo para la primera solicitud de generación de esa sesión y ninguna para las resolicitudes. Si es así, codifique la carga de trabajo en `CLAUDE_RUNNER_ORDER_ID` en su lugar.342#### Corrige las sesiones reabiertas que permanecen en Queued o muestran Failed

343 

344Si las sesiones reabiertas permanecen en **Queued** o muestran **Failed**, o tu hook agota el tiempo de espera con ellas, una causa es un hook que nombra o deduplica las cargas de trabajo por el ID de sesión. Una sesión se reabre cuando su usuario le envía un mensaje después de que su ejecutor ha salido. Por ejemplo, toma un hook que construye el nombre de cada carga de trabajo así:

345 

346```bash theme={null}

347name="runner-${CLAUDE_RUNNER_SESSION_ID}"

348```

349 

3501. En la primera solicitud de generación de la sesión, el hook crea una carga de trabajo con ese nombre, y se inicia un ejecutor

3512. El ejecutor sale, por ejemplo después de [`--release-idle-session-min`](#make-on-demand-runners-exit-when-idle), y el usuario reabre la sesión más tarde

3523. La siguiente solicitud de generación de la sesión lleva el mismo ID de sesión y un nuevo ID de orden, así que el hook construye el mismo nombre

3534. Si tu plataforma todavía tiene la carga de trabajo de la primera solicitud, porque nada la [eliminó](#make-on-demand-runners-exit-when-idle) cuando su ejecutor salió, el hook no crea ninguna carga de trabajo nueva y no se inicia ningún ejecutor

3545. Cada solicitud de generación posterior para la sesión termina de la misma manera

355 

356Abre tu propio hook y lee qué hace cuando la carga de trabajo ya existe, por ejemplo cuando tu plataforma rechaza el nombre duplicado. Busca ese comportamiento en la primera columna para ver qué muestra la sesión reabierta en la pestaña **Activity**:

357 

358| Cuando la carga de trabajo existe, tu hook | **Queued** cambia a **Failed** | Error de generación |

359| :- | :- | :- |

360| Sale con 0 sin crear nada | Después de 10 solicitudes así seguidas | `runner did not register within ETA after max attempts` |

361| Sale con 1 | Después de 10 solicitudes así seguidas | El final del stderr de tu hook, o `exit 1` si no escribió nada en stderr |

362| Sale con 2 o superior | De inmediato | El final del stderr de tu hook, o `exit` y el código, como `exit 2`, si no escribió nada en stderr |

363| Espera hasta que termina `--hook-timeout` | Después de 10 solicitudes así seguidas | El final del stderr de tu hook, o `spawn-runner hook timed out after 60000ms` si no escribió nada en stderr |

364 

365En el error de generación de la última fila, `60000` es tu `--hook-timeout` en milisegundos. Cuando un hook espera hasta que termina `--hook-timeout`, el registro del orquestador también recibe una línea `timed out after`.

366 

367Para corregir el hook, construye cada nombre o clave a partir de `CLAUDE_RUNNER_ORDER_ID`, como exige la [regla 1 del contrato del hook](#the-spawn-runner-hook). En el ejemplo, el nombre pasa a ser:

368 

369```bash theme={null}

370name="runner-${CLAUDE_RUNNER_ORDER_ID}"

371```

372 

373Si tu hook espera, haz también que salga una vez que haya enviado la carga de trabajo, porque un hook que espera [retrasa los siguientes hooks de su orquestador](https://code.claude.com/docs/es/self-hosted-environments-reference.md#orchestrator-cli-flags). Después de cambiar el hook, comprueba el estado de cada sesión atascada en la pestaña **Activity**:

374 

375* **Queued**: la sesión recibe su siguiente solicitud de generación por sí sola

376* **Failed**: selecciona **Retry** en ella como Propietario, o haz que su usuario le envíe un mensaje nuevo

322 377 

323#### Haz que los ejecutores bajo demanda salgan cuando estén inactivos378#### Haz que los ejecutores bajo demanda salgan cuando estén inactivos

324 379 


740 795 

741La instantánea del `~/.claude/` del host que toma el ejecutor excluye el directorio `projects/`. La ubicación de almacenamiento predeterminada de la memoria automática está dentro de ese directorio. Si colocas archivos de memoria allí, el ejecutor no los copia a las sesiones, y no activan la memoria automática.796La instantánea del `~/.claude/` del host que toma el ejecutor excluye el directorio `projects/`. La ubicación de almacenamiento predeterminada de la memoria automática está dentro de ese directorio. Si colocas archivos de memoria allí, el ejecutor no los copia a las sesiones, y no activan la memoria automática.

742 797 

798### Detener las sesiones que no logran obtener la configuración administrada por el servidor

799 

800Para evitar que una sesión que obtiene la [configuración administrada por el servidor](https://code.claude.com/docs/es/server-managed-settings.md) se inicie cuando esa obtención falla, establece [`forceRemoteSettingsRefresh`](https://code.claude.com/docs/es/settings-reference#forceremotesettingsrefresh) en `true` en el [`managed-settings.json`](https://code.claude.com/docs/es/settings#where-settings-live) de tu imagen del ejecutor. Una respuesta de la API de Anthropic que indica que tu organización no tiene configuración administrada por el servidor cuenta como una obtención correcta.

801 

802Antes de agregar la clave, comprueba si el entorno ejecuta sesiones de canales de Claude Tag o envía solicitudes de modelo a Bedrock o Agent Platform:

803 

804* **Sesiones de canales de Claude Tag**: omite la clave en los ejecutores de un entorno al que un Owner [dirige canales de Claude Tag](https://code.claude.com/docs/es/cloud-environments.md#set-the-environment-a-claude-tag-channel-uses). La API de Anthropic rechaza la solicitud de configuración administrada por el servidor de estas sesiones, por lo que, con la clave establecida, no logran iniciarse. Coloca sus reglas en el `managed-settings.json` de la imagen del ejecutor, que [siguen leyendo](https://code.claude.com/docs/es/managed-settings.md#where-and-when-a-policy-applies). Para usar la clave en tus demás sesiones, ejecútalas en un entorno independiente.

805* **Bedrock o Agent Platform**: las sesiones en estos proveedores [no obtienen la configuración administrada por el servidor](#what-differs-from-sessions-on-the-anthropic-api), por lo que se inician tanto si estableces la clave como si no. En su lugar, aplica tus reglas desde el mismo `managed-settings.json`.

806 

807Este `managed-settings.json` establece la clave:

808 

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

810{

811 "forceRemoteSettingsRefresh": true

812}

813```

814 

815Establece la clave en ese archivo aunque también la establezcas en la consola de administración de claude.ai. Una sesión nueva no tiene una [copia en caché](https://code.claude.com/docs/es/server-managed-settings.md#fetch-and-caching-behavior) de tu configuración administrada por el servidor, así que, si estableces la clave solo en la consola, la sesión todavía no la tiene. Si su obtención falla entonces, la sesión se ejecuta sin esa configuración hasta que una obtención posterior tenga éxito.

816 

817Para confirmar que una obtención fallida de la configuración es la razón por la que una sesión no se inició, revisa la [última salida de Claude Code](#keep-stdin-and-file-descriptor-3-attached) en la sesión o el registro del ejecutor. Incluye `Your organization requires remote managed settings to load, but they could not be loaded.`

818 

743### Configuración de repositorios en sesiones con varios repositorios819### Configuración de repositorios en sesiones con varios repositorios

744 820 

745En un hilo de un [proyecto](https://code.claude.com/docs/es/claude-projects.md#what-threads-pick-up-from-your-repositories), ningún `.claude/settings.json` de repositorio tiene efecto como configuración del proyecto y no se carga ningún `.mcp.json` ni ningún skill de repositorio, dondequiera que se inicie el hilo. Para dar un skill a esos hilos, agrégalo a tu imagen del ejecutor.821En un hilo de un [proyecto](https://code.claude.com/docs/es/claude-projects.md#what-threads-pick-up-from-your-repositories), ningún `.claude/settings.json` de repositorio tiene efecto como configuración del proyecto y no se carga ningún `.mcp.json` ni ningún skill de repositorio, dondequiera que se inicie el hilo. Para dar un skill a esos hilos, agrégalo a tu imagen del ejecutor.

Details

313 313 

314Para cada sesión que usa git gestionado por Anthropic, el runner también registra una línea `[runner:warn]` que comienza con `governed git: GIT_SSL_CAINFO is set` o `governed git: GIT_SSL_NO_VERIFY is set`. La línea dice qué hizo el runner con esa variable para su propio git, para git dentro de la sesión, y para sus hooks de ciclo de vida. Termina con si necesita cambiar algo.314Para cada sesión que usa git gestionado por Anthropic, el runner también registra una línea `[runner:warn]` que comienza con `governed git: GIT_SSL_CAINFO is set` o `governed git: GIT_SSL_NO_VERIFY is set`. La línea dice qué hizo el runner con esa variable para su propio git, para git dentro de la sesión, y para sus hooks de ciclo de vida. Termina con si necesita cambiar algo.

315 315 

316### Agrega repositorios de github.com a sesiones de canales de Claude Tag

317 

318Si Claude no puede agregar un repositorio de github.com a una sesión de un canal de Claude Tag, asegúrate de que el canal tenga acceso a él, incluso cuando tu runner pueda clonarlo. Ese acceso proviene de ajustes en GitHub y en tu organización de Claude, no de las credenciales de git de tu runner.

319 

320**1. Instala la Claude GitHub App**

321 

322Instala la [Claude GitHub App](https://github.com/apps/claude) en la organización o cuenta de GitHub propietaria del repositorio, e incluye ese repositorio en la instalación.

323 

324**2. Vincula la organización o cuenta de GitHub**

325 

326En [**Organization settings > Git providers**](https://claude.ai/admin-settings/source-control), vincula esa organización o cuenta a tu organización de Claude. Un Owner de tu organización de Claude que también sea propietario de la organización de GitHub puede vincularla. Consulta [Vincula tu organización de GitHub](https://claude.com/docs/claude-tag/admins/configure-github#link-your-github-organization).

327 

328**3. Concede el repositorio**

329 

330En la [configuración de administración de Claude Tag](https://claude.ai/admin-settings/claude-tag), concede el repositorio al canal o a un alcance más amplio que incluya el canal: su espacio de trabajo de Slack o todo Slack. Alguien con el rol Owner o el permiso Claude Tag Admin puede concederlo. Un administrador del canal también puede agregarlo a su propio canal si su cuenta de GitHub es administradora del repositorio. Consulta [Concede acceso al repositorio](https://claude.com/docs/claude-tag/admins/configure-github#grant-repository-access).

331 

332Luego inicia un nuevo hilo en el canal y [nombra el repositorio](https://claude.com/docs/claude-tag/admins/configure-github#how-granted-repositories-reach-a-session) en tu primer mensaje.

333 

334Si Claude sigue sin poder agregar el repositorio, consulta [Si Claude no puede llegar a un repositorio](https://claude.com/docs/claude-tag/admins/configure-github#if-claude-can%E2%80%99t-reach-a-repository) para saber dónde revisar el vínculo de GitHub y la concesión del repositorio.

335 

316### Reescriba URLs de git para redes privadas336### Reescriba URLs de git para redes privadas

317 337 

318Las URLs de repositorio llegan desde el plano de control como HTTPS, con el nombre de host de tu host de git; para GitHub Enterprise, es el nombre de host que configuraste para la [integración de GitHub Enterprise](https://code.claude.com/docs/es/github-enterprise-server.md) en claude.ai. Dos flags repetibles reescriben esas URLs antes del clon:338Las URLs de repositorio llegan desde el plano de control como HTTPS, con el nombre de host de tu host de git; para GitHub Enterprise, es el nombre de host que configuraste para la [integración de GitHub Enterprise](https://code.claude.com/docs/es/github-enterprise-server.md) en claude.ai. Dos flags repetibles reescriben esas URLs antes del clon:


376 396 

377Las compilaciones y pruebas son generalmente la parte más grande y variable de la carga de una sesión, así que ejecute una compilación representativa de su repositorio, mida su CPU y memoria máximas, y aumente cualquier valor inicial que no deje espacio para el proceso de Claude Code en la parte superior de ese pico.397Las compilaciones y pruebas son generalmente la parte más grande y variable de la carga de una sesión, así que ejecute una compilación representativa de su repositorio, mida su CPU y memoria máximas, y aumente cualquier valor inicial que no deje espacio para el proceso de Claude Code en la parte superior de ese pico.

378 398 

379El runner usa `--capacity` para limitar cuántas sesiones ejecuta a la vez. No divide CPU o memoria entre ellas, por lo que las sesiones en un runner comparten la CPU y memoria del contenedor. Para limitar la parte de una sesión, aplique límites desde su [script de envoltura](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#wrapper-scripts). Lo que dar a un contenedor depende de cuántas sesiones sirve a la vez:399El runner usa `--capacity` para limitar cuántas sesiones ejecuta a la vez. No divide CPU ni memoria entre ellas, por lo que las sesiones en un runner comparten la CPU y la memoria del contenedor. Para evitar que el uso de memoria de una sesión termine las demás, ejecuta una sesión por runner con [su propio límite de memoria](#give-each-session-its-own-memory-limit).

380 400 

381* **Una sesión por runner**: dé a cada contenedor los valores de una sesión. Use este dimensionamiento en `--capacity 1`, que la [sección de endurecimiento](#harden-your-deployment) recomienda, y para [runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), donde establece los valores en la carga de trabajo que su [hook `spawn-runner`](https://code.claude.com/docs/es/self-hosted-environments-configuration#the-spawn-runner-hook) envía, como la plantilla de pod de un Job de Kubernetes.401* **Una sesión por runner**: dé a cada contenedor los valores de una sesión. Use este dimensionamiento en `--capacity 1`, que la [sección de endurecimiento](#harden-your-deployment) recomienda, y para [runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), donde establece los valores en la carga de trabajo que su [hook `spawn-runner`](https://code.claude.com/docs/es/self-hosted-environments-configuration#the-spawn-runner-hook) envía, como la plantilla de pod de un Job de Kubernetes.

382* **Varias sesiones por runner**: en un `--capacity` por encima de uno, multiplique los valores de una sesión por la capacidad, porque hasta esa cantidad de sesiones pueden ejecutarse en el contenedor a la vez. Las recetas de [Kubernetes](#kubernetes) y [Docker Compose](#docker-compose) ejecutan `--capacity 4` sin límites de CPU o memoria, así que agregue límites dimensionados para la capacidad que ejecuta.402* **Varias sesiones por runner**: en un `--capacity` por encima de uno, multiplique los valores de una sesión por la capacidad, porque hasta esa cantidad de sesiones pueden ejecutarse en el contenedor a la vez. Las recetas de [Kubernetes](#kubernetes) y [Docker Compose](#docker-compose) ejecutan `--capacity 4` sin límites de CPU o memoria, así que agregue límites dimensionados para la capacidad que ejecuta.

403* **Varios contenedores de runner en un host**: dimensiona el host para la suma de las capacidades de los runners, porque cada runner cuenta solo sus propias sesiones contra `--capacity`:

404 

405 * **Memoria**: multiplica la memoria de una sesión por la suma y luego agrega lo que usan los propios procesos del host

406 * **CPU**: multiplica la solicitud de CPU de una sesión por la suma. Para permitir que todas las sesiones superen su solicitud a la vez, multiplica en su lugar su límite de CPU.

407 

408 Da a cada runner su propio contenedor. Usa la [misma ruta de `--base-dir`](#keep-the-base-directory-and-capacity-identical-across-runners) en cada uno, en un almacenamiento que ningún otro contenedor de runner monte, para que cada runner tenga [su propio directorio de trabajo](#harden-your-deployment).

409 

410### Da a cada sesión su propio límite de memoria

411 

412Para evitar que una sesión termine las demás cuando se agota la memoria, ejecuta cada runner en `--capacity 1` bajo su propio límite de memoria, establecido en la memoria de una sesión:

413 

414* **En un contenedor**: ejecuta un runner por contenedor y establece el límite de memoria del contenedor, como `limits.memory` en Kubernetes, `--memory` en Docker o `mem_limit` en un archivo de Compose. Mantén la suma de los límites de los contenedores por debajo de la memoria del host, porque cuando el propio host se queda sin memoria, el kernel puede matar procesos en cualquier parte del host.

415* **Bajo systemd sin contenedor**: establece `MemoryMax` en la unidad del runner y ejecuta un runner por host, porque los runners que [usan el mismo `--base-dir`](#keep-the-base-directory-and-capacity-identical-across-runners) en un sistema de archivos comparten los repositorios clonados allí. Por ejemplo, en `--capacity 1` sin un hook `checkout`, sus sesiones sobre un mismo repositorio pueden trabajar en el mismo checkout a la vez. Para ejecutar varios runners en un host, da a cada uno un contenedor.

416 

417Cuando un contenedor o una unidad alcanza su límite de memoria, el kernel mata procesos solo dentro de él. Si estableces `--capacity` mayor que uno, las sesiones comparten un límite. Cuando lo alcanzan, el kernel no elige por sesión qué procesos matar, por lo que el uso de memoria de una sesión puede terminar las demás.

418 

419En Kubernetes, no puedes separar las sesiones con ninguno de los valores del ajuste `singleProcessOOMKill` del kubelet. Tampoco puedes limitar la memoria total de una sesión con un `ulimit` de memoria en tu [script de envoltura](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#wrapper-scripts). El kernel aplica un valor como `ulimit -v` a cada proceso por separado.

420 

421### Deja margen bajo los límites de procesos e hilos

422 

423Para dimensionar un límite de procesos e hilos, mide lo que necesita una sesión y multiplícalo por el número de sesiones que comparten el límite. Cuando esas sesiones alcanzan el límite, el kernel rechaza nuevos procesos e hilos, por lo que los comandos, compilaciones y pruebas en cualquiera de ellas pueden fallar. La llamada rechazada devuelve `EAGAIN`, cuyo mensaje estándar es `Resource temporarily unavailable`.

424 

425Supón que una sesión alcanza un pico de 300 procesos e hilos, y cuatro sesiones comparten el límite. Juntas necesitan 1,200, y con un límite de 2,400, dejas margen para compilaciones que necesiten el doble.

426 

427#### Dónde establecer cada límite

428 

429Cada límite de esta tabla cuenta tanto hilos como procesos, y `pids.max` es el archivo que contiene el límite de un cgroup:

430 

431| Límite | Dónde lo estableces | Qué lo comparte |

432| :- | :- | :- |

433| `pids.max` en Kubernetes | `podPidsLimit` en la configuración del kubelet de los nodos que ejecutan runners. No puedes establecerlo en una especificación de Pod. | Los contenedores de un Pod |

434| `pids.max` en Docker | `--pids-limit`, o `pids_limit` en un archivo de Compose | Un contenedor |

435| `pids.max` bajo systemd | `TasksMax` en la unidad del runner | Una unidad |

436| `ulimit -u` | El shell o servicio que inicia el runner | Todo lo que en el host se ejecuta con el ID de usuario del runner. No se aplica para root. |

437 

438Cuando no estableces `TasksMax`, systemd aplica `DefaultTasksMax`, que de forma predeterminada es el 15% del menor entre `kernel.pid_max`, `kernel.threads-max` y el `pids.max` del cgroup raíz.

439 

440#### Mide el pico de una sesión

441 

442Para obtener los números de tus propios runners, mide una sesión en su host, que en Kubernetes es el nodo:

443 

444**1. Inicia un runner solo**

445 

446Inicia un runner en `--capacity 1` sin nada más en su contenedor o unidad de systemd, solo en su host y en su entorno:

447 

448* **Su host**: usa uno que no ejecute ningún otro runner. Así podrás identificar su proceso en el siguiente paso.

449* **Su entorno**: haz que sea el único runner allí, por ejemplo en un entorno que [crees para la prueba](https://code.claude.com/docs/es/self-hosted-environments-quickstart.md#set-up-manually). Las sesiones se enrutan a un entorno y no a un runner.

450 

451No inicies una sesión todavía, porque necesitas el directorio del siguiente paso antes de que comience la compilación.

452 

453**2. Encuentra el directorio de cgroup del runner**

454 

455En el host, no dentro del contenedor, encuentra el ID de proceso del runner, por ejemplo con `ps`. Lee `/proc/<pid>/cgroup` para ese ID:

456 

457* **Una línea contiene `:pids:`**: el host usa cgroup v1, y el directorio es `/sys/fs/cgroup/pids` seguido del texto que aparece después de `:pids:`

458* **La única línea comienza con `0::`**: el host usa cgroup v2, y el directorio es `/sys/fs/cgroup` seguido del texto que aparece después de `0::`

459 

460**3. Ejecuta una compilación representativa y registra el pico**

461 

462Ejecuta una sesión a lo largo de una compilación representativa y toma el pico del directorio de cgroup del runner:

463 

464* **El directorio tiene `pids.peak`**: lee el archivo cuando termine la compilación

465* **El directorio no tiene `pids.peak`**: lee `pids.current` una vez por segundo mientras se ejecuta la compilación y conserva el valor más alto. Un pico entre dos lecturas pasa desapercibido, así que trata ese valor como una estimación baja.

466 

467**4. Multiplica por las sesiones que comparten el límite**

468 

469* **El Pod, contenedor o unidad de un runner**: multiplica el pico por el `--capacity` del runner

470* **Un límite que comparten varios runners**: multiplica el pico por la suma de sus capacidades

471 

472Luego agrega el pico de cualquier otra cosa que comparta el límite, como otro contenedor en el Pod.

473 

474**5. Establece el límite por encima del resultado**

475 

476Con un límite más alto, dejas margen para compilaciones más pesadas, y con uno más bajo, detienes antes una fork bomb.

477 

478#### Comprueba un límite `pids.max`

479 

480* **Comprueba si se alcanzó `pids.max`**: busca en el registro del kernel del host, por ejemplo con `dmesg`, una línea que contenga `cgroup: fork rejected by pids controller in` y la ruta de un cgroup. El kernel la registra solo la primera vez que rechaza un proceso o hilo en ese cgroup, así que busca en todo el registro.

481* **Consulta el límite vigente**: lee `pids.max` en el directorio de cgroup del runner y en cada directorio por encima de él. El valor más bajo es el límite vigente, y `max` significa que no hay límite en ese nivel.

383 482 

384## Kubernetes483## Kubernetes

385 484 


577 676 

578Lo que la ruta de reutilización hace y no garantiza:677Lo que la ruta de reutilización hace y no garantiza:

579 678 

580* **Cualquier forma de clon funciona**: un clon completo, superficial, o de rama única en la ruta se usa tal cual. El runner nunca pasa `--depth` cuando obtiene en un clon existente, por lo que un precalentamiento completo mantiene su historial completo y uno superficial permanece superficial. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0`, o un número; valor predeterminado 50) controla solo el clon frío que el runner hace cuando no existe clon aún.679* **Profundidad del clon**: crea el clon sin `--depth`, con o sin `--single-branch`. El runner nunca pasa `--depth` cuando obtiene en un clon con un remoto `origin`, incluso si configuras [`CLAUDE_RUNNER_FETCH_DEPTH`](https://code.claude.com/docs/es/self-hosted-environments-reference#environment-variable-only-settings). Con un clon completo, cada sesión descarga solo los commits que le faltan al clon. Con un clon superficial, una sesión en una rama que se bifurcó antes del commit más antiguo del clon descarga todo el historial de esa rama.

581* **Los cambios rastreados se reinician, los archivos sin rastrear persisten**: con `--capacity 1`, cada sesión comienza desde un reinicio duro que borra las modificaciones rastreadas de la sesión anterior, pero el runner nunca ejecuta `git clean`, por lo que los archivos sin rastrear de las sesiones anteriores del propietario bloqueado permanecen en el árbol.680* **Los cambios rastreados se reinician, los archivos sin rastrear persisten**: con `--capacity 1`, cada sesión comienza desde un reinicio duro que borra las modificaciones rastreadas de la sesión anterior, pero el runner nunca ejecuta `git clean`, por lo que los archivos sin rastrear de las sesiones anteriores del propietario bloqueado permanecen en el árbol.

582* **Directorios por sesión persisten también**: junto al checkout, el runner crea entradas por sesión bajo `<base-dir>/_sessions/` para cada sesión que ejecuta. El directorio de configuración de Claude de la sesión contiene una copia local de la transcripción de la conversación. Junto a él se encuentran los archivos cargados de la sesión, cuando la sesión tiene alguno. El directorio de sesión también se encuentra allí: contiene cualquier worktree por sesión y checkouts de hook `checkout` mientras se ejecuta la sesión, y mantiene cualquier otra cosa que Claude escribió en él.681* **Directorios por sesión persisten también**: junto al checkout, el runner crea entradas por sesión bajo `<base-dir>/_sessions/` para cada sesión que ejecuta. El directorio de configuración de Claude de la sesión contiene una copia local de la transcripción de la conversación. Junto a él se encuentran los archivos cargados de la sesión, cuando la sesión tiene alguno. El directorio de sesión también se encuentra allí: contiene cualquier worktree por sesión y checkouts de hook `checkout` mientras se ejecuta la sesión, y mantiene cualquier otra cosa que Claude escribió en él.

583 682 


587* **Con el proxy de git, un precalentamiento con `reftable` pierde sus refs**: cuando el runner sanitiza `.git/` antes de cada sesión, mantiene `.git/refs/` y elimina el directorio `.git/reftable/`. Un clon precalentado con el formato de refs `reftable` de git pierde así sus refs, por lo que debes precalentar el clon con el formato de refs `files` de git en su lugar.686* **Con el proxy de git, un precalentamiento con `reftable` pierde sus refs**: cuando el runner sanitiza `.git/` antes de cada sesión, mantiene `.git/refs/` y elimina el directorio `.git/reftable/`. Un clon precalentado con el formato de refs `reftable` de git pierde así sus refs, por lo que debes precalentar el clon con el formato de refs `files` de git en su lugar.

588* **Los clones largos no necesitan solución alternativa**: el runner limita cada operación de git con un vigilante de 120 segundos sin progreso y un límite duro de 30 minutos, no un tiempo de espera plano, por lo que un clon frío lento que sigue reportando progreso se completa.687* **Los clones largos no necesitan solución alternativa**: el runner limita cada operación de git con un vigilante de 120 segundos sin progreso y un límite duro de 30 minutos, no un tiempo de espera plano, por lo que un clon frío lento que sigue reportando progreso se completa.

589 688 

689### Confirma que el runner usa tu clon

690 

691Para confirmar que el runner usa tu clon, inícialo con [`--log-level debug`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags) e inicia una sesión en el repositorio. El runner registra `Prefetched repo found at` y la ruta del clon. Si en cambio registra `No prefetched repo, fresh init at`, no encontró ningún clon utilizable en la ruta de esa línea. Comprueba que tu clon esté en esa ruta, que pertenezca al usuario del runner y que tenga un remoto llamado `origin`.

692 

693Si el runner encuentra tu clon y las sesiones siguen iniciándose lentamente, comprueba si el clon es superficial.

694 

590## Fije la versión695## Fije la versión

591 696 

592De forma predeterminada, el proceso hijo de cada sesión ejecuta el binario propio del runner, y el runner desactiva la actualización automática dentro de las sesiones que genera. Con ese valor predeterminado, cada sesión ejecuta la versión que instalaste en el host o que incluiste en la imagen. Una actualización a nivel de host entra en vigor la próxima vez que el runner se inicia.697De forma predeterminada, el proceso hijo de cada sesión ejecuta el binario propio del runner, y el runner desactiva la actualización automática dentro de las sesiones que genera. Con ese valor predeterminado, cada sesión ejecuta la versión que instalaste en el host o que incluiste en la imagen. Una actualización a nivel de host entra en vigor la próxima vez que el runner se inicia.


609* **Flota fija**: ejecute un conjunto estático de réplicas de runner y escale en las [métricas de Prometheus](https://code.claude.com/docs/es/self-hosted-environments-reference.md#prometheus-metrics) que cada runner sirve714* **Flota fija**: ejecute un conjunto estático de réplicas de runner y escale en las [métricas de Prometheus](https://code.claude.com/docs/es/self-hosted-environments-reference.md#prometheus-metrics) que cada runner sirve

610* **Runners bajo demanda**: ejecute el subcomando `claude self-hosted-runner orchestrator`, que sondea Anthropic para sesiones que están en cola sin runner disponible e invoca su hook `spawn-runner` para arrancar uno por sesión. Consulte [Runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners).715* **Runners bajo demanda**: ejecute el subcomando `claude self-hosted-runner orchestrator`, que sondea Anthropic para sesiones que están en cola sin runner disponible e invoca su hook `spawn-runner` para arrancar uno por sesión. Consulte [Runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners).

611 716 

717### Libera las sesiones inactivas en una flota fija

718 

719Si las sesiones permanecen en cola en una flota fija mientras todos los runners están en línea, la causa pueden ser las sesiones inactivas. De forma predeterminada, una sesión conserva su espacio después de que termina su turno, y su runner permanece bloqueado para el [propietario](https://code.claude.com/docs/es/self-hosted-environments#key-concepts) de esa sesión. Si la [tarea programada en la nube](https://code.claude.com/docs/es/routines.md) de tu equipo inicia una nueva sesión en cada ejecución, sus sesiones inactivas pueden llenar todos los espacios.

720 

721Para comprobarlo, lee `claude_code_self_hosted_runner_session_idle_seconds` en las [métricas de Prometheus](https://code.claude.com/docs/es/self-hosted-environments-reference.md#prometheus-metrics) de cada runner. Cada sesión que mantiene un runner tiene su propia serie: `0` mientras la sesión está ocupada; de lo contrario, los segundos transcurridos desde que quedó inactiva. Elige el tiempo de inactividad que permitirías: más largo que las pausas que las personas hacen a mitad de una tarea, y lo bastante corto como para que cada ejecución se libere antes de que comience la siguiente de la tarea programada. Compara las series con ese valor.

722 

723* **Series por encima de ese tiempo, como `1800` para 30 minutos**: las sesiones inactivas ocupan esos espacios, así que establece `--release-idle-session-min`

724* **Todas las series por debajo**: ninguna sesión ha estado inactiva tanto tiempo. Agrega runners o establece [`--kill-session-after-min`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags) para las [sesiones que nunca quedan inactivas](#some-sessions-don’t-count-as-idle).

725* **Un runner sin series**: ninguna sesión lo ocupa. Consulta **Sessions stay queued** en [Solución de problemas](#troubleshooting).

726* **Un runner cuyas métricas no responden**: es posible que su proceso haya terminado. Consulta **An environment that looks healthy** en [Cuando el runner termina](#when-the-runner-exits).

727 

728Para liberar las sesiones inactivas, inicia cada runner con [`--release-idle-session-min`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags) y ese tiempo en minutos, como `--release-idle-session-min 30`. El runner libera entonces cualquier sesión que permanezca inactiva ese tiempo, ya sea que la haya iniciado una tarea programada o una persona.

729 

730* **Trabajo sin enviar**: una sesión liberada se reanuda con su siguiente mensaje, sin el trabajo que no había enviado con push. Para conservar sus commits, consulta [Las sesiones reanudadas pierden el trabajo sin enviar](#additional-limitations).

731* **El runner termina**: un runner que libera su última sesión inicia una [salida normal](#when-the-runner-exits). Haz que tu supervisor lo reinicie en un sistema de archivos limpio, como se describe en [Refuerza tu despliegue](#harden-your-deployment).

732* **Sesiones que nunca quedan inactivas**: establece también [`--kill-session-after-min`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags), porque [algunas sesiones no cuentan como inactivas](#some-sessions-don’t-count-as-idle)

733 

612## Problemas conocidos y limitaciones734## Problemas conocidos y limitaciones

613 735 

614Las siguientes son las limitaciones en esta versión, con soluciones alternativas donde exista una.736Las siguientes son las limitaciones en esta versión, con soluciones alternativas donde exista una.


642### Limitaciones adicionales764### Limitaciones adicionales

643 765 

644* **Las sesiones reanudadas pierden el trabajo sin push**: un runner nuevo vuelve a clonar el repositorio desde su rama inicial, por lo que el trabajo al que la sesión no había hecho push se pierde.766* **Las sesiones reanudadas pierden el trabajo sin push**: un runner nuevo vuelve a clonar el repositorio desde su rama inicial, por lo que el trabajo al que la sesión no había hecho push se pierde.

645 * **Para conservar el trabajo con commit**: establece [`--push-outcome-on-release`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags) en todos los runners del entorno, porque un runner sin el flag reanuda la sesión desde su rama inicial. Un runner con el flag hace, en la medida de lo posible, push de las ramas de resultado de la sesión antes de liberarla, y la sesión reanudada comienza desde esos commits. El push usa las credenciales de git propias del host del runner, incluso en un runner que usa [git administrado por Anthropic](#use-the-anthropic-git-proxy). Los cambios sin commit se siguen perdiendo.767 * **Para conservar el trabajo con commit**: establece [`--push-outcome-on-release`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags) en todos los runners del entorno, porque un runner sin el flag reanuda la sesión desde su rama inicial. Un runner con el flag hace, en la medida de lo posible, push de las ramas de resultado de la sesión antes de liberarla, y la sesión reanudada comienza desde esos commits. El push usa las credenciales de git propias del host del runner, incluso en un runner que usa [git administrado por Anthropic](#use-the-anthropic-git-proxy).

646 * **Con un hook `checkout`**: a los repositorios obtenidos mediante un [hook de ciclo de vida `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout) no se les hace push. En su lugar, guarda una instantánea de ellos desde el [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session).768 * **Con un hook `checkout`**: a los repositorios obtenidos mediante un [hook de ciclo de vida `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout) no se les hace push. En su lugar, guarda una instantánea de ellos desde el [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session).

647 * **Antes de habilitar el flag**: restringe quién puede hacer push a las refs `claude/*` en el remoto de origen. Al reanudar, el runner obtiene la rama a la que se hizo push previamente sin verificar quién hizo el push.769 * **Antes de habilitar el flag**: restringe quién puede hacer push a las refs `claude/*` en el remoto de origen. Al reanudar, el runner obtiene la rama a la que se hizo push previamente sin verificar quién hizo el push.

770 * **Los cambios sin commit se siguen perdiendo**: para pedirle a Claude que haga commit y push cuando termine de responder, consulta [Pedir a las sesiones que hagan push de su trabajo](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)

648* **Un repositorio agregado a mitad de sesión puede fallar al clonarse**: Claude lo clona con `git clone` a través de HTTPS. En un runner sin [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), la clonación falla con un error de autenticación de git si nada en el host puede leer el repositorio. Siempre que puedas, selecciona todos los repositorios que la sesión necesita al crearla.771* **Un repositorio agregado a mitad de sesión puede fallar al clonarse**: Claude lo clona con `git clone` a través de HTTPS. En un runner sin [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), la clonación falla con un error de autenticación de git si nada en el host puede leer el repositorio. Siempre que puedas, selecciona todos los repositorios que la sesión necesita al crearla.

649* **Algunos conectores no aparecen en sesiones autohospedadas**: un conector que aún no ha conectado en la configuración de claude.ai no se enumera en una sesión autohospedada, y la sesión no le pedirá que lo conecte. Conéctelo en Configuración primero, luego inicie una sesión nueva. Agregar un conector a una sesión ya en ejecución tampoco hace que sus herramientas estén disponibles para Claude; inicie una sesión nueva para recoger un conector recién agregado.772* **Algunos conectores no aparecen en sesiones autohospedadas**: un conector que aún no ha conectado en la configuración de claude.ai no se enumera en una sesión autohospedada, y la sesión no le pedirá que lo conecte. Conéctelo en Configuración primero, luego inicie una sesión nueva. Agregar un conector a una sesión ya en ejecución tampoco hace que sus herramientas estén disponibles para Claude; inicie una sesión nueva para recoger un conector recién agregado.

650* **Cuando alguien archiva o elimina una sesión, o libera su runner desde el menú de la sesión**: no cuentes con el push de [`--push-outcome-on-release`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags). Para guardar los commits en esos casos, haz push de `HEAD` a una rama de rescate desde un [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session). Si partes del ejemplo de esa sección, haz que haga push incluso cuando no haya nada sin commit, porque solo hace push después de un commit de instantánea.773* **Cuando alguien archiva o elimina una sesión, o libera su runner desde el menú de la sesión**: no cuentes con el push de [`--push-outcome-on-release`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags). Para guardar los commits en esos casos, haz push de `HEAD` a una rama de rescate desde un [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session). Si partes del ejemplo de esa sección, haz que haga push incluso cuando no haya nada sin commit, porque solo hace push después de un commit de instantánea.


684* **Las sesiones fallan inmediatamente después de la recogida**: abre la sesión en claude.ai/code para ver el error. Si el error muestra que git no pudo autenticarse, revisa las [credenciales de git](#configure-git) del runner. En un runner iniciado con `--use-anthropic-git-proxy`, consulta [Cuando las sesiones no se inician en un runner con el proxy de git](#when-anthropic-doesnt-serve-a-session).807* **Las sesiones fallan inmediatamente después de la recogida**: abre la sesión en claude.ai/code para ver el error. Si el error muestra que git no pudo autenticarse, revisa las [credenciales de git](#configure-git) del runner. En un runner iniciado con `--use-anthropic-git-proxy`, consulta [Cuando las sesiones no se inician en un runner con el proxy de git](#when-anthropic-doesnt-serve-a-session).

685 808 

686 Un directorio base no escribible detiene el runner al inicio en lugar de hacer fallar las sesiones. Consulta la entrada **El runner se cierra al inicio con `cannot create or write to base directory`** en esta lista.809 Un directorio base no escribible detiene el runner al inicio en lugar de hacer fallar las sesiones. Consulta la entrada **El runner se cierra al inicio con `cannot create or write to base directory`** en esta lista.

810* **Una sesión se recoge, pero Claude nunca responde su primer mensaje**: si tus runners llegan a `api.anthropic.com` a través de un proxy, configúralo para que deje pasar la respuesta `/worker/events/stream` de la sesión a medida que llega. Aumentar los tiempos de espera del runner no ayuda. Para confirmar la causa en el registro del runner, consulta [Una sesión se recoge, pero Claude nunca responde su primer mensaje](#when-a-sessions-first-message-is-never-answered).

687* **Las sesiones no se inician en un runner que estableció `--use-anthropic-git-proxy`**: busca en el registro del runner `access denied by the git proxy`, o un error de git que nombre una dirección de `api.anthropic.com` que contenga `/git_proxy/`. Para saber si Anthropic atendió la sesión y corregir la causa, consulta [Cuando las sesiones no se inician en un runner con el proxy de git](#when-anthropic-doesnt-serve-a-session).811* **Las sesiones no se inician en un runner que estableció `--use-anthropic-git-proxy`**: busca en el registro del runner `access denied by the git proxy`, o un error de git que nombre una dirección de `api.anthropic.com` que contenga `/git_proxy/`. Para saber si Anthropic atendió la sesión y corregir la causa, consulta [Cuando las sesiones no se inician en un runner con el proxy de git](#when-anthropic-doesnt-serve-a-session).

688* **Las sesiones no pueden alcanzar la red a través de un proxy de salida autenticador**: cuando la fuente que estableció con [`--proxy-authorization-command` o `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) falla, agota el tiempo de espera después de 30 segundos o produce un valor vacío, el runner responde esa conexión con `502 Bad Gateway` y registra por qué. El runner redacta stderr del comando en ese registro y nunca registra el valor del encabezado. Con `--proxy-authorization-command`, ejecute el comando usted mismo en el host para confirmar que imprime el valor de encabezado completo en stdout. Si el runner se cierra al inicio con `could not start the proxy-authorization listener`, no pudo abrir su oyente de loopback.812* **Las sesiones no pueden alcanzar la red a través de un proxy de salida autenticador**: cuando la fuente que estableció con [`--proxy-authorization-command` o `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) falla, agota el tiempo de espera después de 30 segundos o produce un valor vacío, el runner responde esa conexión con `502 Bad Gateway` y registra por qué. El runner redacta stderr del comando en ese registro y nunca registra el valor del encabezado. Con `--proxy-authorization-command`, ejecute el comando usted mismo en el host para confirmar que imprime el valor de encabezado completo en stdout. Si el runner se cierra al inicio con `could not start the proxy-authorization listener`, no pudo abrir su oyente de loopback.

689* **El runner registra líneas `Poll failed` que contienen `rejecting the malformed poll response`**: el runner recibió una respuesta de sondeo de trabajo cuyo cuerpo no es el JSON esperado de la cola. Una causa es un proxy interceptor o un portal cautivo que responde con su propia página. Si el runner se conecta a través de un proxy, configura el proxy para que pase las respuestas de `api.anthropic.com` sin alterarlas.813* **El runner registra líneas `Poll failed` que contienen `rejecting the malformed poll response`**: el runner recibió una respuesta de sondeo de trabajo cuyo cuerpo no es el JSON esperado de la cola. Una causa es un proxy interceptor o un portal cautivo que responde con su propia página. Si el runner se conecta a través de un proxy, configura el proxy para que pase las respuestas de `api.anthropic.com` sin alterarlas.


708* **Una sesión no se inicia con `This runner couldn't read`**: el runner le pidió al host de git un repositorio con sus [credenciales de git](#configure-git) y obtuvo una respuesta de no encontrado. El repositorio no existe, o esas credenciales no pueden acceder al repositorio.832* **Una sesión no se inicia con `This runner couldn't read`**: el runner le pidió al host de git un repositorio con sus [credenciales de git](#configure-git) y obtuvo una respuesta de no encontrado. El repositorio no existe, o esas credenciales no pueden acceder al repositorio.

709 * **Si administras el runner**: otorga a sus credenciales de git acceso de lectura al repositorio y luego inicia una nueva sesión.833 * **Si administras el runner**: otorga a sus credenciales de git acceso de lectura al repositorio y luego inicia una nueva sesión.

710 * **Si iniciaste la sesión**: si el repositorio no existe, inicia una nueva sesión con el repositorio correcto. Si el runner no puede acceder al repositorio, pide al administrador del runner que otorgue acceso y luego inicia una nueva sesión.834 * **Si iniciaste la sesión**: si el repositorio no existe, inicia una nueva sesión con el repositorio correcto. Si el runner no puede acceder al repositorio, pide al administrador del runner que otorgue acceso y luego inicia una nueva sesión.

711* **Las sesiones tardan minutos en iniciarse**: el clon inicial generalmente domina. Observe la [métrica](https://code.claude.com/docs/es/self-hosted-environments-reference.md#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds` para confirmar, y corte el clon con un [pre-warmed checkout](#reuse-a-pre-warmed-checkout) o un `CLAUDE_RUNNER_FETCH_DEPTH` más pequeño.835* **Las sesiones tardan minutos en iniciarse o reanudarse**: una causa es un clon desde cero. En una flota que inicia cada runner sobre un disco vacío, sin [hook `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout), el runner clona de nuevo los repositorios de la sesión antes de iniciar Claude Code. Una sesión que se reanuda sobre un disco vacío vuelve a esperar el mismo clon.

836 

837 Para evitar el clon desde cero, proporciona un [checkout precalentado](#reuse-a-pre-warmed-checkout). Si ya proporcionas uno, [confirma que el runner lo usa](#confirm-that-the-runner-uses-your-clone). Cuando el runner hace el clon por sí mismo y se cierra después de una sola sesión, reduce [`CLAUDE_RUNNER_FETCH_DEPTH`](https://code.claude.com/docs/es/self-hosted-environments-reference#environment-variable-only-settings) desde su valor predeterminado de 50 commits para obtener menos historial.

838 

839 Si usas un hook, este se ejecuta en lugar del clon del runner, así que revisa lo que hace tu hook. Observa la [métrica](https://code.claude.com/docs/es/self-hosted-environments-reference.md#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds` para ver cuánto tardan los inicios.

712* **Los turnos fallan con un 401**: cuando un turno termina con un 401 o 403 de la API de Anthropic, el runner obtiene un [`CLAUDE_CODE_OAUTH_TOKEN`](https://code.claude.com/docs/es/self-hosted-environments-configuration#wrapper-scripts) nuevo de Anthropic y lo pasa a la sesión. El turno fallido no se reintenta. Este token es de corta duración, y el runner lo rota a través del stdin de la sesión.840* **Los turnos fallan con un 401**: cuando un turno termina con un 401 o 403 de la API de Anthropic, el runner obtiene un [`CLAUDE_CODE_OAUTH_TOKEN`](https://code.claude.com/docs/es/self-hosted-environments-configuration#wrapper-scripts) nuevo de Anthropic y lo pasa a la sesión. El turno fallido no se reintenta. Este token es de corta duración, y el runner lo rota a través del stdin de la sesión.

713 841 

714 Cuando una obtención falla, el runner registra una línea `inference_token refresh failed` que dice cuándo reintentará, y continúa reintentando mientras la sesión se ejecute.842 Cuando una obtención falla, el runner registra una línea `inference_token refresh failed` que dice cuándo reintentará, y continúa reintentando mientras la sesión se ejecute.


788 916 

789Para un diagnóstico guiado en el host del runner, ejecute el [subcomando doctor](#troubleshooting).917Para un diagnóstico guiado en el host del runner, ejecute el [subcomando doctor](#troubleshooting).

790 918 

919### Una sesión se recoge, pero Claude nunca responde su primer mensaje

920 

921Si un runner recoge una sesión pero Claude nunca responde el primer mensaje, y tus runners llegan a `api.anthropic.com` a través de un proxy, el proxy puede ser la causa. Anthropic envía a una sesión sus mensajes mediante una única respuesta en streaming que permanece abierta. Si tu proxy la almacena en búfer, o la termina antes de transmitir algo, el primer mensaje nunca llega. Las demás solicitudes de la sesión siguen funcionando.

922 

923Para corregirlo, cambia cómo maneja el proxy esta solicitud:

924 

925```text theme={null}

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

927```

928 

929* **No almacenes la respuesta en búfer**: déjala pasar a medida que llega. Su tipo de contenido es `text/event-stream`.

930* **Deja que la respuesta permanezca abierta**: puede permanecer abierta hasta una hora. Si el proxy tiene un tiempo de espera por inactividad, mantenlo muy por encima de 15 segundos, porque Anthropic envía un keep-alive al menos con esa frecuencia por defecto.

931 

932Luego inicia una nueva sesión y comprueba que Claude responde. Aumentar los tiempos de espera del runner no ayuda: solo esperas más antes de que el runner detenga la sesión.

933 

934#### Confirmar la causa en el registro del runner

935 

936Estos pasos son para runners con Claude Code v2.1.287 o posterior, con el valor predeterminado `--log-level info`. Los runners más antiguos registran estas líneas más tarde, o no las registran.

937 

9381. Espera a que transcurra [`--startup-timeout-min`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags), 15 minutos por defecto. El runner entonces detiene la sesión y registra una línea que contiene `no child output for` y termina en `— releasing`.

9392. Busca `SDKStartup: SSE` en el registro del runner. Estas líneas siguen a una línea `finished: interrupted`, unas líneas después de la del paso 1. La mayoría no tiene marca de tiempo, así que un recolector de registros puede mostrarlas en otro lugar.

9403. Busca la línea en esta tabla:

941 

942| La línea de registro contiene | Qué hacer |

943| :- | :- |

944| `SSE connect failed (no response in 30s)` o `SSE liveness timeout` | Comprueba que el proxy reenvía la solicitud, deja pasar los encabezados y los datos de la respuesta a medida que llegan, y no corta la conexión |

945| `SSE connect failed (HTTP` y un código de estado | Revisa el registro del propio proxy. Si el proxy respondió la solicitud por sí mismo, deja pasar la solicitud a través de él. |

946| `SSE connect failed (` y cualquier otro texto | El texto entre paréntesis es el error. Busca la misma conexión en el registro del propio proxy. |

947| `SSE stream ended by server`, una y otra vez | Revisa el límite de tiempo del proxy para respuestas de larga duración. Una sola línea así es normal. |

948| `SSE reconnected after` | Busca una de las otras líneas después de ella. Esta no significa que algo haya llegado a la sesión. |

949 

950Si el registro no tiene ninguna de estas líneas, o el registro del proxy no muestra nada anómalo, [reporta un problema](#report-an-issue).

951 

952#### Evitar que la sesión lo vuelva a intentar

953 

954La sesión mantiene el mensaje pendiente, y un runner que puede atender al propietario de la sesión la recoge de nuevo. Hasta que cambies el proxy, la sesión espera de la misma manera cada vez. Para detenerlo, archiva la sesión en claude.ai/code.

955 

791## Qué sigue956## Qué sigue

792 957 

793* [Personalice sesiones](https://code.claude.com/docs/es/self-hosted-environments-configuration.md): scripts de envoltura, hooks de ciclo de vida, runners bajo demanda, servidores MCP, y permisos958* [Personalice sesiones](https://code.claude.com/docs/es/self-hosted-environments-configuration.md): scripts de envoltura, hooks de ciclo de vida, runners bajo demanda, servidores MCP, y permisos

Details

117 117 

118Si la sesión no empieza a trabajar, identifica lo que ves:118Si la sesión no empieza a trabajar, identifica lo que ves:

119 119 

120* **La sesión permanece en cola**: consulta [Troubleshooting](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#troubleshooting).120* **La sesión permanece en cola**: consulta [Solución de problemas](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#troubleshooting).

121* **La sesión no se inicia por un error de git**: si el error incluye el mensaje de git `could not read Username for` seguido de la URL de tu host de git, el runner no tenía credenciales HTTPS para ese host.121* **La sesión no se inicia por un error de git**: si el error incluye el mensaje de git `could not read Username for` seguido de la URL de tu host de git, el runner no tenía credenciales HTTPS para ese host.

122 * **Proporcionar credenciales HTTPS**: consulta [Configurar git](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#configure-git)122 * **Proporcionar credenciales HTTPS**: consulta [Configurar git](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#configure-git)

123 * **Clonar por SSH en su lugar**: si el host del runner ya tiene una clave SSH, consulta [Reescribir URLs de git para redes privadas](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#rewrite-git-urls-for-private-networks)123 * **Clonar por SSH en su lugar**: si el host del runner ya tiene una clave SSH, consulta [Reescribir URLs de git para redes privadas](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#rewrite-git-urls-for-private-networks)

124 * **Después de cualquiera de las dos soluciones**: vuelve a iniciar el runner y observa la sesión fallida en lugar de iniciar una nueva. Si ha fallado varias veces, espera varios minutos a que el runner registre `Picked up session`.

125 * **Para usar otro repositorio en su lugar**: [archiva](https://code.claude.com/docs/es/claude-code-on-the-web.md#archive-sessions) o [elimina](https://code.claude.com/docs/es/claude-code-on-the-web.md#delete-sessions) la sesión fallida, luego vuelve a iniciar el runner e inicia una sesión nueva. De lo contrario, el runner puede tomar la sesión fallida en lugar de la nueva.

124 126 

125### Si el runner sale127### Si el runner sale

126 128 

Details

83 83 

84| Bandera | Predeterminado | Descripción |84| Bandera | Predeterminado | Descripción |

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

86| `--hook-concurrency <n>` | `4` | Máximo de hooks `spawn-runner` ejecutándose en paralelo. También limita cuántas solicitudes de generación se reclaman por sondeo. |86| `--hook-concurrency <n>` | `4` | Máximo de hooks `spawn-runner` ejecutándose en paralelo. También limita cuántas solicitudes de generación se reclaman por sondeo. El orchestrator busca nuevas solicitudes de generación solo después de que haya terminado cada hook que inició, por lo que un hook lento retrasa los siguientes hooks de ese orchestrator. |

87| `--hook-timeout <sec>` | `60` | Terminar el árbol de procesos del hook después de este número de segundos. El tiempo de espera más su período de gracia de 5 segundos debe mantenerse por debajo de `--expected-spawn-seconds`; el orchestrator lo aplica al inicio. |87| `--hook-timeout <sec>` | `60` | Terminar el árbol de procesos del hook después de este número de segundos. El tiempo de espera más su período de gracia de 5 segundos debe mantenerse por debajo de `--expected-spawn-seconds`; el orchestrator lo aplica al inicio. |

88| `--expected-spawn-seconds <sec>` | `120` | Tiempo p99 esperado desde que el orchestrator recibe una solicitud de generación hasta que el runner se registra, incluida cualquier espera de capacidad en tu plataforma. El servidor aplica un rango de 10 a 3600. Se envía en cada sondeo como el arrendamiento del lado del servidor: si ningún runner se registra antes de que transcurra, la sesión se vuelve a ofrecer con un ID de orden nuevo. Todas las réplicas deben compartir este valor. |88| `--expected-spawn-seconds <sec>` | `120` | Tiempo p99 esperado desde que el orchestrator recibe una solicitud de generación hasta que el runner se registra, incluida cualquier espera de capacidad en tu plataforma. El servidor aplica un rango de 10 a 3600. Se envía en cada sondeo como el arrendamiento del lado del servidor: si ningún runner se registra antes de que transcurra, la sesión se vuelve a ofrecer con un ID de orden nuevo. Todas las réplicas deben compartir este valor. |

89| `--min-idle <n>` | `0` | Mantener al menos N espacios de sesión inactivos libres generando runners en espera de forma proactiva. `0` desactiva el precalentamiento. Emparejar con `--exit-if-unused-min` del runner para que los runners en espera excedentes se reclamen a sí mismos. |89| `--min-idle <n>` | `0` | Mantener al menos N espacios de sesión inactivos libres generando runners en espera de forma proactiva. `0` desactiva el precalentamiento. Emparejar con `--exit-if-unused-min` del runner para que los runners en espera excedentes se reclamen a sí mismos. |


116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | Cuánto tiempo el runner espera después de que una sesión alcanza su límite `--kill-session-after-min`, para que un turno en ejecución termine o se complete la liberación, antes de terminar la sesión |116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | Cuánto tiempo el runner espera después de que una sesión alcanza su límite `--kill-session-after-min`, para que un turno en ejecución termine o se complete la liberación, antes de terminar la sesión |

117| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Límite en cuánto tiempo el runner cuenta una sesión como ocupada para el drenaje `--drain-wait-sec` después de que un turno termina, mientras el proceso de la sesión reporta el final del turno a Anthropic. `0` o un valor inutilizable vuelve al predeterminado, por lo que la retención no se puede desactivar. Requiere Claude Code v2.1.275 o posterior. |117| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Límite en cuánto tiempo el runner cuenta una sesión como ocupada para el drenaje `--drain-wait-sec` después de que un turno termina, mientras el proceso de la sesión reporta el final del turno a Anthropic. `0` o un valor inutilizable vuelve al predeterminado, por lo que la retención no se puede desactivar. Requiere Claude Code v2.1.275 o posterior. |

118| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Cuánto tiempo el runner espera a que el SO entregue `SIGKILL` a un hijo atascado en E/S no interrumpible antes de salir él mismo. Limitado a `--post-session-hook-timeout-sec` más 15 segundos, y 30 más cuando `--push-outcome-on-release` está establecido, por lo que el mínimo efectivo es 75 segundos en valores predeterminados. |118| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Cuánto tiempo el runner espera a que el SO entregue `SIGKILL` a un hijo atascado en E/S no interrumpible antes de salir él mismo. Limitado a `--post-session-hook-timeout-sec` más 15 segundos, y 30 más cuando `--push-outcome-on-release` está establecido, por lo que el mínimo efectivo es 75 segundos en valores predeterminados. |

119| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Profundidad de búsqueda de git para clones frescos. Establezca un entero positivo, o `full` o `0` para una búsqueda completa. Los repositorios ya presentes en el workspace mantienen su profundidad existente. |119| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Profundidad de búsqueda de git para clones frescos. Establece un entero positivo, o `full` o `0` para una búsqueda completa. Para un clon que ya está en el espacio de trabajo, consulta [Reutilizar un checkout precalentado](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout). |

120| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | Cuánto tiempo en milisegundos, por intento, una búsqueda de git puede esperar sus primeros datos mientras los números de progreso del propio servidor git siguen aumentando, como cuando el servidor prepara el pack para un repositorio grande. `0` u `off` desactiva la espera: esa búsqueda se corta entonces después de dos minutos sin datos. Cualquier otro número entero se limita a un valor entre `120000` y `1800000`, de 2 a 30 minutos. Requiere Claude Code v2.1.295 o posterior. |120| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | Cuánto tiempo en milisegundos, por intento, una búsqueda de git puede esperar sus primeros datos mientras los números de progreso del propio servidor git siguen aumentando, como cuando el servidor prepara el pack para un repositorio grande. `0` u `off` desactiva la espera: esa búsqueda se corta entonces después de dos minutos sin datos. Cualquier otro número entero se limita a un valor entre `120000` y `1800000`, de 2 a 30 minutos. Requiere Claude Code v2.1.295 o posterior. |

121| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | unset | Cuando es `1`, omita la verificación de presencia `.git` después de que se ejecute un hook `checkout`. Establezca esto cuando su hook materializa una fuente que no es git. |121| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | unset | Cuando es `1`, omita la verificación de presencia `.git` después de que se ejecute un hook `checkout`. Establezca esto cuando su hook materializa una fuente que no es git. |

122| `FORCE_AUTOUPDATE_PLUGINS` | unset | Cuando es `1`, permita que los mercados de plugins se actualicen automáticamente aunque el binario esté fijado |122| `FORCE_AUTOUPDATE_PLUGINS` | unset | Cuando es `1`, permita que los mercados de plugins se actualicen automáticamente aunque el binario esté fijado |


231 interval: 30s231 interval: 30s

232```232```

233 233 

234### Reglas de alerta de ejemplo

235 

234Estas reglas de alerta de ejemplo son un punto de partida; ajuste los umbrales para el tamaño de su flota:236Estas reglas de alerta de ejemplo son un punto de partida; ajuste los umbrales para el tamaño de su flota:

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### Alertar sobre runners perdidos y sesiones en espera

310 

311En una [flota fija](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#scale-the-fleet), carga `ClaudeRunnersBelowFloor`. Con [runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), carga `ClaudeOrchestratorSessionsWaiting` y `ClaudeOrchestratorQueueWaitHigh` en su lugar.

312 

313#### Alertar cuando una flota fija pierde runners

314 

315`ClaudeRunnersBelowFloor` se dispara cuando quedan menos runners registrados y raspados que el mínimo durante 10 minutos:

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* **Mínimo**: establece el `2` en `expr` en aproximadamente la mitad de tu número de réplicas, redondeado hacia arriba. Con tres réplicas mantén `2`, y la alerta se dispara cuando queda un runner o ninguno.

332* **Espacio de nombres**: reemplaza `claude-runners` en el matcher y en `labels`, y copia la alerta para cada espacio de nombres adicional. Si tus destinos no tienen una etiqueta `namespace`, elimina el matcher y la etiqueta, o la alerta lee 0 y se dispara.

333* **`ClaudeRunnerPollStale` y `ClaudeRunnerPollErrors`**: mantenlas cargadas desde las [reglas de alerta de ejemplo](#sample-alert-rules), porque `ClaudeRunnersBelowFloor` sigue contando un runner que no puede sondear

334 

335#### Alertar cuando las sesiones esperan runners bajo demanda

336 

337`ClaudeOrchestratorSessionsWaiting` se dispara cuando el número de sesiones que esperan un runner se mantiene por encima de 0 durante 10 minutos. `ClaudeOrchestratorQueueWaitHigh` se dispara cuando más del 1% de las esperas en cola de los últimos 10 minutos superaron los 160 segundos, y eso se mantiene durante 5 minutos:

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* **Umbral**: si siempre hay alguna sesión esperando, sube el `> 0` en `ClaudeOrchestratorSessionsWaiting` por encima del número que sueles ver

367* **`ClaudeOrchestratorDisconnected`**: mantenla cargada desde las [reglas de alerta de ejemplo](#sample-alert-rules), porque `ClaudeOrchestratorSessionsWaiting` deja de dispararse unos 2 minutos después de que se desconecta el último orquestador del espacio de nombres

368 

307### Pasar a través de métricas de hijo de sesión369### Pasar a través de métricas de hijo de sesión

308 370 

309Cada sesión se ejecuta en su propio proceso hijo con sus propias métricas de OpenTelemetry; en `--capacity` superior a uno, el runner reescribe cómo se exponen esas métricas del hijo. Establecer `OTEL_METRICS_EXPORTER=prometheus` en el host del runner y `CLAUDE_CODE_ENABLE_TELEMETRY=1` en el entorno de la sesión, por ejemplo desde su [script de envoltura](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#wrapper-scripts) o el entorno propio del runner, que las sesiones heredan, re-expone los instrumentos de contador y indicador de cada hijo en el punto final `/metrics` propio del runner, junto con la serie del runner. El runner reescribe el exportador del hijo para empujar sobre OTLP a un receptor solo de loopback en el puerto de salud, etiqueta cada serie con etiquetas `session_id` y `client_platform`, y desaloja la serie de una sesión cuando esa sesión termina. Los histogramas no pasan, y una métrica del hijo cuyo nombre entraría en conflicto con el prefijo propio del runner se descarta.371Cada sesión se ejecuta en su propio proceso hijo con sus propias métricas de OpenTelemetry; en `--capacity` superior a uno, el runner reescribe cómo se exponen esas métricas del hijo. Establecer `OTEL_METRICS_EXPORTER=prometheus` en el host del runner y `CLAUDE_CODE_ENABLE_TELEMETRY=1` en el entorno de la sesión, por ejemplo desde su [script de envoltura](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#wrapper-scripts) o el entorno propio del runner, que las sesiones heredan, re-expone los instrumentos de contador y indicador de cada hijo en el punto final `/metrics` propio del runner, junto con la serie del runner. El runner reescribe el exportador del hijo para empujar sobre OTLP a un receptor solo de loopback en el puerto de salud, etiqueta cada serie con etiquetas `session_id` y `client_platform`, y desaloja la serie de una sesión cuando esa sesión termina. Los histogramas no pasan, y una métrica del hijo cuyo nombre entraría en conflicto con el prefijo propio del runner se descarta.

Details

324}324}

325```325```

326 326 

327Una entrada de ID de modelo como `"claude-opus-5"` también permite versiones posteriores que la extienden, como Opus 5.5. Para bloquear una de esas versiones, use [`deniedModels`](#deniedmodels). Para hacer que cada entrada de ID de modelo permita solo la versión que nombra, use [`availableModelsMatch`](#availablemodelsmatch). Consulte [Restringir la selección de modelos](https://code.claude.com/docs/es/model-config.md#restrict-model-selection).327Una entrada de ID de modelo como `"claude-opus-5"` también permite versiones posteriores que la extienden, como Opus 5.5. Para bloquear una de esas versiones, usa [`deniedModels`](#deniedmodels). Para hacer que cada entrada de ID de modelo permita solo la versión que nombra, usa [`availableModelsMatch`](#availablemodelsmatch). Consulta [Restringir la selección de modelos](https://code.claude.com/docs/es/model-config.md#restrict-model-selection). Para IDs de proveedores de terceros, consulta [Fijar modelos para despliegues de terceros](https://code.claude.com/docs/es/model-config.md#pin-models-for-third-party-deployments).

328 328 

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

330 330 


333* **Alcance**: [`Administrado`](#scopes). Claude Code ignora la clave en configuraciones de usuario, proyecto y local y en `--settings`, con una advertencia333* **Alcance**: [`Administrado`](#scopes). Claude Code ignora la clave en configuraciones de usuario, proyecto y local y en `--settings`, con una advertencia

334* **Tipo**: cadena, uno de:334* **Tipo**: cadena, uno de:

335 * `"prefix"`: una entrada de ID de modelo permite su versión y cualquier ID de modelo que la extienda con otro segmento335 * `"prefix"`: una entrada de ID de modelo permite su versión y cualquier ID de modelo que la extienda con otro segmento

336 * `"exact"`: una entrada de ID de modelo permite solo la versión que nombra, incluidos los IDs fechados de esa versión, por lo que `"claude-opus-5"` permite Opus 5 pero no `claude-opus-5-5`. Un alias de familia como `"opus"` aún permite toda la familia, y las entradas `best`, `opusplan` y `default` se ignoran336 * `"exact"`: una entrada de ID de modelo permite solo la versión que nombra, por lo que `"claude-opus-5"` permite Opus 5 pero no `claude-opus-5-5`. Una entrada como `"claude-opus-4-5"` también permite su ID de modelo de Anthropic fechado `claude-opus-4-5-20251101`. Un alias de familia como `"opus"` aún permite toda la familia, y las entradas `best`, `opusplan` y `default` se ignoran

337* **Predeterminado**: `"prefix"`337* **Predeterminado**: `"prefix"`

338 338 

339Este ejemplo permite Opus 5 y Sonnet 5 y ningún lanzamiento posterior de ninguno:339Este ejemplo permite Opus 5 y Sonnet 5 y ningún lanzamiento posterior de ninguno:


1371 1371 

1372Claude Code elimina la barra final de una ruta de directorio, por lo que `~/.aws` y `~/.aws/` coinciden con el mismo directorio. Antes de v2.1.224, Claude Code pasaba la barra final al sandbox, y Claude aún podía leer o escribir rutas bajo una entrada `denyRead` o `denyWrite` escrita con ella.1372Claude Code elimina la barra final de una ruta de directorio, por lo que `~/.aws` y `~/.aws/` coinciden con el mismo directorio. Antes de v2.1.224, Claude Code pasaba la barra final al sandbox, y Claude aún podía leer o escribir rutas bajo una entrada `denyRead` o `denyWrite` escrita con ella.

1373 1373 

1374Claude Code también elimina un `/**` final, por lo que `~/build/**` y `~/build` cubren el mismo directorio. Que un comodín como `*` funcione depende de la lista en la que esté la entrada y de la plataforma:1374##### Dónde funcionan los comodines en las rutas del sandbox

1375 1375 

1376* **`allowWrite` y `denyWrite`**: en macOS, los comodines funcionan. En Linux y WSL2, el sandbox monta rutas concretas, por lo que Claude Code omite una entrada que contiene `*`, `?` o `[` una vez eliminado el `/**` final, y esa entrada no tiene efecto. Claude Code agrega a estas listas las rutas de tus reglas de permisos `Edit`, por lo que el mismo límite se aplica a ellas, y la pestaña **Config** de `/sandbox` advierte sobre las reglas de permisos `Edit` y `Read` que contienen comodines.1376Los comodines `*`, `?` y `**` funcionan en las cuatro listas de rutas de `sandbox.filesystem` en macOS, y en menos lugares en Linux y WSL2:

1377* **`denyRead` y `allowRead`**: los comodines funcionan en todas las plataformas. En Linux y WSL2, Claude Code expande una entrada de lectura a las rutas concretas con las que coincide, algo que no hace con las listas de escritura.

1378 1377 

1379Las llaves coinciden como caracteres normales dentro de un nombre, por lo que `~/data/{keys,tokens}` cubre un directorio llamado literalmente `{keys,tokens}`, no dos alternativas. Para cubrir `~/data/keys` y `~/data/tokens`, agrega cada una como una entrada independiente.1378| Lista de `sandbox.filesystem` | Qué funciona en Linux y WSL2 | Ejemplo que no funciona en Linux y WSL2 | Qué escribir en su lugar |

1379| :- | :- | :- | :- |

1380| `denyRead`, `allowRead` | Un `/**` final funciona, así que `~/build/**` cubre el mismo directorio que `~/build`. Cualquier otro comodín funciona solo después del primer nombre de directorio de la [ruta completa](#sandbox-path-prefixes) de la entrada. | `/**/*.pem` en `denyRead` no cubre nada, así que no bloquea ninguna lectura | `/srv/**/*.pem`, con una entrada para cada directorio de nivel superior |

1381| `allowWrite`, `denyWrite` | Solo funciona un `/**` final, así que `~/build/**` cubre el mismo directorio que `~/build` | `./src/*` cubre solo un archivo o directorio dentro de `src` que se llame literalmente `*`, y nada cuando no existe | `./src`, que cubre todo lo que hay bajo `src`, o una entrada para cada ruta |

1382 

1383En `~/keys/*.pem`, el comodín va después del primer nombre de directorio, que es `home` para un directorio home `/home/alice`:

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 

1391En Linux y WSL2, la pestaña **Config** de `/sandbox` en una sesión advierte sobre las reglas de permisos `Edit` que contienen un comodín distinto de un `/**` final. Esos comodines no funcionan para los comandos en el sandbox. Agrega cada ruta que deba cubrir la regla, o el directorio que las contiene, a `allowWrite` para una regla de permitir o a `denyWrite` para una regla de denegar.

1392 

1393##### Nombres de directorios con corchetes, llaves o paréntesis

1394 

1395Para permitir o bloquear un directorio cuyo nombre contiene corchetes, escribe el nombre tal como es, por ejemplo `./app/[slug]`. En esa entrada, `[slug]` es el nombre real del directorio, con los corchetes incluidos:

1396 

1397```text theme={null}

1398app/

1399└── [slug]/

1400 └── page.tsx

1401```

1402 

1403Esa entrada cubre todo lo que hay bajo el directorio, así que no agregues un `/**` final. En macOS y en Linux y WSL2, el directorio `app/[slug]` tiene que existir cuando se inicia el comando en el sandbox.

1404 

1405* **Corchetes como `[slug]`**: en todas las listas en macOS, y en `denyRead` y `allowRead` en Linux y WSL2, los corchetes de `./app/[slug]` también son un patrón. La entrada entonces también coincide con cualquier ruta bajo `app` cuyo nombre sea un carácter de `slug`, como `app/s` o `app/g`. Con esa entrada en `allowRead`, o en `allowWrite` en macOS, los comandos en el sandbox también pueden acceder a esas rutas. Cambia el nombre de las que no deberían alcanzar.

1406* **Corchetes como `[user-id]` o `[post-id]`, donde el carácter a la izquierda del guion se ordena después del de la derecha**: `./app/[user-id]` cubre solo el directorio con exactamente ese nombre, en todas las listas y en todas las plataformas. Antes de v2.1.304, los comandos en el sandbox en Linux y WSL2 no se iniciaban mientras `denyRead` o `allowRead` contenía una entrada así.

1407* **Llaves y paréntesis**: son caracteres comunes, así que `~/data/{keys,tokens}` cubre un directorio llamado `{keys,tokens}`, no dos alternativas. Para cubrir `~/data/keys` y `~/data/tokens`, agrega cada uno como una entrada propia.

1380 1408 

1381### `sandbox.filesystem.allowWrite`1409### `sandbox.filesystem.allowWrite`

1382 1410 


3470 3498 

3471La coincidencia del nombre de host no distingue mayúsculas de minúsculas y trata `hooks.example.com.`, con el punto final que marca un nombre de dominio completamente calificado, igual que `hooks.example.com`, que es cómo DNS los trata. La lista de permitidos se aplica a hooks de todas las fuentes, incluida la configuración administrada.3499La coincidencia del nombre de host no distingue mayúsculas de minúsculas y trata `hooks.example.com.`, con el punto final que marca un nombre de dominio completamente calificado, igual que `hooks.example.com`, que es cómo DNS los trata. La lista de permitidos se aplica a hooks de todas las fuentes, incluida la configuración administrada.

3472 3500 

3473En la opción `managedSettings` del Agent SDK, Claude Code ignora esta clave cuando su lista tiene entradas, así que pasa la lista en la opción `settings` del SDK en su lugar. Consulta [qué hace cada valor en la configuración principal](https://code.claude.com/docs/es/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).3501En la opción `managedSettings` del Agent SDK, Claude Code ignora una lista con entradas, así que pásala en la [opción `settings`](https://code.claude.com/docs/es/agent-sdk/typescript#options) del SDK en su lugar. Consulta [qué hace una lista vacía en la configuración principal](https://code.claude.com/docs/es/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).

3474 3502 

3475### `allowManagedHooksOnly`3503### `allowManagedHooksOnly`

3476 3504 


3520El alcance depende de qué archivo lleve la clave:3548El alcance depende de qué archivo lleve la clave:

3521 3549 

3522* **En configuración administrada**: Claude Code deshabilita cada hook configurado, incluidos los administrados, y continúa ejecutando los hooks que el [Agent SDK](https://code.claude.com/docs/es/agent-sdk/overview.md) registra en proceso3550* **En configuración administrada**: Claude Code deshabilita cada hook configurado, incluidos los administrados, y continúa ejecutando los hooks que el [Agent SDK](https://code.claude.com/docs/es/agent-sdk/overview.md) registra en proceso

3523* **En la opción `managedSettings` del Agent SDK**: Claude Code trata la clave como `allowManagedHooksOnly: true`, así que consulta [qué se ejecuta bajo `allowManagedHooksOnly`](#what-runs-under-allowmanagedhooksonly) para saber qué hooks se detienen. En una máquina donde un administrador implementa configuración administrada, Claude Code ignora esta clave a menos que el administrador [permita que un host integrador agregue políticas](https://code.claude.com/docs/es/managed-settings.md#let-an-embedding-host-add-policy). Requiere Claude Code v2.1.309 o posterior.3551* **En la opción `managedSettings` del Agent SDK**: en una máquina donde un administrador implementa configuración administrada, Claude Code ignora esta clave a menos que el administrador [permita que un host integrador agregue políticas](https://code.claude.com/docs/es/managed-settings.md#let-an-embedding-host-add-policy). Donde la clave surte efecto, se detienen los hooks de usuario, proyecto, locales y de plugins, así como cualquiera en la opción `settings` del SDK. Los hooks administrados de un administrador, los hooks de plugins [forzados a habilitarse](#enabledplugins) y tus [callbacks de hooks del SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md) continúan ejecutándose. Requiere Claude Code v2.1.309 o posterior.

3524* **En cualquier otro archivo de configuración**: Claude Code deshabilita hooks de usuario, proyecto, locales y de plugins; los hooks administrados, hooks del Agent SDK y hooks de plugins forzados a habilitarse en [`enabledPlugins`](#enabledplugins) administrado continúan ejecutándose3552* **En cualquier otro archivo de configuración**: Claude Code deshabilita hooks de usuario, proyecto, locales y de plugins; los hooks administrados, hooks del Agent SDK y hooks de plugins forzados a habilitarse en [`enabledPlugins`](#enabledplugins) administrado continúan ejecutándose

3525 3553 

3526La clave también detiene los [mods](https://code.claude.com/docs/es/plugins/mods/overview.md), que son plugins cuyo código registra hooks:3554La clave también detiene los [mods](https://code.claude.com/docs/es/plugins/mods/overview.md), que son plugins cuyo código registra hooks:


3624 3652 

3625La lista de permitidos se aplica a hooks de todas las fuentes, incluida la configuración administrada.3653La lista de permitidos se aplica a hooks de todas las fuentes, incluida la configuración administrada.

3626 3654 

3627En la opción `managedSettings` del Agent SDK, Claude Code ignora esta clave cuando su lista tiene entradas, así que pasa la lista en la opción `settings` del SDK en su lugar. Consulta [qué hace cada valor en la configuración principal](https://code.claude.com/docs/es/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect).3655En la opción `managedSettings` del Agent SDK, Claude Code ignora una lista con entradas, así que pásala en la [opción `settings`](https://code.claude.com/docs/es/agent-sdk/typescript#options) del SDK en su lugar. Consulta [qué hace una lista vacía en la configuración principal](https://code.claude.com/docs/es/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 nunca ejecuta el comando declarado por el mercado, no instala ni actualiza plugins de origen de comando, y deja de cargar los ya instalados3870 * `true`: Claude Code nunca ejecuta el comando declarado por el mercado, no instala ni actualiza plugins de origen de comando, y deja de cargar los ya instalados

3843 * `false`: Claude Code permite plugins de origen de comando explícitamente3871 * `false`: Claude Code permite plugins de origen de comando explícitamente

3844* **Default**: sin establecer, por lo que Claude Code sigue [`allowManagedHooksOnly`](#allowmanagedhooksonly): una organización que restringe la ejecución de hooks a configuración administrada también obtiene fuentes de comando deshabilitadas3872* **Default**: sin establecer, por lo que Claude Code sigue [`allowManagedHooksOnly`](#allowmanagedhooksonly): una organización que restringe la ejecución de hooks a la configuración administrada también tiene las fuentes de comando deshabilitadas. Una aplicación que pasa [`disableAllHooks: true`](#disableallhooks) en la opción `managedSettings` del Agent SDK no deshabilita por sí sola las fuentes de comando.

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 

134La línea `allow-passthrough` permite que las notificaciones y actualizaciones de progreso lleguen a la terminal externa en lugar de ser absorbidas por tmux. Las líneas `extended-keys` permiten que tmux distinga Shift+Enter de Enter simple para que el atajo de nueva línea funcione.135La línea `allow-passthrough` permite que las notificaciones y actualizaciones de progreso lleguen a la terminal externa en lugar de ser absorbidas por tmux. Las líneas `extended-keys` permiten que tmux distinga Shift+Enter de Enter simple para que el atajo de nueva línea funcione.

135 136 

137Un [`Image` de un mod](https://code.claude.com/docs/es/plugins/mods/reference#elements) necesita las líneas `allow-passthrough` y `focus-events`, junto con los demás [requisitos para dibujar dentro de tmux](https://code.claude.com/docs/es/plugins/mods/gallery.md#draw-an-image-inside-tmux). Después de agregar las líneas, también desconéctate de tmux, vuelve a conectarte y reinicia Claude Code.

138 

136## Corregir que Retroceso elimine una palabra completa en Windows139## Corregir que Retroceso elimine una palabra completa en Windows

137 140 

138En Windows, Claude Code lee un Retroceso que llega como `^H` como Ctrl+Retroceso, que [elimina la palabra anterior](https://code.claude.com/docs/es/interactive-mode.md#text-editing), excepto cuando `TERM_PROGRAM` es `mintty` o `TERM` es `cygwin`. En macOS y Linux, Claude Code lo lee como Retroceso simple.141En Windows, Claude Code lee un Retroceso que llega como `^H` como Ctrl+Retroceso, que [elimina la palabra anterior](https://code.claude.com/docs/es/interactive-mode.md#text-editing), excepto cuando `TERM_PROGRAM` es `mintty` o `TERM` es `cygwin`. En macOS y Linux, Claude Code lo lee como Retroceso simple.

ultrareview.md +2 −2

Details

176El subcomando sale con uno de tres códigos:176El subcomando sale con uno de tres códigos:

177 177 

178* **0**: la revisión se completó, con o sin hallazgos178* **0**: la revisión se completó, con o sin hallazgos

179* **1**: la revisión no se pudo iniciar o se detuvo antes de finalizar, la sesión en la nube generó un error, o se agotó el tiempo de espera. El código también es 1 cuando la [carpeta no es de confianza](#trust-the-folder-before-the-review-runs), incluso cuando respondes `n` o presionas Ctrl-C en la pregunta de confianza.179* **1**: la revisión no se pudo iniciar o se detuvo antes de finalizar, la sesión en la nube generó un error, o se agotó el tiempo de espera. El código también es 1 cuando la [carpeta no es de confianza](#trust-the-folder-before-the-review-runs), incluso cuando respondes `n`, presionas Enter o presionas Ctrl-C en la pregunta de confianza.

180* **130**: presionaste Ctrl-C mientras el subcomando iniciaba la revisión, esperaba los hallazgos o enviaba el comentario de `--post`, en lugar de en la pregunta de confianza180* **130**: presionaste Ctrl-C mientras el subcomando iniciaba la revisión, esperaba los hallazgos o enviaba el comentario de `--post`, en lugar de en la pregunta de confianza

181 181 

182Si el subcomando sale antes de que lleguen los hallazgos, estos nunca llegan a tu terminal. Es posible que la revisión siga ejecutándose en la nube. Ejecutar el subcomando de nuevo inicia una nueva revisión en lugar de reanudar esa, y la nueva revisión [usa una ejecución gratuita o se factura como créditos de uso](#pricing-and-free-runs).182Si el subcomando sale antes de que lleguen los hallazgos, estos nunca llegan a tu terminal. Es posible que la revisión siga ejecutándose en la nube. Ejecutar el subcomando de nuevo inicia una nueva revisión en lugar de reanudar esa, y la nueva revisión [usa una ejecución gratuita o se factura como créditos de uso](#pricing-and-free-runs).


198claude ultrareview 1234 --trust-workspace198claude ultrareview 1234 --trust-workspace

199```199```

200 200 

201Para revisar un pull request que no es de confianza, ejecuta `claude ultrareview <PR number> --trust-workspace` desde una rama en la que confíes. A diferencia de `y`, el flag no guarda nada. El PR se [clona en la nube](#review-a-pull-request), por lo que no necesitas su rama localmente.201Para revisar un pull request que no es de confianza, ejecuta `claude ultrareview <PR number> --trust-workspace` desde una rama en la que confíes. El PR se [clona en la nube](#review-a-pull-request), por lo que no necesitas su rama localmente.

202 202 

203## Cómo ultrareview se compara con /code-review203## Cómo ultrareview se compara con /code-review

204 204 

vs-code.md +6 −1

Details

1001 1001 

1002### El dictado o la pestaña Web fallan detrás de un proxy con inspección TLS1002### El dictado o la pestaña Web fallan detrás de un proxy con inspección TLS

1003 1003 

1004Cuando el dictado o la pestaña Web fallan con un error de certificado como `unable to get local issuer certificate`, establece [`NODE_EXTRA_CA_CERTS`](https://code.claude.com/docs/es/network-config#custom-ca-certificates) en el bloque `env` de `~/.claude/settings.json`. Establécelo en la ruta de un archivo PEM con el certificado de CA raíz de tu proxy, que tu equipo de TI puede proporcionarte. Ese texto de error aparece en el botón del micrófono o en los registros de la extensión:1004Cuando el dictado o la pestaña Web fallan con un error de certificado como `unable to get local issuer certificate`, establece [`NODE_EXTRA_CA_CERTS`](https://code.claude.com/docs/es/network-config#custom-ca-certificates) en el bloque `env` de `~/.claude/settings.json`. Establécelo en la ruta de un archivo PEM con el certificado de CA raíz de tu proxy, que tu equipo de TI puede proporcionarte. La falla aparece en el botón del micrófono o en la pestaña Web, o en los registros:

1005 1005 

1006* **Dictado**: el botón del micrófono muestra el texto de error después de `Dictation error: WebSocket error:`.1006* **Dictado**: el botón del micrófono muestra el texto de error después de `Dictation error: WebSocket error:`.

1007* **Pestaña Web**: la pestaña que enumera las [sesiones en la nube](#resume-cloud-sessions-from-claude-ai) muestra `Remote server is not connected` sin el texto de error. Para leerlo en los registros:1007* **Pestaña Web**: la pestaña que enumera las [sesiones en la nube](#resume-cloud-sessions-from-claude-ai) muestra `Remote server is not connected` sin el texto de error. Para leerlo en los registros:

1008 1. Ejecuta **Claude Code: Show Logs** desde la [Command Palette](#vs-code-commands-and-shortcuts) para abrir el canal de salida `Claude VSCode`.1008 1. Ejecuta **Claude Code: Show Logs** desde la [Command Palette](#vs-code-commands-and-shortcuts) para abrir el canal de salida `Claude VSCode`.

1009 2. Haz clic en **Reconnect** en la pestaña y espera hasta que deje de mostrar `Connecting…`.1009 2. Haz clic en **Reconnect** en la pestaña y espera hasta que deje de mostrar `Connecting…`.

1010 3. Busca en el canal `Error fetching remote sessions:` o `Failed to fetch organization UUID:` y luego lee el texto de error después de ese prefijo en la línea coincidente más reciente.1010 3. Busca en el canal `Error fetching remote sessions:` o `Failed to fetch organization UUID:` y luego lee el texto de error después de ese prefijo en la línea coincidente más reciente.

1011* **Advertencia en el registro**: una advertencia que menciona `an authority that Claude Code does not trust` informa un error de certificado. Detrás de un proxy con inspección TLS, establece `NODE_EXTRA_CA_CERTS` en `env` en `~/.claude/settings.json`. Las versiones anteriores a la v2.1.309 no registran esta advertencia.

1011 1012 

1012Esta solución requiere la versión 2.1.307 o posterior de la extensión, así que primero actualiza la extensión. Luego establece `NODE_EXTRA_CA_CERTS` en la ruta completa del archivo de certificado, escrita sin `~`. Para una ruta de Windows, escribe cada barra invertida dos veces en `settings.json`, como en `C:\\certs\\example-ca.pem`.1013Esta solución requiere la versión 2.1.307 o posterior de la extensión, así que primero actualiza la extensión. Luego establece `NODE_EXTRA_CA_CERTS` en la ruta completa del archivo de certificado, escrita sin `~`. Para una ruta de Windows, escribe cada barra invertida dos veces en `settings.json`, como en `C:\\certs\\example-ca.pem`.

1013 1014 

1015> [!NOTE]

1016>

1017> En una ventana conectada a WSL, a un host SSH, a un dev container o a otro sistema, guarda el archivo de certificado y edita `~/.claude/settings.json` en ese sistema, no en tu computadora local.

1018 

1014Este ejemplo indica un archivo de certificado en la ruta de Linux o macOS `/etc/ssl/certs/example-ca.pem`:1019Este ejemplo indica un archivo de certificado en la ruta de Linux o macOS `/etc/ssl/certs/example-ca.pem`:

1015 1020 

1016```json ~/.claude/settings.json theme={null}1021```json ~/.claude/settings.json theme={null}