SpyBara
Go Premium

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

19 files changed +520 −173. View all changes and history on the product overview
2026
Sat 10 11: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
Details

124 124 

125Sin mensajes parciales habilitados, recibe todos los tipos de mensajes excepto `StreamEvent`. Los tipos comunes incluyen `SystemMessage` (inicialización de sesión), `AssistantMessage` (bloques de contenido completos), `ResultMessage` (resultado final), y un mensaje de límite compacto que indica cuándo se compactó el historial de conversación (`SDKCompactBoundaryMessage` en TypeScript; `SystemMessage` con subtipo `"compact_boundary"` en Python).125Sin mensajes parciales habilitados, recibe todos los tipos de mensajes excepto `StreamEvent`. Los tipos comunes incluyen `SystemMessage` (inicialización de sesión), `AssistantMessage` (bloques de contenido completos), `ResultMessage` (resultado final), y un mensaje de límite compacto que indica cuándo se compactó el historial de conversación (`SDKCompactBoundaryMessage` en TypeScript; `SystemMessage` con subtipo `"compact_boundary"` en Python).

126 126 

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

128 Manejar un stream que se corta

129</h3>

130 

131Si un stream se corta a mitad de un mensaje, por ejemplo cuando interrumpes el turno o se cae la conexión, igualmente recibes el `message_stop` de ese mensaje antes de que termine el turno. Un bloque de texto o de pensamiento cortado también recibe su `content_block_stop`. Una llamada a herramienta cortada no lo recibe, así que si `message_stop` llega mientras el bloque de una llamada a herramienta sigue abierto, trata la entrada de esa llamada como incompleta.

132 

133Antes de Claude Code v2.1.290, un stream cortado podía terminar el turno sin `message_stop`, por lo que una respuesta que renderizas a partir de eventos de stream podía seguir mostrándose como en curso. El Agent SDK de TypeScript incluye Claude Code v2.1.290 o posterior a partir de v0.3.290, y el Agent SDK de Python a partir de v0.2.164. Si una respuesta sigue mostrándose como en curso después de que termina el turno, actualiza el SDK.

134 

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

128 Transmitir llamadas de herramientas136 Transmitir llamadas de herramientas

129</h2>137</h2>

Details

1588 1588 

1589Asocia los mensajes de un subagente con sus eventos de tarea mediante `agent_id`, en lugar de emparejar el `parent_tool_use_id` de un mensaje con el `tool_use_id` de un evento de tarea. Cuando una llamada a herramienta reanuda el subagente, los eventos de tarea llevan el `tool_use_id` de esa llamada, mientras que los mensajes conservan el `parent_tool_use_id` de la llamada a herramienta que inició el subagente por primera vez, así que ambos ya no coinciden.1589Asocia los mensajes de un subagente con sus eventos de tarea mediante `agent_id`, en lugar de emparejar el `parent_tool_use_id` de un mensaje con el `tool_use_id` de un evento de tarea. Cuando una llamada a herramienta reanuda el subagente, los eventos de tarea llevan el `tool_use_id` de esa llamada, mientras que los mensajes conservan el `parent_tool_use_id` de la llamada a herramienta que inició el subagente por primera vez, así que ambos ya no coinciden.

1590 1590 

1591Claude Code establece `user_message_uuid` y `user_message_uuids` en el primer mensaje del asistente del turno, bajo las condiciones descritas en [`user_message_uuid`](#user_message_uuid). Cuando Claude Code vuelve a ejecutar un turno que un reinicio interrumpió, los mensajes del asistente de la nueva ejecución que llevan esos campos también llevan [`resume_reason`](#resume_reason).1591Claude Code establece `user_message_uuid` y `user_message_uuids` en el primer mensaje del asistente del turno, en las condiciones descritas en [`user_message_uuid`](#user_message_uuid). Cuando el turno continúa uno que un reinicio interrumpió, los mensajes del asistente que llevan esos campos también llevan [`resume_reason`](#resume_reason).

1592 1592 

1593`timestamp` es la hora ISO 8601 en que el contenido del mensaje terminó de generarse en el proceso que lo produjo. El valor proviene del reloj de esa máquina, así que úsalo solo para mostrarlo y no ordenes los mensajes según él. Un turno de API puede producir varios mensajes del asistente que comparten un `message.id`, cada uno con su propio `timestamp`. Cuando el campo está ausente, recurre a la hora en que recibiste el mensaje.1593`timestamp` es la hora ISO 8601 en que el contenido del mensaje terminó de generarse en el proceso que lo produjo. El valor proviene del reloj de esa máquina, así que úsalo solo para mostrarlo y no ordenes los mensajes según él. Un turno de API puede producir varios mensajes del asistente que comparten un `message.id`, cada uno con su propio `timestamp`. Cuando el campo está ausente, recurre a la hora en que recibiste el mensaje.

1594 1594 


1631 1631 

1632Establece `inline_pastes` para indicarle a Claude Code qué partes de `message.content` pegó el usuario en lugar de escribirlas, una cadena por cada pegado. El texto del prompt permanece donde el usuario lo puso. Claude Code puede envolver cada pegado listado en etiquetas `<pasted_content>` en su lugar, para que Claude pueda distinguir el material pegado de las propias palabras del usuario. Solo se envuelven los pegados del último bloque de texto del prompt. Requiere TypeScript Agent SDK v0.3.280 o posterior.1632Establece `inline_pastes` para indicarle a Claude Code qué partes de `message.content` pegó el usuario en lugar de escribirlas, una cadena por cada pegado. El texto del prompt permanece donde el usuario lo puso. Claude Code puede envolver cada pegado listado en etiquetas `<pasted_content>` en su lugar, para que Claude pueda distinguir el material pegado de las propias palabras del usuario. Solo se envuelven los pegados del último bloque de texto del prompt. Requiere TypeScript Agent SDK v0.3.280 o posterior.

1633 1633 

1634Cada campo de pegado tiene un límite de tamaño:

1635 

1636* `pasted_content`: si las entradas más los bloques de contenido que contienen suman más de 1,000, Claude Code ignora todo el campo.

1637* `inline_pastes`: Claude Code usa las primeras 100 entradas que no están en blanco e ignora el resto.

1638 

1634Establece `shouldQuery`, `client_composed` o `priority` para cambiar cómo Claude Code maneja un mensaje que envías:1639Establece `shouldQuery`, `client_composed` o `priority` para cambiar cómo Claude Code maneja un mensaje que envías:

1635 1640 

1636* `shouldQuery`: establécelo en `false` para añadir el mensaje a la transcripción sin activar un turno del asistente. El mensaje se retiene y se fusiona con el siguiente mensaje del usuario que sí activa un turno. Úsalo para inyectar contexto, como la salida de un comando que ejecutaste fuera de banda, sin gastar una llamada al modelo en él.1641* `shouldQuery`: establécelo en `false` para añadir el mensaje a la transcripción sin activar un turno del asistente. El mensaje se retiene y se fusiona con el siguiente mensaje del usuario que sí activa un turno. Úsalo para inyectar contexto, como la salida de un comando que ejecutaste fuera de banda, sin gastar una llamada al modelo en él.


1775* `ttft_stream_ms`: tiempo en milisegundos hasta el primer evento de streaming `message_start`, cuando se abre el stream de respuesta. Es menor que `ttft_ms`; la diferencia entre ambos es el tiempo dedicado a transmitir en streaming el primer mensaje. Presente solo en la rama de éxito.1780* `ttft_stream_ms`: tiempo en milisegundos hasta el primer evento de streaming `message_start`, cuando se abre el stream de respuesta. Es menor que `ttft_ms`; la diferencia entre ambos es el tiempo dedicado a transmitir en streaming el primer mensaje. Presente solo en la rama de éxito.

1776* `user_message_uuid`: el `uuid` del mensaje que enviaste y que este turno respondió. Consulta [`user_message_uuid`](#user_message_uuid) para saber qué resultados lo llevan.1781* `user_message_uuid`: el `uuid` del mensaje que enviaste y que este turno respondió. Consulta [`user_message_uuid`](#user_message_uuid) para saber qué resultados lo llevan.

1777* `user_message_uuids`: los `uuid` de cada mensaje que enviaste y que Claude Code respondió en este turno. Consulta [`user_message_uuids`](#user_message_uuids).1782* `user_message_uuids`: los `uuid` de cada mensaje que enviaste y que Claude Code respondió en este turno. Consulta [`user_message_uuids`](#user_message_uuids).

1778* `resume_reason`: por qué Claude Code volvió a ejecutar este turno después de que un reinicio lo interrumpiera. Presente en ambas ramas. Consulta [`resume_reason`](#resume_reason).1783* `resume_reason`: por qué este turno continúa uno que un reinicio interrumpió. Presente en ambas ramas. Consulta [`resume_reason`](#resume_reason).

1779* `local_command`: el nombre del comando que despachó el turno, en el resultado de éxito de un turno que un comando completó sin entrar en el bucle del agente, como `/compact`. El nombre se convierte a letras minúsculas y guiones bajos, así que `/reload-plugins` reporta `reload_plugins`. Un comando que proporciona un servidor MCP, y el `/mcp` integrado, reportan `mcp`. Un comando que definiste tú mismo reporta `custom`. Los argumentos nunca se incluyen. Ausente en todo turno que entró en el bucle del agente y en los envíos que no ejecutaron ningún comando. Requiere Agent SDK v0.3.268 o posterior.1784* `local_command`: el nombre del comando que despachó el turno, en el resultado de éxito de un turno que un comando completó sin entrar en el bucle del agente, como `/compact`. El nombre se convierte a letras minúsculas y guiones bajos, así que `/reload-plugins` reporta `reload_plugins`. Un comando que proporciona un servidor MCP, y el `/mcp` integrado, reportan `mcp`. Un comando que definiste tú mismo reporta `custom`. Los argumentos nunca se incluyen. Ausente en todo turno que entró en el bucle del agente y en los envíos que no ejecutaron ningún comando. Requiere Agent SDK v0.3.268 o posterior.

1780* `request_sent_wall_ms`: milisegundos de época en los que Claude Code despachó la solicitud de API, para cruzarlos con marcas de tiempo del lado del servidor. Presente solo junto con [`user_message_uuid`](#user_message_uuid), en un resultado de éxito con `is_error` en false cuyo turno envió una solicitud de API.1785* `request_sent_wall_ms`: milisegundos de época en los que Claude Code despachó la solicitud de API, para cruzarlos con marcas de tiempo del lado del servidor. Presente solo junto con [`user_message_uuid`](#user_message_uuid), en un resultado de éxito con `is_error` en false cuyo turno envió una solicitud de API.

1781* `first_content_frame_ms`: tiempo en milisegundos hasta el primer evento de streaming `content_block_start` o `content_block_delta`, contando los bloques de pensamiento como contenido. Presente solo en la rama de éxito, cuando `is_error` es false. Requiere Agent SDK v0.3.260 o posterior.1786* `first_content_frame_ms`: tiempo en milisegundos hasta el primer evento de streaming `content_block_start` o `content_block_delta`, contando los bloques de pensamiento como contenido. Presente solo en la rama de éxito, cuando `is_error` es false. Requiere Agent SDK v0.3.260 o posterior.


1825 1830 

1826* **Un mensaje normal que enviaste**, es decir, uno sin `isSynthetic: true`: el turno responde a ese mensaje durante toda su ejecución. Cuando envías varios mensajes en poco tiempo, Claude Code puede fusionarlos en un solo turno, y el campo entonces lleva solo el `uuid` del último mensaje. Para asociar la respuesta con cualquiera de los mensajes fusionados, usa [`user_message_uuids`](#user_message_uuids).1831* **Un mensaje normal que enviaste**, es decir, uno sin `isSynthetic: true`: el turno responde a ese mensaje durante toda su ejecución. Cuando envías varios mensajes en poco tiempo, Claude Code puede fusionarlos en un solo turno, y el campo entonces lleva solo el `uuid` del último mensaje. Para asociar la respuesta con cualquiera de los mensajes fusionados, usa [`user_message_uuids`](#user_message_uuids).

1827* **Un mensaje que enviaste con `isSynthetic: true`**: el turno responde a ese mensaje al principio. Si Claude Code recoge un mensaje normal tuyo entre llamadas a herramientas, el turno responde al mensaje recogido a partir de ese momento. Devolver el `uuid` de un mensaje sintético requiere Agent SDK v0.3.265 o posterior; las versiones anteriores no devuelven nada en los turnos sintéticos.1832* **Un mensaje que enviaste con `isSynthetic: true`**: el turno responde a ese mensaje al principio. Si Claude Code recoge un mensaje normal tuyo entre llamadas a herramientas, el turno responde al mensaje recogido a partir de ese momento. Devolver el `uuid` de un mensaje sintético requiere Agent SDK v0.3.265 o posterior; las versiones anteriores no devuelven nada en los turnos sintéticos.

1828* **El prompt que Claude Code genera para volver a ejecutar un turno interrumpido con [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/es/env-vars)**: cuando el último prompt del turno interrumpido es un mensaje normal que enviaste, ya sea que abriera el turno o que Claude Code lo recogiera durante el turno, la nueva ejecución responde a ese mensaje al principio. [`resume_reason`](#resume_reason) distingue los frames de la nueva ejecución de los del intento interrumpido. Cuando el último prompt no es un mensaje normal tuyo, la nueva ejecución no responde a ningún mensaje tuyo al principio. Si Claude Code recoge un mensaje normal tuyo entre llamadas a herramientas, el turno responde al mensaje recogido a partir de ese momento. Devolver el prompt del turno interrumpido requiere Agent SDK v0.3.268 o posterior.1833* **El prompt que genera Claude Code para continuar un turno interrumpido con [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/es/env-vars)**: cuando el último prompt del turno interrumpido es un mensaje normal que enviaste, ya sea que abriera el turno o que Claude Code lo recogiera durante el turno, el turno continuado responde a ese mensaje al principio. [`resume_reason`](#resume_reason) distingue los frames del turno continuado de los del intento interrumpido. Cuando el último prompt no es un mensaje normal tuyo, el turno continuado no responde a ningún mensaje tuyo al principio. Si Claude Code recoge un mensaje normal tuyo entre llamadas a herramientas, a partir de entonces el turno responde al mensaje recogido. Repetir el prompt del turno interrumpido requiere el Agent SDK v0.3.268 o posterior.

1829* **Cualquier otro prompt que Claude Code haya generado por sí mismo**: el turno no responde a ningún mensaje tuyo al principio y sus frames no llevan eco. Si Claude Code recoge un mensaje normal tuyo entre llamadas a herramientas, el turno responde a ese mensaje a partir de ese momento. El eco de la recogida requiere Agent SDK v0.3.265 o posterior; las versiones anteriores no devuelven nada en estos turnos.1834* **Cualquier otro prompt que Claude Code haya generado por sí mismo**: el turno no responde a ningún mensaje tuyo al principio y sus frames no llevan eco. Si Claude Code recoge un mensaje normal tuyo entre llamadas a herramientas, el turno responde a ese mensaje a partir de ese momento. El eco de la recogida requiere Agent SDK v0.3.265 o posterior; las versiones anteriores no devuelven nada en estos turnos.

1830 1835 

1831Claude Code devuelve el `uuid` del mensaje respondido en tres tipos de frame:1836Claude Code devuelve el `uuid` del mensaje respondido en tres tipos de frame:


1857 `resume_reason`1862 `resume_reason`

1858</h4>1863</h4>

1859 1864 

1860Por qué Claude Code volvió a ejecutar este turno después de un reinicio. Claude Code establece este campo en un turno que volvió a ejecutar con [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/es/env-vars), para que puedas distinguir la respuesta y el resultado de la nueva ejecución de los del intento interrumpido. Requiere Agent SDK v0.3.268 o posterior.1865Por qué este turno continúa uno que un reinicio interrumpió. Claude Code establece este campo en un turno que continúa uno interrumpido con [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/es/env-vars), para que puedas distinguir la respuesta y el resultado del turno continuado de los del intento interrumpido. Requiere el Agent SDK v0.3.268 o posterior.

1861 1866 

1862Claude Code establece el campo en dos tipos de frame:1867Claude Code establece el campo en dos tipos de frame:

1863 1868 

1864* **El resultado de la nueva ejecución**: tanto en la rama de éxito como en la de error, lleve o no el resultado `user_message_uuid`.1869* **El resultado del turno continuado**: tanto en la rama de éxito como en la de error, lleve o no el resultado `user_message_uuid`.

1865* **Los frames de respuesta de la nueva ejecución**: aquellos que llevan [`user_message_uuid`](#user_message_uuid).1870* **Los frames de respuesta del turno continuado**: los que llevan [`user_message_uuid`](#user_message_uuid).

1866 1871 

1867El valor es un token breve en minúsculas que nombra por qué se volvió a ejecutar el turno, como `interrupted_turn`.1872El valor es un token corto en minúsculas, como `interrupted_turn`.

1868 1873 

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

1870 `queued_turn_count`1875 `queued_turn_count`


2029};2034};

2030```2035```

2031 2036 

2032Claude Code establece `user_message_uuid` y `user_message_uuids` en el primer evento de streaming del turno que no es ping, y de nuevo cuando cambia el mensaje al que responde el turno, bajo las condiciones descritas en [`user_message_uuid`](#user_message_uuid). Cuando Claude Code vuelve a ejecutar un turno que un reinicio interrumpió, los eventos de streaming de la nueva ejecución que llevan esos campos también llevan [`resume_reason`](#resume_reason).2037Claude Code establece `user_message_uuid` y `user_message_uuids` en el primer evento de stream del turno que no es ping, y de nuevo cuando cambia el mensaje al que responde el turno, en las condiciones descritas en [`user_message_uuid`](#user_message_uuid). Cuando el turno continúa uno que un reinicio interrumpió, los eventos de stream que llevan esos campos también llevan [`resume_reason`](#resume_reason).

2033 2038 

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

2035 `SDKCompactBoundaryMessage`2040 `SDKCompactBoundaryMessage`


3557| - | - | - |3562| - | - | - |

3558| `script` | `string` | Script de flujo de trabajo en línea. Debe comenzar con `export const meta = { name, description }` como un literal, seguido del cuerpo del script usando `agent()`, `parallel()`, `pipeline()` y `phase()`. Una matriz `phases` opcional en `meta` agrupa agentes bajo etapas nombradas en la vista de progreso |3563| `script` | `string` | Script de flujo de trabajo en línea. Debe comenzar con `export const meta = { name, description }` como un literal, seguido del cuerpo del script usando `agent()`, `parallel()`, `pipeline()` y `phase()`. Una matriz `phases` opcional en `meta` agrupa agentes bajo etapas nombradas en la vista de progreso |

3559| `name` | `string` | Nombre de un flujo de trabajo integrado o uno guardado en `.claude/workflows/`. Se resuelve a un script |3564| `name` | `string` | Nombre de un flujo de trabajo integrado o uno guardado en `.claude/workflows/`. Se resuelve a un script |

3560| `scriptPath` | `string` | Ruta a un archivo de script de flujo de trabajo en disco. Tiene precedencia sobre `script` y `name`. Claude Code persiste el script de cada invocación y devuelve la ruta en el resultado, para que puedas editar ese archivo e invocar nuevamente con el mismo `scriptPath` para iterar |3565| `scriptPath` | `string` | Ruta a un archivo de script de flujo de trabajo en disco, como el `scriptPath` que devolvió una ejecución anterior. Tiene precedencia sobre `script` y `name`. Claude Code rechaza `scriptPath` con un error cuando las herramientas de la sesión no incluyen `Read` |

3561| `args` | `unknown` | Valor de entrada expuesto al script como el `args` global, para flujos de trabajo nombrados parametrizados como una pregunta de investigación o una lista de rutas de archivo. Pasa matrices y objetos como valores JSON reales, no como una cadena codificada en JSON |3566| `args` | `unknown` | Valor de entrada expuesto al script como el `args` global, para flujos de trabajo nombrados parametrizados como una pregunta de investigación o una lista de rutas de archivo. Pasa matrices y objetos como valores JSON reales, no como una cadena codificada en JSON |

3562| `resumeFromRunId` | `string` | ID de ejecución de una invocación anterior de `Workflow` para reanudar. Las llamadas `agent()` completadas con entradas sin cambios normalmente devuelven resultados en caché; el resto se ejecuta en vivo. [Reanudar después de una pausa](/docs/es/workflows#resume-after-a-pause) cubre qué llamadas completadas se vuelven a ejecutar. Solo la misma sesión |3567| `resumeFromRunId` | `string` | ID de ejecución de una invocación anterior de `Workflow` para reanudar. Las llamadas `agent()` completadas con entradas sin cambios normalmente devuelven resultados en caché; el resto se ejecuta en vivo. [Reanudar después de una pausa](/docs/es/workflows#resume-after-a-pause) cubre qué llamadas completadas se vuelven a ejecutar. Solo la misma sesión |

3563| `title` | `string` | Ignorado; el bloque `meta` del script establece el título |3568| `title` | `string` | Ignorado; el bloque `meta` del script establece el título |

chrome.md +3 −4

Details

129 Solicitudes de permiso en sesiones de VS Code129 Solicitudes de permiso en sesiones de VS Code

130</h3>130</h3>

131 131 

132En una sesión de VS Code, que Claude Code te pregunte antes de una acción del navegador depende de cómo se conectó la sesión a tu navegador:132En una sesión de VS Code, cuando Claude Code te pregunta antes de una acción del navegador, la solicitud aparece como una tarjeta en el panel de chat. Cuando la acción se dirige a un sitio que no has permitido, la tarjeta también ofrece permitir ese sitio.

133 133 

134* **Escribiste `@browser`**: la extensión aprueba cada acción del navegador sobre la que Claude Code de otro modo te preguntaría.134En una sesión que se conectó a tu navegador al iniciar porque [Enabled by default](#enable-chrome-by-default) está activado, Claude Code te pregunta antes de las acciones del navegador en un sitio que no has permitido, en los modos de permisos Manual, Edit automatically, Auto y Bypass permissions. En los modos de permisos Auto y Bypass permissions, esto se aplica hasta que escribas `@browser` en esa sesión.

135* **El ajuste [Enabled by default](#enable-chrome-by-default) la conectó al iniciar**: Claude Code te pregunta antes de las acciones del navegador en un sitio que no has permitido, en los modos de permisos Manual, Edit automatically, Auto y Bypass permissions, hasta que escribas `@browser` en esa sesión.

136 135 

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

138 Herramientas del navegador en Plan Mode137 Herramientas del navegador en Plan Mode

139</h3>138</h3>

140 139 

141En [modo plan](/docs/es/permission-modes#analyze-before-you-edit-with-plan-mode), aparece una solicitud de permiso antes de que Claude grabe un GIF, abra una nueva pestaña o ejecute un atajo, excepto en una sesión de VS Code en la que escribiste [`@browser`](#permission-prompts-in-vs-code-sessions). En una sesión interactiva de la CLI, si [el modo bypass permissions está disponible](/docs/es/permission-modes#skip-all-checks-with-bypasspermissions-mode) y [la obtención de banderas de características](/docs/es/env-vars#features-that-need-feature-flag-fetching) está desactivada, estas llamadas se ejecutan sin una solicitud.140En [modo plan](/docs/es/permission-modes#analyze-before-you-edit-with-plan-mode), aparece una solicitud de permiso antes de que Claude grabe un GIF, abra una nueva pestaña o ejecute un atajo. En una sesión interactiva de la CLI, si [el modo bypass permissions está disponible](/docs/es/permission-modes#skip-all-checks-with-bypasspermissions-mode) y [la obtención de banderas de características](/docs/es/env-vars#features-that-need-feature-flag-fetching) está desactivada, estas llamadas se ejecutan sin una solicitud.

142 141 

143Una llamada `tabs_context_mcp` también solicita aprobación cuando establece `createIfEmpty`, y lo mismo ocurre con una llamada `browser_batch` que incluya cualquiera de estas acciones.142Una llamada `tabs_context_mcp` también solicita aprobación cuando establece `createIfEmpty`, y lo mismo ocurre con una llamada `browser_batch` que incluya cualquiera de estas acciones.

144 143 

Details

981 * **Claves mezcladas**: un archivo que tiene tanto `code` como `cli`, o su grafía anterior `settings`, detiene el gateway al arrancar. Coloca todos los bloques bajo una sola clave, en una sola edición.981 * **Claves mezcladas**: un archivo que tiene tanto `code` como `cli`, o su grafía anterior `settings`, detiene el gateway al arrancar. Coloca todos los bloques bajo una sola clave, en una sola edición.

982</Warning>982</Warning>

983 983 

984La configuración de Claude Code de una política, como una regla que deniega la lectura de archivos `.env`, va en un bloque bajo la clave `cli` o `code`. Ambas claves admiten el mismo contenido. La clave decide dónde se aplica la configuración:984Los ajustes de Claude Code de una política, como una regla que deniega leer archivos `.env`, van en un bloque bajo la clave `cli` o `code`. `code` es la clave recomendada, y `cli` es la clave heredada. Ambas claves aceptan el mismo contenido. La clave decide dónde se aplican los ajustes:

985 985 

986* **`cli`**: la terminal, las extensiones de VS Code y JetBrains, y el Agent SDK. Con `cli`, la pestaña Code de Claude Desktop recibe la [configuración derivada](#claude-desktop-overlay), así que una regla con alcance como `Read(./.env)` no detiene a un usuario allí.986* **`cli`**: la terminal, las extensiones de VS Code y JetBrains, y el Agent SDK. Con `cli`, la pestaña Code de Claude Desktop recibe la [configuración derivada](#claude-desktop-overlay), así que una regla con alcance como `Read(./.env)` no detiene a un usuario allí.

987* **`code`**: los mismos lugares, y también puede cubrirse la pestaña Code de Claude Desktop.987* **`code`**: los mismos lugares, y también puede cubrirse la pestaña Code de Claude Desktop.

988 988 

989La decisión es si esta configuración también debe cubrir la pestaña Code. Si no, no cambies nada. Un archivo que usa `cli` funciona como antes, y un gateway que encuentra `cli` en una política con una clave [`desktop`](#claude-desktop-overlay) muestra una advertencia al arrancar y arranca de todos modos. Para cubrir la pestaña Code, cambia a `code`, la clave recomendada.989Un archivo que usa `cli` funciona como antes, y un gateway que encuentra `cli` en una política con una clave [`desktop`](#claude-desktop-overlay) advierte al arrancar y se inicia de todos modos. Cambia a `code` para que los ajustes también puedan cubrir la pestaña Code.

990 990 

991Antes de cambiar, lee [Aplicar la configuración de `code` en la pestaña Code](#apply-code-settings-in-the-code-tab). La política necesita una clave `desktop` y las máquinas de los usuarios necesitan preparación antes de que la configuración se aplique allí, y la búsqueda web se desactiva en Claude Desktop.991Antes de cambiar, lee [Aplicar la configuración de `code` en la pestaña Code](#apply-code-settings-in-the-code-tab). La política necesita una clave `desktop` y las máquinas de los usuarios necesitan preparación antes de que la configuración se aplique allí, y la búsqueda web se desactiva en Claude Desktop.

992 992 

Details

277 277 

278Los hilos se ejecutan en [modo automático](/docs/es/permission-modes#eliminate-prompts-with-auto-mode) cuando el modelo del hilo lo admite, por lo que la mayoría de las llamadas de herramientas se ejecutan sin pedirle. Cuando un hilo necesita su aprobación, el aviso está dentro de ese hilo y el hilo espera hasta que responda allí. Decirle a Claude en la conversación del proyecto que continúe no lo alcanza.278Los hilos se ejecutan en [modo automático](/docs/es/permission-modes#eliminate-prompts-with-auto-mode) cuando el modelo del hilo lo admite, por lo que la mayoría de las llamadas de herramientas se ejecutan sin pedirle. Cuando un hilo necesita su aprobación, el aviso está dentro de ese hilo y el hilo espera hasta que responda allí. Decirle a Claude en la conversación del proyecto que continúe no lo alcanza.

279 279 

280Cada aprobación cubre ese aviso, o el resto de ese hilo si elige la opción más amplia. Para permitir que cada hilo ejecute ciertos comandos sin preguntar, o para bloquear algunos, agregue [reglas de permiso](/docs/es/permissions) al `.claude/settings.json` del repositorio. Los hilos en la nube las aplican solo en un proyecto con un repositorio; vea [Qué recogen los hilos de sus repositorios](#what-threads-pick-up-from-your-repositories). En un proyecto con varios repositorios, las reglas de permiso de ningún repositorio llegan a un hilo en la nube, por lo que depende del modo automático y de las aprobaciones que da dentro de cada hilo.280Cada aprobación cubre esa solicitud, o el resto de ese hilo si eliges la opción más amplia.

281 

282Para permitir que todos los hilos ejecuten ciertos comandos sin preguntar, o para bloquear algunos, agrega [reglas de permisos](/docs/es/permissions) al `.claude/settings.json` del repositorio. Comprueba que los hilos en la nube de tu proyecto las apliquen:

283 

284* **Un repositorio**: los hilos en la nube aplican las reglas. Consulta [Qué recogen los hilos de tus repositorios](#what-threads-pick-up-from-your-repositories).

285* **Varios repositorios, entorno alojado por Anthropic**: las reglas de permisos de ningún repositorio llegan a un hilo en la nube, por lo que dependes del modo automático y de las aprobaciones que das dentro de cada hilo.

286* **Varios repositorios, entorno autoalojado**: consulta [qué configuración de repositorio se aplica](/docs/es/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories).

281 287 

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

283 Ejecutar un hilo en su propia computadora289 Ejecutar un hilo en su propia computadora


381 Lo que los hilos recogen de tus repositorios387 Lo que los hilos recogen de tus repositorios

382</h3>388</h3>

383 389 

384Cada hilo en la nube clona cada repositorio del proyecto y carga `CLAUDE.md` y skills de todos ellos. Las reglas de permisos, los hooks y `env` vienen solo del `.claude/settings.json` en el directorio en el que comienza el hilo: dentro del repositorio cuando el proyecto tiene uno, y encima de los clones cuando tiene varios, donde no se lee el archivo de ningún repositorio para ellos.390Cada hilo en la nube clona cada repositorio del proyecto y carga `CLAUDE.md` y skills de todos ellos. Las reglas de permisos, los hooks y `env` vienen solo del `.claude/settings.json` en el directorio en el que comienza el hilo.

385 391 

386| En cada repositorio | Un repositorio | Varios repositorios |392| En cada repositorio | Un repositorio | Varios repositorios |

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

388| `CLAUDE.md` | Se carga cuando comienza el hilo | Se carga desde cada repositorio cuando comienza el hilo |394| `CLAUDE.md` | Se carga cuando comienza el hilo | Se carga desde cada repositorio cuando comienza el hilo |

389| Skills, agentes y comandos bajo `.claude/` | Se cargan | Se cargan desde cada repositorio |395| Skills, agentes y comandos bajo `.claude/` | Se cargan | Se cargan desde cada repositorio |

390| Plugins habilitados en `.claude/settings.json` | No se cargan. Agrega el plugin en **Configuración del proyecto > Plugins** en su lugar | No se cargan. Agrega el plugin en **Configuración del proyecto > Plugins** en su lugar |396| Plugins habilitados en `.claude/settings.json` | No se cargan. Agrega el plugin en **Configuración del proyecto > Plugins** en su lugar | No se cargan. Agrega el plugin en **Configuración del proyecto > Plugins** en su lugar |

391| Reglas de permisos, hooks y `env` definidos en `.claude/settings.json` | Se aplican al hilo, excepto las claves `env` que [ninguna sesión en la nube respeta](/docs/es/cloud-environments#what-carries-over-from-your-setup) | No se aplican |397| Reglas de permisos, hooks y `env` definidos en `.claude/settings.json` | Se aplican al hilo, excepto las claves `env` que [ninguna sesión en la nube respeta](/docs/es/cloud-environments#what-carries-over-from-your-setup) | No se aplican en un entorno alojado por Anthropic. Para un entorno autoalojado, consulta [qué configuración de repositorio se aplica](/docs/es/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

392 398 

393En un proyecto con varios repositorios, cada clon se adjunta al hilo como un [directorio adicional](/docs/es/memory#load-from-additional-directories) con la carga de `CLAUDE.md` activada, por lo que el `CLAUDE.md` y los skills de cada repositorio se cargan al inicio aunque el hilo comience encima de ellos. En un proyecto así, pon las reglas permanentes en las instrucciones del proyecto y proporciona a los hilos variables de entorno a través del [entorno en la nube](#choose-an-environment-for-threads).399En un proyecto con varios repositorios, pon las reglas permanentes en las instrucciones del proyecto y proporciona a los hilos variables de entorno a través del [entorno en la nube](#choose-an-environment-for-threads).

394 400 

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

396 Elegir un entorno para los hilos402 Elegir un entorno para los hilos


406 412 

407Los hilos en la nube no tienen los skills, servidores MCP, plugins y herramientas instalados solo en tu máquina. Un hilo que Claude ejecuta en tu máquina a través de [Remote Control](/docs/es/remote-control) usa lo que está instalado allí. Para que cada uno de estos esté disponible para los hilos en la nube:413Los hilos en la nube no tienen los skills, servidores MCP, plugins y herramientas instalados solo en tu máquina. Un hilo que Claude ejecuta en tu máquina a través de [Remote Control](/docs/es/remote-control) usa lo que está instalado allí. Para que cada uno de estos esté disponible para los hilos en la nube:

408 414 

409* Skills, subagentes y comandos: haz commit de ellos en un repositorio que agregaste al proyecto, por ejemplo un skill en `.claude/skills/<skill-name>/SKILL.md`. Cada hilo en la nube clona cada repositorio del proyecto y carga `.claude/skills/`, `.claude/agents/` y `.claude/commands/` de cada uno de ellos, por lo que un skill con commit en un repositorio está disponible en cada hilo en la nube. Los hilos en la nube también cargan los skills que habilitas para tu cuenta de claude.ai.415* Skills, subagentes y comandos: haz commit de ellos en un repositorio que agregaste al proyecto, por ejemplo un skill en `.claude/skills/<skill-name>/SKILL.md`. Cada hilo en la nube clona cada repositorio del proyecto y carga `.claude/skills/`, `.claude/agents/` y `.claude/commands/` de cada uno de ellos, por lo que un skill con commit en un repositorio está disponible en cada hilo en la nube. Los hilos en la nube también cargan los [skills que habilitas para tu cuenta de claude.ai](/docs/es/skills#skills-in-cowork-and-cloud-sessions).

410* Plugins: agrégalos en **Configuración del proyecto > Plugins**; se cargan en cada nuevo hilo en la nube. Los plugins que un repositorio declara en su `.claude/settings.json` [no se cargan en los hilos en la nube](/docs/es/cloud-environments#what-carries-over-from-your-setup).416* Plugins: agrégalos en **Configuración del proyecto > Plugins**; se cargan en cada nuevo hilo en la nube. Los plugins que un repositorio declara en su `.claude/settings.json` [no se cargan en los hilos en la nube](/docs/es/cloud-environments#what-carries-over-from-your-setup).

411* Servidores MCP: los hilos en la nube obtienen sus herramientas MCP de los conectores de tu cuenta de claude.ai, que son servidores MCP que conectas una sola vez en [claude.ai/customize/connectors](https://claude.ai/customize/connectors) o a través del enlace **Administrar conectores** en **Configuración del proyecto > Entorno**. Cada hilo en la nube puede usarlos todos sin configuración por proyecto. La conversación del proyecto en sí no tiene conectores, así que envía el trabajo que necesite uno como una tarea para un hilo en la nube. En un proyecto con un solo repositorio, los hilos en la nube también cargan servidores MCP del [`.mcp.json`](/docs/es/cloud-environments#what-carries-over-from-your-setup) de ese repositorio. [Cómo los conectores llegan a Claude Code](/docs/es/mcp#how-connectors-reach-claude-code) enumera las reglas para sesiones en la nube y la configuración que desactiva los conectores.417* Servidores MCP: los hilos en la nube obtienen sus herramientas MCP de los conectores de tu cuenta de claude.ai, que son servidores MCP que conectas una sola vez en [claude.ai/customize/connectors](https://claude.ai/customize/connectors) o a través del enlace **Administrar conectores** en **Configuración del proyecto > Entorno**. Cada hilo en la nube puede usarlos todos sin configuración por proyecto. La conversación del proyecto en sí no tiene conectores, así que envía el trabajo que necesite uno como una tarea para un hilo en la nube. En un proyecto con un solo repositorio, los hilos en la nube también cargan servidores MCP del [`.mcp.json`](/docs/es/cloud-environments#what-carries-over-from-your-setup) de ese repositorio. [Cómo los conectores llegan a Claude Code](/docs/es/mcp#how-connectors-reach-claude-code) enumera las reglas para sesiones en la nube y la configuración que desactiva los conectores.

412* Herramientas de línea de comandos y paquetes: instálalos en el [script de configuración](/docs/es/cloud-environments#setup-scripts) del entorno.418* Herramientas de línea de comandos y paquetes: instálalos en el [script de configuración](/docs/es/cloud-environments#setup-scripts) del entorno.

Details

108| `--maintenance` | Ejecuta [hooks de Setup](/docs/es/hooks#setup) con el matcher `maintenance` antes de la sesión (solo modo print) | `claude -p --maintenance "query"` |108| `--maintenance` | Ejecuta [hooks de Setup](/docs/es/hooks#setup) con el matcher `maintenance` antes de la sesión (solo modo print) | `claude -p --maintenance "query"` |

109| `--max-budget-usd` | Detiene la ejecución una vez que el gasto estimado en llamadas de API alcanza esta cantidad (solo modo print). Claude Code compara el límite con su [estimación de costos del lado del cliente](/docs/es/agent-sdk/cost-tracking#estimates-not-billing), que puede diferir de tu factura. El gasto de [subagentes](/docs/es/sub-agents) cuenta hacia el límite. El gasto puede superar el límite, así que [deja margen](/docs/es/agent-sdk/agent-loop#budget-headroom). Cuando regresas a una conversación con `--continue` o `--resume`, los totales [restaurados de ejecuciones anteriores](/docs/es/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls) no cuentan hacia él. Una vez que el gasto alcanza el límite, generar otro subagente falla con `Budget limit reached`, y Claude Code detiene los subagentes en segundo plano que aún se ejecutan; los comportamientos de cumplimiento del límite requieren Claude Code v2.1.217 o posterior | `claude -p --max-budget-usd 5.00 "query"` |109| `--max-budget-usd` | Detiene la ejecución una vez que el gasto estimado en llamadas de API alcanza esta cantidad (solo modo print). Claude Code compara el límite con su [estimación de costos del lado del cliente](/docs/es/agent-sdk/cost-tracking#estimates-not-billing), que puede diferir de tu factura. El gasto de [subagentes](/docs/es/sub-agents) cuenta hacia el límite. El gasto puede superar el límite, así que [deja margen](/docs/es/agent-sdk/agent-loop#budget-headroom). Cuando regresas a una conversación con `--continue` o `--resume`, los totales [restaurados de ejecuciones anteriores](/docs/es/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls) no cuentan hacia él. Una vez que el gasto alcanza el límite, generar otro subagente falla con `Budget limit reached`, y Claude Code detiene los subagentes en segundo plano que aún se ejecutan; los comportamientos de cumplimiento del límite requieren Claude Code v2.1.217 o posterior | `claude -p --max-budget-usd 5.00 "query"` |

110| `--max-turns` | Limita el número de turnos agentivos (solo modo print). Sale con un error cuando se alcanza el límite. Sin límite por defecto. Con `--input-format stream-json`, un mensaje aún en cola cuando el límite termina un turno permanece en cola e inicia un nuevo turno con su propio límite | `claude -p --max-turns 3 "query"` |110| `--max-turns` | Limita el número de turnos agentivos (solo modo print). Sale con un error cuando se alcanza el límite. Sin límite por defecto. Con `--input-format stream-json`, un mensaje aún en cola cuando el límite termina un turno permanece en cola e inicia un nuevo turno con su propio límite | `claude -p --max-turns 3 "query"` |

111| `--mcp-config` | Carga servidores MCP desde archivos JSON o cadenas (separados por espacios). Cuando pasas esta bandera con `-p`, Claude Code espera a que los servidores aún pendientes se conecten antes de ejecutar el primer turno, hasta el tiempo de espera de inicio [`MCP_TIMEOUT`](/docs/es/env-vars), 30 segundos por defecto; un servidor con una [lista de herramientas en caché](/docs/es/mcp#managing-your-servers) omite la espera y se conecta en el primer uso. La espera requiere Claude Code v2.1.221 o posterior | `claude --mcp-config ./mcp.json` |111| `--mcp-config` | Carga servidores MCP desde archivos JSON o cadenas (separados por espacios). Cuando pasas esta bandera con `-p`, Claude Code espera a que los servidores aún pendientes se conecten antes de ejecutar el primer turno, hasta el tiempo de espera de inicio [`MCP_TIMEOUT`](/docs/es/env-vars), 30 segundos por defecto; un servidor con una [lista de herramientas en caché](/docs/es/mcp#managing-your-servers) omite la espera y se conecta en el primer uso. En un [entorno autohospedado](/docs/es/self-hosted-environments-configuration#connection-timing), se aplica en su lugar una espera más corta. La espera requiere Claude Code v2.1.221 o posterior | `claude --mcp-config ./mcp.json` |

112| `--model` | Establece el modelo para la sesión actual con un [alias de modelo](/docs/es/model-config#model-aliases) como `sonnet`, `opus`, `haiku`, o `fable`, o el nombre completo de un modelo. Anula la configuración [`model`](/docs/es/settings-reference#model) y [`ANTHROPIC_MODEL`](/docs/es/model-config#environment-variables) | `claude --model claude-sonnet-5` |112| `--model` | Establece el modelo para la sesión actual con un [alias de modelo](/docs/es/model-config#model-aliases) como `sonnet`, `opus`, `haiku`, o `fable`, o el nombre completo de un modelo. Anula la configuración [`model`](/docs/es/settings-reference#model) y [`ANTHROPIC_MODEL`](/docs/es/model-config#environment-variables) | `claude --model claude-sonnet-5` |

113| `--name`, `-n` | Establece un nombre para mostrar para la sesión, mostrado en `/resume` y el título de la terminal. Puedes reanudar una sesión nombrada con `claude --resume <name>`. En una sesión interactiva, si otra sesión activa en esta máquina ya usa el nombre, Claude Code aplica [una variante del mismo](/docs/es/sessions#name-your-sessions). <br /><br />[`/rename`](/docs/es/commands) cambia el nombre a mitad de sesión y también lo muestra en la barra de indicador | `claude -n "my-feature-work"` |113| `--name`, `-n` | Establece un nombre para mostrar para la sesión, mostrado en `/resume` y el título de la terminal. Puedes reanudar una sesión nombrada con `claude --resume <name>`. En una sesión interactiva, si otra sesión activa en esta máquina ya usa el nombre, Claude Code aplica [una variante del mismo](/docs/es/sessions#name-your-sessions). <br /><br />[`/rename`](/docs/es/commands) cambia el nombre a mitad de sesión y también lo muestra en la barra de indicador | `claude -n "my-feature-work"` |

114| `--no-chrome` | Deshabilita la [integración del navegador Chrome](/docs/es/chrome) para esta sesión | `claude --no-chrome` |114| `--no-chrome` | Deshabilita la [integración del navegador Chrome](/docs/es/chrome) para esta sesión | `claude --no-chrome` |

Details

314| Plugins y marketplaces declarados en el `.claude/settings.json` de tu repositorio | No | Una sesión en la nube no instala los plugins que un repositorio activa bajo [`enabledPlugins`](/docs/es/settings-reference#enabledplugins), incluidos los de los marketplaces que enumera bajo [`extraKnownMarketplaces`](/docs/es/settings-reference#extraknownmarketplaces) |314| Plugins y marketplaces declarados en el `.claude/settings.json` de tu repositorio | No | Una sesión en la nube no instala los plugins que un repositorio activa bajo [`enabledPlugins`](/docs/es/settings-reference#enabledplugins), incluidos los de los marketplaces que enumera bajo [`extraKnownMarketplaces`](/docs/es/settings-reference#extraknownmarketplaces) |

315| La [configuración administrada por servidor](/docs/es/server-managed-settings) de tu organización | Sí, excepto en sesiones de [Claude Tag](https://claude.com/docs/claude-tag/overview) | Se obtiene de los servidores de Anthropic cuando comienza la sesión. Consulta [Cobertura de superficie](/docs/es/model-config#surface-coverage) para ver cómo se aplica `availableModels` en sesiones en la nube. La configuración implementada en tu dispositivo a través de MDM o archivos de configuración administrada no se aplica, porque la sesión se ejecuta en una VM administrada por Anthropic; en un [entorno autohospedado](/docs/es/self-hosted-environments), las sesiones también leen el archivo de configuración administrada en la imagen del ejecutor, según [cómo Claude Code combina fuentes administradas](/docs/es/managed-settings#how-claude-code-combines-managed-sources) |315| La [configuración administrada por servidor](/docs/es/server-managed-settings) de tu organización | Sí, excepto en sesiones de [Claude Tag](https://claude.com/docs/claude-tag/overview) | Se obtiene de los servidores de Anthropic cuando comienza la sesión. Consulta [Cobertura de superficie](/docs/es/model-config#surface-coverage) para ver cómo se aplica `availableModels` en sesiones en la nube. La configuración implementada en tu dispositivo a través de MDM o archivos de configuración administrada no se aplica, porque la sesión se ejecuta en una VM administrada por Anthropic; en un [entorno autohospedado](/docs/es/self-hosted-environments), las sesiones también leen el archivo de configuración administrada en la imagen del ejecutor, según [cómo Claude Code combina fuentes administradas](/docs/es/managed-settings#how-claude-code-combines-managed-sources) |

316| Tu `~/.claude/CLAUDE.md` de usuario | No | Vive en tu máquina, no en el repositorio. Consulta [Agregar preferencias personales sin hacer commit en el repositorio](#add-personal-preferences-without-committing-to-the-repo) |316| Tu `~/.claude/CLAUDE.md` de usuario | No | Vive en tu máquina, no en el repositorio. Consulta [Agregar preferencias personales sin hacer commit en el repositorio](#add-personal-preferences-without-committing-to-the-repo) |

317| Tus `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` de usuario | No | Viven en tu máquina, no en el repositorio. Haz commit de ellos en el directorio `.claude/` del repositorio en su lugar. Las sesiones en la nube cargan automáticamente los skills que habilitas en claude.ai |317| Tus `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` de usuario | No | Viven en tu máquina, no en el repositorio. Haz commit de ellos en el directorio `.claude/` del repositorio en su lugar. Las sesiones en la nube cargan automáticamente los [skills que habilitas en claude.ai](/docs/es/skills#skills-in-cowork-and-cloud-sessions) |

318| Plugins habilitados solo en tu configuración de usuario | No | El `enabledPlugins` con alcance de usuario vive en `~/.claude/settings.json` en tu máquina |318| Plugins habilitados solo en tu configuración de usuario | No | El `enabledPlugins` con alcance de usuario vive en `~/.claude/settings.json` en tu máquina |

319| Servidores MCP que agregaste con `claude mcp add` en el alcance local predeterminado o el alcance de usuario | No | Esos escriben en `~/.claude.json` en tu máquina, no en el repositorio. Agrega el servidor con `claude mcp add --scope project`, que escribe el [`.mcp.json`](/docs/es/mcp#project-scope) del repositorio, y haz commit de ese archivo. Una sesión con un repositorio lo carga |319| Servidores MCP que agregaste con `claude mcp add` en el alcance local predeterminado o el alcance de usuario | No | Esos escriben en `~/.claude.json` en tu máquina, no en el repositorio. Agrega el servidor con `claude mcp add --scope project`, que escribe el [`.mcp.json`](/docs/es/mcp#project-scope) del repositorio, y haz commit de ese archivo. Una sesión con un repositorio lo carga |

320| Variables de transporte en el bloque `env` de `.claude/settings.json` de tu repositorio, como `NODE_EXTRA_CA_CERTS` y las [variables de certificado de cliente mTLS](/docs/es/network-config#mtls-authentication) | No | El entorno de alojamiento administra la conexión de API de la sesión, por lo que Claude Code ignora estas claves y anota cada clave ignorada en el registro de depuración de la sesión |320| Variables de transporte en el bloque `env` de `.claude/settings.json` de tu repositorio, como `NODE_EXTRA_CA_CERTS` y las [variables de certificado de cliente mTLS](/docs/es/network-config#mtls-authentication) | No | El entorno de alojamiento administra la conexión de API de la sesión, por lo que Claude Code ignora estas claves y anota cada clave ignorada en el registro de depuración de la sesión |

env-vars.md +1 −1

Details

340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Límite de llamadas a [WebSearch](/docs/es/tools-reference#session-search-limit) (predeterminado: 200). Cuando Claude alcanza el límite, las llamadas posteriores a WebSearch devuelven un aviso que le indica que continúe con la información que ya recopiló. Acepta un número entero positivo sin límite superior. Cualquier otro valor se ignora y se aplica el predeterminado, por lo que el límite se puede aumentar pero no desactivar. Requiere Claude Code v2.1.212 o posterior |340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Límite de llamadas a [WebSearch](/docs/es/tools-reference#session-search-limit) (predeterminado: 200). Cuando Claude alcanza el límite, las llamadas posteriores a WebSearch devuelven un aviso que le indica que continúe con la información que ya recopiló. Acepta un número entero positivo sin límite superior. Cualquier otro valor se ignora y se aplica el predeterminado, por lo que el límite se puede aumentar pero no desactivar. Requiere Claude Code v2.1.212 o posterior |

341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Establécela en `1` para iniciar los servidores MCP stdio solo con un entorno base seguro más el `env` configurado del servidor, en lugar de heredar el entorno de tu shell |341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Establécela en `1` para iniciar los servidores MCP stdio solo con un entorno base seguro más el `env` configurado del servidor, en lugar de heredar el entorno de tu shell |

342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Tiempo transcurrido en milisegundos antes de que una llamada a herramienta MCP que sigue en ejecución [pase a una tarea en segundo plano](/docs/es/mcp#automatic-backgrounding-of-long-tool-calls) (predeterminado: 120000, o 2 minutos). Establécela en `0` para desactivar el paso automático a segundo plano. Requiere Claude Code v2.1.212 o posterior |342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Tiempo transcurrido en milisegundos antes de que una llamada a herramienta MCP que sigue en ejecución [pase a una tarea en segundo plano](/docs/es/mcp#automatic-backgrounding-of-long-tool-calls) (predeterminado: 120000, o 2 minutos). Establécela en `0` para desactivar el paso automático a segundo plano. Requiere Claude Code v2.1.212 o posterior |

343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Cuánto tiempo en milisegundos espera el primer turno de una sesión [no interactiva](/docs/es/headless) a los servidores MCP que todavía se están conectando, en lugar de la [espera del primer turno](/docs/es/agent-sdk/mcp#connection-timing) predeterminada. Cuando se establece, la espera abarca todos los servidores pendientes. Establécela en `0` para omitir la espera. Un servidor de [`--permission-prompt-tool`](/docs/es/cli-reference#cli-flags) mantiene su propia espera de `MCP_TIMEOUT` independientemente del valor. Requiere Claude Code v2.1.274 o posterior |343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Cuánto tiempo en milisegundos espera el primer turno de una sesión [no interactiva](/docs/es/headless) a los servidores MCP que aún se están conectando, en lugar de la [espera del primer turno](/docs/es/agent-sdk/mcp#connection-timing) predeterminada. Cuando se establece, la espera abarca todos los servidores pendientes; en un [entorno autohospedado](/docs/es/self-hosted-environments-configuration#connection-timing), solo cambia cuánto dura la espera. Establécela en `0` para omitir la espera. Un servidor de [`--permission-prompt-tool`](/docs/es/cli-reference#cli-flags) mantiene su propia espera de `MCP_TIMEOUT` independientemente del valor. Requiere Claude Code v2.1.274 o posterior |

344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Tiempo de espera por inactividad en milisegundos para las llamadas a herramientas MCP. Cuando un servidor MCP stdio, HTTP, SSE, WebSocket o de [conector de claude.ai](/docs/es/mcp#use-mcp-servers-from-claude-ai) no envía ninguna respuesta ni ninguna notificación de progreso durante este tiempo, la llamada a herramienta se aborta con un error en lugar de esperar el `MCP_TOOL_TIMEOUT` general. Sobrescribe los valores predeterminados por transporte de 300000 (5 minutos) para servidores de red y 1800000 (30 minutos) para servidores stdio. Establécela en `0` para deshabilitar la comprobación de inactividad. Los valores inferiores a 1000 se elevan a un segundo, y el valor se limita al `MCP_TOOL_TIMEOUT` efectivo. Un `timeout` por servidor en `.mcp.json` de al menos 1000 eleva la ventana de inactividad de ese servidor a al menos el valor de `timeout`. No se aplica a servidores del IDE ni a servidores en proceso del SDK. Requiere Claude Code v2.1.187 o posterior. Antes de la v2.1.203, los servidores stdio estaban exentos del tiempo de espera por inactividad |344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Tiempo de espera por inactividad en milisegundos para las llamadas a herramientas MCP. Cuando un servidor MCP stdio, HTTP, SSE, WebSocket o de [conector de claude.ai](/docs/es/mcp#use-mcp-servers-from-claude-ai) no envía ninguna respuesta ni ninguna notificación de progreso durante este tiempo, la llamada a herramienta se aborta con un error en lugar de esperar el `MCP_TOOL_TIMEOUT` general. Sobrescribe los valores predeterminados por transporte de 300000 (5 minutos) para servidores de red y 1800000 (30 minutos) para servidores stdio. Establécela en `0` para deshabilitar la comprobación de inactividad. Los valores inferiores a 1000 se elevan a un segundo, y el valor se limita al `MCP_TOOL_TIMEOUT` efectivo. Un `timeout` por servidor en `.mcp.json` de al menos 1000 eleva la ventana de inactividad de ese servidor a al menos el valor de `timeout`. No se aplica a servidores del IDE ni a servidores en proceso del SDK. Requiere Claude Code v2.1.187 o posterior. Antes de la v2.1.203, los servidores stdio estaban exentos del tiempo de espera por inactividad |

345| `CLAUDE_CODE_MESSAGING_SOCKET` | La establece Claude Code, no tú: en las sesiones que vinculan un [socket de bandeja de entrada](/docs/es/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporta la ruta de ese socket a los hooks y a los comandos de Bash cuando vincula el socket. En una sesión que se inicia con la mensajería activada, Claude Code vincula el socket antes de que se ejecute cualquier hook. Otras sesiones de la máquina entregan mensajes a esta ruta. Cada sesión exporta su propio socket en lugar de uno heredado de un proceso padre, y los mensajes que llegan a él pasan por los [controles de entrada](/docs/es/cross-session-messaging#control-inbound-messages) de la sesión. Los bloques `env` de la configuración no pueden establecerla. Requiere Claude Code v2.1.224 o posterior |345| `CLAUDE_CODE_MESSAGING_SOCKET` | La establece Claude Code, no tú: en las sesiones que vinculan un [socket de bandeja de entrada](/docs/es/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporta la ruta de ese socket a los hooks y a los comandos de Bash cuando vincula el socket. En una sesión que se inicia con la mensajería activada, Claude Code vincula el socket antes de que se ejecute cualquier hook. Otras sesiones de la máquina entregan mensajes a esta ruta. Cada sesión exporta su propio socket en lugar de uno heredado de un proceso padre, y los mensajes que llegan a él pasan por los [controles de entrada](/docs/es/cross-session-messaging#control-inbound-messages) de la sesión. Los bloques `env` de la configuración no pueden establecerla. Requiere Claude Code v2.1.224 o posterior |

346| `CLAUDE_CODE_MESSAGING_TOKEN` | La establece Claude Code, no tú: en las sesiones que vinculan un [socket de bandeja de entrada](/docs/es/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporta este token por sesión a los hooks y a los comandos de Bash junto con `CLAUDE_CODE_MESSAGING_SOCKET`. Un script que publica en el socket puede enviar `{"type":"auth","token":"<token>"}` como su primera línea para demostrar que pertenece a la sesión. En Windows nativo, Claude Code exige esta línea y cierra cualquier conexión que no comience con una válida. Las [reglas de procesos hijos propios](/docs/es/cross-session-messaging#the-sessions-inbox-socket) indican cuándo consulta Claude Code el token. Cada sesión exporta su propio token, nunca uno heredado de una sesión padre. Los bloques `env` de la configuración no pueden establecerla. Requiere Claude Code v2.1.228 o posterior |346| `CLAUDE_CODE_MESSAGING_TOKEN` | La establece Claude Code, no tú: en las sesiones que vinculan un [socket de bandeja de entrada](/docs/es/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporta este token por sesión a los hooks y a los comandos de Bash junto con `CLAUDE_CODE_MESSAGING_SOCKET`. Un script que publica en el socket puede enviar `{"type":"auth","token":"<token>"}` como su primera línea para demostrar que pertenece a la sesión. En Windows nativo, Claude Code exige esta línea y cierra cualquier conexión que no comience con una válida. Las [reglas de procesos hijos propios](/docs/es/cross-session-messaging#the-sessions-inbox-socket) indican cuándo consulta Claude Code el token. Cada sesión exporta su propio token, nunca uno heredado de una sesión padre. Los bloques `env` de la configuración no pueden establecerla. Requiere Claude Code v2.1.228 o posterior |

errors.md +45 −8

Details

247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Errores de línea de comandos](#windows-reported-an-error-ebadf) |247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Errores de línea de comandos](#windows-reported-an-error-ebadf) |

248| `Cannot switch renderers in this session` | [Errores de línea de comandos](#cannot-switch-renderers-in-this-session) |248| `Cannot switch renderers in this session` | [Errores de línea de comandos](#cannot-switch-renderers-in-this-session) |

249| `Cannot switch renderers while work is running in the background` | [Errores de línea de comandos](#cannot-switch-renderers-in-this-session) |249| `Cannot switch renderers while work is running in the background` | [Errores de línea de comandos](#cannot-switch-renderers-in-this-session) |

250| `Claude Code couldn't restart` | [Errores de línea de comandos](#claude-code-couldnt-restart) |

250| `Couldn't open Claude Desktop` | [Errores de línea de comandos](#couldnt-open-claude-desktop) |251| `Couldn't open Claude Desktop` | [Errores de línea de comandos](#couldnt-open-claude-desktop) |

251| `Failed to open Claude Desktop. Please try opening it manually.` | [Errores de línea de comandos](#couldnt-open-claude-desktop) |252| `Failed to open Claude Desktop. Please try opening it manually.` | [Errores de línea de comandos](#couldnt-open-claude-desktop) |

252| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [Errores de línea de comandos](#terminal-setup-left-your-zed-keymap-unchanged) |253| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [Errores de línea de comandos](#terminal-setup-left-your-zed-keymap-unchanged) |


334| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Errores de sesión en segundo plano](#session-isnt-responding) |335| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Errores de sesión en segundo plano](#session-isnt-responding) |

335| `Session <id> was stopped while the respawn was in flight` | [Errores de sesión en segundo plano](#session-was-stopped-while-the-respawn-was-in-flight) |336| `Session <id> was stopped while the respawn was in flight` | [Errores de sesión en segundo plano](#session-was-stopped-while-the-respawn-was-in-flight) |

336| `This session was running agent '<name>', which is no longer available` | [Errores de sesión en segundo plano](#session-agent-no-longer-available) |337| `This session was running agent '<name>', which is no longer available` | [Errores de sesión en segundo plano](#session-agent-no-longer-available) |

338| `This session restarted <time> after its next /loop wakeup was due, so that wakeup will not fire` | [Errores de sesión en segundo plano](#restarted-after-its-next-loop-wakeup-was-due) |

337| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Errores de sesión en segundo plano](#claude_code_process_wrapper-launcher-errors) |339| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Errores de sesión en segundo plano](#claude_code_process_wrapper-launcher-errors) |

338| `EUNKNOWN: unknown error, uv_spawn` | [Errores de sesión en segundo plano](#eunknown-when-starting-a-background-session) |340| `EUNKNOWN: unknown error, uv_spawn` | [Errores de sesión en segundo plano](#eunknown-when-starting-a-background-session) |

339| `EACCES: permission denied, posix_spawn` | [Errores de sesión en segundo plano](#eacces-when-starting-a-background-session) |341| `EACCES: permission denied, posix_spawn` | [Errores de sesión en segundo plano](#eacces-when-starting-a-background-session) |


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

440| [`CLAUDE_CODE_MAX_RETRIES`](/docs/es/env-vars) | 10 | Número de reintentos. Limitado a 15 a partir de v2.1.186; a partir de v2.1.199, `CLAUDE_CODE_RETRY_WATCHDOG` aumenta el valor predeterminado y elimina el límite. Redúcelo para que los fallos aparezcan más rápido en scripts. |442| [`CLAUDE_CODE_MAX_RETRIES`](/docs/es/env-vars) | 10 | Número de reintentos. Limitado a 15 a partir de v2.1.186; a partir de v2.1.199, `CLAUDE_CODE_RETRY_WATCHDOG` aumenta el valor predeterminado y elimina el límite. Redúcelo para que los fallos aparezcan más rápido en scripts. |

441| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/es/env-vars) | sin establecer | Establécelo en `1` en sesiones desatendidas, como trabajos de CI, para reintentar errores de capacidad `429` y `529` indefinidamente en lugar de fallar después de `CLAUDE_CODE_MAX_RETRIES` intentos. Claude Code falla de inmediato cuando una solicitud de velocidad estándar recibe un `429` que reporta un límite de gasto o créditos de uso agotados, incluso uno de un [límite de gasto de un gateway](#spend-limit-reached) que se restablece según un calendario. Antes de v2.1.239, el watchdog los reintentaba indefinidamente. Para solicitudes en modo rápido, consulta [Handle rate limits](/docs/es/fast-mode#handle-rate-limits). En v2.1.199 o posterior, también aumenta el número predeterminado de reintentos para otros errores transitorios, como errores del servidor, tiempos de espera agotados y conexiones perdidas, a 300, aproximadamente tres horas de retroceso, y elimina el límite de 15 en `CLAUDE_CODE_MAX_RETRIES` si estableces esa variable explícitamente. |443| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/es/env-vars) | sin establecer | Establécelo en `1` en sesiones desatendidas, como trabajos de CI, para reintentar errores de capacidad `429` y `529` indefinidamente en lugar de fallar después de `CLAUDE_CODE_MAX_RETRIES` intentos. Claude Code falla de inmediato cuando una solicitud de velocidad estándar recibe un `429` que reporta un límite de gasto o créditos de uso agotados, incluso uno de un [límite de gasto de un gateway](#spend-limit-reached) que se restablece según un calendario. Antes de v2.1.239, el watchdog los reintentaba indefinidamente. Para solicitudes en modo rápido, consulta [Handle rate limits](/docs/es/fast-mode#handle-rate-limits). En v2.1.199 o posterior, también aumenta el número predeterminado de reintentos para otros errores transitorios, como errores del servidor, tiempos de espera agotados y conexiones perdidas, a 300, aproximadamente tres horas de retroceso, y elimina el límite de 15 en `CLAUDE_CODE_MAX_RETRIES` si estableces esa variable explícitamente. |

444| [`CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`](/docs/es/env-vars) | sin establecer | Tiempo máximo en milisegundos que cada solicitud a la API pasa esperando a que se resuelvan los errores `429` y `529` cuando `CLAUDE_CODE_RETRY_WATCHDOG` está establecido. Si no está establecido, la espera no tiene límite. Requiere Claude Code v2.1.295 o posterior. |

442| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/es/env-vars) | 500 | Retraso inicial en milisegundos del retroceso entre reintentos de una solicitud que la API rechaza con un error de sobrecarga `529`. Auméntalo, hasta 32000, para distribuir los reintentos en un período más largo cuando la API está al límite de su capacidad. No tiene efecto cuando `CLAUDE_CODE_RETRY_WATCHDOG` está establecido en `1`, ni cuando la solicitud rechazada se envió en [modo rápido](/docs/es/fast-mode#handle-rate-limits). Requiere Claude Code v2.1.292 o posterior. |445| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/es/env-vars) | 500 | Retraso inicial en milisegundos del retroceso entre reintentos de una solicitud que la API rechaza con un error de sobrecarga `529`. Auméntalo, hasta 32000, para distribuir los reintentos en un período más largo cuando la API está al límite de su capacidad. No tiene efecto cuando `CLAUDE_CODE_RETRY_WATCHDOG` está establecido en `1`, ni cuando la solicitud rechazada se envió en [modo rápido](/docs/es/fast-mode#handle-rate-limits). Requiere Claude Code v2.1.292 o posterior. |

443| [`API_TIMEOUT_MS`](/docs/es/env-vars) | 600000 | Tiempo de espera por solicitud en milisegundos. Auméntalo para redes lentas o proxies. También limita cuánto tiempo espera Claude Code los encabezados de respuesta, como se describe en [No response from API](#no-response-from-api). |446| [`API_TIMEOUT_MS`](/docs/es/env-vars) | 600000 | Tiempo de espera por solicitud en milisegundos. Auméntalo para redes lentas o proxies. También limita cuánto tiempo espera Claude Code los encabezados de respuesta, como se describe en [No response from API](#no-response-from-api). |

444| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/es/env-vars) | sin establecer | Límite de reenvíos de una [solicitud sin streaming](#streaming-response-ended-before-any-complete-data-was-received) cuyo tiempo de espera se agota. Al alcanzar el límite, la solicitud falla. Una respuesta de Claude que tarda en generarse más que el tiempo de espera vuelve a agotar el tiempo de espera en cada reenvío, así que establece un número bajo, como `0`, para que falle antes. El tiempo de espera de cada intento sin streaming se agota después de 300 segundos en una sesión local, o después de `API_TIMEOUT_MS` cuando estableces un valor positivo. Requiere Claude Code v2.1.285 o posterior. |447| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/es/env-vars) | sin establecer | Límite de reenvíos de una [solicitud sin streaming](#streaming-response-ended-before-any-complete-data-was-received) cuyo tiempo de espera se agota. Al alcanzar el límite, la solicitud falla. Una respuesta de Claude que tarda en generarse más que el tiempo de espera vuelve a agotar el tiempo de espera en cada reenvío, así que establece un número bajo, como `0`, para que falle antes. El tiempo de espera de cada intento sin streaming se agota después de 300 segundos en una sesión local, o después de `API_TIMEOUT_MS` cuando estableces un valor positivo. Requiere Claude Code v2.1.285 o posterior. |


3412 3415 

3413Claude Code muestra el mismo error para cualquier skill que [inyecte contexto dinámico](/docs/es/skills#when-an-injected-command-fails), y un comando inyectado que falla aborta la invocación de ese skill. Dos cadenas hermanas se disparan antes de que el comando llegue a ejecutarse:3416Claude Code muestra el mismo error para cualquier skill que [inyecte contexto dinámico](/docs/es/skills#when-an-injected-command-fails), y un comando inyectado que falla aborta la invocación de ese skill. Dos cadenas hermanas se disparan antes de que el comando llegue a ejecutarse:

3414 3417 

3415* `Shell command permission check failed for pattern "..."`: la comprobación de permisos del comando no lo permitió. [Comprobaciones de permisos en comandos inyectados](/docs/es/skills#permission-checks-on-injected-commands) explica qué resultados abortan en cada modo de permisos y cómo aprobar previamente un comando con `allowed-tools`3418* `Shell command permission check failed for pattern "..."`: la comprobación de permisos del comando no lo permitió. [Permission checks on injected commands](/docs/es/skills#permission-checks-on-injected-commands) explica qué resultados abortan en cada modo de permisos y cómo aprobar previamente un comando con `allowed-tools`

3416* ``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](/docs/es/skills#how-injected-commands-run)3419* ``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](/docs/es/skills#how-injected-commands-run)

3417 3420 

3418**Qué hacer:**3421**Qué hacer:**


3562 3565 

3563* **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 anterior3566* **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

3564* **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>`)``3567* **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>`)``

3565* **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 saber 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`.3568* **Pasaste una rama base que no estaba en tu clon**: Claude Code hizo fetch de ella desde 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 toda rama base obtenida con fetch, y en un clon completo ese comando falla con `fatal: --unshallow on a complete repository does not make sense`.

3566 3569 

3567**Qué hacer:**3570**Qué hacer:**

3568 3571 


3816 3819 

3817* En una sesión iniciada sin esas restricciones, ejecuta `/tui fullscreen`, o `/tui default` para volver al anterior. Claude Code guarda allí el [ajuste `tui`](/docs/es/settings-reference#tui)3820* En una sesión iniciada sin esas restricciones, ejecuta `/tui fullscreen`, o `/tui default` para volver al anterior. Claude Code guarda allí el [ajuste `tui`](/docs/es/settings-reference#tui)

3818 3821 

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

3823 Claude Code couldn't restart

3824</h3>

3825 

3826Claude Code se estaba reiniciando, por ejemplo para activar o desactivar el renderizado en pantalla completa después de que ejecutaras [`/tui`](/docs/es/fullscreen#enable-fullscreen-rendering). Cerró la sesión pero no pudo iniciar el nuevo proceso, así que imprimió este mensaje y terminó con el estado 1:

3827 

3828```text theme={null}

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

3830```

3831 

3832Cuando el reinicio no tenía ninguna conversación que volver a abrir, por ejemplo porque `/tui` fue tu primera entrada en una sesión nueva, el mensaje dice `Claude Code couldn't restart. Start Claude Code again.`

3833 

3834**Qué hacer:**

3835 

3836* Vuelve a ejecutar `claude` en tu shell desde el mismo directorio. Si el mensaje indicaba que tu conversación está guardada, ejecuta [`/resume`](/docs/es/sessions#resume-a-session) en la nueva sesión y selecciónala

3837* Si los reinicios siguen fallando, inicia Claude Code desde tu shell con [`claude --debug-file claude-debug.log`](/docs/es/cli-reference#cli-flags). Si falla un reinicio desde esa sesión, `claude-debug.log`, en el directorio desde el que la iniciaste, registra una línea `Failed to relaunch:` con el error del sistema operativo. Incluye esa línea cuando [informes el problema](#report-an-error)

3838 

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

3820 No se pudo abrir Claude Desktop3840 No se pudo abrir Claude Desktop

3821</h3>3841</h3>


4752 Comando bloqueado por las verificaciones de aislamiento de worktree4772 Comando bloqueado por las verificaciones de aislamiento de worktree

4753</h3>4773</h3>

4754 4774 

4755Claude ejecutó un comando Bash o Monitor en una [sesión aislada en un worktree](/docs/es/worktrees#how-claude-code-enforces-isolation), y Claude Code lo rechazó por una de dos razones:4775Claude ejecutó un comando Bash, [PowerShell](/docs/es/tools-reference#powershell-tool) o [Monitor](/docs/es/tools-reference#monitor-tool) en una [sesión aislada en un worktree](/docs/es/worktrees#how-claude-code-enforces-isolation), y Claude Code lo rechazó por una de estas razones:

4756 4776 

4757* El comando apunta git al checkout principal.4777* El comando se ejecutaría en el checkout principal o en otro worktree. El mensaje dice que su directorio de trabajo `resolved to the shared checkout` o `is in a different worktree`.

4758* Claude Code no puede verificar a partir del texto del comando que cualquier git que ejecute el comando se mantenga dentro del worktree. Un comando que nunca nombra git aún puede ser rechazado por esta razón, porque expandir una indirección de variable como `${!name}` o ejecutar una sustitución de función Bash como `${ command; }` produce un valor en tiempo de ejecución que en sí mismo puede ser un comando.4778* Un comando Bash o Monitor apunta git al checkout principal.

4779* Claude Code no puede verificar a partir del texto de un comando Bash o Monitor que cualquier git que ejecute el comando se mantenga dentro del worktree. Un comando que nunca nombra git aún puede ser rechazado por esta razón, porque expandir una indirección de variable como `${!name}` o ejecutar una sustitución de función Bash como `${ command; }` produce un valor en tiempo de ejecución que en sí mismo puede ser un comando.

4759 4780 

4760La parte central del mensaje nombra lo que no se pudo verificar:4781El mensaje dice `is isolated in the worktree <path>, but this command`, seguido de la razón, como en el caso de un comando cuyo texto Claude Code no pudo verificar:

4761 4782 

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

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


4765 4786 

4766**Qué hacer:**4787**Qué hacer:**

4767 4788 

4768* Generalmente nada: Claude lee el mensaje y reescribe el comando de la manera que su oración final solicita4789* **Git apuntado al checkout principal, o texto de comando que no se puede verificar**: nada. Claude lee el mensaje y reescribe el comando de la manera que su oración final solicita. Si un comando que pediste sigue siendo rechazado por una expansión en su texto, escribe el valor marcado literalmente y ejecuta git como su propio comando simple desde dentro del worktree

4769* Si un comando que pediste sigue siendo rechazado, escribe el valor marcado literalmente: reemplaza la indirección o sustitución con su valor, y ejecuta git como su propio comando simple desde dentro del worktree

4770* Para actuar en el checkout principal a propósito, ejecuta el comando tú mismo en una terminal fuera de la sesión4790* Para actuar en el checkout principal a propósito, ejecuta el comando tú mismo en una terminal fuera de la sesión

4771 4791 

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


4946* O reanuda con `--agent <name>` nombrando un agente que sí exista, para ejecutar la sesión como ese agente en su lugar4966* O reanuda con `--agent <name>` nombrando un agente que sí exista, para ejecutar la sesión como ese agente en su lugar

4947* Si el agente tiene alcance de proyecto y no has confiado en el directorio original de la sesión, ejecuta Claude Code allí una vez, acepta el diálogo de confianza y luego reanuda nuevamente4967* Si el agente tiene alcance de proyecto y no has confiado en el directorio original de la sesión, ejecuta Claude Code allí una vez, acepta el diálogo de confianza y luego reanuda nuevamente

4948 4968 

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

4970 Esta sesión se reinició después de que venciera su siguiente activación de /loop

4971</h3>

4972 

4973Un [`/loop` de ritmo propio](/docs/es/scheduled-tasks#let-claude-choose-the-interval) en una [sesión en segundo plano](/docs/es/agent-view) se detuvo. El proceso de la sesión terminó mientras el bucle esperaba su siguiente activación, y esa activación venció antes de que se iniciara el [siguiente proceso](/docs/es/agent-view#the-supervisor-process) de la sesión. La activación perdida no se dispara con retraso. El aviso indica cuánto retraso tenía la activación cuando la sesión se reinició:

4974 

4975```text theme={null}

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

4977```

4978 

4979Antes de v2.1.295, el bucle se detenía en esta situación sin ningún aviso.

4980 

4981**Qué hacer:**

4982 

4983* Para continuar el bucle, [responde a la sesión](/docs/es/agent-view#peek-and-reply) e indícalo, por ejemplo `keep the loop running`. Claude lee el aviso junto con tu respuesta y puede programar la siguiente activación

4984* Si ya terminaste con el bucle, no hagas nada. Ya se detuvo

4985 

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

4950 Errores del lanzador CLAUDE\_CODE\_PROCESS\_WRAPPER4987 Errores del lanzador CLAUDE\_CODE\_PROCESS\_WRAPPER

4951</h3>4988</h3>

headless.md +58 −56

Details

89* **Vigilancias de [Monitor](/docs/es/tools-reference#monitor-tool)**: la ejecución espera hasta que se agote el tiempo de espera de la vigilancia o el límite de 10 minutos finalice la espera, lo que ocurra primero. Mientras espera, Claude continúa respondiendo a lo que reporta la vigilancia. De forma predeterminada, el tiempo de espera de una vigilancia se agota cinco minutos después de que Claude la inicia.89* **Vigilancias de [Monitor](/docs/es/tools-reference#monitor-tool)**: la ejecución espera hasta que se agote el tiempo de espera de la vigilancia o el límite de 10 minutos finalice la espera, lo que ocurra primero. Mientras espera, Claude continúa respondiendo a lo que reporta la vigilancia. De forma predeterminada, el tiempo de espera de una vigilancia se agota cinco minutos después de que Claude la inicia.

90* **Activaciones pendientes**: en una ejecución cuyo prompt pasaste como texto en lugar de con `--input-format stream-json`, cuando Claude ha programado una [activación de `/loop` a su propio ritmo](/docs/es/scheduled-tasks#let-claude-choose-the-interval), la ejecución espera a que se dispare cada activación y ejecuta su iteración hasta que [el bucle termina](/docs/es/scheduled-tasks#stop-a-loop), incluso más allá del límite de 10 minutos.90* **Activaciones pendientes**: en una ejecución cuyo prompt pasaste como texto en lugar de con `--input-format stream-json`, cuando Claude ha programado una [activación de `/loop` a su propio ritmo](/docs/es/scheduled-tasks#let-claude-choose-the-interval), la ejecución espera a que se dispare cada activación y ejecuta su iteración hasta que [el bucle termina](/docs/es/scheduled-tasks#stop-a-loop), incluso más allá del límite de 10 minutos.

91 91 

92Cuando stderr es una terminal y la ejecución ha esperado cinco segundos, Claude Code imprime en stderr una línea que comienza con `Waiting for background work to finish` y nombra el trabajo. Con [salida `json` o `stream-json`](#get-structured-output), la línea se imprime solo cuando stdout no es una terminal, por lo que el JSON que lee tu script nunca la incluye.

93 

92Si la ejecución alcanza su límite de [`--max-budget-usd`](/docs/es/cli-reference#cli-flags), Claude Code detiene el trabajo en segundo plano restante en lugar de esperar.94Si la ejecución alcanza su límite de [`--max-budget-usd`](/docs/es/cli-reference#cli-flags), Claude Code detiene el trabajo en segundo plano restante en lugar de esperar.

93 95 

94Cuando el trabajo en segundo plano inicia otro turno, la ejecución imprime el resultado de cada turno con la salida `text` predeterminada y el resultado del último turno con la salida `json`. Antes de la v2.1.295, la ejecución también imprimía solo el resultado del último turno con la salida `text`.96Cuando el trabajo en segundo plano inicia otro turno, la ejecución imprime el resultado de cada turno con la salida `text` predeterminada y el resultado del último turno con la salida `json`. Antes de la v2.1.295, la ejecución también imprimía solo el resultado del último turno con la salida `text`.


116 Ejemplos118 Ejemplos

117</h2>119</h2>

118 120 

119Estos ejemplos destacan patrones comunes de CLI. Donde un comando nombra un archivo como `auth.py` o `build-error.txt`, sustituya un archivo de su propio proyecto. En CI u otros entornos con scripts, agregue [`--bare`](#start-faster-with-bare-mode) para que Claude Code se inicie sin cargar los hooks del host, plugins, memoria automática o `CLAUDE.md`.121Estos ejemplos destacan patrones comunes de CLI. Donde un comando nombra un archivo como `auth.py` o `build-error.txt`, sustituye un archivo de tu propio proyecto. En CI u otros entornos con scripts, agrega [`--bare`](#start-faster-with-bare-mode) para que Claude Code se inicie sin cargar los hooks del host, plugins, memoria automática o `CLAUDE.md`.

120 122 

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

122 Canalizar datos a través de Claude124 Canalizar datos a través de Claude

123</h3>125</h3>

124 126 

125El modo no interactivo lee stdin, por lo que puede canalizar datos y redirigir la respuesta como cualquier otra herramienta de línea de comandos.127El modo no interactivo lee stdin, por lo que puedes canalizar datos y redirigir la respuesta como cualquier otra herramienta de línea de comandos.

126 128 

127Este ejemplo canaliza un registro de compilación a Claude y escribe la explicación en un archivo:129Este ejemplo canaliza un registro de compilación a Claude y escribe la explicación en un archivo:

128 130 


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

131```133```

132 134 

133Con `--output-format json`, la carga útil de respuesta incluye `total_cost_usd` y un desglose de costos por modelo, por lo que los llamadores con scripts pueden rastrear el gasto sin consultar el [panel de uso](/docs/es/costs). Cuando continúa una conversación anterior con `--continue` o `--resume`, la ejecución informa el total completo de la conversación, [gastos de ejecuciones anteriores incluidos](/docs/es/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls). Ambas cifras son [estimaciones del lado del cliente](/docs/es/agent-sdk/cost-tracking) y pueden diferir de su factura real.135Con `--output-format json`, la carga útil de respuesta incluye `total_cost_usd` y un desglose de costos por modelo, por lo que los llamadores con scripts pueden rastrear el gasto sin consultar el [panel de uso](/docs/es/costs). Cuando continúas una conversación anterior con `--continue` o `--resume`, la ejecución informa el total completo de la conversación, [gastos de ejecuciones anteriores incluidos](/docs/es/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls). Ambas cifras son [estimaciones del lado del cliente](/docs/es/agent-sdk/cost-tracking) y pueden diferir de tu factura real.

134 136 

135<Note>137<Note>

136 El stdin canalizado está limitado a 10MB. Si excede el límite, Claude Code sale con un error claro y un estado distinto de cero. Para trabajar con entradas más grandes, escriba el contenido en un archivo y haga referencia a la ruta del archivo en su indicador en lugar de canalizarlo.138 El stdin canalizado está limitado a 10MB. Si excedes el límite, Claude Code sale con un error claro y un estado distinto de cero. Para trabajar con entradas más grandes, escribe el contenido en un archivo y haz referencia a la ruta del archivo en tu prompt en lugar de canalizarlo.

137</Note>139</Note>

138 140 

139Si Claude Code no puede leer stdin, por ejemplo porque el proceso que lo inició desconectó su extremo, Claude Code imprime una advertencia en stderr y continúa con el indicador de la línea de comandos. Antes de v2.1.211, un stdin no legible en Windows bloqueaba la sesión o hacía que saliera silenciosamente sin salida.141Si Claude Code no puede leer stdin, por ejemplo porque el proceso que lo inició desconectó su extremo, Claude Code imprime una advertencia en stderr y continúa con el prompt de la línea de comandos. Antes de v2.1.211, un stdin no legible en Windows bloqueaba la sesión o hacía que saliera silenciosamente sin salida.

140 142 

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

142 Agregar Claude a un script de compilación144 Agregar Claude a un script de compilación

143</h3>145</h3>

144 146 

145Puede envolver una llamada no interactiva en un script para usar Claude como un linter o revisor específico del proyecto.147Puedes envolver una llamada no interactiva en un script para usar Claude como un linter o revisor específico del proyecto.

146 148 

147Este script `package.json` canaliza el diff contra `main` a Claude y le pide que informe sobre errores tipográficos. Canalizar el diff significa que Claude no necesita permiso de Bash para leerlo, y las comillas dobles escapadas mantienen el script portátil a Windows:149Este script `package.json` canaliza el diff contra `main` a Claude y le pide que informe sobre errores tipográficos. Canalizar el diff significa que Claude no necesita permiso de Bash para leerlo, y las comillas dobles escapadas mantienen el script portátil a Windows:

148 150 


154}156}

155```157```

156 158 

157Ejecute con `npm run lint:claude`.159Ejecútalo con `npm run lint:claude`.

158 160 

159<h3 id="get-structured-output">161<h3 id="get-structured-output">

160 Obtener salida estructurada162 Obtener salida estructurada

161</h3>163</h3>

162 164 

163Utilice `--output-format` para controlar cómo se devuelven las respuestas:165Usa `--output-format` para controlar cómo se devuelven las respuestas:

164 166 

165* `text` (predeterminado): salida de texto sin formato167* `text` (predeterminado): salida de texto sin formato

166* `json`: JSON estructurado con resultado, ID de sesión y metadatos168* `json`: JSON estructurado con resultado, ID de sesión y metadatos

167* `stream-json`: JSON delimitado por saltos de línea para transmisión en tiempo real169* `stream-json`: JSON delimitado por saltos de línea para streaming en tiempo real

168 170 

169Este ejemplo devuelve un resumen del proyecto como JSON con metadatos de sesión, con el resultado de texto en el campo `result`:171Este ejemplo devuelve un resumen del proyecto como JSON con metadatos de sesión, con el resultado de texto en el campo `result`:

170 172 


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

173```175```

174 176 

175Para obtener una salida que se ajuste a un esquema específico, utilice `--output-format json` con `--json-schema` y una definición de [JSON Schema](https://json-schema.org/). La respuesta incluye metadatos sobre la solicitud (ID de sesión, uso, etc.) con la salida estructurada en el campo `structured_output`.177Para obtener una salida que se ajuste a un esquema específico, usa `--output-format json` con `--json-schema` y una definición de [JSON Schema](https://json-schema.org/). La respuesta incluye metadatos sobre la solicitud (ID de sesión, uso, etc.) con la salida estructurada en el campo `structured_output`.

176 178 

177Este ejemplo extrae nombres de funciones y los devuelve como una matriz de cadenas:179Este ejemplo extrae nombres de funciones y los devuelve como una matriz de cadenas:

178 180 


185Si el valor no es un JSON Schema válido, `claude` sale con `Error: --json-schema is not a valid JSON Schema` seguido del diagnóstico del validador. Claude Code acepta esquemas que utilizan la palabra clave `format`, como `"format": "email"`, pero trata `format` como una anotación y no la aplica. Antes de v2.1.205, Claude Code ignoraba silenciosamente un esquema inválido y devolvía texto no estructurado, y trataba cualquier esquema que contenía `format` como inválido.187Si el valor no es un JSON Schema válido, `claude` sale con `Error: --json-schema is not a valid JSON Schema` seguido del diagnóstico del validador. Claude Code acepta esquemas que utilizan la palabra clave `format`, como `"format": "email"`, pero trata `format` como una anotación y no la aplica. Antes de v2.1.205, Claude Code ignoraba silenciosamente un esquema inválido y devolvía texto no estructurado, y trataba cualquier esquema que contenía `format` como inválido.

186 188 

187<Tip>189<Tip>

188 Utilice una herramienta como [jq](https://jqlang.org/) para analizar la respuesta y extraer campos específicos:190 Usa una herramienta como [jq](https://jqlang.org/) para analizar la respuesta y extraer campos específicos:

189 191 

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

191 # Extract the text result193 # Extract the text result


200</Tip>202</Tip>

201 203 

202<h3 id="stream-responses">204<h3 id="stream-responses">

203 Transmitir respuestas205 Respuestas en streaming

204</h3>206</h3>

205 207 

206Utilice `--output-format stream-json` con `--verbose` e `--include-partial-messages` para recibir tokens a medida que se generan. Cada línea es un objeto JSON que representa un evento:208Usa `--output-format stream-json` con `--verbose` e `--include-partial-messages` para recibir tokens a medida que se generan. Cada línea es un objeto JSON que representa un evento:

207 209 

208```bash theme={null}210```bash theme={null}

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

210```212```

211 213 

212La última línea de la transmisión es un mensaje `result` con el texto de respuesta final, el costo y los metadatos de la sesión.214La última línea del stream es un mensaje `result` con el texto de respuesta final, el costo y los metadatos de la sesión.

213 215 

214Si su consumidor lee la transmisión lentamente, Claude Code espera a que se drene la salida en cola antes de salir, escalando la espera con cuánto aún está en cola, limitado a 30 segundos. Antes de v2.1.214, la espera de salida estaba limitada a aproximadamente dos segundos, lo que podría cortar el final de una respuesta grande.216Si tu consumidor lee el stream lentamente, Claude Code espera a que se drene la salida en cola antes de salir, escalando la espera según cuánto sigue en cola, con un límite de 30 segundos. Antes de v2.1.214, la espera de salida estaba limitada a aproximadamente dos segundos, lo que podía cortar el final de una respuesta grande.

215 217 

216El siguiente ejemplo usa [jq](https://jqlang.org/) para filtrar deltas de texto y mostrar solo el texto en streaming. El flag `-r` genera cadenas sin formato (sin comillas) y `-j` une sin saltos de línea para que los tokens se transmitan en streaming de forma continua:218El siguiente ejemplo usa [jq](https://jqlang.org/) para filtrar deltas de texto y mostrar solo el texto en streaming. El flag `-r` genera cadenas sin formato (sin comillas) y `-j` une sin saltos de línea para que los tokens se transmitan en streaming de forma continua:

217 219 


220 jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'222 jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

221```223```

222 224 

223Para transmisión programática con devoluciones de llamada y objetos de mensaje, consulte [Transmitir respuestas en tiempo real](/docs/es/agent-sdk/streaming-output) en la documentación del Agent SDK.225Para streaming programático con devoluciones de llamada y objetos de mensaje, consulta [Respuestas en streaming en tiempo real](/docs/es/agent-sdk/streaming-output) en la documentación del Agent SDK.

224 226 

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

226 Seguir mensajes de subagentes228 Seguir mensajes de subagentes


257 Manejar reintentos de API259 Manejar reintentos de API

258</h4>260</h4>

259 261 

260Cuando una solicitud de API falla con un error reintentable, Claude Code emite un evento `system/api_retry` antes de reintentar. En v2.1.246 o posterior, cuando un `401` o `403` rechaza una credencial [`apiKeyHelper`](/docs/es/settings-reference#apikeyhelper), Claude Code realiza los primeros dos reintentos silenciosamente sin evento, luego emite el evento como de costumbre desde el tercer reintento consecutivo en adelante. Los reintentos silenciosos aún cuentan hacia `attempt`. Puede usar el evento para mostrar el progreso del reintento en su propia interfaz.262Cuando una solicitud de API falla con un error reintentable, Claude Code emite un evento `system/api_retry` antes de reintentar. En v2.1.246 o posterior, cuando un `401` o `403` rechaza una credencial [`apiKeyHelper`](/docs/es/settings-reference#apikeyhelper), Claude Code realiza los primeros dos reintentos silenciosamente sin evento, luego emite el evento como de costumbre desde el tercer reintento consecutivo en adelante. Los reintentos silenciosos aún cuentan para `attempt`. Puedes usar el evento para mostrar el progreso del reintento en tu propia interfaz.

261 263 

262| Campo | Tipo | Descripción |264| Campo | Tipo | Descripción |

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


276 Leer metadatos de sesión278 Leer metadatos de sesión

277</h4>279</h4>

278 280 

279El evento `system/init` informa metadatos de sesión incluyendo el modelo, herramientas, servidores MCP y plugins cargados. Es el primer evento en la transmisión a menos que eventos de inicio lo precedan:281El evento `system/init` informa metadatos de sesión incluyendo el modelo, herramientas, servidores MCP y plugins cargados. Es el primer evento en el stream a menos que eventos de inicio lo precedan:

280 282 

281* eventos `plugin_install`, cuando [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/es/env-vars) está configurado.283* eventos `plugin_install`, cuando [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/es/env-vars) está configurado.

282* [eventos `hook_started`, `hook_progress` y `hook_response`](/docs/es/agent-sdk/typescript#sdkhookstartedmessage), mientras se ejecuta un hook [`SessionStart`](/docs/es/hooks#sessionstart) o [`Setup`](/docs/es/hooks#setup) configurado. Estos se transmiten a medida que el hook los produce. Claude Code v2.1.169 a v2.1.203 los entregó en un lote después de que el hook se completó, aún antes de `system/init`; v2.1.204 restauró la entrega en vivo.284* [eventos `hook_started`, `hook_progress` y `hook_response`](/docs/es/agent-sdk/typescript#sdkhookstartedmessage), mientras se ejecuta un hook [`SessionStart`](/docs/es/hooks#sessionstart) o [`Setup`](/docs/es/hooks#setup) configurado. Estos se transmiten en streaming a medida que el hook los produce. Claude Code v2.1.169 a v2.1.203 los entregaba en un lote después de que el hook se completaba, aún antes de `system/init`; v2.1.204 restauró la entrega en vivo.

283 285 

284El evento también lleva una matriz `capabilities` opcional de cadenas que nombran los comportamientos del protocolo que esta versión de Claude Code implementa, como `interrupt_receipt_v1` o `interrupt_cancel_queued_v1`. Verifíquelo para detectar características en lugar de comparar cadenas de versión, e ignore valores que no reconozca. El campo requiere Claude Code v2.1.205 o posterior y está ausente en versiones anteriores. Consulte [`SDKSystemMessage`](/docs/es/agent-sdk/typescript#sdksystemmessage) para la lista de capacidades.286El evento también lleva una matriz `capabilities` opcional de cadenas que nombran los comportamientos del protocolo que esta versión de Claude Code implementa, como `interrupt_receipt_v1` o `interrupt_cancel_queued_v1`. Revísala para detectar características en lugar de comparar cadenas de versión, e ignora los valores que no reconozcas. El campo requiere Claude Code v2.1.205 o posterior y está ausente en versiones anteriores. Consulta [`SDKSystemMessage`](/docs/es/agent-sdk/typescript#sdksystemmessage) para la lista de capacidades.

285 287 

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

287 Fallar CI cuando un plugin o servidor MCP no se carga289 Hacer fallar CI cuando un plugin o servidor MCP no se carga

288</h4>290</h4>

289 291 

290Utilice los campos de plugin en el evento `system/init` para detectar un plugin que no se cargó:292Usa los campos de plugin en el evento `system/init` para detectar un plugin que no se cargó:

291 293 

292| Campo | Tipo | Descripción |294| Campo | Tipo | Descripción |

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

294| `plugins` | matriz | plugins que se cargaron exitosamente, cada uno con `name` y `path` |296| `plugins` | matriz | plugins que se cargaron exitosamente, cada uno con `name` y `path` |

295| `plugin_errors` | matriz | errores de tiempo de carga de plugin, cada uno con `plugin`, `type` y `message`. Incluye versiones de dependencia insatisfechas y fallos de carga de `--plugin-dir` como una ruta faltante o archivo inválido. Un plugin que no se cargó está ausente de `plugins`. La clave se omite cuando no hay errores |297| `plugin_errors` | matriz | errores de tiempo de carga de plugin, cada uno con `plugin`, `type` y `message`. Incluye versiones de dependencia insatisfechas y fallos de carga de `--plugin-dir` como una ruta faltante o un archivo comprimido inválido. Un plugin que no se cargó está ausente de `plugins`. La clave se omite cuando no hay errores |

296 298 

297Cuando un directorio o archivo `--plugin-dir` en sí falla al cargarse, su entrada `plugin_errors` incluye la ruta absoluta resuelta como `path`. Úselo para saber cuál de varios valores `--plugin-dir` falló. El campo `path` requiere Claude Code v2.1.283 o posterior.299Cuando un directorio o archivo comprimido de `--plugin-dir` en sí falla al cargarse, su entrada `plugin_errors` incluye la ruta absoluta resuelta como `path`. Úsala para saber cuál de varios valores `--plugin-dir` falló. El campo `path` requiere Claude Code v2.1.283 o posterior.

298 300 

299Utilice los campos del servidor MCP de la misma manera. Cuando pasa [`--mcp-config`](/docs/es/cli-reference#cli-flags) con `-p`, Claude Code espera a que los servidores aún pendientes se completen antes de ejecutar el primer turno, hasta el tiempo de espera de inicio [`MCP_TIMEOUT`](/docs/es/env-vars), 30 segundos de forma predeterminada. Un servidor remoto con una [lista de herramientas en caché](/docs/es/agent-sdk/mcp#connection-timing) omite la espera, muestra `pending` en `system/init` y se conecta en su primera llamada de herramienta. La espera requiere Claude Code v2.1.221 o posterior.301Usa los campos del servidor MCP de la misma manera. Cuando pasas [`--mcp-config`](/docs/es/cli-reference#cli-flags) con `-p`, Claude Code espera a los servidores aún pendientes antes de ejecutar el primer turno, hasta el tiempo de espera de inicio [`MCP_TIMEOUT`](/docs/es/env-vars), 30 segundos de forma predeterminada. Un servidor remoto con una [lista de herramientas en caché](/docs/es/agent-sdk/mcp#connection-timing) omite la espera, muestra `pending` en `system/init` y se conecta en su primera llamada a herramienta. En un [entorno autoalojado](/docs/es/self-hosted-environments-configuration#connection-timing), se aplica en su lugar una espera más corta. La espera requiere Claude Code v2.1.221 o posterior.

300 302 

301Claude Code valida cada entrada `--mcp-config` al inicio y omite las entradas que fallan la validación, por ejemplo una entrada `url` sin `type`. La ejecución continúa y sale limpiamente, por lo que verifique estos campos para detectar un servidor que nunca se cargó:303Claude Code valida cada entrada `--mcp-config` al inicio y omite las entradas que no pasan la validación, por ejemplo una entrada `url` sin `type`. La ejecución continúa y sale limpiamente, así que revisa estos campos para detectar un servidor que nunca se cargó:

302 304 

303| Campo | Tipo | Descripción |305| Campo | Tipo | Descripción |

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

305| `mcp_servers` | matriz | servidores MCP en la sesión, cada uno con `name` y `status` |307| `mcp_servers` | matriz | servidores MCP en la sesión, cada uno con `name` y `status` |

306| `mcp_server_errors` | matriz | entradas `--mcp-config` omitidas por validación de configuración, cada una con `name`, `type` y `message`. `type` es una categoría de omisión como `unknown_type`, `url_missing_type`, `invalid_config` o `reserved_name`; trate valores que no reconozca como una omisión genérica. Los servidores afectados están ausentes de `mcp_servers`. La clave se omite cuando no hay errores, por lo que una puerta de CI puede fallar en una matriz no vacía. Requiere Claude Code v2.1.219 o posterior |308| `mcp_server_errors` | matriz | entradas `--mcp-config` omitidas por la validación de configuración, cada una con `name`, `type` y `message`. `type` es una categoría de omisión como `unknown_type`, `url_missing_type`, `invalid_config` o `reserved_name`; trata los valores que no reconozcas como una omisión genérica. Los servidores afectados están ausentes de `mcp_servers`. La clave se omite cuando no hay errores, por lo que una puerta de CI puede fallar ante una matriz no vacía. Requiere Claude Code v2.1.219 o posterior |

307 309 

308Cuando ejecuta el comando a mano en una terminal, Claude Code también imprime una advertencia de inicio en stderr, como `Warning: 1 MCP server skipped due to invalid config:`, seguida de la razón para cada entrada omitida. Cuando redirige stderr, o cuando un programa como un ejecutor de CI o un host SDK lo captura, Claude Code no imprime advertencia e informa las entradas omitidas solo en el campo `mcp_server_errors`. La advertencia requiere Claude Code v2.1.219 o posterior.310Cuando ejecutas el comando a mano en una terminal, Claude Code también imprime una advertencia de inicio en stderr, como `Warning: 1 MCP server skipped due to invalid config:`, seguida de la razón de cada entrada omitida. Cuando rediriges stderr, o cuando un programa como un ejecutor de CI o un host del SDK lo captura, Claude Code no imprime ninguna advertencia e informa las entradas omitidas solo en el campo `mcp_server_errors`. La advertencia requiere Claude Code v2.1.219 o posterior.

309 311 

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

311 Rastrear instalaciones de plugins313 Rastrear instalaciones de plugins

312</h4>314</h4>

313 315 

314Cuando [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/es/env-vars) está configurado, Claude Code emite eventos `system/plugin_install` mientras los plugins del marketplace se instalan antes del primer turno. Use estos para mostrar el progreso de instalación en su propia interfaz de usuario.316Cuando [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/es/env-vars) está configurado, Claude Code emite eventos `system/plugin_install` mientras los plugins del marketplace se instalan antes del primer turno. Úsalos para mostrar el progreso de instalación en tu propia interfaz de usuario.

315 317 

316| Campo | Tipo | Descripción |318| Campo | Tipo | Descripción |

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

318| `type` | `"system"` | tipo de mensaje |320| `type` | `"system"` | tipo de mensaje |

319| `subtype` | `"plugin_install"` | identifica esto como un evento de instalación de plugin |321| `subtype` | `"plugin_install"` | identifica esto como un evento de instalación de plugin |

320| `status` | `"started"`, `"installed"`, `"failed"`, o `"completed"` | `started` y `completed` enmarcan la instalación general; `installed` y `failed` reportan mercados individuales |322| `status` | `"started"`, `"installed"`, `"failed"`, o `"completed"` | `started` y `completed` enmarcan la instalación general; `installed` y `failed` informan sobre marketplaces individuales |

321| `name` | cadena, opcional | nombre del marketplace, presente en `installed` y `failed` |323| `name` | cadena, opcional | nombre del marketplace, presente en `installed` y `failed` |

322| `error` | cadena, opcional | mensaje de fallo, presente en `failed` |324| `error` | cadena, opcional | mensaje de fallo, presente en `failed` |

323| `uuid` | cadena | identificador único del evento |325| `uuid` | cadena | identificador único del evento |


327 Aprobar herramientas automáticamente329 Aprobar herramientas automáticamente

328</h3>330</h3>

329 331 

330Utilice `--allowedTools` para permitir que Claude use ciertas herramientas sin solicitar confirmación. Enumerar `Read` y `Edit` permite que Claude lea y edite archivos sin pedir permiso. Enumerar `Bash` hace lo mismo para comandos de shell, excepto en una ejecución que comienza en [modo automático](/docs/es/permission-modes#how-auto-mode-evaluates-actions), donde Claude Code descarta una entrada `Bash` desnuda como una regla de permiso amplia y el modo automático evalúa cada comando en su lugar. Este ejemplo ejecuta un conjunto de pruebas y corrige fallos con esas tres herramientas enumeradas:332Usa `--allowedTools` para permitir que Claude use ciertas herramientas sin pedir confirmación. Enumerar `Read` y `Edit` permite que Claude lea y edite archivos sin pedir permiso. Enumerar `Bash` hace lo mismo para comandos de shell, excepto en una ejecución que comienza en [modo automático](/docs/es/permission-modes#how-auto-mode-evaluates-actions), donde Claude Code descarta una entrada `Bash` sin más como una regla de permisos demasiado amplia y el modo automático evalúa cada comando en su lugar. Este ejemplo ejecuta un conjunto de pruebas y corrige fallos con esas tres herramientas enumeradas:

331 333 

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

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

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

335```337```

336 338 

337Para establecer una línea base para toda la sesión en lugar de enumerar herramientas individuales, pase un [modo de permiso](/docs/es/permission-modes). Una ejecución donde nada establece un modo de permiso toma el [modo de permiso de inicio integrado](/docs/es/permission-modes#which-mode-a-session-starts-in), que puede ser `auto`, así que pase el que desee:339Para establecer una línea base para toda la sesión en lugar de enumerar herramientas individuales, pasa un [modo de permisos](/docs/es/permission-modes). Una ejecución donde nada establece un modo de permisos toma el [modo de permisos de inicio integrado](/docs/es/permission-modes#which-mode-a-session-starts-in), que puede ser `auto`, así que pasa el que desees:

338 340 

339* **`auto`**: pase `--permission-mode auto` para que un clasificador revise la mayoría de las acciones en lugar de usted341* **`auto`**: pasa `--permission-mode auto` para que un clasificador revise la mayoría de las acciones en lugar de ti

340* **`dontAsk`**: Claude Code deniega cualquier llamada que de otro modo solicitaría, lo que es útil para ejecuciones de CI bloqueadas. Las acciones que no necesitan aprobación en modo Manual aún se ejecutan, como lecturas de archivos en sus directorios de trabajo y el [conjunto de comandos de solo lectura](/docs/es/permissions#read-only-commands), y también lo hacen las acciones que sus entradas `--allowedTools` o reglas `permissions.allow` cubren. `AskUserQuestion`, herramientas de conector [que su organización configuró para `ask`](/docs/es/mcp#organization-controls-on-connector-tools), y herramientas MCP marcadas [`requiresUserInteraction`](/docs/es/mcp#require-approval-for-a-specific-tool) se deniegan incluso cuando una regla de permiso coincide342* **`dontAsk`**: Claude Code deniega cualquier llamada que de otro modo pediría confirmación, lo que es útil para ejecuciones de CI bloqueadas. Las acciones que no necesitan aprobación en modo Manual aún se ejecutan, como lecturas de archivos en tus directorios de trabajo y el [conjunto de comandos de solo lectura](/docs/es/permissions#read-only-commands), y también las acciones que cubren tus entradas `--allowedTools` o reglas `permissions.allow`. `AskUserQuestion`, las herramientas de conector [que tu organización configuró como `ask`](/docs/es/mcp#organization-controls-on-connector-tools) y las herramientas MCP marcadas con [`requiresUserInteraction`](/docs/es/mcp#require-approval-for-a-specific-tool) se deniegan incluso cuando coincide una regla de permiso

341* **`acceptEdits`**: Claude escribe archivos sin solicitar, y Claude Code aprueba automáticamente comandos comunes del sistema de archivos como `mkdir`, `touch`, `mv` y `cp`. Las [acciones que ningún modo aprueba automáticamente](/docs/es/permission-modes#actions-no-mode-auto-approves) aún se aplican. Aparte del conjunto de comandos de solo lectura, otros comandos de shell y solicitudes de red aún necesitan una entrada `--allowedTools` o una regla `permissions.allow`. Consulte [qué `acceptEdits` aprueba automáticamente](/docs/es/permission-modes#auto-approve-file-edits-with-acceptedits-mode) para la lista completa343* **`acceptEdits`**: Claude escribe archivos sin pedir confirmación, y Claude Code aprueba automáticamente comandos comunes del sistema de archivos como `mkdir`, `touch`, `mv` y `cp`. Las [acciones que ningún modo aprueba automáticamente](/docs/es/permission-modes#actions-no-mode-auto-approves) aún se aplican. Aparte del conjunto de comandos de solo lectura, otros comandos de shell y solicitudes de red aún necesitan una entrada `--allowedTools` o una regla `permissions.allow`. Consulta [qué aprueba automáticamente `acceptEdits`](/docs/es/permission-modes#auto-approve-file-edits-with-acceptedits-mode) para la lista completa

342 344 

343Este ejemplo aplica correcciones de lint con `acceptEdits` como línea base:345Este ejemplo aplica correcciones de lint con `acceptEdits` como línea base:

344 346 


347```349```

348 350 

349<h3 id="turn-off-permission-prompts-in-unattended-runs">351<h3 id="turn-off-permission-prompts-in-unattended-runs">

350 Desactivar indicadores de permiso en ejecuciones desatendidas352 Desactivar las solicitudes de permiso en ejecuciones desatendidas

351</h3>353</h3>

352 354 

353Pase `--permission-prompts none` cuando nadie esté disponible para responder indicadores de permiso, por ejemplo en un trabajo programado. La bandera es más importante cuando su ejecución tiene un host de permiso: una aplicación Agent SDK con una devolución de llamada [`canUseTool`](/docs/es/agent-sdk/user-input), o una herramienta MCP que pasa con [`--permission-prompt-tool`](/docs/es/cli-reference#cli-flags). Sin la bandera, su ejecución espera a que ese host responda cada solicitud de permiso.355Pasa `--permission-prompts none` cuando nadie esté disponible para responder solicitudes de permiso, por ejemplo en un trabajo programado. El flag importa sobre todo cuando tu ejecución tiene un host de permisos: una aplicación del Agent SDK con una [devolución de llamada `canUseTool`](/docs/es/agent-sdk/user-input), o una herramienta MCP que pasas con [`--permission-prompt-tool`](/docs/es/cli-reference#cli-flags). Sin el flag, tu ejecución espera a que ese host responda cada solicitud de permiso.

354 356 

355Con la bandera, su ejecución no consulta al host ni espera en él. Cualquier cosa que solicitaría se deniega a menos que un hook `PermissionRequest` lo permita, se le dice a Claude que nadie puede aprobar la solicitud y que no la reintente, y la ejecución continúa. En una ejecución `-p` sin host, estas solicitudes se deniegan de cualquier forma, y la bandera también le dice a Claude que no las reintente. Las reglas de permiso, [hooks `PermissionRequest`](/docs/es/hooks#permissionrequest), y el modo de permiso que establezca aún deciden cada llamada primero; Claude Code deniega solo las solicitudes que nada más resuelve.357Con el flag, tu ejecución no consulta al host ni lo espera. Cualquier cosa que pediría confirmación se deniega a menos que un hook `PermissionRequest` la permita, se le indica a Claude que nadie puede aprobar la solicitud y que no la reintente, y la ejecución continúa. En una ejecución `-p` sin host, estas solicitudes se deniegan de cualquier forma, y el flag también le indica a Claude que no las reintente. Las reglas de permisos, los [hooks `PermissionRequest`](/docs/es/hooks#permissionrequest) y el modo de permisos que establezcas siguen decidiendo primero cada llamada; Claude Code deniega solo las solicitudes que nada más resuelve.

356 358 

357Este ejemplo ejecuta una tarea desatendida en [modo automático](/docs/es/permission-modes#eliminate-prompts-with-auto-mode). El clasificador revisa cada acción como de costumbre, y Claude Code deniega cualquier cosa que habría recurrido a un indicador:359Este ejemplo ejecuta una tarea desatendida en [modo automático](/docs/es/permission-modes#eliminate-prompts-with-auto-mode). El clasificador revisa cada acción como de costumbre, y Claude Code deniega cualquier cosa que habría terminado en una solicitud de permiso:

358 360 

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

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

361```363```

362 364 

363Con `--permission-prompts none`, Claude Code elimina las herramientas que necesitan una respuesta de una persona, como [`AskUserQuestion`](/docs/es/tools-reference#askuserquestion-tool-behavior), por lo que Claude no puede llamarlas. Cualquier [solicitud de elicitación MCP](/docs/es/mcp#respond-to-mcp-elicitation-requests) que ningún hook [`Elicitation`](/docs/es/hooks#elicitation) responda se cancela.365Con `--permission-prompts none`, Claude Code elimina las herramientas que necesitan una respuesta de una persona, como [`AskUserQuestion`](/docs/es/tools-reference#askuserquestion-tool-behavior), por lo que Claude no puede llamarlas. Cualquier [solicitud de elicitación MCP](/docs/es/mcp#respond-to-mcp-elicitation-requests) que ningún [hook `Elicitation`](/docs/es/hooks#elicitation) responda se cancela.

364 366 

365Con `--output-format stream-json`, las denegaciones aparecen como mensajes del sistema `permission_denied`, y el mensaje de resultado final las enumera en `permission_denials`.367Con `--output-format stream-json`, las denegaciones aparecen como mensajes del sistema `permission_denied`, y el mensaje de resultado final las enumera en `permission_denials`.

366 368 

367<Note>369<Note>

368 La bandera `--permission-prompts` requiere Claude Code v2.1.259 o posterior. Las versiones anteriores la rechazan con un error de opción desconocida.370 El flag `--permission-prompts` requiere Claude Code v2.1.259 o posterior. Las versiones anteriores lo rechazan con un error de opción desconocida.

369</Note>371</Note>

370 372 

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

372 Crear una confirmación374 Crear un commit

373</h3>375</h3>

374 376 

375Este ejemplo revisa los cambios preparados y crea una confirmación con un mensaje apropiado:377Este ejemplo revisa los cambios preparados y crea un commit con un mensaje apropiado:

376 378 

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

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

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

380```382```

381 383 

382La bandera `--allowedTools` utiliza [sintaxis de regla de permiso](/docs/es/settings-reference#permission-rule-syntax). El ` *` final habilita la coincidencia de prefijo, por lo que `Bash(git diff *)` permite cualquier comando que comience con `git diff`. El espacio antes de `*` es importante: sin él, `Bash(git diff*)` también coincidiría con `git diff-index`.384El flag `--allowedTools` utiliza la [sintaxis de reglas de permisos](/docs/es/settings-reference#permission-rule-syntax). El ` *` final habilita la coincidencia de prefijo, por lo que `Bash(git diff *)` permite cualquier comando que comience con `git diff`. El espacio antes de `*` es importante: sin él, `Bash(git diff*)` también coincidiría con `git diff-index`.

383 385 

384<Note>386<Note>

385 La compatibilidad de comandos difiere en modo `-p`:387 La compatibilidad de comandos difiere en modo `-p`:

386 388 

387 * Las [skills](/docs/es/skills) invocadas por el usuario y los comandos personalizados funcionan. Incluya `/skill-name` en la cadena de indicador y Claude Code lo expande antes de ejecutar.389 * Los [skills](/docs/es/skills) invocados por el usuario y los comandos personalizados funcionan. Incluye `/skill-name` en la cadena del prompt y Claude Code lo expande antes de ejecutar.

388 * Los comandos integrados que solo se ejecutan en la interfaz de terminal, como `/login`, no están disponibles.390 * Los comandos integrados que solo se ejecutan en la interfaz de la terminal, como `/login`, no están disponibles.

389 * `/model`, `/effort`, `/fast`, `/color` y `/rename` aceptan el valor como argumento, por ejemplo `/model sonnet`, y `/mcp` sin argumento imprime un resumen de texto del estado del servidor. Estas formas requieren Claude Code v2.1.205 o posterior y siguen las [notas de disponibilidad](/docs/es/commands#all-commands) de cada comando.391 * `/model`, `/effort`, `/fast`, `/color` y `/rename` aceptan el valor como argumento, por ejemplo `/model sonnet`, y `/mcp` sin argumento imprime un resumen de texto del estado del servidor. Estas formas requieren Claude Code v2.1.205 o posterior y siguen las [notas de disponibilidad](/docs/es/commands#all-commands) de cada comando.

390 * Para cambiar una configuración, pase `key=value` a `/config`, por ejemplo `/config thinking=false`.392 * Para cambiar un ajuste, pasa `key=value` a `/config`, por ejemplo `/config thinking=false`.

391 * `/output-style <style>` cambia [estilos de salida](/docs/es/output-styles) y `/output-style` solo los enumera. Requiere Claude Code v2.1.269 o posterior.393 * `/output-style <style>` cambia de [estilo de salida](/docs/es/output-styles) y `/output-style` solo los enumera. Requiere Claude Code v2.1.269 o posterior.

392</Note>394</Note>

393 395 

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

395 Personalizar el indicador del sistema397 Personalizar el prompt del sistema

396</h3>398</h3>

397 399 

398Utilice `--append-system-prompt` para agregar instrucciones mientras mantiene el comportamiento predeterminado de Claude Code. Este ejemplo canaliza un diff de PR a Claude e le indica que revise las vulnerabilidades de seguridad. Guárdelo como un script de shell, por ejemplo `review.sh`:400Usa `--append-system-prompt` para agregar instrucciones mientras mantienes el comportamiento predeterminado de Claude Code. Este ejemplo canaliza el diff de un PR a Claude y le indica que lo revise en busca de vulnerabilidades de seguridad. Guárdalo como un script de shell, por ejemplo `review.sh`:

399 401 

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

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


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

404```406```

405 407 

406En el script, `"$1"` representa el primer argumento que pasa en la línea de comandos. Ejecute `bash review.sh 123` y el shell reemplaza `"$1"` con `123`, por lo que el script obtiene el diff para PR 123. Claude Code imprime la revisión como JSON, con el texto en el campo `result`.408En el script, `"$1"` representa el primer argumento que pasas en la línea de comandos. Ejecuta `bash review.sh 123` y el shell reemplaza `"$1"` con `123`, por lo que el script obtiene el diff del PR 123. Claude Code imprime la revisión como JSON, con el texto en el campo `result`.

407 409 

408Consulte [banderas de indicador del sistema](/docs/es/cli-reference#system-prompt-flags) para más opciones incluyendo `--system-prompt` para reemplazar completamente el indicador predeterminado.410Consulta [flags del prompt del sistema](/docs/es/cli-reference#system-prompt-flags) para más opciones, incluido `--system-prompt` para reemplazar completamente el prompt predeterminado.

409 411 

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

411 Continuar conversaciones413 Continuar conversaciones

412</h3>414</h3>

413 415 

414Utilice `--continue` para continuar la conversación más reciente, o `--resume` con un ID de sesión para continuar una conversación específica. En Claude Code v2.1.257 o posterior, cuando pasa `--continue`, Claude Code abre una [sesión en segundo plano](/docs/es/sessions#resume-a-session) que ha terminado, pero no una que aún se está ejecutando. Este ejemplo ejecuta una revisión y luego envía indicaciones de seguimiento:416Usa `--continue` para continuar la conversación más reciente, o `--resume` con un ID de sesión para continuar una conversación específica. En Claude Code v2.1.257 o posterior, cuando pasas `--continue`, Claude Code abre una [sesión en segundo plano](/docs/es/sessions#resume-a-session) que ha terminado, pero no una que aún se está ejecutando. Este ejemplo ejecuta una revisión y luego envía prompts de seguimiento:

415 417 

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

417# First request419# First request


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

423```425```

424 426 

425Si está ejecutando múltiples conversaciones, capture el ID de sesión para reanudar una específica:427Si estás ejecutando múltiples conversaciones, captura el ID de sesión para reanudar una específica:

426 428 

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

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

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

430```432```

431 433 

432Puede ejecutar los dos comandos desde diferentes directorios: Claude Code [encuentra la sesión por su ID](/docs/es/sessions#resume-a-session) en cualquier proyecto en esta máquina. Antes de v2.1.223, Claude Code buscaba el ID solo en el directorio del proyecto actual y sus git worktrees, por lo que tenía que ejecutar ambos comandos desde el mismo directorio.434Puedes ejecutar los dos comandos desde directorios diferentes: Claude Code [encuentra la sesión por su ID](/docs/es/sessions#resume-a-session) en cualquier proyecto de esta máquina. Antes de v2.1.223, Claude Code buscaba el ID solo en el directorio del proyecto actual y sus git worktrees, por lo que tenías que ejecutar ambos comandos desde el mismo directorio.

433 435 

434En lugar del ID de sesión, puede pasar a `--resume` la ruta absoluta al archivo de [transcripción](/docs/es/sessions#where-transcripts-are-stored) `.jsonl` de una sesión, y Claude Code continúa la conversación almacenada en ese archivo.436En lugar del ID de sesión, puedes pasar a `--resume` la ruta absoluta al [archivo de transcripción](/docs/es/sessions#where-transcripts-are-stored) `.jsonl` de una sesión, y Claude Code continúa la conversación almacenada en ese archivo.

435 437 

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

437 Próximos pasos439 Próximos pasos

Details

132El ejecutor y sus sesiones hacen varios tipos de conexión saliente, y no se requiere conectividad entrante desde Anthropic:132El ejecutor y sus sesiones hacen varios tipos de conexión saliente, y no se requiere conectividad entrante desde Anthropic:

133 133 

134* **Plano de control**: el ejecutor sondea `api.anthropic.com` para trabajo y publica eventos de progreso de configuración y falla, todo HTTPS saliente. El sondeo funciona como el latido del corazón del ejecutor.134* **Plano de control**: el ejecutor sondea `api.anthropic.com` para trabajo y publica eventos de progreso de configuración y falla, todo HTTPS saliente. El sondeo funciona como el latido del corazón del ejecutor.

135* **Conector SCM**: el orquestador opcional [conector SCM](/docs/es/self-hosted-environments-reference#scm-connector-flags) tunnel es la única conexión WebSocket.135* **Git**: el ejecutor clona desde tu host de git y envía cambios a él sobre HTTPS o SSH, autenticado con credenciales que proporciona tu despliegue. Consulta [Configurar git](/docs/es/self-hosted-environments-deploy#configure-git) para ver las opciones, incluidas las credenciales generadas por sesión. Con el [proxy de git de Anthropic](/docs/es/self-hosted-environments-deploy#use-the-anthropic-git-proxy), el tráfico de git para repositorios en github.com pasa en cambio por `api.anthropic.com`.

136* **Git**: el ejecutor clona desde y empuja a su host de git sobre HTTPS o SSH, autenticado con credenciales que su implementación proporciona; [Configurar git](/docs/es/self-hosted-environments-deploy#configure-git) cubre las opciones, incluidas credenciales acuñadas por sesión y el [proxy de git de Anthropic](/docs/es/self-hosted-environments-deploy#use-the-anthropic-git-proxy), que enruta git a través de `api.anthropic.com` en su lugar.136* **Secundario de sesión**: el proceso secundario de Claude Code mantiene el stream de eventos de la sesión hacia `api.anthropic.com`, y realiza sus propias llamadas salientes para la inferencia de modelos y para los comandos de git ejecutados durante la sesión. En una sesión que usa [git administrado por Anthropic](/docs/es/self-hosted-environments-deploy#use-the-anthropic-git-proxy), el secundario envía su tráfico de `git` y `gh` para github.com a través de una conexión WebSocket que abre hacia `api.anthropic.com`.

137* **Secundario de sesión**: el proceso secundario de Claude Code mantiene el flujo de eventos de la sesión a `api.anthropic.com`, y realiza sus propias llamadas salientes para inferencia de modelos y para comandos de git ejecutados durante la sesión. Consulte [Requisitos de red](/docs/es/self-hosted-environments-deploy#network-requirements) para la lista completa de salida. El [diagrama anterior](#how-self-hosted-environments-work) muestra estas rutas, aparte del conector SCM opcional.137* **Conector SCM**: el [conector SCM](/docs/es/self-hosted-environments-reference#scm-connector-flags) opcional del orquestador no está disponible, por lo que su túnel no se abre. El túnel es una conexión WebSocket hacia `api.anthropic.com`.

138 

139Consulta [Requisitos de red](/docs/es/self-hosted-environments-deploy#network-requirements) para ver la lista completa de salida. El [diagrama anterior](#how-self-hosted-environments-work) muestra estas rutas, aparte del conector SCM opcional y la conexión de git administrado por Anthropic.

138 140 

139De forma predeterminada, la inferencia de modelos utiliza la API de Anthropic. El plano de control entrega el endpoint de la API a cada sesión, y la sesión se autentica con un token OAuth emitido por Anthropic con alcance de sesión. Para enviar en su lugar las solicitudes de modelo a tu propia cuenta en la nube, consulta [Enviar solicitudes de modelo a Bedrock o Agent Platform](/docs/es/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).141De forma predeterminada, la inferencia de modelos utiliza la API de Anthropic. El plano de control entrega el endpoint de la API a cada sesión, y la sesión se autentica con un token OAuth emitido por Anthropic con alcance de sesión. Para enviar en su lugar las solicitudes de modelo a tu propia cuenta en la nube, consulta [Enviar solicitudes de modelo a Bedrock o Agent Platform](/docs/es/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).

140 142 

Details

31| Variable | Descripción |31| Variable | Descripción |

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

33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | El JWT de la sesión, con prefijo `sk-ant-cc-`. Su reclamación `act` identifica al creador de la sesión, con el correo electrónico del creador cuando la superficie de creación lo registró. El valor es el token en el momento de la generación; los refrescos llegan a través del stdin del hijo, por lo que un contenedor solo ve el valor inicial. Consulta [Verificar identidad de sesión](/docs/es/self-hosted-environments-identity). |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | El JWT de la sesión, con prefijo `sk-ant-cc-`. Su reclamación `act` identifica al creador de la sesión, con el correo electrónico del creador cuando la superficie de creación lo registró. El valor es el token en el momento de la generación; los refrescos llegan a través del stdin del hijo, por lo que un contenedor solo ve el valor inicial. Consulta [Verificar identidad de sesión](/docs/es/self-hosted-environments-identity). |

34| `CCR_SESSION_ACCOUNT_EMAIL` | El correo electrónico del creador de la sesión, preextraído por el ejecutor de la reclamación `act.email` del token sin verificación de firma. Adecuado para etiquetado, como trailers de commit. Cuando el correo electrónico controla la emisión de credenciales, verifica el token y lee la reclamación de él en su lugar; consulta [Aprovisionar credenciales limitadas al creador de la sesión](#provision-credentials-scoped-to-the-session-creator). No está establecida cuando el token no lleva correo electrónico del creador. Trátala como información de identificación personal. |34| `CCR_SESSION_ACCOUNT_EMAIL` | El correo electrónico del creador de la sesión, preextraído por el ejecutor de la reclamación `act.email` del token sin verificación de firma. Adecuado para etiquetado, como trailers de commit. Cuando el correo electrónico controla la emisión de credenciales, verifica el token y lee la reclamación de él en su lugar. Consulta [Aprovisionar credenciales limitadas al creador de la sesión](#provision-credentials-scoped-to-the-session-creator). No está establecida cuando el token no lleva correo electrónico del creador, por ejemplo en sesiones que crea la identidad de servicio de tu organización. Trátala como información de identificación personal. |

35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli` o `scheduled_trigger`. Anthropic registra el valor una vez en la creación de la sesión, por lo que el contenedor y cada hook de ciclo de vida ven el mismo valor. Úsala solo para análisis de adopción y etiquetado, no como señal de autorización. No está establecida cuando la sesión no tiene una superficie registrada o reconocida, así que haz referencia a ella como `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` bajo `set -u`. Requiere Claude Code v2.1.229 o posterior. |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli` o `scheduled_trigger`. Anthropic registra el valor una vez en la creación de la sesión, por lo que el contenedor y cada hook de ciclo de vida ven el mismo valor. Úsala solo para análisis de adopción y etiquetado, no como señal de autorización. No está establecida cuando la sesión no tiene una superficie registrada o reconocida. Requiere Claude Code v2.1.229 o posterior. |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | Ruta absoluta al binario de Claude Code propio del ejecutor. Termina tu contenedor con `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` para entregar el control al binario fijado sin codificar una ruta de instalación. |36| `CLAUDE_RUNNER_CLAUDE_BIN` | Ruta absoluta al binario de Claude Code propio del ejecutor. Termina tu contenedor con `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` para entregar el control al binario fijado sin codificar una ruta de instalación. |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID de sesión en forma etiquetada `cse_...`. Esta es la misma sesión que los [hooks de ciclo de vida](#lifecycle-hooks) ven como `CLAUDE_RUNNER_SESSION_ID` en forma `session_...`; las variables UUID coinciden en ambas, y sustituir el prefijo `cse_` con `session_` produce el ID que se muestra en la URL de la sesión. |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID de sesión en forma etiquetada `cse_...`. Esta es la misma sesión que los [hooks de ciclo de vida](#lifecycle-hooks) ven como `CLAUDE_RUNNER_SESSION_ID` en forma `session_...`; las variables UUID coinciden en ambas, y sustituir el prefijo `cse_` con `session_` produce el ID que se muestra en la URL de la sesión. |

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

39| `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. |

40| `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_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. |41| `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`](/docs/es/self-hosted-environments-reference#runner-cli-flags); consulta [Reutilizar un checkout precalentado](/docs/es/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |42| `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`](/docs/es/self-hosted-environments-reference#runner-cli-flags); consulta [Reutilizar un checkout precalentado](/docs/es/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |

41| `ANTHROPIC_BASE_URL` | La URL base de API que el hijo usará, entregada por el plano de control por sesión y normalmente `https://api.anthropic.com`. No la sobrescribas: la credencial de inferencia de la sesión es un token OAuth emitido por Anthropic que otros proveedores no aceptan. |43| `ANTHROPIC_BASE_URL` | La URL base de API que el hijo usará, entregada por el plano de control por sesión y normalmente `https://api.anthropic.com`. No la sobrescribas: la credencial de inferencia de la sesión es un token OAuth emitido por Anthropic que otros proveedores no aceptan. |


43 45 

44El 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.

45 47 

48`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.

49 

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

51 Dar un valor predeterminado a las variables que pueden no estar establecidas

52</h3>

53 

54`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:-}`.

55 

56Dondequiera que un shell expanda el enlace del hilo de Slack, toma estas precauciones:

57 

58* **Ponlo entre comillas**: el enlace puede contener caracteres que un shell interpreta, como `?` y `&`, así que pon la variable entre comillas, como en `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`.

59* **Mantén su valor fuera de las cadenas de `eval` y `sh -c`**: no sustituyas su valor en una cadena que ejecuta `eval` o `sh -c`, ni siquiera entre comillas. En su lugar, haz que esa cadena haga referencia a la variable.

60 

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

47 Mantener stdin y descriptor de archivo 3 adjuntos62 Mantener stdin y descriptor de archivo 3 adjuntos

48</h3>63</h3>

49 64 

50El stdin del hijo es el canal de control del ejecutor. Las rotaciones de token y las señales de fin de sesión llegan por él. El ejecutor también abre una tubería en el descriptor de archivo 3 y lee de ella las señales de actividad del hijo para controlar los tiempos de espera de inactividad e inicio. Un simple `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` preserva ambos automáticamente.65El stdin del hijo es el canal de control del ejecutor. Las rotaciones de token y las señales de fin de sesión llegan por él. El ejecutor también abre una tubería en el descriptor de archivo 3 y lee de ella las señales de actividad del hijo para controlar los tiempos de espera de inactividad e inicio. Un simple `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` preserva ambos automáticamente.

51 66 

52Si tu contenedor coloca el hijo en segundo plano con un simple `&`, corta el stdin del hijo: la sesión se ve saludable hasta que expira la vida útil de aproximadamente 30 minutos del token OAuth inicial, y luego cada llamada de API falla con `401 authentication_error`. Si tu contenedor debe colocar el hijo en segundo plano, por ejemplo para mantener viva una trampa de desmontaje, guarda stdin en el descriptor de archivo 4 o superior y vuelve a adjuntarlo explícitamente:67Si tu contenedor coloca el hijo en segundo plano con un simple `&`, corta el stdin del hijo. La sesión se ve saludable hasta que expira la vida útil de aproximadamente 30 minutos del token OAuth inicial, y luego cada llamada de API que usa el token falla con `401 authentication_error`. Si tu contenedor debe colocar el hijo en segundo plano, por ejemplo para mantener viva una trampa de desmontaje, guarda stdin en el descriptor de archivo 4 o superior y vuelve a adjuntarlo explícitamente:

53 68 

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

55exec 4<&070exec 4<&0


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

60```75```

61 76 

62No cierres ni reutilices el descriptor de archivo 3 en el contenedor. Redirigir stdout y stderr del hijo está bien.77Puedes redirigir el stdout del hijo. Mantén el descriptor de archivo 3 y stderr adjuntos al ejecutor:

78 

79* **Descriptor de archivo 3**: lleva las señales de actividad del hijo al ejecutor. No lo cierres ni lo reutilices en el contenedor.

80* **stderr**: cuando el contenedor o el hijo salen con un código distinto de cero, el ejecutor publica las últimas líneas de stderr en la sesión y las imprime en su propio registro. El usuario de la sesión ve esas líneas, así que no imprimas secretos en stderr y quita `set -x` antes de implementar el contenedor. Si rediriges stderr, las sesiones siguen ejecutándose, pero el ejecutor informa un fallo solo con el código de salida.

63 81 

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

65 Transmitir los flags del prompt del sistema83 Transmitir los flags del prompt del sistema


108 checkout126 checkout

109</h3>127</h3>

110 128 

111Se ejecuta una vez por repositorio, en lugar del clon y fetch integrados del ejecutor. Usa el hook para clonar desde un espejo de lectura, sembrar un árbol de trabajo desde un archivo, o aplicar autenticación git por sesión. El ejecutor establece estas variables, y puede establecer otras variables `CLAUDE_RUNNER_` que la tabla no enumera:129Se ejecuta una vez por repositorio, en lugar del clon y fetch integrados del ejecutor. Usa el hook para clonar desde un espejo de lectura al que accedes por HTTPS o SSH, sembrar una copia de trabajo desde un archivo, o aplicar autenticación git por sesión. El ejecutor establece estas variables, y puede establecer otras variables `CLAUDE_RUNNER_` que la tabla no enumera:

112 130 

113| Variable | Descripción |131| Variable | Descripción |

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

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

116| `CLAUDE_RUNNER_REPO_REF` | Revisión a verificar: rama, etiqueta o SHA de commit como la sesión lo solicitó. Vacío significa la rama predeterminada del repositorio. |134| `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. |

117| `CLAUDE_RUNNER_CHECKOUT_PATH` | Ruta absoluta donde el árbol de trabajo debe dejarse |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | Ruta absoluta donde el árbol de trabajo debe dejarse |

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

119| `CLAUDE_RUNNER_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica |137| `CLAUDE_RUNNER_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica |

120| `CLAUDE_RUNNER_API_BASE_URL` | URL base de API de Anthropic para llamadas limitadas a sesión |138| `CLAUDE_RUNNER_API_BASE_URL` | URL base de API de Anthropic para llamadas limitadas a sesión |

121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app` o `ios`. No establecido cuando la sesión no tiene una superficie registrada o reconocida. |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app` o `ios`. No se establece cuando la sesión no tiene una superficie registrada o reconocida, así que haz referencia a ella como `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` con `set -u`. Requiere Claude Code v2.1.229 o posterior. |

122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | El token de acceso de sesión, para llamadas de API limitadas a sesión |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | El token de acceso de sesión, para llamadas de API limitadas a sesión |

123| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Ajustes de Git que el ejecutor fija para el git que ejecuta tu hook. [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks) los describe. Requiere Claude Code v2.1.280 o posterior. |141| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Ajustes de Git que el ejecutor fija para el git que ejecuta tu hook. [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks) los describe. Requiere Claude Code v2.1.280 o posterior. |

124 142 

125El script debe dejar un árbol de trabajo en `CLAUDE_RUNNER_CHECKOUT_PATH` verificado en la revisión solicitada. HEAD desacoplado está bien; el ejecutor crea la rama de trabajo de la sesión encima. El ejecutor verifica que la ruta contenga un `.git` después; si su hook materializa una fuente no git como Perforce o un tarball desempaquetado, establezca `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` en el entorno del ejecutor para omitir esa verificación. Los flujos basados en git como la creación de rama de trabajo y el envío de resultados requieren un checkout de git, por lo que exporte resultados de árboles no git con un hook [`post-session`](#post-session).143El script debe dejar una copia de trabajo en `CLAUDE_RUNNER_CHECKOUT_PATH` extraída en la revisión solicitada. Un HEAD desacoplado funciona, porque el ejecutor crea la rama de trabajo de la sesión encima.

126 144 

127El ejecutor no pasa una credencial git al hook. En su lugar, acuñe una credencial de clon por sesión de la identidad de la sesión: verifique `CLAUDE_CODE_SESSION_ACCESS_TOKEN` con una biblioteca JWT estándar contra el punto final JWKS bajo `CLAUDE_RUNNER_API_BASE_URL`, como se describe en [Verificar el token desde su servicio](/docs/es/self-hosted-environments-identity#verify-the-token-from-your-service), luego haga que su servicio de credenciales emita una credencial de clon de corta duración para la identidad en la reclamación `act` del token. `CLAUDE_RUNNER_CLAUDE_BIN` no se establece en el entorno del hook de checkout, por lo que el subcomando `decode-token` no está disponible aquí. Volver a la autenticación git que el host ya tiene, como un agente SSH, ayudante de credenciales o `.netrc`, también es una opción.145Después de que tu hook regresa, el ejecutor verifica que `CLAUDE_RUNNER_CHECKOUT_PATH` contenga un `.git`. Si tu hook materializa una fuente no git como Perforce o un tarball desempaquetado, establece `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` en el entorno del ejecutor para omitir esa verificación. Los flujos basados en git como la creación de la rama de trabajo y el envío de resultados requieren un checkout de git, así que exporta los resultados de copias no git con un [hook `post-session`](#post-session).

128 146 

129Cuando el hook sale con código distinto de cero, o sale con 0 sin dejar un checkout utilizable detrás, lo que hace el ejecutor depende del repositorio:147<h4 id="get-git-credentials-in-the-hook">

148 Obtener credenciales de git en el hook

149</h4>

130 150 

131* **Un repositorio al que la sesión envía resultados**: el ejecutor falla la sesión, y en una salida distinta de cero muestra la cola del stderr del script al usuario.151El ejecutor no pasa una credencial git al hook. El subcomando `decode-token` tampoco está disponible aquí, porque `CLAUDE_RUNNER_CLAUDE_BIN` no se establece en el entorno del hook de checkout. En su lugar, genera una credencial de clon por sesión a partir de la identidad de la sesión, o recurre a la autenticación git propia del host:

132* **Un repositorio que la sesión solo lee**, como un repositorio agregado a una sesión en ejecución: el ejecutor registra una línea `[runner:warn]` con el detalle de falla, publica un paso `Skipped` a la sesión, elimina lo que el hook dejó en la ruta de checkout y continúa con los repositorios restantes. Cuando el ejecutor no puede eliminar la ruta inmediatamente, reintenta la eliminación al final de la sesión. Si omitir deja la sesión sin repositorio en absoluto, el ejecutor falla la sesión de todas formas.

133 152 

134Antes de v2.1.228, el ejecutor fallaba la sesión en un fallo de hook para cualquier repositorio, por lo que un repositorio de solo lectura que el hook no podía servir fallaba la sesión nuevamente en cada ejecutor nuevo en el que la sesión se reanudaba.153* **Credencial de clon por sesión**: verifica `CLAUDE_CODE_SESSION_ACCESS_TOKEN` con una biblioteca JWT estándar contra el endpoint JWKS bajo `CLAUDE_RUNNER_API_BASE_URL`, como se describe en [Verificar el token desde tu servicio](/docs/es/self-hosted-environments-identity#verify-the-token-from-your-service). Luego haz que tu servicio de credenciales emita una credencial de clon de corta duración para la identidad en la reclamación `act` del token. Asocia esa credencial a `act.sub`, y no exijas `act.email`.

154* **Autenticación git del host**: usa la autenticación git que el host ya tenga, como un agente SSH, un ayudante de credenciales o `.netrc`.

135 155 

136El ejecutor elimina la ruta de checkout después de que la sesión termina.156<h4 id="when-the-hook-fails">

157 Cuando el hook falla

158</h4>

159 

160El hook falla cuando sale con código distinto de cero, o sale con 0 sin dejar un checkout utilizable:

161 

162* **Un repositorio al que la sesión envía resultados**: el ejecutor falla la sesión, y en una salida distinta de cero muestra la cola del stderr del script al usuario.

163* **Un repositorio que la sesión solo lee**, como un repositorio agregado a una sesión en ejecución: el ejecutor registra una línea `[runner:warn]` con el detalle del fallo, publica un paso `Skipped` en la sesión, elimina lo que el hook haya dejado en la ruta de checkout y continúa con los repositorios restantes. Si al omitirlo la sesión queda sin ningún repositorio, el ejecutor falla la sesión de todas formas.

164 

165Cuando el hook tiene éxito, el ejecutor elimina la ruta de checkout después de que la sesión termina.

137 166 

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

139 post-session168 post-session


151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Rutas absolutas separadas por dos puntos de los árboles de trabajo de la sesión. Vacío para sesiones sin repositorio. |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Rutas absolutas separadas por dos puntos de los árboles de trabajo de la sesión. Vacío para sesiones sin repositorio. |

152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Ruta al registro de depuración de la sesión, aún en disco mientras se ejecuta el hook |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Ruta al registro de depuración de la sesión, aún en disco mientras se ejecuta el hook |

153| `CLAUDE_RUNNER_API_BASE_URL` | URL base de API de Anthropic para llamadas limitadas a sesión |182| `CLAUDE_RUNNER_API_BASE_URL` | URL base de API de Anthropic para llamadas limitadas a sesión |

154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app` o `ios`. No establecido cuando la sesión no tiene una superficie registrada o reconocida. Requiere Claude Code v2.1.229 o posterior. |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app` o `ios`. No se establece cuando la sesión no tiene una superficie registrada o reconocida, así que haz referencia a ella como `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` con `set -u`. Requiere Claude Code v2.1.229 o posterior. |

155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | El token de acceso de sesión, para llamadas de API limitadas a sesión |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | El token de acceso de sesión, para llamadas de API limitadas a sesión |

156| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Ajustes de Git que el ejecutor fija para el git que ejecuta tu hook. [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks) los describe. Requiere Claude Code v2.1.280 o posterior. |185| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Ajustes de Git que el ejecutor fija para el git que ejecuta tu hook. [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks) los describe. Requiere Claude Code v2.1.280 o posterior. |

157 186 

158`CLAUDE_RUNNER_EXIT_REASON` toma uno de cuatro valores:187`CLAUDE_RUNNER_EXIT_REASON` toma uno de cuatro valores:

159 188 

160* `completed`: la sesión terminó limpiamente. El proceso de Claude Code salió normalmente, o la sesión fue archivada o eliminada mientras aún se estaba ejecutando.189* `completed`: la sesión terminó limpiamente. El proceso de Claude Code salió normalmente, o salió por sí mismo después de que la sesión fue archivada o eliminada.

161* `failed`: el proceso de Claude Code se bloqueó, o la configuración falló después de que comenzó.190* `failed`: el proceso de Claude Code se bloqueó, o la configuración falló después de que comenzó.

162* `interrupted`: el ejecutor detuvo la sesión. Liberó la sesión para liberar la ranura, la sesión agotó el tiempo de espera al inicio, el servidor movió la sesión fuera de este ejecutor, el ejecutor estaba drenando, o la sesión superó su límite [`--kill-session-after-min`](/docs/es/self-hosted-environments-reference#runner-cli-flags).191* `interrupted`: el ejecutor detuvo la sesión, en uno de estos casos:

192 * El ejecutor liberó la sesión para liberar la ranura.

193 * Se agotó el tiempo de espera de la sesión al inicio.

194 * El servidor movió la sesión fuera de este ejecutor.

195 * El sondeo del ejecutor detectó un archivado o una eliminación antes de que el proceso saliera.

196 * El ejecutor estaba drenando.

197 * La sesión superó su límite de [`--kill-session-after-min`](/docs/es/self-hosted-environments-reference#runner-cli-flags).

163* `abandoned`: reservado para una sesión que otro ejecutor reclamó. El hook actualmente no se dispara en ese caso.198* `abandoned`: reservado para una sesión que otro ejecutor reclamó. El hook actualmente no se dispara en ese caso.

164 199 

165Los [contadores de ciclo de vida de sesión](/docs/es/self-hosted-environments-reference#session-lifecycle-counter-semantics) cuentan una liberación, un tiempo de espera de inicio y un movimiento de servidor como `completed` en lugar de `interrupted`, porque el ejecutor devolvió la ranura limpiamente. Espere esa diferencia si compara recibos de hook con los contadores.200Si comparas los recibos del hook con los [contadores de ciclo de vida de sesión](/docs/es/self-hosted-environments-reference#session-lifecycle-counter-semantics), espera que algunos recibos `interrupted` cuenten allí como `completed`. Los contadores cuentan como `completed` una liberación, un tiempo de espera agotado al inicio, un movimiento de servidor y un archivado o eliminación que el sondeo del ejecutor detectó primero, porque el ejecutor devolvió la ranura limpiamente.

166 201 

167El estado de salida del hook nunca afecta el resultado de la sesión; un fallo se registra e ignora. El ejecutor espera hasta `--post-session-hook-timeout-sec`, 60 segundos por defecto, en cada fin de sesión incluido el apagado del ejecutor. Este ejemplo guarda trabajo no confirmado en una rama de rescate:202El estado de salida del hook nunca afecta el resultado de la sesión; un fallo se registra e ignora. El ejecutor espera hasta `--post-session-hook-timeout-sec`, 60 segundos por defecto, en cada fin de sesión incluido el apagado del ejecutor. Este ejemplo guarda trabajo no confirmado en una rama de rescate:

168 203 

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

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

171set -u206set -u

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

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

173# Las sobrescrituras -c prevalecen sobre los ajustes a nivel de repositorio, lo que impide209# -c overrides beat repo-local settings, blocking session-written fsmonitor,

174# que la configuración de fsmonitor, ruta de hooks y programa gpg escrita por la sesión210# hook-path, and gpg-program config from executing code with the hook's

175# ejecute código con los privilegios del hook. -c commit.gpgsign=false también deja211# privileges. -c commit.gpgsign=false also leaves these rescue commits

176# estos commits de rescate sin firmar con --configure-git.212# unsigned under --configure-git.

177# credential.helper y pushurl a nivel de repositorio aún se aplican, y en un ejecutor213# Repo-local credential.helper and pushurl still apply, and on a runner

178# anterior a v2.1.280 también core.sshCommand; si el hook tiene credenciales que214# before v2.1.280 so does core.sshCommand; if the hook holds credentials

179# la sesión no tenía, consulta la nota debajo del script.215# the session didn't, see the note below the script.

180g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \216g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \

181 -c commit.gpgsign=false "$@"; }217 -c commit.gpgsign=false "$@"; }

182for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do218for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do


188done224done

189```225```

190 226 

227La línea `GIT_ALLOW_PROTOCOL` del script limita git a remotos HTTPS, HTTP y SSH. Si el entorno del ejecutor ya establece su propia lista `GIT_ALLOW_PROTOCOL` no vacía, el script conserva esa lista.

228 

191El hook hace push con las credenciales git que estén disponibles en su propio entorno en el host del ejecutor. Con la [postura de no credenciales en la imagen](/docs/es/self-hosted-environments-deploy#configure-git), incluido cuando el clon integrado pasa por el proxy git de Anthropic, no hay ninguna, así que genera una credencial de push de corta duración dentro del hook antes de hacer push: intercambia el token de sesión que el hook recibe en `CLAUDE_CODE_SESSION_ACCESS_TOKEN` con tu propio servicio de tokens, verificándolo como se describe en [Verificar la identidad de sesión](/docs/es/self-hosted-environments-identity). Cuando el hook tiene una credencial que la sesión no tenía, reemplaza `origin` con una URL proporcionada por el operador y pasa `-c credential.helper=` más tu propio ayudante. [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks) describe lo que la configuración escrita por la sesión aún puede afectar.229El hook hace push con las credenciales git que estén disponibles en su propio entorno en el host del ejecutor. Con la [postura de no credenciales en la imagen](/docs/es/self-hosted-environments-deploy#configure-git), incluido cuando el clon integrado pasa por el proxy git de Anthropic, no hay ninguna, así que genera una credencial de push de corta duración dentro del hook antes de hacer push: intercambia el token de sesión que el hook recibe en `CLAUDE_CODE_SESSION_ACCESS_TOKEN` con tu propio servicio de tokens, verificándolo como se describe en [Verificar la identidad de sesión](/docs/es/self-hosted-environments-identity). Cuando el hook tiene una credencial que la sesión no tenía, reemplaza `origin` con una URL proporcionada por el operador y pasa `-c credential.helper=` más tu propio ayudante. [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks) describe lo que la configuración escrita por la sesión aún puede afectar.

192 230 

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


264| `CLAUDE_RUNNER_ORDER_ID` | Clave de idempotencia opaca, única por solicitud de generación y segura para nombres de recursos de Kubernetes. Úsela como clave de deduplicación de su aprovisionador. |302| `CLAUDE_RUNNER_ORDER_ID` | Clave de idempotencia opaca, única por solicitud de generación y segura para nombres de recursos de Kubernetes. Úsela como clave de deduplicación de su aprovisionador. |

265| `CLAUDE_RUNNER_SESSION_ID` | La sesión para la que es esta solicitud. Se repite en cada resolicitud de la sesión, por lo que úsela para registro y enrutamiento, no como clave de deduplicación. Vacío para solicitudes de precalentamiento, que arrancan un ejecutor en espera antes de cualquier sesión específica cuando [`--min-idle`](/docs/es/self-hosted-environments-reference#orchestrator-cli-flags) se establece, por lo que no asuma que la variable se establece. |303| `CLAUDE_RUNNER_SESSION_ID` | La sesión para la que es esta solicitud. Se repite en cada resolicitud de la sesión, por lo que úsela para registro y enrutamiento, no como clave de deduplicación. Vacío para solicitudes de precalentamiento, que arrancan un ejecutor en espera antes de cualquier sesión específica cuando [`--min-idle`](/docs/es/self-hosted-environments-reference#orchestrator-cli-flags) se establece, por lo que no asuma que la variable se establece. |

266| `CLAUDE_RUNNER_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica. Vacío para solicitudes de precalentamiento. |304| `CLAUDE_RUNNER_SESSION_UUID` | El mismo ID de sesión en forma UUID canónica. Vacío para solicitudes de precalentamiento. |

267| `CLAUDE_RUNNER_ATTEMPT` | Cuántas solicitudes de generación ha tenido esta sesión. `0` para solicitudes de precalentamiento. |305| `CLAUDE_RUNNER_ATTEMPT` | Un contador por sesión para usar en el registro. No es un recuento de reintentos ni un recuento de solicitudes. `0` para solicitudes de precalentamiento, aunque una solicitud para una sesión también puede llevar `0`. |

268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Hora del servidor del encabezado HTTP `Date` de la respuesta de sondeo. Cuando el hook verifica el `exp` del JWT de orden de trabajo, compare contra este valor en lugar del reloj local para tolerar sesgo. Vacío cuando la puerta de enlace omitió el encabezado. |306| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Hora del servidor del encabezado HTTP `Date` de la respuesta de sondeo. Cuando el hook verifica el `exp` del JWT de orden de trabajo, compare contra este valor en lugar del reloj local para tolerar sesgo. Vacío cuando la puerta de enlace omitió el encabezado. |

269| `CLAUDE_RUNNER_POOL_ID` | El ID del entorno al que el nuevo ejecutor debe unirse, en forma `ccpool_...` |307| `CLAUDE_RUNNER_POOL_ID` | El ID del entorno al que el nuevo ejecutor debe unirse, en forma `ccpool_...` |

270| `CLAUDE_RUNNER_ACCOUNT_ID` | ID etiquetado de la cuenta que encoló la sesión, para enrutamiento por cuenta, cuota o contracargo. Vacío cuando no está disponible, y siempre vacío para sesiones de canal Claude Tag, que ninguna cuenta encola. |308| `CLAUDE_RUNNER_ACCOUNT_ID` | ID etiquetado de la cuenta que encoló la sesión, para enrutamiento por cuenta, cuota o contracargo. Vacío cuando no está disponible, y siempre vacío para sesiones de canal Claude Tag, que ninguna cuenta encola. |

271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Correo electrónico de la cuenta que encoló la sesión. Vacío cuando no está disponible. Trate el correo electrónico como información de identificación personal y no lo registre. |309| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Correo electrónico de la cuenta que encoló la sesión. Vacío cuando no está disponible. Trate el correo electrónico como información de identificación personal y no lo registre. |

272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL de la primera fuente git de la sesión, para enrutamiento a un ejecutor con ese repositorio precalentado. Vacío cuando la sesión no tiene fuentes git. |310| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL de la primera fuente git de la sesión, para enrutamiento a un ejecutor con ese repositorio precalentado. Vacío cuando la sesión no tiene fuentes git. |

273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Revisión de la primera fuente git de la sesión: rama, SHA o etiqueta. Vacío cuando no se especifica. |311| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Revisión de la primera fuente git de la sesión: rama, SHA, etiqueta o nombre de referencia completo. Vacío cuando no se especifica. |

274| `CLAUDE_RUNNER_REPO_SOURCES` | Matriz JSON de `{url, revision}` para todas las fuentes git de la sesión, para hooks que enrutan en un repositorio secundario. Vacío cuando no hay fuentes. |312| `CLAUDE_RUNNER_REPO_SOURCES` | Matriz JSON de `{url, revision}` para todas las fuentes git de la sesión, para hooks que enrutan en un repositorio secundario. Vacío cuando no hay fuentes. |

275| `CLAUDE_RUNNER_CORRELATION_ID` | El ID de correlación proporcionado en la creación de sesión, devuelto para que el hook pueda asignar esta orden de trabajo a la solicitud que creó la sesión. Vacío cuando la sesión no tiene ninguno. |313| `CLAUDE_RUNNER_CORRELATION_ID` | El ID de correlación proporcionado en la creación de sesión, devuelto para que el hook pueda asignar esta orden de trabajo a la solicitud que creó la sesión. Vacío cuando la sesión no tiene ninguno. |

276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app`, `ios` o `scheduled_trigger`, para análisis de adopción. No establecido cuando la sesión no tiene una superficie registrada o reconocida, y para solicitudes de precalentamiento; verifíquelo con `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, que permanece seguro bajo `set -u`. |314| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La superficie del cliente que creó la sesión, como `web_claude_ai`, `desktop_app`, `ios` o `scheduled_trigger`, para análisis de adopción. No establecido cuando la sesión no tiene una superficie registrada o reconocida, y para solicitudes de precalentamiento; verifíquelo con `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, que permanece seguro bajo `set -u`. |


282* **Use `--capacity 1` en ejecutores generados**: una orden de trabajo vinculada a sesión registra exactamente un ejecutor vinculado a esa sesión, por lo que una capacidad más alta agrega espacios que nunca reciben trabajo, y el ejecutor registra una advertencia al inicio.320* **Use `--capacity 1` en ejecutores generados**: una orden de trabajo vinculada a sesión registra exactamente un ejecutor vinculado a esa sesión, por lo que una capacidad más alta agrega espacios que nunca reciben trabajo, y el ejecutor registra una advertencia al inicio.

283* **Las órdenes de trabajo de precalentamiento registran sin vincular**: el ejecutor en espera no está vinculado a una sesión y reclama trabajo en cola como un ejecutor de flota fija.321* **Las órdenes de trabajo de precalentamiento registran sin vincular**: el ejecutor en espera no está vinculado a una sesión y reclama trabajo en cola como un ejecutor de flota fija.

284 322 

285El contrato tiene cuatro reglas agnósticas del aprovisionador:323El contrato tiene cuatro reglas, sea cual sea la plataforma en la que tu hook aprovisiona:

286 324 

2871. **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.3251. **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.

2882. **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`.3262. **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`.

2893. **Use el contrato de código de salida.** Salida 0 significa enviado. Salida 1 significa fallo reintentable; la sesión retrocede y se reintenta. Salida 2 o superior significa no reintentable; la sesión se bloquea de generar nuevamente hasta que un [Propietario](/docs/es/cloud-environments#organization-shared-environments) selecciona **Retry** en ella en la pestaña **Activity** del entorno. En salida distinta de cero, la cola del stderr del hook aparece allí como la razón de falla, por lo que escriba el error procesable a stderr y nunca secretos. Para una solicitud de precalentamiento no hay sesión para fallar: el orquestador registra una salida distinta de cero localmente solamente, y el servidor reintenta la generación después del arrendamiento.3273. **Usa el contrato de código de salida.** Sal con el estado que corresponda al resultado:

2904. **Establezca `--expected-spawn-seconds` a al menos su tiempo de arranque p99.** Este es el arrendamiento del lado del servidor. Todas las réplicas del orquestador deben usar el mismo valor.328 

329 * **Salida 0**: enviado.

330 * **Salida 1**: fallo reintentable. La sesión espera un tiempo y se vuelve a ofrecer.

331 * **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](/docs/es/cloud-environments#organization-shared-environments) seleccione **Retry** en ella en la pestaña **Activity** del entorno.

332 

333 En una salida distinta de cero, el final del stderr del hook aparece en la pestaña **Activity** como la razón del fallo, así que escribe el error procesable en stderr y nunca escribas secretos allí. En un hook de shell, [mantén los fallos transitorios reintentables](#keep-transient-failures-retryable-in-a-shell-hook).

334 

335 Una solicitud de precalentamiento no tiene sesión que pueda fallar: el orquestador registra una salida distinta de cero solo localmente, y el servidor vuelve a solicitar la generación después de que expira el arrendamiento de `--expected-spawn-seconds`.

3364. **Establece `--expected-spawn-seconds` en al menos tu tiempo p99 desde la solicitud de generación hasta el registro del ejecutor.** Mide desde el momento en que el orquestador recibe la solicitud de generación, e incluye cualquier espera de capacidad en tu plataforma además del tiempo de arranque. Este valor es el arrendamiento del lado del servidor, y la orden de trabajo expira con él, por lo que un ejecutor cuya carga de trabajo tarde más no puede registrarse. Todas las réplicas del orquestador deben usar el mismo valor.

291 337 

292Todo 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.338Todo 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.

293 339 

294Una 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.340Una 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.

295 341 

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

343 Mantén los fallos transitorios reintentables en un hook de shell

344</h4>

345 

346En un hook de shell que usa `set -e`, un fallo que un reintento podría haber resuelto puede bloquear la sesión. El hook se detiene en el comando que falla y sale con el estado propio de ese comando, y el orquestador aplica el contrato de código de salida a ese estado. Muchos fallos devuelven un estado de 2 o superior, como `127` cuando un comando no está instalado y `22` de `curl --fail` ante un error HTTP, por lo que bloquean la sesión en su primer fallo.

347 

348Una sesión que el hook ya bloqueó permanece bloqueada hasta que un usuario le envíe un mensaje nuevo o un [Propietario](/docs/es/cloud-environments#organization-shared-environments) seleccione **Retry** en ella en la pestaña **Activity** del entorno.

349 

350Para convertir ese tipo de fallo en una salida 1, coloca estas líneas justo debajo de la línea `#!` del hook, por encima de cualquier cosa que pueda fallar:

351 

352```bash theme={null}

353set -e

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

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

356```

357 

358Estas líneas cambian cómo se comporta el resto del hook, así que revísalo en busca de cada uno de estos patrones después de agregarlas:

359 

360* **`exit 2` o superior a secas**: con el trap establecido, se convierte en salida 1. Para un error que ningún reintento puede corregir, llama a `permanent` con el motivo en su lugar, como `permanent "namespace claude-runners does not exist"`. Llámalo en el shell principal, no dentro de `$( )`, `( )` ni de una tubería.

361* **`exec`**: no inicies el último comando del hook con `exec`, porque `exec` reemplaza el shell y el trap no se ejecuta.

362* **Segundo trap `EXIT`**: un segundo `trap ... EXIT` reemplaza al primero, así que combina los dos en un solo trap. Coloca tus comandos de limpieza justo después de `rc=$?;` y termina cada uno con `|| true;`. Así la limpieza se ejecuta tanto en caso de fallo como de éxito, y un comando de limpieza que falla no establece el estado de salida del hook. Este trap combinado muestra la forma, con `your-cleanup-command` en lugar de tu propio comando:

363 

364 ```bash theme={null}

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

366 ```

367* **Comandos a los que se les permite fallar**: si el hook no usaba `set -e` antes, ahora se detiene en el primer comando que devuelve un valor distinto de cero, como una búsqueda que no encuentra nada o un envío duplicado que tu plataforma rechaza. Si el hook actúa según el resultado, convierte ese comando en la condición de un `if`. Si ignora el resultado, añade `|| true` después del comando.

368 

369Para confirmar que el trap funciona, agrega justo debajo de la línea `trap` una línea que llame a un comando que no existe, como `no-such-command`. Ejecuta el archivo del hook desde tu shell y comprueba que `echo $?` imprima `1`; luego elimina la línea.

370 

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

297 Enviar solicitudes de modelo a Bedrock o Agent Platform372 Enviar solicitudes de modelo a Bedrock o Agent Platform

298</h2>373</h2>


381Una sesión que envía solicitudes de modelo a Amazon Bedrock o a Agent Platform de Google Cloud difiere de una sesión en la API de Anthropic en estos aspectos:456Una sesión que envía solicitudes de modelo a Amazon Bedrock o a Agent Platform de Google Cloud difiere de una sesión en la API de Anthropic en estos aspectos:

382 457 

383* **Políticas de claude.ai**: la [configuración administrada por el servidor](/docs/es/server-managed-settings) no llega a estas sesiones. Tampoco llegan las políticas de organización que un Owner establece en la configuración de administración de Claude Code, por lo que Claude Code no las aplica dentro de la sesión. Coloca las reglas de las que dependes en el [archivo de configuración administrada](/docs/es/managed-settings#delivery-mechanisms) de la imagen del runner.458* **Políticas de claude.ai**: la [configuración administrada por el servidor](/docs/es/server-managed-settings) no llega a estas sesiones. Tampoco llegan las políticas de organización que un Owner establece en la configuración de administración de Claude Code, por lo que Claude Code no las aplica dentro de la sesión. Coloca las reglas de las que dependes en el [archivo de configuración administrada](/docs/es/managed-settings#delivery-mechanisms) de la imagen del runner.

459* **Skills de la cuenta**: estas sesiones no descargan los skills habilitados para la cuenta de claude.ai de una persona. Consulta [Cómo se ensambla la configuración de cada sesión](#how-each-session’s-config-is-assembled).

384* **Archivos**: los archivos que las personas adjuntan a una sesión en claude.ai o en la aplicación móvil o de escritorio no llegan a ella, y Claude no puede devolver archivos con la [herramienta `SendUserFile`](/docs/es/tools-reference). En su lugar, coloca los archivos de entrada en el repositorio o en el runner.460* **Archivos**: los archivos que las personas adjuntan a una sesión en claude.ai o en la aplicación móvil o de escritorio no llegan a ella, y Claude no puede devolver archivos con la [herramienta `SendUserFile`](/docs/es/tools-reference). En su lugar, coloca los archivos de entrada en el repositorio o en el runner.

385* **Selección de modelo**: el plano de control de Anthropic envía el modelo de cada sesión y, cuando una sesión se inicia sin uno, Claude Code usa su modelo predeterminado para el proveedor. El runner elimina `ANTHROPIC_MODEL` y `ANTHROPIC_DEFAULT_MODEL` del entorno que pasa a las sesiones. Los ejemplos de las páginas de los proveedores establecen `ANTHROPIC_MODEL`, pero en el entorno del runner ninguna de las dos variables tiene efecto. Las variables por familia de Fijar versiones de modelos para [Amazon Bedrock](/docs/es/amazon-bedrock#4-pin-model-versions) y [Agent Platform](/docs/es/google-vertex-ai#5-pin-model-versions) sí llegan a las sesiones. Deciden a qué se resuelve un alias como `opus`, no a qué se resuelve un ID de modelo completo.461* **Selección de modelo**: el plano de control de Anthropic envía el modelo de cada sesión y, cuando una sesión se inicia sin uno, Claude Code usa su modelo predeterminado para el proveedor. No puedes elegir el modelo con `ANTHROPIC_MODEL` ni con `ANTHROPIC_DEFAULT_MODEL` en el entorno del runner, pero sí puedes fijar a qué se resuelve un alias:

462 * **`ANTHROPIC_MODEL` y `ANTHROPIC_DEFAULT_MODEL`**: el runner las elimina del entorno que pasa a las sesiones, aunque los ejemplos de las páginas de los proveedores establezcan `ANTHROPIC_MODEL`.

463 * **Variables de fijación por familia**: las variables de Fijar versiones de modelos para [Amazon Bedrock](/docs/es/amazon-bedrock#4-pin-model-versions) y [Agent Platform](/docs/es/google-vertex-ai#5-pin-model-versions) sí llegan a las sesiones. Deciden a qué se resuelve un alias como `opus`, no a qué se resuelve un ID de modelo completo.

386* **Modelos que tu cuenta no ofrece**: una sesión puede fallar en un mensaje con un error que nombra el modelo. Habilita los modelos que tus desarrolladores pueden elegir, el modelo en segundo plano descrito en Fijar versiones de modelos y el modelo clasificador que usa el [modo automático](/docs/es/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). En Amazon Bedrock, permite cada uno de ellos en tu política.464* **Modelos que tu cuenta no ofrece**: una sesión puede fallar en un mensaje con un error que nombra el modelo. Habilita los modelos que tus desarrolladores pueden elegir, el modelo en segundo plano descrito en Fijar versiones de modelos y el modelo clasificador que usa el [modo automático](/docs/es/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). En Amazon Bedrock, permite cada uno de ellos en tu política.

387* **Búsqueda web y modo rápido**: la [búsqueda web](/docs/es/tools-reference#websearch-tool-behavior) no está disponible en Amazon Bedrock, y el [modo rápido](/docs/es/fast-mode) no está disponible en ninguno de los dos proveedores. Para otras capacidades que varían según el proveedor, consulta [Capacidades de la CLI que varían según el proveedor](/docs/es/feature-availability#cli-capabilities-that-vary-by-provider).465* **Búsqueda web y modo rápido**: la [búsqueda web](/docs/es/tools-reference#websearch-tool-behavior) no está disponible en Amazon Bedrock, y el [modo rápido](/docs/es/fast-mode) no está disponible en ninguno de los dos proveedores. Para otras capacidades que varían según el proveedor, consulta [Capacidades de la CLI que varían según el proveedor](/docs/es/feature-availability#cli-capabilities-that-vary-by-provider).

388 466 


411 489 

412Las sesiones heredan el entorno del runner, así que define [`ENABLE_TOOL_SEARCH`](/docs/es/mcp#scale-with-mcp-tool-search) allí para controlar la búsqueda de herramientas MCP en cada sesión que inicie un runner; la página de MCP describe los valores.490Las sesiones heredan el entorno del runner, así que define [`ENABLE_TOOL_SEARCH`](/docs/es/mcp#scale-with-mcp-tool-search) allí para controlar la búsqueda de herramientas MCP en cada sesión que inicie un runner; la página de MCP describe los valores.

413 491 

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

493 

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

495 Esperar a los servidores MCP antes del primer turno

496</h3>

497 

498Una sesión autohospedada espera brevemente a los servidores MCP que aún se están conectando, en dos momentos distintos. Si un servidor no llega a tiempo a una de las esperas, sus herramientas faltan cuando comienza el primer turno, y quedan disponibles más tarde sin que tengas que hacer nada. Las dos esperas son:

499 

500* **Inicio de la sesión**: antes de que se tome la lista de herramientas por primera vez, la sesión espera de forma predeterminada hasta 5 segundos a un servidor HTTP o SSE cuya entrada defina [`alwaysLoad: true`](/docs/es/mcp#exempt-a-server-from-deferral), o a todos los servidores cuando defines [`MCP_CONNECTION_NONBLOCKING=0`](/docs/es/env-vars) en el entorno del runner. En los demás casos, los servidores HTTP y SSE se conectan en segundo plano. Mientras la sesión espera aquí, tarda más en inicializarse. [`MCP_CONNECT_TIMEOUT_MS`](/docs/es/env-vars) cambia el valor predeterminado de 5 segundos.

501* **Primer turno**: después de que llega el mensaje, el primer turno espera hasta 2 segundos a los servidores stdio que aún se están conectando. Mientras la sesión espera aquí, la primera respuesta tarda más. Para cambiar cuánto dura esta espera, define [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/es/env-vars) en el entorno del runner. No cambia qué servidores abarca la espera. Requiere Claude Code v2.1.274 o posterior.

502 

503`claude mcp add` no tiene un flag `alwaysLoad`. Para definir la clave, agrega el servidor con `claude mcp add-json`, que la recibe en el JSON del servidor y la escribe en `.claude.json`. En tu Dockerfile:

504 

505```dockerfile theme={null}

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

507```

508 

509Si las herramientas de un servidor tampoco aparecen en turnos posteriores, comprueba si el servidor llegó a la sesión, como se describe en [Servidores MCP](#mcp-servers).

510 

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

415 Desactivar las herramientas de sesión integradas512 Desactivar las herramientas de sesión integradas

416</h3>513</h3>


571 668 

572Establezca `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` para sembrar desde una ruta diferente, o apúntelo a un directorio vacío para deshabilitar la siembra.669Establezca `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` para sembrar desde una ruta diferente, o apúntelo a un directorio vacío para deshabilitar la siembra.

573 670 

574El `.claude/settings.json` confirmado en el repositorio se superpone como configuración del proyecto. En una sesión con varios repositorios, [como máximo tiene efecto el archivo de un solo repositorio](#repository-settings-in-sessions-with-several-repositories). Las sesiones también leen [`managed-settings.json`](/docs/es/settings#where-settings-live) desde la ruta estándar del sistema en tu imagen del ejecutor. Si sus claves se aplican junto con la [configuración administrada por el servidor](/docs/es/server-managed-settings) depende de [cómo Claude Code combina las fuentes administradas](/docs/es/managed-settings#how-claude-code-combines-managed-sources): de forma predeterminada, cuando tu organización entrega cualquier clave administrada por el servidor, las sesiones ignoran el archivo de la imagen del ejecutor, salvo las [claves que Claude Code lee de todas las fuentes de administrador](/docs/es/managed-settings#keys-read-from-every-admin-source), como el bloque `env`, los bloqueos del sandbox, las rutas de los binarios del sandbox y `forceRemoteSettingsRefresh`. Consulta [precedencia de configuración](/docs/es/settings#settings-precedence).671Las sesiones también leen estos archivos de configuración:

672 

673* **Configuración del proyecto**: un `.claude/settings.json` confirmado en el repositorio se superpone a la línea de base a nivel de usuario. En una sesión con varios repositorios, [como máximo tiene efecto el archivo de un solo repositorio](#repository-settings-in-sessions-with-several-repositories).

674* **Configuración administrada**: las sesiones leen [`managed-settings.json`](/docs/es/settings#where-settings-live) desde la ruta estándar del sistema en tu imagen del ejecutor. Para saber si sus claves se aplican junto con la [configuración administrada por el servidor](/docs/es/server-managed-settings), consulta [cómo Claude Code combina las fuentes administradas](/docs/es/managed-settings#how-claude-code-combines-managed-sources).

675 

676Para conocer el orden en que se aplican estas fuentes, consulta [precedencia de configuración](/docs/es/settings#settings-precedence).

575 677 

576Cuando el plano de control de Anthropic proporciona una sesión con [hooks de Claude Code](/docs/es/hooks), el ejecutor los instala junto a, no sobre, su propia configuración. Requiere Claude Code v2.1.229 o posterior.678Cuando el plano de control de Anthropic proporciona una sesión con [hooks de Claude Code](/docs/es/hooks), el ejecutor los instala junto a, no sobre, su propia configuración. Requiere Claude Code v2.1.229 o posterior.

577 679 


579* **Quién los autor**: el plano de control puebla los scripts desde constantes fijas en su propia implementación, nunca desde entrada por sesión o de terceros.681* **Quién los autor**: el plano de control puebla los scripts desde constantes fijas en su propia implementación, nunca desde entrada por sesión o de terceros.

580* **Qué aún los rige**: los hooks entregados a través de `--settings` entran en la configuración de hook ordinaria fusionada, no en el nivel administrado, por lo que su configuración administrada aún se aplica. `disableAllHooks` los deshabilita, y no están entre las categorías que [`allowManagedHooksOnly`](/docs/es/settings-reference#allowmanagedhooksonly) mantiene cargadas.682* **Qué aún los rige**: los hooks entregados a través de `--settings` entran en la configuración de hook ordinaria fusionada, no en el nivel administrado, por lo que su configuración administrada aún se aplica. `disableAllHooks` los deshabilita, y no están entre las categorías que [`allowManagedHooksOnly`](/docs/es/settings-reference#allowmanagedhooksonly) mantiene cargadas.

581 683 

684Cuando una persona inicia su propia sesión, Claude Code también descarga los [skills habilitados para su cuenta de claude.ai](/docs/es/skills#skills-in-cowork-and-cloud-sessions) en el directorio de configuración de esa sesión. Una ejecución de una [rutina](/docs/es/routines) no recibe los skills de su propietario, y una sesión que [envía solicitudes de modelo a Bedrock o Agent Platform](#send-model-requests-to-bedrock-or-agent-platform) no descarga ninguno. Para un skill que esas sesiones necesiten, haz commit de él en el `.claude/skills/` del repositorio o agrégalo a tu imagen del ejecutor.

685 

582Fuera de las sesiones de [Claude Tag](https://claude.com/docs/claude-tag/overview), una sesión en un entorno autohospedado se ejecuta con la [memoria automática](/docs/es/memory#auto-memory) desactivada de forma predeterminada. Para instrucciones que deban mantenerse entre sesiones, usa el `CLAUDE.md` de tu imagen del ejecutor o del repositorio.686Fuera de las sesiones de [Claude Tag](https://claude.com/docs/claude-tag/overview), una sesión en un entorno autohospedado se ejecuta con la [memoria automática](/docs/es/memory#auto-memory) desactivada de forma predeterminada. Para instrucciones que deban mantenerse entre sesiones, usa el `CLAUDE.md` de tu imagen del ejecutor o del repositorio.

583 687 

584La 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.688La 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.

Details

20 20 

21* **Contenedores efímeros por sesión**: ejecuta cada proceso de runner en un contenedor o VM nuevo que se destruya cuando el proceso salga, con `--capacity 1` y el `--drain-grace-sec 0` predeterminado para que cada contenedor sirva exactamente una sesión. Con una capacidad más alta, o con un drenaje de gracia positivo, un contenedor sirve múltiples sesiones del mismo [propietario bloqueado](/docs/es/self-hosted-environments#key-concepts); consulta [Ciclo de vida del runner](/docs/es/self-hosted-environments#runner-lifecycle). No reutilices un sistema de archivos entre reinicios de runner, excepto en la configuración deliberada de [checkout precalentado](#reuse-a-pre-warmed-checkout), y nunca entre propietarios.21* **Contenedores efímeros por sesión**: ejecuta cada proceso de runner en un contenedor o VM nuevo que se destruya cuando el proceso salga, con `--capacity 1` y el `--drain-grace-sec 0` predeterminado para que cada contenedor sirva exactamente una sesión. Con una capacidad más alta, o con un drenaje de gracia positivo, un contenedor sirve múltiples sesiones del mismo [propietario bloqueado](/docs/es/self-hosted-environments#key-concepts); consulta [Ciclo de vida del runner](/docs/es/self-hosted-environments#runner-lifecycle). No reutilices un sistema de archivos entre reinicios de runner, excepto en la configuración deliberada de [checkout precalentado](#reuse-a-pre-warmed-checkout), y nunca entre propietarios.

22 * <span id="processes-a-stopped-session-leaves" />Cuando el runner detiene una sesión, no envía ninguna señal a un proceso que siga en ejecución después de que su comando de shell terminó, como un servicio que se convirtió en daemon. Destruir el contenedor o la VM finaliza ese proceso.22 * <span id="processes-a-stopped-session-leaves" />Cuando el runner detiene una sesión, no envía ninguna señal a un proceso que siga en ejecución después de que su comando de shell terminó, como un servicio que se convirtió en daemon. Destruir el contenedor o la VM finaliza ese proceso.

23* **Sin credenciales amplias en la imagen**: no incluya claves SSH de larga duración, credenciales de proveedor de nube, o tokens de acceso personal que otorguen más de lo que una sesión necesita. Genere credenciales utilizadas durante una sesión, como tokens de push o API, por sesión desde su [script de envoltura](/docs/es/self-hosted-environments-configuration#wrapper-scripts). Para el clon inicial, que ocurre antes de que se ejecute el envoltura, use un [hook de ciclo de vida `checkout`](/docs/es/self-hosted-environments-configuration#checkout) o [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy); consulte [Configurar git](#configure-git).23* **Sin credenciales amplias en la imagen**: no incluyas claves SSH de larga duración, credenciales de proveedor de nube, o tokens de acceso personal que otorguen más de lo que una sesión necesita. Genera las credenciales utilizadas durante una sesión, como tokens de push o de API, por sesión desde tu [script de envoltura](/docs/es/self-hosted-environments-configuration#wrapper-scripts). El clon inicial ocurre antes de que se ejecute el script de envoltura, así que gestiónalo con un [hook de ciclo de vida `checkout`](/docs/es/self-hosted-environments-configuration#checkout), o con [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) cuando todos los repositorios de una sesión estén en github.com. Para ambos casos, consulta [Configurar git](#configure-git).

24* **Mantén las credenciales de GitHub del host lejos de las sesiones**: Claude puede usar cualquier credencial de GitHub que una sesión pueda leer, con el acceso que esa credencial otorgue. Mantén las credenciales de GitHub de alcance amplio del propio host del runner fuera de todo lo que una sesión pueda leer. Una credencial así puede ser un token de acceso personal, el token que `gh auth login` guarda para tu cuenta, o un `GH_TOKEN` en el entorno del runner.

25 * **Con [git administrado por Anthropic](#use-the-anthropic-git-proxy)**: con una credencial así, Claude llega a GitHub directamente en lugar de hacerlo a través del git administrado por Anthropic.

26 * **Sin git administrado por Anthropic**: una credencial de clonación puede permanecer en la imagen si limitas su alcance tan estrictamente como describe [Incluir la configuración de git en tu imagen](#ship-git-config-in-your-image).

24* **Mantenga el secreto del entorno fuera de los hosts que ejecutan sesiones**: el secreto del entorno puede registrar runners y recoger cualquier sesión en cola en el entorno. En una flota fija vive en cada host de runner, donde el código de cualquier sesión puede leer el archivo secreto. Prefiera [runners bajo demanda](/docs/es/self-hosted-environments-configuration#on-demand-runners), donde el secreto permanece en el host del orquestador, que nunca ejecuta código de usuario, y cada runner recibe una orden de trabajo de un solo uso que registra exactamente un runner. En una flota fija, trate el archivo de secreto del entorno como legible por cada sesión y rote el secreto después de cualquier compromiso de sesión sospechoso.27* **Mantenga el secreto del entorno fuera de los hosts que ejecutan sesiones**: el secreto del entorno puede registrar runners y recoger cualquier sesión en cola en el entorno. En una flota fija vive en cada host de runner, donde el código de cualquier sesión puede leer el archivo secreto. Prefiera [runners bajo demanda](/docs/es/self-hosted-environments-configuration#on-demand-runners), donde el secreto permanece en el host del orquestador, que nunca ejecuta código de usuario, y cada runner recibe una orden de trabajo de un solo uso que registra exactamente un runner. En una flota fija, trate el archivo de secreto del entorno como legible por cada sesión y rote el secreto después de cualquier compromiso de sesión sospechoso.

25* **Salida de red de negación predeterminada**: restrinja el tráfico saliente del contenedor de runner y sesión en su propio límite de red en cada entorno; [Salida de negación predeterminada](#default-deny-egress) cubre qué permitir y por qué.28* **Salida de red de negación predeterminada**: restrinja el tráfico saliente del contenedor de runner y sesión en su propio límite de red en cada entorno; [Salida de negación predeterminada](#default-deny-egress) cubre qué permitir y por qué.

26* **IAM de host con privilegios mínimos**: la identidad de cálculo adjunta al host del runner, como un perfil de instancia o una cuenta de servicio de nodo, debe otorgar solo lo que el runner en sí necesita. Las sesiones deben obtener sus propias credenciales a través de su script de envoltura en lugar de heredar las del host.29* **IAM de host con privilegios mínimos**: la identidad de cálculo adjunta al host del runner, como un perfil de instancia o una cuenta de servicio de nodo, debe otorgar solo lo que el runner en sí necesita. Las sesiones deben obtener sus propias credenciales a través de su script de envoltura en lugar de heredar las del host.


42 La protección se ejecuta independientemente de [`--trust-workspace`](/docs/es/self-hosted-environments-reference#runner-cli-flags), y no cubre hooks de repositorio, `.mcp.json`, o reglas de Bash; consulte [Permisos y aprobación de herramientas](/docs/es/self-hosted-environments-configuration#permissions-and-tool-approval) para saber dónde pertenecen esas concesiones.45 La protección se ejecuta independientemente de [`--trust-workspace`](/docs/es/self-hosted-environments-reference#runner-cli-flags), y no cubre hooks de repositorio, `.mcp.json`, o reglas de Bash; consulte [Permisos y aprobación de herramientas](/docs/es/self-hosted-environments-configuration#permissions-and-tool-approval) para saber dónde pertenecen esas concesiones.

43 46 

44<Note>47<Note>

45 La lista de permitidos de IP de su organización no cubre el tráfico de runner autohospedado por defecto. No confíe en ella como control de red para el tráfico de runner o sesión; aplique salida de negación predeterminada en su propio límite de red en su lugar, y contacte a su equipo de cuenta de Anthropic si desea aplicación de lista de permitidos de IP para su organización.48 Si tu organización tiene habilitada la [lista de IP permitidas](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting), agrega las direcciones públicas de salida de tus runners y contenedores de sesión a la lista de permitidos antes de iniciarlos. Si ejecutas [runners bajo demanda](/docs/es/self-hosted-environments-configuration#on-demand-runners), agrega también la dirección del host del orquestador. No confíes en la lista de permitidos como control de red para el tráfico de runners o sesiones. En su lugar, aplica salida con denegación predeterminada en tu propio límite de red.

46</Note>49</Note>

47 50 

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


55 58 

56| Host | Puerto | Utilizado para |59| Host | Puerto | Utilizado para |

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

58| `api.anthropic.com` | 443, HTTPS; WSS solo para el conector SCM | Plano de control del runner y transmisión de sesión, inferencia de modelo, banderas de características, análisis de productos, obtenciones de claves [JWKS](/docs/es/self-hosted-environments-identity), firma de commits, el proxy de git cuando se establece `--use-anthropic-git-proxy`, y el túnel del [conector SCM](/docs/es/self-hosted-environments-reference#scm-connector-flags) del orquestador cuando se establece `--scm-connector-host` |61| `api.anthropic.com` | 443, HTTPS; WSS para [git administrado por Anthropic](#use-the-anthropic-git-proxy) | Plano de control del runner y streaming de sesiones, inferencia de modelos, banderas de características, análisis de productos, obtenciones de claves [JWKS](/docs/es/self-hosted-environments-identity), firma de commits y git administrado por Anthropic cuando se establece `--use-anthropic-git-proxy` |

59| Su host de git, como `github.com` o su host de GitHub Enterprise | 443 o 22 | Clonación e inserción de repositorios. No es necesario si el runner usa `--use-anthropic-git-proxy`, que enruta el tráfico de git a través de `api.anthropic.com`. |62| Tu host de git, como `github.com` o tu host de GitHub Enterprise | 443 o 22 | Clonación y push de repositorios en cada host de git que usan las sesiones del runner. En un runner que usa [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), consulta [cuándo se sigue necesitando la ruta de `github.com`](#github-com-egress-with-the-anthropic-git-proxy). |

63 

64<span id="github-com-egress-with-the-anthropic-git-proxy" />Un runner que usa [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) enruta su tráfico de git de `github.com` a través de `api.anthropic.com`, por lo que no necesita la ruta al host de git para `github.com`. Aún necesita esa ruta si estableces `--push-outcome-on-release` o haces push desde un hook `post-session`.

60 65 

61Si estos hosts son necesarios depende de su configuración:66Si estos hosts son necesarios depende de su configuración:

62 67 


71| `browser-intake-us5-datadoghq.com` | 443 | Cargas de informes de errores de Anthropic, enviadas solo cuando [informe de errores](/docs/es/data-usage#telemetry-services) está habilitado para la cuenta de la sesión. Suprimido por `DISABLE_ERROR_REPORTING=1` o `DISABLE_TELEMETRY=1`. |76| `browser-intake-us5-datadoghq.com` | 443 | Cargas de informes de errores de Anthropic, enviadas solo cuando [informe de errores](/docs/es/data-usage#telemetry-services) está habilitado para la cuenta de la sesión. Suprimido por `DISABLE_ERROR_REPORTING=1` o `DISABLE_TELEMETRY=1`. |

72| Los endpoints de tu proveedor de nube para solicitudes de modelo, búsquedas de modelos y renovación de credenciales, como `bedrock-runtime.us-east-1.amazonaws.com` o `aiplatform.googleapis.com` | 443 | Solo cuando el runner [envía solicitudes de modelo a Amazon Bedrock o a Agent Platform de Google Cloud](/docs/es/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |77| Los endpoints de tu proveedor de nube para solicitudes de modelo, búsquedas de modelos y renovación de credenciales, como `bedrock-runtime.us-east-1.amazonaws.com` o `aiplatform.googleapis.com` | 443 | Solo cuando el runner [envía solicitudes de modelo a Amazon Bedrock o a Agent Platform de Google Cloud](/docs/es/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |

73 78 

74El runner no alcanza `statsig.anthropic.com`, `*.sentry.io`, `claude.ai`, o `platform.claude.com`. Estos hosts aparecen en algunas listas de verificación de red empresarial más antiguas, pero no necesita permitirlos para el tráfico de runner o sesión: las obtenciones de banderas de características van a `api.anthropic.com`, y el runner se autentica con el secreto del entorno en lugar de OAuth interactivo. Dos flujos del lado del host alcanzan `claude.ai`, así que ejecútelos desde un host cuya salida permite en lugar de ampliar la salida del contenedor de sesión: el instalador de una línea obtiene `install.sh` de `claude.ai` en el momento de la instalación, e interactivo `claude auth login`, que el [configuración guiada](/docs/es/self-hosted-environments-quickstart#set-up-an-environment-and-runner), el modo firmado del `doctor`, y [envío de CI](/docs/es/self-hosted-environments-testing#authenticate-from-ci) usan, inicia sesión a través de `claude.ai`, `claude.com`, y `platform.claude.com`. `mcp-proxy.anthropic.com` tampoco es requerido: las sesiones autohospedadas no lo usan, y la entrega de los conectores de claude.ai de su organización a sesiones, cuando está habilitada para su organización, se enruta a través de `api.anthropic.com`. Consulte [Servidores MCP](/docs/es/self-hosted-environments-configuration#mcp-servers).79No necesitas agregar estos hosts a la lista de permitidos para el tráfico del runner o de las sesiones:

80 

81* **`statsig.anthropic.com`, `*.sentry.io`, `claude.ai` y `platform.claude.com`**: estos hosts aparecen en algunas listas de verificación de red empresarial más antiguas, pero el runner no los alcanza. Las obtenciones de banderas de características van a `api.anthropic.com`, y el runner se autentica con el secreto del entorno en lugar de OAuth interactivo.

82* **`mcp-proxy.anthropic.com`**: las sesiones autohospedadas no lo usan. Cuando la entrega de conectores está habilitada para tu organización, los conectores de claude.ai de tu organización llegan a las sesiones a través de `api.anthropic.com`. Consulta [Servidores MCP](/docs/es/self-hosted-environments-configuration#mcp-servers).

83 

84Estos flujos del lado del host sí alcanzan `claude.ai`, así que ejecútalos desde un host cuya salida lo permita en lugar de ampliar la salida del contenedor de sesión:

85 

86* **El instalador de una línea**: obtiene `install.sh` de `claude.ai` en el momento de la instalación.

87* **`claude auth login` interactivo**: inicia sesión a través de `claude.ai`, `claude.com` y `platform.claude.com`. La [configuración guiada](/docs/es/self-hosted-environments-quickstart#run-the-guided-setup), el modo con sesión iniciada de `doctor` y el [envío desde CI](/docs/es/self-hosted-environments-testing#authenticate-from-ci) lo usan. El navegador con el que inicias sesión también carga las verificaciones de navegador de la página de inicio de sesión de claude.ai desde `hcaptcha.com`, `*.hcaptcha.com` y `challenges.cloudflare.com`.

75 88 

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

77 Salida de negación predeterminada90 Salida de negación predeterminada


127* **Deje que el runner configure git**: inicie el runner con `--configure-git` para que escriba la misma identidad y configuración de firma de commit que usan las sesiones alojadas por Anthropic140* **Deje que el runner configure git**: inicie el runner con `--configure-git` para que escriba la misma identidad y configuración de firma de commit que usan las sesiones alojadas por Anthropic

128* **Envíe la configuración de git en su imagen**: establezca la identidad y las credenciales de push usted mismo, por ejemplo para hacer commits bajo su propia identidad de bot141* **Envíe la configuración de git en su imagen**: establezca la identidad y las credenciales de push usted mismo, por ejemplo para hacer commits bajo su propia identidad de bot

129 142 

143Para repositorios en github.com, también puedes iniciar el runner con [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), o establecer `CLAUDE_RUNNER_USE_GIT_PROXY=1`, para pedirle a Anthropic que atienda git para las sesiones del runner.

144 

130Pisos de versión de Git en el host del runner: [`--configure-git`](#let-the-runner-configure-git) la firma de commit SSH requiere Git 2.34 o más reciente, [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) requiere 2.32 o más reciente, y reanudar sesiones desde ramas empujadas por [`--push-outcome-on-release`](/docs/es/self-hosted-environments-reference#runner-cli-flags) requiere 2.29 o más reciente. Git 2.24 es suficiente si omite los tres y gestiona la identidad de git usted mismo.145Pisos de versión de Git en el host del runner: [`--configure-git`](#let-the-runner-configure-git) la firma de commit SSH requiere Git 2.34 o más reciente, [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) requiere 2.32 o más reciente, y reanudar sesiones desde ramas empujadas por [`--push-outcome-on-release`](/docs/es/self-hosted-environments-reference#runner-cli-flags) requiere 2.29 o más reciente. Git 2.24 es suficiente si omite los tres y gestiona la identidad de git usted mismo.

131 146 

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


138* `user.name = Claude` y `user.email = noreply@anthropic.com`, coincidiendo con sesiones alojadas por Anthropic153* `user.name = Claude` y `user.email = noreply@anthropic.com`, coincidiendo con sesiones alojadas por Anthropic

139* Firma de commit y etiqueta en formato SSH, enrutada a través de un shim gestionado por el runner que firma cada commit a través del servicio de firma de Anthropic usando las credenciales de la sesión. Las firmas son verificables en GitHub contra la clave de firma SSH publicada de Anthropic.154* Firma de commit y etiqueta en formato SSH, enrutada a través de un shim gestionado por el runner que firma cada commit a través del servicio de firma de Anthropic usando las credenciales de la sesión. Las firmas son verificables en GitHub contra la clave de firma SSH publicada de Anthropic.

140* `push.negotiate = true`, para que git pregunte a su host de git qué commits ya tiene antes de empacar un push. Requiere Claude Code v2.1.257 o posterior.155* `push.negotiate = true`, para que git pregunte a su host de git qué commits ya tiene antes de empacar un push. Requiere Claude Code v2.1.257 o posterior.

141* `core.hooksPath` apuntando a un directorio de hooks gestionado por el runner. Sus hooks `commit-msg` y `prepare-commit-msg` añaden un tráiler `Co-authored-by:` para el creador de la sesión a cada commit, construido a partir del correo electrónico en [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/es/self-hosted-environments-configuration#wrapper-scripts) y omitido cuando esa variable no está establecida. Si su imagen ya establece `core.hooksPath`, el runner deja su configuración en su lugar, omite instalar estos hooks, e imprime una advertencia `[runner:git]`.156* `core.hooksPath` apuntando a un directorio de hooks gestionado por el runner. Sus hooks `commit-msg` y `prepare-commit-msg` añaden a cada commit un tráiler `Co-authored-by:` para el creador de la sesión. El tráiler se construye a partir del correo electrónico en [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/es/self-hosted-environments-configuration#wrapper-scripts) y se omite cuando esa variable no está establecida. Si tu imagen ya establece `core.hooksPath` y el runner no usa [git gestionado por Anthropic](#use-the-anthropic-git-proxy), el runner conserva tu ajuste, omite instalar estos hooks e imprime una advertencia `[runner:git]`.

142 157 

143La firma de commit requiere git 2.34 o más reciente; el runner verifica al inicio y sale con un error si su git es más antiguo. Esta bandera no configura credenciales de push, que aún proporciona en la imagen.158La firma de commit requiere git 2.34 o más reciente; el runner verifica al inicio y sale con un error si su git es más antiguo. Esta bandera no configura credenciales de push, que aún proporciona en la imagen.

144 159 

145En un runner con v2.1.280 o posterior, los commits que haces desde un hook de ciclo de vida `checkout` o `post-session` también se firman como la sesión, sin el tráiler `Co-authored-by:`. [Configuración de git dentro de los hooks de ciclo de vida](/docs/es/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) describe los ajustes de git que el runner fija dentro de esos hooks.160En un runner con v2.1.280 o posterior, los commits que haces desde un hook de ciclo de vida `checkout` o `post-session` también se firman como la sesión, sin el tráiler `Co-authored-by:`. [Configuración de git dentro de los hooks de ciclo de vida](/docs/es/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) describe los ajustes de git que el runner fija dentro de esos hooks.

146 161 

162Con o sin `--configure-git`, Claude Code le indica a Claude que termine sus mensajes de commit con un tráiler `Claude-Session: <url>` y sus descripciones de pull request con la URL de la sesión. Para omitir ambos, establece [`attribution.sessionUrl`](/docs/es/settings-reference#attribution-sessionurl) en `false` en el [`~/.claude/settings.json`](/docs/es/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) del host del runner y luego reinicia el runner.

163 

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

148 Envíe la configuración de git en su imagen165 Envíe la configuración de git en su imagen

149</h3>166</h3>


186 Use el proxy de git de Anthropic203 Use el proxy de git de Anthropic

187</h3>204</h3>

188 205 

189Inicie el runner con `--use-anthropic-git-proxy`, o establezca `CLAUDE_RUNNER_USE_GIT_PROXY=1`, para que clone a través del proxy de git de Anthropic, autenticado con el token de corta duración de la sesión. Para sesiones de usuario ordinarias, el proxy usa el token OAuth de GitHub o GitHub Enterprise almacenado para el creador de la sesión; para sesiones de bot y agente, usa el token de instalación de GitHub App de su organización. De cualquier manera, la imagen del runner no necesita credenciales de git en absoluto: sin claves SSH, sin ayudante de credenciales, sin `.netrc`. Esta es la misma ruta de autenticación que usan los entornos alojados por Anthropic.206Con el proxy de git de Anthropic, también llamado git gestionado por Anthropic, la imagen del runner no necesita claves SSH, ayudante de credenciales, `.netrc` ni otras credenciales de git para la propia sesión. En su lugar, el runner le pide a Anthropic que atienda git para sus sesiones. Para una sesión de usuario que Anthropic atiende, el clon del runner y los propios fetch y push de la sesión pasan por Anthropic, que usa el token OAuth de GitHub almacenado para el creador de la sesión. [Cómo atiende Anthropic git para una sesión](#how-anthropic-serves-git-for-a-session) cubre las sesiones de bot y de agente.

207 

208El proxy de git está desactivado a menos que lo [actives](#turn-the-anthropic-git-proxy-on). Un runner que llega a tu host de git con sus propias credenciales no lo necesita, y su git funciona con cualquier host de git.

209 

210A cambio, el proxy de git limita lo que el runner admite y cambia lo que necesita:

211 

212* **Solo github.com**: Anthropic atiende una sesión solo cuando todos sus repositorios están en github.com, y el proxy de git aún no admite GitHub Enterprise Server. En un runner con el proxy de git, una sesión con un repositorio en otro host de git [no se inicia](#when-anthropic-doesnt-serve-a-session).

213* **Cuentas de GitHub conectadas**: la persona que creó una sesión de usuario debe haber conectado GitHub en claude.ai, o la sesión [no se inicia](#creator-has-no-github-connection).

214* **`--capacity 1`**: el proxy de git requiere una sesión por proceso de runner, así que ejecuta más réplicas para paralelismo. [Activa el proxy de git de Anthropic](#turn-the-anthropic-git-proxy-on) enumera los requisitos.

215* **Configuración global de git reemplazada**: el runner [elimina y reemplaza la configuración global de git](#git-proxy-replaces-global-git-config) del usuario con el que se ejecuta. Ejecútalo como un usuario dedicado o en un contenedor.

216* **Credenciales del host para los push del host**: el push de [`--push-outcome-on-release`](/docs/es/self-hosted-environments-reference#runner-cli-flags) del runner y cualquier push que haga tu [hook `post-session`](/docs/es/self-hosted-environments-configuration#post-session) siguen usando las propias credenciales de git del host del runner y su [ruta de red hacia `github.com`](#github-com-egress-with-the-anthropic-git-proxy). Para esas credenciales, consulta [Incluye la configuración de git en tu imagen](#ship-git-config-in-your-image).

217* **Decisión por sesión**: Anthropic decide para cada sesión del runner si atiende su git, y una sesión que no atiende no se inicia. [Cuando las sesiones no se inician en un runner con el proxy de git](#when-anthropic-doesnt-serve-a-session) cubre las causas.

218 

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

220 

221<Warning>

222 Con `--use-anthropic-git-proxy` establecido, el runner elimina y reemplaza la configuración global de git del usuario con el que se ejecuta, y no guarda ninguna copia de seguridad. Lo hace al inicio y antes de cada sesión. Cualquier inicio de sesión o ayudante de credenciales que tuvieras ahí se pierde. Los ajustes que escribe [`--configure-git`](#let-the-runner-configure-git) se conservan. Ejecuta el runner como un usuario dedicado o en un contenedor, nunca como tu propio usuario.

223</Warning>

224 

225Mantén los ajustes de git que no son secretos, como la identidad y `safe.directory`, en la configuración de git del sistema.

226 

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

228 Activa el proxy de git de Anthropic

229</h4>

230 

231Antes de iniciar el runner con `--use-anthropic-git-proxy`, confirma que el host del runner cumple cada uno de estos requisitos. El runner se niega a iniciar cuando no se cumple el requisito de capacidad o de git:

190 232 

191El proxy requiere `--capacity 1` porque la URL del proxy es por sesión, y git 2.32 o más reciente porque git más antiguo ignora el mecanismo de configuración que el proxy usa para aislar sesiones entre sí. El runner se niega a iniciar si alguno de los requisitos no se cumple. Porque el proxy obtiene del lado de Anthropic, su host de git debe ser alcanzable desde la infraestructura de Anthropic, el mismo requisito que tienen las sesiones alojadas por Anthropic; para un host de git que solo es enrutable dentro de su red, use un [hook de ciclo de vida `checkout`](/docs/es/self-hosted-environments-configuration#checkout) en su lugar. Cada proceso de runner maneja una sesión a la vez, así que ejecute más réplicas para paralelismo. Cuando el proxy está habilitado, `--git-host-rewrite` y `--git-ssh-rewrite` no tienen efecto: la URL del proxy apunta a `api.anthropic.com`, no a su host de git.233* **Claude Code v2.1.267 o posterior**: las versiones anteriores aceptan el flag pero no reportan la solicitud para que Anthropic atienda git ni imprimen la línea `Registering as opted in`, por lo que Anthropic no atiende sus sesiones.

234* **`--capacity 1`, el valor predeterminado**: cada proceso de runner maneja una sesión a la vez, así que ejecuta más réplicas para paralelismo.

235* **Git 2.32 o posterior**: las versiones anteriores de git ignoran la configuración de git por sesión que el runner prepara para el proxy de git.

192 236 

193<Warning>237<Warning>

194 Las [recetas de Kubernetes](#kubernetes) y [Docker Compose](#docker-compose) en esta página usan `--capacity 4`. Si agrega `--use-anthropic-git-proxy` o `CLAUDE_RUNNER_USE_GIT_PROXY=1` a una de ellas sin cambiar la capacidad a `1`, el runner sale al inicio cada vez que su orquestador lo reinicia. Establezca `--capacity 1` y ejecute más réplicas para paralelismo. [Cuando el runner sale](#when-the-runner-exits) muestra la línea que imprime el runner.238 Las [recetas de Kubernetes](#kubernetes) y [Docker Compose](#docker-compose) en esta página usan `--capacity 4`. Si agrega `--use-anthropic-git-proxy` o `CLAUDE_RUNNER_USE_GIT_PROXY=1` a una de ellas sin cambiar la capacidad a `1`, el runner sale al inicio cada vez que su orquestador lo reinicia. Establezca `--capacity 1` y ejecute más réplicas para paralelismo. [Cuando el runner sale](#when-the-runner-exits) muestra la línea que imprime el runner.

195</Warning>239</Warning>

196 240 

197El runner también reporta la opción de participación a Anthropic cuando se registra, imprimiendo `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)` al inicio. Reportar la opción de participación requiere Claude Code v2.1.267 o posterior, y versiones anteriores aceptan la bandera sin reportarla o imprimir esa línea. Cada sesión en un runner que ha optado por participar luego usa git gestionado por Anthropic o la URL del proxy por sesión. Cuando una sesión usa la URL del proxy por sesión, el runner registra una línea `[runner:warn]` diciendo así.241Para activar el proxy de git, agrega `--use-anthropic-git-proxy` al comando del runner, o establece `CLAUDE_RUNNER_USE_GIT_PROXY=1` en el entorno del runner. Este comando, ejecutado en un shell en el host del runner, inicia el runner del [inicio rápido](/docs/es/self-hosted-environments-quickstart#set-up-manually) con el proxy de git activado:

242 

243```bash theme={null}

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

245```

246 

247Al inicio, el runner imprime `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`. Luego, Anthropic decide para cada sesión en ese runner si atiende su git. Para cada sesión que atiende, el runner registra una línea `[runner:session]` que contiene `governed git ACTIVE`. Si en cambio una sesión no se inicia, consulta [Cuando las sesiones no se inician en un runner con el proxy de git](#when-anthropic-doesnt-serve-a-session).

248 

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

250 Cómo atiende Anthropic git para una sesión

251</h4>

252 

253Para una sesión que Anthropic atiende, el clon del runner y los propios fetch y push de la sesión pasan por Anthropic, autenticados con el token de corta duración de la propia sesión:

254 

255* **Sesiones de usuario**: Anthropic usa el token OAuth de GitHub almacenado para el creador de la sesión.

256* **Sesiones de bot y de agente**: Anthropic usa el token de instalación de GitHub App de tu organización.

257* **Reescrituras de URL**: `--git-host-rewrite` y `--git-ssh-rewrite` no tienen efecto en un repositorio que atiende el proxy de git.

258 

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

260 Cuando las sesiones no se inician en un runner con el proxy de git

261</h4>

262 

263En un runner iniciado con `--use-anthropic-git-proxy`, una sesión no se inicia cuando Anthropic no atiende su git. Busca en el registro del runner un error de git que nombre una dirección de `api.anthropic.com` que contenga `/git_proxy/`.

264 

265Para cada sesión, un runner con Claude Code v2.1.267 o posterior también registra una línea `[runner:session]` que contiene `governed git ACTIVE` cuando Anthropic atiende el git de la sesión, o una línea `[runner:warn]` que contiene `the server withheld Anthropic-managed git for this session` cuando no lo hace. Busca la línea que ves entre estos casos:

266 

267* **Ni `governed git ACTIVE` ni la línea `withheld`**: un runner anterior a Claude Code v2.1.267 no registra ninguna de las dos líneas, y Anthropic no atiende sus sesiones. Actualiza el runner a v2.1.267 o posterior siguiendo [Fija la versión](#pin-the-version).

268* **La línea `withheld`**: Anthropic no atendió la sesión. Un runner que antes funcionaba con el proxy de git puede fallar así sin ningún cambio de tu parte.

269 * **Un repositorio no está en github.com**: una sesión con aunque sea un repositorio en otro host de git, como GitHub Enterprise Server, no se atiende, incluidos sus repositorios de github.com. [Desactiva el proxy de git de Anthropic](#turn-the-anthropic-git-proxy-off) para los runners de ese entorno.

270 * **Todos los repositorios están en github.com**: reporta el fallo a [tu equipo de cuenta de Anthropic](#report-an-issue) con el ID de sesión de la línea `withheld`. Anthropic registra el motivo de su lado.

271* **Una línea que contiene `remote: access denied by the git proxy`**: una sesión que Anthropic atiende aún puede ser rechazada, por ejemplo cuando la política de la organización deniega el acceso a git para la sesión, o la sesión no está autorizada para el repositorio. El registro del runner muestra entonces una línea que contiene `remote: access denied by the git proxy`, y el resto de esa línea indica el motivo.

272* <span id="creator-has-no-github-connection" />**`GitHub authentication required`**: esto aparece cuando el creador de la sesión no tiene una conexión de GitHub funcional en claude.ai. El clon de la sesión falla, y el error de git dice `GitHub authentication required. Please reconnect your GitHub account.` Pídele a esa persona que conecte o vuelva a conectar GitHub en su configuración de claude.ai.

273 

274Después de corregir la causa, vuelve a iniciar las sesiones fallidas.

275 

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

277 Desactiva el proxy de git de Anthropic

278</h4>

279 

280Si las sesiones de un entorno usan un repositorio en un host de git distinto de github.com, como GitHub Enterprise Server, desactiva `--use-anthropic-git-proxy` para los runners de ese entorno.

281 

282<Steps>

283 <Step title="Quita el flag">

284 Quita `--use-anthropic-git-proxy` del comando del runner. Si estableciste `CLAUDE_RUNNER_USE_GIT_PROXY` en el entorno del runner, como en una especificación de pod o un archivo de Compose, quítala de ahí. En un shell, elimínala:

285 

286 ```bash theme={null}

287 unset CLAUDE_RUNNER_USE_GIT_PROXY

288 ```

289 </Step>

290 

291 <Step title="Dale credenciales de git al runner">

292 Proporciona credenciales que funcionen sin pedir nada para cada host de git que usan las sesiones de los runners, github.com incluido. Cualquier credencial que estuviera en la configuración global de git del usuario del runner ya no existe, porque el runner eliminó esa configuración mientras `--use-anthropic-git-proxy` estaba establecido. [Incluye las credenciales en tu imagen](#ship-git-config-in-your-image) o usa un [hook de ciclo de vida `checkout`](/docs/es/self-hosted-environments-configuration#checkout).

293 </Step>

294 

295 <Step title="Abre la ruta de red">

296 Permite que el runner llegue a cada host de git que usan las sesiones de los runners en el puerto 443 o 22. Consulta la fila del host de git en [Requisitos de red](#network-requirements).

297 </Step>

298 

299 <Step title="Reinicia los runners">

300 Reinicia los runners para que se registren sin el proxy de git. Luego vuelve a iniciar cada sesión fallida.

301 </Step>

302</Steps>

198 303 

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

200 Acceso a la API de GitHub sin la GitHub CLI305 Acceso a la API de GitHub sin la GitHub CLI


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

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

268ARG CLAUDE_CODE_VERSION373ARG CLAUDE_CODE_VERSION

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

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

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

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


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

383```488```

384 489 

385Cree el Secret de respaldo desde un archivo local que contenga el valor que copió en el paso [**Copiar clave de entorno**](/docs/es/self-hosted-environments-quickstart#set-up-an-environment-and-runner) de la UI de administrador, para que el secreto nunca aparezca en su historial de shell. Ejecute `(umask 077 && cat > ./environment-secret)`, pegue el secreto, presione Enter, luego Ctrl-D. Luego cree el Secret y elimine el archivo:490Crea el Secret de respaldo desde un archivo local que contenga el valor que copiaste en el paso [**Copiar clave de entorno**](/docs/es/self-hosted-environments-quickstart#set-up-manually) de la UI de administración, para que el secreto nunca aparezca en tu historial del shell. Ejecuta `(umask 077 && cat > ./environment-secret)`, pega el secreto, presiona Enter y luego Ctrl-D. Después crea el Secret y elimina el archivo:

386 491 

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

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


500 Reutilice un checkout precalentado605 Reutilice un checkout precalentado

501</h2>606</h2>

502 607 

503Para repositorios grandes, el clon puede dominar el inicio de sesión. En `--capacity 1` sin [hook `checkout`](/docs/es/self-hosted-environments-configuration#checkout), el runner mantiene un clon canónico por repositorio en `<base-dir>/<repo-owner>/<repo>` y lo reutiliza en sesiones: obtiene la ref solicitada, desasocia `HEAD`, y reinicia duro a ella, que es casi instantáneo cuando poco ha cambiado. Para omitir el clon frío, suministre el clon de una de dos maneras:608Para repositorios grandes, el clon puede dominar el inicio de sesión. Para omitir el clon frío, proporciona tú mismo un clon en la ruta donde el runner mantiene el suyo. Sin [hook `checkout`](/docs/es/self-hosted-environments-configuration#checkout), el runner mantiene un clon canónico por repositorio en `<base-dir>/<repo-owner>/<repo>` y lo reutiliza entre sesiones:

609 

610* **Con `--capacity 1`**: el runner obtiene la ref solicitada, desasocia `HEAD` y hace un reinicio duro a ella, lo cual es casi instantáneo cuando ha cambiado poco.

611* **Con un `--capacity` mayor que uno**: el runner obtiene en ese clon y luego extrae un worktree separado a partir de él para cada sesión. Un clon precalentado ahorra la descarga, pero no el checkout.

612 

613Proporciona el clon en la imagen o en un volumen persistente:

504 614 

505* **Clon en la imagen**: construya el clon en su imagen de runner en esa ruta. Cada contenedor nuevo comienza con el clon precalentado sin reutilizar un disco.615* **Clon en la imagen**: construya el clon en su imagen de runner en esa ruta. Cada contenedor nuevo comienza con el clon precalentado sin reutilizar un disco.

506* **Clon en un volumen persistente**: en runners que prebloquea a la cuenta de un usuario con [`--lock-to-account`](/docs/es/self-hosted-environments-reference#runner-cli-flags), apunte `--base-dir` a un volumen persistente, para que el disco solo sirva esa cuenta. Un runner prebloquado nunca recoge sesiones de canal de Claude Tag, por lo que esta opción no se aplica a runners que las sirven.616* **Clon en un volumen persistente**: en runners que prebloquea a la cuenta de un usuario con [`--lock-to-account`](/docs/es/self-hosted-environments-reference#runner-cli-flags), apunte `--base-dir` a un volumen persistente, para que el disco solo sirva esa cuenta. Un runner prebloquado nunca recoge sesiones de canal de Claude Tag, por lo que esta opción no se aplica a runners que las sirven.


508Lo que la ruta de reutilización hace y no garantiza:618Lo que la ruta de reutilización hace y no garantiza:

509 619 

510* **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.620* **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.

511* **Los cambios rastreados se reinician, los archivos sin rastrear persisten**: 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.621* **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.

512* **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.622* **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.

513 623 

514 Por defecto, el runner deja estos en su lugar cuando termina la sesión, por lo que en un disco que sobrevive al proceso del runner se acumulan. Cada sesión se ejecuta como el usuario del runner, por lo que cualquier sesión posterior que ese disco sirva puede leerlos. Si mantiene un `--base-dir` persistente, dimensione el volumen para ese crecimiento. Lo mismo se aplica a cualquier configuración que reinicie el runner en el mismo sistema de archivos, incluida la [receta de Docker Compose](#docker-compose).624 Por defecto, el runner deja estos en su lugar cuando termina la sesión, por lo que en un disco que sobrevive al proceso del runner se acumulan. Cada sesión se ejecuta como el usuario del runner, por lo que cualquier sesión posterior que ese disco sirva puede leerlos. Si mantiene un `--base-dir` persistente, dimensione el volumen para ese crecimiento. Lo mismo se aplica a cualquier configuración que reinicie el runner en el mismo sistema de archivos, incluida la [receta de Docker Compose](#docker-compose).


522 632 

523El proceso hijo de Claude Code 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, por lo que cada sesión ejecuta la versión que instaló en el host o construyó en la imagen. Una actualización a nivel de host entra en vigor la próxima vez que el runner comienza.633El proceso hijo de Claude Code 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, por lo que cada sesión ejecuta la versión que instaló en el host o construyó en la imagen. Una actualización a nivel de host entra en vigor la próxima vez que el runner comienza.

524 634 

525Un modelo que sus sesiones utilizan puede requerir una versión más reciente de Claude Code que la que ejecutan. El servidor rechaza las solicitudes para ese modelo con [Claude Code no admite este modelo](/docs/es/errors#claude-code-does-not-support-this-model). Antes de fijar una versión, compruebe [las versiones de Claude Code que los modelos requieren](/docs/es/model-config#available-models) para cada modelo que sus sesiones utilizan.635Elige qué versión ejecutan tus sesiones y cuándo cambia:

526 636 

637* **Antes de fijar una versión**: consulta [las versiones de Claude Code que requieren los modelos](/docs/es/model-config#available-models) para cada modelo que usan tus sesiones. Si un modelo requiere una versión más reciente que la que ejecutan tus sesiones, el servidor rechaza las solicitudes para ese modelo con [Claude Code no admite este modelo](/docs/es/errors#claude-code-does-not-support-this-model).

527* **Para mantener una flota en una versión**: construya la imagen con una versión fijada, o en un host desnudo instale una versión específica y [desactive las actualizaciones automáticas](/docs/es/setup#disable-auto-updates)638* **Para mantener una flota en una versión**: construya la imagen con una versión fijada, o en un host desnudo instale una versión específica y [desactive las actualizaciones automáticas](/docs/es/setup#disable-auto-updates)

528* **Para actualizar**: instale la versión más reciente o reconstruya la imagen, luego reinicie los runners639* **Para actualizar una flota fija**: lee las entradas del [changelog](/docs/en/changelog) entre tu versión y la que vas a instalar; luego instala la versión más reciente o vuelve a crear la imagen y reinicia los runners

640* **Para actualizar runners bajo demanda**: lee las entradas del [changelog](/docs/en/changelog) entre tu versión y la que vas a instalar; luego cambia la imagen que inicia tu [hook `spawn-runner`](/docs/es/self-hosted-environments-configuration#the-spawn-runner-hook). Cada runner nuevo obtiene la nueva versión. Un runner que ya está en ejecución, incluido un runner en espera que inició [`--min-idle`](/docs/es/self-hosted-environments-reference#orchestrator-cli-flags), conserva su versión hasta que termina. No lo reinicies, porque su orden de trabajo es de un solo uso.

529* **Plugins**: los mercados de plugins tampoco se actualizan automáticamente; establezca `FORCE_AUTOUPDATE_PLUGINS=1` en el entorno del runner para permitir que los plugins se actualicen automáticamente mientras el binario permanece fijado641* **Plugins**: los mercados de plugins tampoco se actualizan automáticamente; establezca `FORCE_AUTOUPDATE_PLUGINS=1` en el entorno del runner para permitir que los plugins se actualicen automáticamente mientras el binario permanece fijado

530 642 

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


580</h3>692</h3>

581 693 

582* **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.694* **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.

583 * **Para conservar el trabajo con commit**: establece [`--push-outcome-on-release`](/docs/es/self-hosted-environments-reference#runner-cli-flags). Así, el runner 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. Los cambios sin commit se siguen perdiendo.695 * **Para conservar el trabajo con commit**: establece [`--push-outcome-on-release`](/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.

696 * **Con un hook `checkout`**: a los repositorios obtenidos mediante un [hook de ciclo de vida `checkout`](/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`](/docs/es/self-hosted-environments-configuration#post-session).

584 * **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.697 * **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.

585* **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.698* **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.

586* **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.699* **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.


606* **El runner no aparece en el entorno**: confirme que el host pueda alcanzar `api.anthropic.com` sobre HTTPS, que el secreto del entorno sea actual y que el reloj del host esté dentro de cinco minutos de la hora real; un sesgo mayor causa que la autenticación falle. El runner registra `[runner:fatal]` con el motivo del rechazo en caso de fallo de autenticación.719* **El runner no aparece en el entorno**: confirme que el host pueda alcanzar `api.anthropic.com` sobre HTTPS, que el secreto del entorno sea actual y que el reloj del host esté dentro de cinco minutos de la hora real; un sesgo mayor causa que la autenticación falle. El runner registra `[runner:fatal]` con el motivo del rechazo en caso de fallo de autenticación.

607* **El runner se cierra al inicio con `cannot create or write to base directory`**: el runner no puede crear ni escribir en `--base-dir`, que por defecto es `/workspace`. Corrija la propiedad del directorio o apunte `--base-dir` a una ruta escribible, como se describe en [Mantener el directorio base y la capacidad idénticos en todos los runners](#keep-the-base-directory-and-capacity-identical-across-runners). Si el runner registra `[runner:fatal]` diciendo que la verificación del directorio base agotó el tiempo de espera, el directorio está en un montaje NFS o CSI colgado. Verifique la salud del montaje en lugar de los permisos. El runner imprime ambas fallas de inicio en stderr antes de abrir `--log-file`, así que búsquelas en la terminal o en los registros del contenedor de su plataforma en lugar del archivo de registro. Antes de v2.1.225, el runner no verificaba el directorio base al inicio, y esta configuración incorrecta fallaba en las sesiones después de la recogida.720* **El runner se cierra al inicio con `cannot create or write to base directory`**: el runner no puede crear ni escribir en `--base-dir`, que por defecto es `/workspace`. Corrija la propiedad del directorio o apunte `--base-dir` a una ruta escribible, como se describe en [Mantener el directorio base y la capacidad idénticos en todos los runners](#keep-the-base-directory-and-capacity-identical-across-runners). Si el runner registra `[runner:fatal]` diciendo que la verificación del directorio base agotó el tiempo de espera, el directorio está en un montaje NFS o CSI colgado. Verifique la salud del montaje en lugar de los permisos. El runner imprime ambas fallas de inicio en stderr antes de abrir `--log-file`, así que búsquelas en la terminal o en los registros del contenedor de su plataforma en lugar del archivo de registro. Antes de v2.1.225, el runner no verificaba el directorio base al inicio, y esta configuración incorrecta fallaba en las sesiones después de la recogida.

608* **Las sesiones permanecen en cola**: cada runner en línea puede estar bloqueado a un propietario diferente. Verifique la [métrica](/docs/es/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_locked_account` de cada runner o el campo `locked_account` de su línea de registro `[runner:health]` para ver quién la mantiene. Ambos muestran el correo electrónico del propietario solo después de que el runner haya recibido un token de sesión que lleve un reclamo `act.email`, que las sesiones de un agente Claude Tag nunca hacen. Sin el reclamo, el runner no emite ninguna serie `locked_account` y registra `locked_account=yes`, lo que le indica que el runner está bloqueado pero no a qué propietario. Agregue réplicas o espere a que un runner existente se drene y reinicie. Si el entorno usa runners bajo demanda, verifique el orquestador en su lugar; consulte [On-demand runners](/docs/es/self-hosted-environments-configuration#on-demand-runners).721* **Las sesiones permanecen en cola**: cada runner en línea puede estar bloqueado a un propietario diferente. Verifique la [métrica](/docs/es/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_locked_account` de cada runner o el campo `locked_account` de su línea de registro `[runner:health]` para ver quién la mantiene. Ambos muestran el correo electrónico del propietario solo después de que el runner haya recibido un token de sesión que lleve un reclamo `act.email`, que las sesiones de un agente Claude Tag nunca hacen. Sin el reclamo, el runner no emite ninguna serie `locked_account` y registra `locked_account=yes`, lo que le indica que el runner está bloqueado pero no a qué propietario. Agregue réplicas o espere a que un runner existente se drene y reinicie. Si el entorno usa runners bajo demanda, verifique el orquestador en su lugar; consulte [On-demand runners](/docs/es/self-hosted-environments-configuration#on-demand-runners).

609* **Las sesiones fallan inmediatamente después de la recogida**: abra la sesión en claude.ai/code para ver el error. Las causas más comunes son las [credenciales de git](#configure-git) faltantes en la imagen del runner y las herramientas de compilación que no están instaladas. Un directorio base no escribible detiene el runner al inicio en lugar de fallar en las sesiones. Consulte la entrada **El runner se cierra al inicio con `cannot create or write to base directory`** en esta lista.722* **Las sesiones fallan inmediatamente después de la recogida**: abre la sesión en claude.ai/code para ver el error. Las causas más comunes son las [credenciales de git](#configure-git) faltantes en la imagen del runner y las herramientas de compilación que no están instaladas. 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). 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.

723* **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).

610* **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.724* **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.

611* **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, la mayoría de las veces porque algo entre el runner y `api.anthropic.com`, como un proxy interceptor o un portal cautivo, respondió con su propia página. El runner rechaza la respuesta, la cuenta bajo el tipo `transport` de la [métrica](/docs/es/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_poll_errors_total`, y reintenta en el cronograma de sondeo fallido descrito en [Session lifecycle](/docs/es/self-hosted-environments#session-lifecycle). El runner continúa sirviendo sus sesiones activas. Configure el proxy para pasar las respuestas de `api.anthropic.com` sin alterar. Antes de v2.1.246, el runner leía tal respuesta como una cola de trabajo vacía, lo que podría terminar sus sesiones activas o hacer que se cierre.725* **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, la mayoría de las veces porque algo entre el runner y `api.anthropic.com`, como un proxy interceptor o un portal cautivo, respondió con su propia página. El runner rechaza la respuesta, la cuenta bajo el tipo `transport` de la [métrica](/docs/es/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_poll_errors_total`, y reintenta en el cronograma de sondeo fallido descrito en [Session lifecycle](/docs/es/self-hosted-environments#session-lifecycle). El runner continúa sirviendo sus sesiones activas. Configure el proxy para pasar las respuestas de `api.anthropic.com` sin alterar. Antes de v2.1.246, el runner leía tal respuesta como una cola de trabajo vacía, lo que podría terminar sus sesiones activas o hacer que se cierre.

612* **La rama de una sesión ya no existe en el remoto**: para una fuente de git que la sesión solo lee, el runner omite esa fuente y continúa con las restantes. Para la fuente a la que la sesión envía resultados, una rama eliminada, típicamente porque fue fusionada y auto-eliminada, falla la sesión con un error que nombra el repositorio y la rama y le pide que restaure la rama y reintente. El runner falla la sesión con el mismo error cuando omitir dejaría sin repositorio en absoluto. Antes de v2.1.228, tal sesión comenzaba en un directorio vacío.726* **La rama de una sesión ya no existe en el remoto**: para una fuente de git que la sesión solo lee, el runner omite esa fuente y continúa con las restantes. Para la fuente a la que la sesión envía resultados, una rama eliminada, típicamente porque fue fusionada y auto-eliminada, falla la sesión con un error que nombra el repositorio y la rama y le pide que restaure la rama y reintente. El runner falla la sesión con el mismo error cuando omitir dejaría sin repositorio en absoluto. Antes de v2.1.228, tal sesión comenzaba en un directorio vacío.


616 730 

617 La verificación de acceso se ejecuta nuevamente cada vez que la sesión comienza en un runner, así que una vez que la identidad de git del runner tiene acceso de lectura, el siguiente inicio clona el repositorio. Antes de v2.1.274, cada uno de estos rechazos fallaba el inicio de sesión.731 La verificación de acceso se ejecuta nuevamente cada vez que la sesión comienza en un runner, así que una vez que la identidad de git del runner tiene acceso de lectura, el siguiente inicio clona el repositorio. Antes de v2.1.274, cada uno de estos rechazos fallaba el inicio de sesión.

618* **Las sesiones tardan minutos en iniciarse**: el clon inicial generalmente domina. Observe la [métrica](/docs/es/self-hosted-environments-reference#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.732* **Las sesiones tardan minutos en iniciarse**: el clon inicial generalmente domina. Observe la [métrica](/docs/es/self-hosted-environments-reference#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.

619* **Los turnos fallan con un 401**: cada sesión autentica llamadas de modelo con el [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/es/self-hosted-environments-configuration#wrapper-scripts) de corta duración que el runner obtiene de Anthropic y rota sobre stdin de la sesión. Cuando un turno termina con un 401 o 403 de la API del modelo, el runner obtiene un token fresco y lo pasa a la sesión. El turno fallido no se reintenta.733* **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`](/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.

620 734 

621 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.735 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.

622 736 


637 751 

638* **Una salida normal**: el runner terminó sus sesiones y se drenó, alcanzó su tiempo de jubilación, o se le indicó que se detuviera. Reinícielo para que el entorno tenga capacidad nuevamente. [Runner lifecycle](/docs/es/self-hosted-environments#runner-lifecycle) describe estas salidas.752* **Una salida normal**: el runner terminó sus sesiones y se drenó, alcanzó su tiempo de jubilación, o se le indicó que se detuviera. Reinícielo para que el entorno tenga capacidad nuevamente. [Runner lifecycle](/docs/es/self-hosted-environments#runner-lifecycle) describe estas salidas.

639* **Un inicio fallido**: el runner no puede iniciarse con la configuración o el host que se le proporcionó, por lo que se cierra segundos después de que comienza, y se cierra de la misma manera cada vez que lo reinicia. Reiniciarlo más rápido no ayuda. Alguien necesita leer su salida y corregir la causa.753* **Un inicio fallido**: el runner no puede iniciarse con la configuración o el host que se le proporcionó, por lo que se cierra segundos después de que comienza, y se cierra de la misma manera cada vez que lo reinicia. Reiniciarlo más rápido no ayuda. Alguien necesita leer su salida y corregir la causa.

754* **Pérdida de contacto**: un runner que no puede comunicarse con Anthropic durante más tiempo que su [lease](/docs/es/self-hosted-environments#session-lifecycle), por ejemplo mientras su host está suspendido, puede ser eliminado del entorno. Cuando un runner eliminado se reconecta, se cierra. Su registro puede mostrar una línea `[runner:fatal]` que contiene `runner record gone server-side` o, tras una interrupción más larga, [`poll auth failed`](/docs/es/self-hosted-environments-quickstart#set-up-an-environment-and-runner). El runner no vuelve a registrarse por sí solo, así que reinícialo.

640 755 

641Configure su supervisor para reiniciar el runner cada vez que se cierre, para esperar más tiempo entre reinicios cuando el runner sigue cerrándose justo después de que comienza, y para notificar a alguien cuando eso sigue sucediendo.756Configure su supervisor para reiniciar el runner cada vez que se cierre, para esperar más tiempo entre reinicios cuando el runner sigue cerrándose justo después de que comienza, y para notificar a alguien cuando eso sigue sucediendo.

642 757 

Details

195 195 

196Los contenedores reciben la ruta absoluta al propio binario del ejecutor en `CLAUDE_RUNNER_CLAUDE_BIN`; usa esa ruta en lugar de un `claude` resuelto por PATH para que la decodificación se ejecute en el mismo binario que usa el ejecutor.196Los contenedores reciben la ruta absoluta al propio binario del ejecutor en `CLAUDE_RUNNER_CLAUDE_BIN`; usa esa ruta en lugar de un `claude` resuelto por PATH para que la decodificación se ejecute en el mismo binario que usa el ejecutor.

197 197 

198Usa `jq -re` en lugar de `jq -r` para que una reclamación faltante cause una salida distinta de cero. Con solo `-r`, una reclamación faltante imprime la cadena literal `null` y sale con cero, lo que silenciosamente pasa un valor incorrecto aguas abajo. Pasa `--no-verify` a `decode-token` solo para inspección sin conexión donde el endpoint de JWKS es inaccesible.198Usa `jq -re` en lugar de `jq -r` para que una reclamación faltante cause una salida distinta de cero. Con solo `-r`, una reclamación faltante imprime la cadena literal `null` y sale con cero, lo que silenciosamente pasa un valor incorrecto aguas abajo.

199 

200Si `decode-token` no puede obtener las claves del endpoint de JWKS o no puede verificar el token, imprime el motivo en stderr, no imprime ninguna reclamación y sale con el código 1. Pasa `--no-verify` a `decode-token` solo para inspección sin conexión donde el endpoint de JWKS es inaccesible.

199 201 

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

201 Referencia de reclamaciones203 Referencia de reclamaciones

Details

34El host del runner necesita:34El host del runner necesita:

35 35 

36* Un host o contenedor Linux o macOS con HTTPS saliente a `api.anthropic.com`, a `claude.ai` y a los hosts de descarga a los que redirige para el paso de instalación a continuación, y a su host de git para el clon; la [tabla de requisitos de red](/docs/es/self-hosted-environments-deploy#network-requirements) tiene la lista completa. Windows no se admite como host de runner; ejecute el runner en un contenedor Linux en su lugar. Las estaciones de trabajo de desarrolladores no se ven afectadas, ya que las sesiones se inician desde claude.ai en un navegador.36* Un host o contenedor Linux o macOS con HTTPS saliente a `api.anthropic.com`, a `claude.ai` y a los hosts de descarga a los que redirige para el paso de instalación a continuación, y a su host de git para el clon; la [tabla de requisitos de red](/docs/es/self-hosted-environments-deploy#network-requirements) tiene la lista completa. Windows no se admite como host de runner; ejecute el runner en un contenedor Linux en su lugar. Las estaciones de trabajo de desarrolladores no se ven afectadas, ya que las sesiones se inician desde claude.ai en un navegador.

37* Un repositorio para la sesión de prueba: uno público, o uno que este host ya pueda clonar mediante su URL HTTPS sin que se le soliciten credenciales.

37* Un reloj sincronizado con la hora real, por ejemplo con NTP. La autenticación falla cuando el reloj está más de cinco minutos desincronizado; consulte [Troubleshooting](/docs/es/self-hosted-environments-deploy#troubleshooting).38* Un reloj sincronizado con la hora real, por ejemplo con NTP. La autenticación falla cuando el reloj está más de cinco minutos desincronizado; consulte [Troubleshooting](/docs/es/self-hosted-environments-deploy#troubleshooting).

38 39 

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


57 Configurar un entorno y runner58 Configurar un entorno y runner

58</h2>59</h2>

59 60 

60Claude Code incluye una configuración guiada: una sesión interactiva de Claude Code que lo guía a través de crear el entorno en la interfaz de administración, inicia un runner local con el archivo secreto que guarda, confirma que el runner se registra, y escribe una hoja de trucos en `./runner-setup/CHEAT-SHEET.md`. Ejecútelo en una máquina donde haya iniciado sesión con `claude auth login` usando una cuenta que tenga un rol Owner; no está disponible con claves API o proveedores de modelos de terceros. En hosts donde una sesión interactiva no es posible, use los pasos manuales a continuación en su lugar. Confirme que la [verificación de versión](#software-on-the-runner-host) pasó primero: en versiones anteriores a 2.1.224, este comando inicia una sesión ordinaria de Claude con las palabras como el prompt en lugar de la configuración guiada. Para iniciar la configuración guiada, ejecute el subcomando setup y siga los prompts:61Usa la [configuración guiada](#run-the-guided-setup) o los [pasos manuales](#set-up-manually). La configuración guiada es un solo comando que inicia una sesión interactiva de Claude Code y te guía por el resto. Usa los pasos manuales en su lugar en un host donde no sea posible una sesión interactiva. Úsalos también cuando alguien con el rol Owner haya creado el entorno y te haya entregado su secreto, ya que la configuración guiada necesita un inicio de sesión de Owner.

62 

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

64 Ejecutar la configuración guiada

65</h3>

66 

67La configuración guiada te acompaña en la creación del entorno en la interfaz de administración, inicia un runner local con el archivo secreto que guardes, confirma que el runner se registra y escribe una hoja de referencia rápida en `./runner-setup/CHEAT-SHEET.md`. Antes de ejecutarla, confirma tu inicio de sesión y tu versión:

68 

69* **Inicio de sesión**: ejecútala en una máquina donde hayas iniciado sesión con `claude auth login` usando una cuenta que tenga un rol Owner. Con solo una clave de API o un proveedor de modelos de terceros, la sesión se inicia, pero sus verificaciones de organización fallan.

70* **Versión**: confirma que la [verificación de versión](#software-on-the-runner-host) pasó. En versiones anteriores a 2.1.224, el comando setup inicia una sesión de Claude con las palabras como prompt en lugar de la configuración guiada.

71 

72Para iniciar la configuración guiada, ejecuta el subcomando setup en tu shell y sigue las instrucciones:

61 73 

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

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

64```76```

65 77 

66Para configurar manualmente en su lugar:78La configuración no inicia una sesión de prueba por sí misma: te indica que inicies una en claude.ai/code. El último paso de la configuración detiene el runner que inició. Si sales de la configuración antes de ese paso, el runner sigue ejecutándose. Para continuar después del último paso, vuelve a iniciar el runner en tu shell con el comando que aparece en `./runner-setup/CHEAT-SHEET.md` y luego [enruta una sesión al entorno](#route-a-session).

79 

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

81 Configurar manualmente

82</h3>

83 

84Crea el entorno en claude.ai, inicia el runner desde una terminal en el host y luego regresa a claude.ai para confirmar que el runner aparece y enrutar una sesión hacia él. Si alguien con el rol Owner ya creó el entorno y te entregó su secreto, empieza en el paso 2.

67 85 

68<Steps>86<Steps>

69 <Step title="Crear un entorno">87 <Step title="Crear un entorno">

70 Vaya a la [página **Cloud environments**](https://claude.ai/admin-settings/cloud-environments) en la configuración de administración. Bajo **Self-hosted environments**, seleccione **New**, nombre el entorno, y seleccione **Create**. En el segundo paso del asistente, seleccione **Copy environment key** para copiar el secreto del entorno, que la interfaz de administración etiqueta como una clave de entorno. claude.ai muestra el secreto una vez, y no puede recuperarlo más tarde; expira 365 días después de la creación. El ID `ccpool_...` del entorno permanece visible en su diálogo de detalle; lo necesitará para la verificación `aud` en [verificación de token](/docs/es/self-hosted-environments-identity) y para enviar [sesiones de prueba desde CI](/docs/es/self-hosted-environments-testing#run-the-test-loop).88 Vaya a la [página **Cloud environments**](https://claude.ai/admin-settings/cloud-environments) en la configuración de administración. Bajo **Self-hosted environments**, seleccione **New**, nombre el entorno, y seleccione **Create**. En el segundo paso del asistente, seleccione **Copy environment key** para copiar el secreto del entorno, que la interfaz de administración etiqueta como una clave de entorno. claude.ai muestra el secreto una vez, y no puede recuperarlo más tarde; expira 365 días después de la creación. El ID `ccpool_...` del entorno permanece visible en su diálogo de detalle; lo necesitará para la verificación `aud` en [verificación de token](/docs/es/self-hosted-environments-identity) y para enviar [sesiones de prueba desde CI](/docs/es/self-hosted-environments-testing#run-the-test-loop).

71 89 

72 Si pierde el secreto o necesita rotarlo, cree un nuevo secreto desde la pestaña **Configuration** del entorno, implemente el nuevo secreto en sus runners, luego revoque el antiguo. Los runners que tengan un secreto revocado fallan su siguiente sondeo autenticado y salen, registrando `poll auth failed`, y su orquestador los reinicia con el nuevo secreto.90 Si pierdes el secreto o necesitas rotarlo, crea un nuevo secreto desde la pestaña **Configuration** del entorno, distribuye el nuevo secreto a tus runners y luego revoca el antiguo. Los runners que tengan un secreto revocado fallan en su siguiente sondeo autenticado y salen, registrando `poll auth failed`, y tu orquestador los reinicia con el nuevo secreto.

73 </Step>91 </Step>

74 92 

75 <Step title="Iniciar un runner">93 <Step title="Iniciar un runner">

76 Cree el directorio secreto. Este paso y el siguiente necesitan root para la ruta `/etc/claude`; cualquier ruta que el proceso runner pueda leer funciona, así que ajuste ambos comandos y el valor `--environment-secret-file` juntos si usa uno diferente.94 Crea el directorio del secreto. Este comando y el siguiente usan `/etc/claude`, que necesita root, y el archivo secreto que crean solo puede leerlo el usuario que los ejecuta. Si el runner se ejecutará como otro usuario, sale con `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`. En ese caso, ejecuta ambos comandos como el usuario del runner, con un directorio en el que ese usuario pueda escribir en lugar de `/etc/claude`, y pasa la misma ruta a `--environment-secret-file`. Funciona cualquier ruta que el proceso del runner pueda leer.

77 95 

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

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


89 107 

90 Si el runner no puede crear o escribir en la ruta, sale al inicio con un error nombrando el directorio en lugar de registrarse. Consulte [Troubleshooting](/docs/es/self-hosted-environments-deploy#troubleshooting).108 Si el runner no puede crear o escribir en la ruta, sale al inicio con un error nombrando el directorio en lugar de registrarse. Consulte [Troubleshooting](/docs/es/self-hosted-environments-deploy#troubleshooting).

91 109 

92 Luego inicie el runner con `--environment-secret-file` y `--base-dir`. El runner se registra con su entorno y comienza a sondear trabajo. Si el runner sale, reinícielo manualmente. Las implementaciones de producción ejecutan el runner bajo un orquestador que reinicia runners salidos, normalmente con un sistema de archivos fresco por reinicio; [Reutilizar un checkout precalentado](/docs/es/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) cubre la configuración de disco persistente admitida.110 Luego inicia el runner con `--environment-secret-file` y `--base-dir`:

93 111 

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

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

96 ```114 ```

115 

116 El runner registra `Registered: runner_id=<runner-id>` una vez que se ha registrado en tu entorno y luego comienza a sondear en busca de trabajo. Si el runner sale más tarde, reinícialo tú mismo. Consulta [Si el runner sale](#if-the-runner-exits) para saber cuándo ocurre eso.

97 </Step>117 </Step>

98 118 

99 <Step title="Verificar que el runner aparece">119 <Step title="Verificar que el runner aparece">

100 Regrese a la [página **Cloud environments**](https://claude.ai/admin-settings/cloud-environments). El estado de su entorno cambia de **No runners deployed** a **Healthy** dentro de unos pocos segundos de que el runner inicie; abra el entorno y seleccione **Activity** para ver el runner mismo.120 Regresa a la [página **Cloud environments**](https://claude.ai/admin-settings/cloud-environments). El estado de tu entorno cambia de **No runners deployed** a **Healthy** a los pocos segundos de que el runner se inicie; abre el entorno y selecciona **Activity** para ver el runner en sí. Si no tienes acceso a la página de administración, la línea `Registered: runner_id=<runner-id>` en el registro del runner del paso anterior te da la misma señal.

101 </Step>121 </Step>

102 122 

103 <Step title="Enrutar una sesión al entorno">123 <Step title="Enrutar una sesión al entorno">

104 Inicie una sesión en claude.ai/code y seleccione su entorno del selector de entorno, donde los entornos autohospedados aparecen junto a los alojados por Anthropic. El runner clona con las credenciales de git que el host ya tiene, así que seleccione un repositorio que este host ya pueda clonar, o uno público; las opciones de credenciales para repositorios privados en producción están en [Configurar git](/docs/es/self-hosted-environments-deploy#configure-git). El siguiente runner disponible recoge la sesión en cola y registra `Picked up session <session-id>` junto con su recuento activo y capacidad, para que pueda confirmar desde la propia salida del runner qué host tomó la sesión. Vea la sesión trabajar y lea las respuestas de Claude en [claude.ai/code](https://claude.ai/code). Si la sesión permanece en cola en su lugar, consulte [Troubleshooting](/docs/es/self-hosted-environments-deploy#troubleshooting).124 <span id="route-a-session" />Inicia una sesión en claude.ai/code y selecciona tu entorno en el selector de entornos, donde los entornos autohospedados aparecen junto a los alojados por Anthropic. Como repositorio, elige el de los [requisitos previos](#host-and-network): un repositorio público o uno que este host ya pueda clonar. El runner clona con las credenciales de git que el host ya tenga.

125 

126 El siguiente runner disponible toma la sesión en cola y registra `Picked up session <session-id>` junto con su recuento de sesiones activas y su capacidad, para que puedas confirmar desde la propia salida del runner qué host tomó la sesión. Observa cómo trabaja la sesión y lee las respuestas de Claude en [claude.ai/code](https://claude.ai/code).

127 

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

129 

130 * **La sesión permanece en cola**: consulta [Troubleshooting](/docs/es/self-hosted-environments-deploy#troubleshooting).

131 * **La sesión no se inicia por un error de git**: el error aparece en la sesión y en el registro del runner. Si 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. Consulta [Configurar git](/docs/es/self-hosted-environments-deploy#configure-git), que también cubre las opciones de credenciales para repositorios privados en producción.

105 </Step>132 </Step>

106</Steps>133</Steps>

107 134 

108El runner sale por diseño una vez que sus sesiones activas terminan; consulte [Runner lifecycle](/docs/es/self-hosted-environments#runner-lifecycle). Para producción, implántelo bajo un orquestador que lo reinicie al salir y espere más tiempo entre reinicios cuando el runner siga saliendo justo después de que inicia. Consulte [Implementar en producción](/docs/es/self-hosted-environments-deploy) y [Cuando el runner sale](/docs/es/self-hosted-environments-deploy#when-the-runner-exits).135<h3 id="if-the-runner-exits">

136 Si el runner sale

137</h3>

138 

139Si el runner sale durante este inicio rápido, vuelve a iniciarlo con el mismo comando. El runner puede salir por sí solo:

140 

141* **Sesiones terminadas**: el registro muestra `[runner:exit] account workload drained — exiting`. El runner sale por diseño una vez que terminan sus sesiones activas. Consulta [Runner lifecycle](/docs/es/self-hosted-environments#runner-lifecycle).

142* **Pérdida de contacto**: el registro muestra una línea `[runner:fatal]` con `runner record gone server-side` o con `poll auth failed`. Si el runner pierde contacto con Anthropic durante un tiempo, por ejemplo porque el host entra en suspensión, puede salir la próxima vez que se comunique con Anthropic.

143 

144Un turno terminado no finaliza tu sesión de prueba. Después del primer turno, la sesión sigue conectada y el runner sigue activo, así que puedes [enviar un mensaje de seguimiento a la sesión](#send-a-follow-up-message-to-a-running-session) sin reiniciar primero el runner.

145 

146Para producción, implementa el runner bajo un orquestador que lo reinicie al salir y espere más tiempo entre reinicios cuando el runner siga saliendo justo después de iniciarse. Consulta [Implementar en producción](/docs/es/self-hosted-environments-deploy) y [Cuando el runner sale](/docs/es/self-hosted-environments-deploy#when-the-runner-exits).

109 147 

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

111 Enviar un mensaje de seguimiento a una sesión en ejecución149 Enviar un mensaje de seguimiento a una sesión en ejecución

Details

52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Libere un slot de sesión después de N minutos de inactividad una vez que un turno termina o la sesión espera la acción del usuario. Una sesión que aún está a mitad de turno, incluida una que sostiene una tarea de fondo que nunca termina o una aprobación solicitada desde dentro de una llamada de herramienta en ejecución, no cuenta como inactiva; empareje con `--kill-session-after-min` como el tope duro. Después de que la tarea de fondo de una sesión termina, el runner considera la sesión ocupada hasta que comienza el turno de seguimiento que lee el resultado, durante como máximo la ventana [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). Hasta que el runner reciba una señal de apagado o alcance su tiempo de retiro, una liberación que deja el runner sin sesiones activas inicia la misma ruta de salida que un drenaje normal, gobernado por `--drain-grace-sec`. Después de una primera señal que difirió con [`--defer-shutdown-max-min`](/docs/es/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), el runner sale tan pronto como una liberación lo deja sin sesiones. `0` desactiva. |52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Libere un slot de sesión después de N minutos de inactividad una vez que un turno termina o la sesión espera la acción del usuario. Una sesión que aún está a mitad de turno, incluida una que sostiene una tarea de fondo que nunca termina o una aprobación solicitada desde dentro de una llamada de herramienta en ejecución, no cuenta como inactiva; empareje con `--kill-session-after-min` como el tope duro. Después de que la tarea de fondo de una sesión termina, el runner considera la sesión ocupada hasta que comienza el turno de seguimiento que lee el resultado, durante como máximo la ventana [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). Hasta que el runner reciba una señal de apagado o alcance su tiempo de retiro, una liberación que deja el runner sin sesiones activas inicia la misma ruta de salida que un drenaje normal, gobernado por `--drain-grace-sec`. Después de una primera señal que difirió con [`--defer-shutdown-max-min`](/docs/es/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), el runner sale tan pronto como una liberación lo deja sin sesiones. `0` desactiva. |

53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | off | Elimine los directorios por sesión de una sesión bajo `<base-dir>/_sessions/` cuando la sesión termina en este runner, sin importar el resultado. [Reuse a pre-warmed checkout](/docs/es/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) describe lo que contienen y quién puede leerlos cuando permanecen. La eliminación es mejor esfuerzo: los directorios por sesión permanecen en su lugar cuando el runner es asesinado o alcanza su plazo de drenaje antes de que se ejecute la limpieza. Con el flag activado, el log de depuración de una sesión fallida o interrumpida no se mantiene en disco. Requiere Claude Code v2.1.268 o posterior. |53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | off | Elimine los directorios por sesión de una sesión bajo `<base-dir>/_sessions/` cuando la sesión termina en este runner, sin importar el resultado. [Reuse a pre-warmed checkout](/docs/es/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) describe lo que contienen y quién puede leerlos cuando permanecen. La eliminación es mejor esfuerzo: los directorios por sesión permanecen en su lugar cuando el runner es asesinado o alcanza su plazo de drenaje antes de que se ejecute la limpieza. Con el flag activado, el log de depuración de una sesión fallida o interrumpida no se mantiene en disco. Requiere Claude Code v2.1.268 o posterior. |

54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Retire el runner en una marca de tiempo Unix absoluta en segundos, para infraestructura que mata el runner en un tiempo conocido; [Runner lifecycle](/docs/es/self-hosted-environments#runner-lifecycle) describe la secuencia de liberación y cómo dimensionar el margen. Los valores antes de 2001 o después del año 5138 son rechazados por el flag e ignorados por la variable de entorno. |54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Retire el runner en una marca de tiempo Unix absoluta en segundos, para infraestructura que mata el runner en un tiempo conocido; [Runner lifecycle](/docs/es/self-hosted-environments#runner-lifecycle) describe la secuencia de liberación y cómo dimensionar el margen. Los valores antes de 2001 o después del año 5138 son rechazados por el flag e ignorados por la variable de entorno. |

55| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | Cuáles de las listas de reglas del clasificador del [modo automático](/docs/es/permission-modes#eliminate-prompts-with-auto-mode) que el plano de control envía con una sesión pueden llegar a esa sesión: `all`, `no-allow` o `none`. Consulta [Listas de reglas del modo automático](#auto-mode-rule-lists) para ver qué aplica cada valor. Un valor no válido detiene el runner al iniciar. Requiere Claude Code v2.1.295 o posterior. |

55| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Cuánto tiempo esperar a que el proceso de Claude salga limpiamente después de que una sesión termina, antes de matarlo por la fuerza. Aumente el valor si los hooks `SessionEnd` propios del hijo necesitan más tiempo. |56| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Cuánto tiempo esperar a que el proceso de Claude salga limpiamente después de que una sesión termina, antes de matarlo por la fuerza. Aumente el valor si los hooks `SessionEnd` propios del hijo necesitan más tiempo. |

56| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Libere un slot de sesión si el hijo no ha señalado que se inicializó dentro de N minutos de generación. Borrado por la señal de inicialización del hijo en el [canal de actividad](/docs/es/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), no por salida ordinaria, después de lo cual `--release-idle-session-min` toma el control. `0` desactiva. |57| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Libera un slot de sesión si el proceso hijo no ha señalado que se inicializó dentro de N minutos después de generarse. La clonación ocurre antes de generarse el proceso, así que el tiempo de clonación no cuenta. Se borra con la señal de inicialización del proceso hijo en el [canal de actividad](/docs/es/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), no con la salida ordinaria, después de lo cual `--release-idle-session-min` toma el control. `0` desactiva. |

57| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Semilla de confianza persistida para las rutas del repositorio de cada sesión para que `permissions.allow` y `additionalDirectories` comprometidos en el repositorio sean honrados. Establezca `false` para descartar concesiones de permisos comprometidas en el repositorio y configure reglas de permiso en la `settings.json` de la configuración del host en su lugar; la configuración `sandbox.*` comprometida en el repositorio aún se aplica de cualquier forma, que es por qué el [guard de configuración de repositorio](/docs/es/self-hosted-environments-deploy#harden-your-deployment) los escanea independientemente de este flag. |58| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Semilla de confianza persistida para las rutas del repositorio de cada sesión para que `permissions.allow` y `additionalDirectories` comprometidos en el repositorio sean honrados. Establezca `false` para descartar concesiones de permisos comprometidas en el repositorio y configure reglas de permiso en la `settings.json` de la configuración del host en su lugar; la configuración `sandbox.*` comprometida en el repositorio aún se aplica de cualquier forma, que es por qué el [guard de configuración de repositorio](/docs/es/self-hosted-environments-deploy#harden-your-deployment) los escanea independientemente de este flag. |

58| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Clone a través del [proxy de git de Anthropic](/docs/es/self-hosted-environments-deploy#use-the-anthropic-git-proxy) en lugar de autenticación de git administrada por el cliente. Requiere `--capacity 1` y git 2.32 o más nuevo; el runner se niega a iniciar de otra forma. Supersede los flags de reescritura. |59| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Clona los repositorios de github.com a través del [proxy de git de Anthropic](/docs/es/self-hosted-environments-deploy#use-the-anthropic-git-proxy) en lugar de la autenticación de git administrada por el cliente. Requiere `--capacity 1` y git 2.32 o posterior; de lo contrario, el runner se niega a iniciar. Reemplaza los flags de reescritura. |

59 60 

60La mayoría de los flags de duración tienen un máximo, elegido para mantener cada timeout dentro del techo del temporizador de 32 bits del runtime de aproximadamente 24,85 días. Los flags `--*-min` se limitan a 10080 minutos, 7 días; `--drain-grace-sec` a 604800 segundos, también 7 días; y `--drain-wait-sec` a 86400 segundos, 24 horas. `--session-stop-grace-sec` y `--post-session-hook-timeout-sec` no tienen límite. Exceder un límite se comporta diferente por superficie:61La mayoría de los flags de duración tienen un máximo, elegido para mantener cada timeout dentro del techo del temporizador de 32 bits del runtime de aproximadamente 24,85 días. Los flags `--*-min` se limitan a 10080 minutos, 7 días; `--drain-grace-sec` a 604800 segundos, también 7 días; y `--drain-wait-sec` a 86400 segundos, 24 horas. `--session-stop-grace-sec` y `--post-session-hook-timeout-sec` no tienen límite. Exceder un límite se comporta diferente por superficie:

61 62 

62* **Flag**: el inicio falla con un error.63* **Flag**: el inicio falla con un error.

63* **Variable de entorno**: el runner fija el valor al techo del temporizador en lugar de rechazarlo.64* **Variable de entorno**: el runner fija el valor al techo del temporizador en lugar de rechazarlo.

64 65 

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

67 Listas de reglas del modo automático

68</h3>

69 

70`--server-auto-mode-lists` te permite decidir qué reglas del clasificador del [modo automático](/docs/es/permission-modes#eliminate-prompts-with-auto-mode) procedentes de fuera del runner llegan a las sesiones de tus runners. El plano de control de Anthropic puede enviar listas de reglas con una sesión y pedir al runner que las aplique. Algunas entradas pueden ser reglas que escribió un administrador de tu organización. Las listas son `environment`, `soft_deny` y `allow`:

71 

72* **`environment`**: una entrada puede hacer que el clasificador permita más, así como menos.

73* **`soft_deny`**: una entrada bloquea una acción a menos que el usuario la haya pedido explícitamente o se aplique una excepción de `allow`.

74* **`allow`**: las excepciones a las entradas de `soft_deny`.

75 

76El valor del flag elige qué listas aplica el runner:

77 

78* **`no-allow`**: el valor predeterminado. Aplica `environment` y `soft_deny` y retiene `allow`. Una entrada de `environment` todavía puede hacer que el clasificador permita más, así que el valor predeterminado no descarta toda relajación.

79* **`all`**: aplica las tres listas.

80* **`none`**: no aplica ninguna de ellas. Elige `none` para descartar toda relajación proveniente de estas listas. También elimina las restricciones de `soft_deny`.

81 

82Ningún ajuste del runner hace que el plano de control le pida al runner que aplique las listas. Cuando no se lo pide, las sesiones no reciben ninguna lista, sin importar lo que establezcas. Para ver qué ocurrió, inicia el runner con `--log-level debug`. Para cada sesión, el runner registra entonces una línea que contiene `the server asked this runner to apply`, o una que contiene `the server did not ask this runner to apply the auto mode lists it sends`.

83 

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

66 Banderas de CLI del Orchestrator85 Banderas de CLI del Orchestrator

67</h2>86</h2>


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

73| `--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. |92| `--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. |

74| `--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. |93| `--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. |

75| `--expected-spawn-seconds <sec>` | `120` | Tiempo de arranque esperado p99 para runners generados, en el rango aplicado por el servidor 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. |94| `--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. |

76| `--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. |95| `--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. |

77| `--debug-dir <path>` | sin establecer | Escribir la orden de trabajo de cada solicitud de generación y stderr del hook en el disco. Solo para depuración; nunca establecer en producción. |96| `--debug-dir <path>` | sin establecer | Escribir la orden de trabajo de cada solicitud de generación y stderr del hook en el disco. Solo para depuración; nunca establecer en producción. |

78 97 


108| `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. |127| `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. |

109| `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. |128| `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. |

110| `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. |129| `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. |

130| `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. |

111| `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. |131| `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. |

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

113| `CLAUDE_CODE_DISABLE_ARTIFACT` | unset | Cuando es `1`, desactive la herramienta Artifact en sesiones independientemente de la configuración de administración de la organización, y elimine el requisito de salida `*.frame.claudeusercontent.com` |133| `CLAUDE_CODE_DISABLE_ARTIFACT` | unset | Cuando es `1`, desactive la herramienta Artifact en sesiones independientemente de la configuración de administración de la organización, y elimine el requisito de salida `*.frame.claudeusercontent.com` |


178| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Fallos acumulativos de PollSpawnHints por tipo: `transport`, `timeout`, `5xx`, `429`, o `4xx`. Las cinco series están presentes desde el inicio del proceso; alerte en `rate(...[5m]) > 0`. |198| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Fallos acumulativos de PollSpawnHints por tipo: `transport`, `timeout`, `5xx`, `429`, o `4xx`. Las cinco series están presentes desde el inicio del proceso; alerte en `rate(...[5m]) > 0`. |

179| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Solicitudes de generación reclamables ahora mismo |199| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Solicitudes de generación reclamables ahora mismo |

180| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Solicitudes de generación en retroceso de reintento después de una falla de hook reintentable |200| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Solicitudes de generación en retroceso de reintento después de una falla de hook reintentable |

181| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Solicitudes de generación bloqueadas hasta que un Owner las reintente desde la pestaña **Activity** del entorno; alerte si es superior a cero |201| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Sesiones bloqueadas para generarse. Cada una permanece bloqueada hasta que un usuario le envía un nuevo mensaje o un Owner la reintenta desde la pestaña **Activity** del entorno. El recuento puede permanecer por encima de cero después de que corrijas la causa. Alerta si es superior a cero. |

182| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Total de sesiones esperando un runner para este entorno. Agregado de todo el entorno, idéntico en cada instancia del orquestador: use `MAX` en lugar de `SUM` entre instancias. |202| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Total de sesiones esperando un runner para este entorno. Agregado de todo el entorno, idéntico en cada instancia del orquestador: use `MAX` en lugar de `SUM` entre instancias. |

183| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Sesiones actualmente asignadas a un runner vivo en este entorno. Agregado de todo el entorno, idéntico en cada instancia del orquestador: use `MAX` en lugar de `SUM` entre instancias. |203| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Sesiones actualmente asignadas a un runner vivo en este entorno. Agregado de todo el entorno, idéntico en cada instancia del orquestador: use `MAX` en lugar de `SUM` entre instancias. |

184| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Resultados acumulativos del hook `spawn-runner`: `ok`, `retryable`, `non_retryable`. Cuenta invocaciones de hook del orquestador, no hijos de sesión que los runners generan: no comparable a `sessions_started_total`, ya que la capacidad superior a uno, grupos cálidos, y runners generados nuevamente para la misma sesión divergen los dos. |204| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Resultados acumulativos del hook `spawn-runner`: `ok`, `retryable`, `non_retryable`. Cuenta invocaciones de hook del orquestador, no hijos de sesión que los runners generan: no comparable a `sessions_started_total`, ya que la capacidad superior a uno, grupos cálidos, y runners generados nuevamente para la misma sesión divergen los dos. |


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

231 251 

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

233# Reglas de alerta de Prometheus de ejemplo para el runner + orquestador253# Example Prometheus alert rules for the Claude Code self-hosted runner

234# autohospedado de Claude Code. Ajuste los umbrales para el tamaño de su flota254# + orchestrator. Tune thresholds for your fleet size and SLOs.

235# y SLOs.

236groups:255groups:

237 - name: claude-code-self-hosted-runner256 - name: claude-code-self-hosted-runner

238 rules:257 rules:


241 for: 2m260 for: 2m

242 labels: {severity: warning}261 labels: {severity: warning}

243 annotations:262 annotations:

244 summary: "Runner {{ $labels.pod }} no ha sondado en >60s"263 summary: "Runner {{ $labels.pod }} has not polled in >60s"

245 - alert: ClaudeRunnerVersionDrift264 - alert: ClaudeRunnerVersionDrift

246 expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1265 expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1

247 for: 30m266 for: 30m

248 labels: {severity: info}267 labels: {severity: info}

249 annotations:268 annotations:

250 summary: "Los runners están ejecutando versiones mixtas"269 summary: "Runners are running mixed versions"

251 - alert: ClaudeRunnerInitErrorsHigh270 - alert: ClaudeRunnerInitErrorsHigh

252 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3271 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3

253 for: 5m272 for: 5m

254 labels: {severity: warning}273 labels: {severity: warning}

255 annotations:274 annotations:

256 summary: "Runner {{ $labels.pod }}: >3 fallos de inicialización de sesión en 10m (hook de checkout / git / token / bloqueo previo a la inicialización)"275 summary: "Runner {{ $labels.pod }}: >3 session init failures in 10m (checkout hook / git / token / pre-init crash)"

257 - alert: ClaudeRunnerPollErrors276 - alert: ClaudeRunnerPollErrors

258 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0277 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0

259 for: 2m278 for: 2m

260 labels: {severity: warning}279 labels: {severity: warning}

261 annotations:280 annotations:

262 summary: "Runner {{ $labels.pod }}: PollWork fallando ({{ $value | humanize }}/s en 5m)"281 summary: "Runner {{ $labels.pod }}: PollWork failing ({{ $value | humanize }}/s over 5m)"

263 - alert: ClaudeRunnerSessionStartHookErrors282 - alert: ClaudeRunnerSessionStartHookErrors

264 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3283 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3

265 for: 5m284 for: 5m

266 labels: {severity: warning}285 labels: {severity: warning}

267 annotations:286 annotations:

268 summary: "Runner {{ $labels.pod }}: >3 fallos de hook SessionStart en 10m"287 summary: "Runner {{ $labels.pod }}: >3 SessionStart hook failures in 10m"

269 288 

270 - name: claude-code-self-hosted-orchestrator289 - name: claude-code-self-hosted-orchestrator

271 rules:290 rules:


274 for: 2m293 for: 2m

275 labels: {severity: critical}294 labels: {severity: critical}

276 annotations:295 annotations:

277 summary: "El orquestador {{ $labels.pod }} no puede alcanzar el plano de control de Anthropic"296 summary: "Orchestrator {{ $labels.pod }} cannot reach the Anthropic control plane"

278 - alert: ClaudeOrchestratorPollStale297 - alert: ClaudeOrchestratorPollStale

279 expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90298 expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90

280 for: 2m299 for: 2m

281 labels: {severity: warning}300 labels: {severity: warning}

282 annotations:301 annotations:

283 summary: "El orquestador {{ $labels.pod }} no ha sondado en >90s (el bucle de sondeo espera en la ejecución del hook)"302 summary: "Orchestrator {{ $labels.pod }} has not polled in >90s (poll loop waits on hook execution)"

284 - alert: ClaudeOrchestratorCircuitBroken303 - alert: ClaudeOrchestratorCircuitBroken

285 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0304 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0

286 for: 1m305 for: 1m

287 labels: {severity: critical}306 labels: {severity: critical}

288 annotations:307 annotations:

289 summary: "{{ $value }} sesiones con circuito abierto — el hook spawn-runner es repetidamente no reintentable; corrija la infraestructura y luego reintente desde la pestaña Activity"308 summary: "Sessions blocked from spawning: {{ $value }}. Read each one's error in the Activity tab, fix the cause, then select Retry"

290 - alert: ClaudeOrchestratorPollErrors309 - alert: ClaudeOrchestratorPollErrors

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

292 for: 2m311 for: 2m

293 labels: {severity: warning}312 labels: {severity: warning}

294 annotations:313 annotations:

295 summary: "Orquestador {{ $labels.pod }}: PollSpawnHints fallando ({{ $value | humanize }}/s en 5m)"314 summary: "Orchestrator {{ $labels.pod }}: PollSpawnHints failing ({{ $value | humanize }}/s over 5m)"

296 - alert: ClaudeOrchestratorSpawnHookFailing315 - alert: ClaudeOrchestratorSpawnHookFailing

297 expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3316 expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3

298 for: 5m317 for: 5m

299 labels: {severity: warning}318 labels: {severity: warning}

300 annotations:319 annotations:

301 summary: "Orquestador {{ $labels.pod }}: >3 fallos de hook spawn-runner en 5m"320 summary: "Orchestrator {{ $labels.pod }}: >3 spawn-runner hook failures in 5m"

302```321```

303 322 

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


321 340 

322Antes de v2.1.260, el runner terminaba cada sesión que alcanzaba su límite `--kill-session-after-min` y la contaba en `sessions_interrupted_total`.341Antes de v2.1.260, el runner terminaba cada sesión que alcanzaba su límite `--kill-session-after-min` y la contaba en `sessions_interrupted_total`.

323 342 

324El `CLAUDE_RUNNER_EXIT_REASON` del hook [`post-session`](/docs/es/self-hosted-environments-configuration#post-session) clasifica traspasos limpios de manera diferente. El hook reporta una liberación, un timeout de inicio, y una desasignación del servidor como `interrupted`, porque el runner detuvo el hijo. Estos contadores registran esos mismos eventos como `completed`, porque el slot fue devuelto limpiamente.343El `CLAUDE_RUNNER_EXIT_REASON` del [hook `post-session`](/docs/es/self-hosted-environments-configuration#post-session) clasifica los traspasos limpios de manera diferente. El hook los reporta como `interrupted`, porque el runner detuvo el hijo: una liberación, un agotamiento del tiempo de espera de inicio, una desasignación del servidor, y un archivado o eliminación que el sondeo notó primero. Estos contadores registran esos mismos eventos como `completed`, porque el slot fue devuelto limpiamente.

325 344 

326Si reconcilia recibos de hook contra `sessions_completed_total` directamente, subestima completaciones. Use el hook para garantías por sesión y los contadores para tasas agregadas.345Si reconcilia recibos de hook contra `sessions_completed_total` directamente, subestima completaciones. Use el hook para garantías por sesión y los contadores para tasas agregadas.

327 346 

Details

87 87 

88Los indicadores de envío `--environment` y `--ref` requieren Claude Code v2.1.224 o posterior en la máquina que ejecuta el script, el mismo piso que el ejecutor en sí. Con el hook en su lugar y un ejecutor iniciado en este host, el script de prueba:88Los indicadores de envío `--environment` y `--ref` requieren Claude Code v2.1.224 o posterior en la máquina que ejecuta el script, el mismo piso que el ejecutor en sí. Con el hook en su lugar y un ejecutor iniciado en este host, el script de prueba:

89 89 

901. Crea una sesión en el entorno de prueba con `claude -p "<prompt>" --environment <environment-id> --output-format json`, ejecutado desde un checkout de git para que la CLI pueda detectar automáticamente el repositorio desde el remoto `origin`. El `--ref <branch>` opcional basa el checkout de la sesión en una ref nombrada en lugar de HEAD local. El comando crea la sesión, imprime una línea de JSON que contiene `session_id` y sale sin esperar la respuesta de Claude.901. Crea una sesión en el entorno de prueba con `claude -p "<prompt>" --environment <environment-id> --output-format json`. Ejecuta el comando desde un checkout de git para que la CLI pueda detectar automáticamente el repositorio desde el remoto `origin`. El `--ref <branch>` opcional basa el checkout de la sesión en una ref nombrada en lugar de HEAD local. El comando sale sin esperar la respuesta de Claude. Lo que imprime le indica a tu script el resultado:

91 * **Sesión creada**: una línea de JSON como `{"ok":true,"session_id":"session_...","title":"...","url":"...","pool_id":"..."}`

92 * **Falló la creación de la sesión**: la línea `{"ok":false,"error":"..."}`, y el comando sale con el estado 1

93 * **Algunos errores anteriores**, como que las sesiones en la nube no estén disponibles para tu organización o que falte el prompt: el error en stderr sin línea de JSON, y el comando sale con el estado 1

912. Espera a que la respuesta aparezca en `$E2E_REPLY_DIR/<session_id>.txt`, escrita por el hook Stop en el ejecutor una vez que el turno se completa.942. Espera a que la respuesta aparezca en `$E2E_REPLY_DIR/<session_id>.txt`, escrita por el hook Stop en el ejecutor una vez que el turno se completa.

923. Envía un seguimiento con `claude -p "<message>" --cloud <session_id> --output-format json` (consulte [Enviar un mensaje de seguimiento a una sesión en ejecución](/docs/es/claude-code-on-the-web#send-follow-ups-from-the-cli)), que publica un evento de usuario en la sesión existente y sale.953. Envía un seguimiento con `claude -p "<message>" --cloud <session_id> --output-format json` (consulte [Enviar un mensaje de seguimiento a una sesión en ejecución](/docs/es/claude-code-on-the-web#send-follow-ups-from-the-cli)), que publica un evento de usuario en la sesión existente y sale.

934. Espera la respuesta del seguimiento de la misma manera que el paso 2.964. Espera la respuesta del seguimiento de la misma manera que el paso 2.


104 Script de ejemplo107 Script de ejemplo

105</h2>108</h2>

106 109 

107El script a continuación ejecuta el bucle completo contra `$CLAUDE_TEST_ENVIRONMENT_ID`, el ID `ccpool_...` de tu entorno de prueba, que se muestra en el diálogo de detalles del entorno en la página de administración o se devuelve por la [llamada create-environment](#create-a-dedicated-test-environment), y afirma una frase centinela en cada respuesta. Ejecútalo desde un checkout de git del repositorio en el que quieres que trabaje la sesión, después de iniciar un ejecutor en este host con el hook de captura instalado y `E2E_REPLY_DIR` exportado. Primero inicia sesión con una cuenta de claude.ai en la máquina que ejecuta el script, como se describe en [Autenticarse desde CI](#authenticate-from-ci). Sin ese inicio de sesión, el primer envío falla con un error como `Unable to get organization UUID for cloud session creation`.110El script de ejemplo se ejecuta en la misma máquina que el ejecutor de pruebas. Antes de ejecutarlo, prepara esa máquina:

111 

112* **Checkout del repositorio**: ejecuta el script desde un checkout de git del repositorio en el que quieres que trabaje la sesión.

113* **Ejecutor**: inicia un ejecutor en este host con el hook de captura instalado y `E2E_REPLY_DIR` exportado.

114* **Inicio de sesión**: inicia sesión con una cuenta de claude.ai en la máquina que ejecuta el script, como se describe en [Autenticarse desde CI](#authenticate-from-ci).

115* **ID del entorno**: establece `CLAUDE_TEST_ENVIRONMENT_ID` en el ID `ccpool_...` de tu entorno de prueba, que se muestra en el diálogo de detalles del entorno en la página de administración o se devuelve por la [llamada create-environment](#create-a-dedicated-test-environment).

116 

117El script a continuación ejecuta el bucle completo contra `$CLAUDE_TEST_ENVIRONMENT_ID` y afirma una frase centinela en cada respuesta.

108 118 

109```bash theme={null}119```bash theme={null}

110#!/usr/bin/env bash120#!/usr/bin/env bash


152TURN1="e2e-probe-$(date +%s)-$$: say exactly 'ok: custom tools are reachable' and nothing else"162TURN1="e2e-probe-$(date +%s)-$$: say exactly 'ok: custom tools are reachable' and nothing else"

153EXPECT1="ok: custom tools are reachable"163EXPECT1="ok: custom tools are reachable"

154create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \164create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \

155 --ref "$TEST_REPO_REF" --output-format json)165 --ref "$TEST_REPO_REF" --output-format json < /dev/null)

156echo "create: $create_json"166echo "create: $create_json"

157SESSION_ID=$(jq -er '.session_id' <<<"$create_json")167SESSION_ID=$(jq -er '.session_id' <<<"$create_json")

158 168 


163# 3. Post a follow-up via the CLI.173# 3. Post a follow-up via the CLI.

164TURN2="e2e-probe-followup-$(date +%s): say exactly 'ok: follow-up delivered' and nothing else"174TURN2="e2e-probe-followup-$(date +%s): say exactly 'ok: follow-up delivered' and nothing else"

165EXPECT2="ok: follow-up delivered"175EXPECT2="ok: follow-up delivered"

166followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json)176followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json < /dev/null)

167echo "followup: $followup_json"177echo "followup: $followup_json"

168jq -e '.ok == true' <<<"$followup_json" >/dev/null178jq -e '.ok == true' <<<"$followup_json" >/dev/null

169 179 

skills.md +1 −1

Details

235 235 

236Si una skill existe solo en `~/.claude/skills/` en tu máquina, Claude Code reporta que la skill no fue encontrada cuando una [rutina](/docs/es/routines) la invoca, porque cada ejecución de rutina comienza como una sesión en la nube nueva. Para hacer una skill personal disponible en estas sesiones:236Si una skill existe solo en `~/.claude/skills/` en tu máquina, Claude Code reporta que la skill no fue encontrada cuando una [rutina](/docs/es/routines) la invoca, porque cada ejecución de rutina comienza como una sesión en la nube nueva. Para hacer una skill personal disponible en estas sesiones:

237 237 

238* Para sesiones de Cowork y en la nube, habilita la skill para tu cuenta claude.ai.238* Para sesiones de Cowork y en la nube, habilita el skill para tu cuenta de claude.ai. [Algunas sesiones en un entorno autoalojado](/docs/es/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) no cargan los skills de tu cuenta.

239* Para sesiones en la nube, puedes en su lugar confirmar la skill en el `.claude/skills/` del repositorio. Los plugins declarados en el `.claude/settings.json` del repositorio y los plugins habilitados solo en tu configuración de usuario [no cargan en sesiones en la nube](/docs/es/cloud-environments#what-carries-over-from-your-setup).239* Para sesiones en la nube, puedes en su lugar confirmar la skill en el `.claude/skills/` del repositorio. Los plugins declarados en el `.claude/settings.json` del repositorio y los plugins habilitados solo en tu configuración de usuario [no cargan en sesiones en la nube](/docs/es/cloud-environments#what-carries-over-from-your-setup).

240 240 

241Las [tareas programadas de escritorio](/docs/es/desktop-scheduled-tasks) se ejecutan localmente en tu máquina, por lo que sí cargan `~/.claude/skills/`.241Las [tareas programadas de escritorio](/docs/es/desktop-scheduled-tasks) se ejecutan localmente en tu máquina, por lo que sí cargan `~/.claude/skills/`.

vs-code.md +1 −1

Details

479 479 

480Claude abre nuevas pestañas para tareas del navegador y comparte el estado de inicio de sesión de tu navegador, por lo que puede acceder a cualquier sitio en el que ya hayas iniciado sesión.480Claude abre nuevas pestañas para tareas del navegador y comparte el estado de inicio de sesión de tu navegador, por lo que puede acceder a cualquier sitio en el que ya hayas iniciado sesión.

481 481 

482Para que cada sesión se conecte a tu navegador al iniciarse, sin escribir `@browser`, consulta [Habilitar Chrome de forma predeterminada](/docs/es/chrome#enable-chrome-by-default). Para saber qué ocurre cuando Claude Code te pide confirmación antes de una acción del navegador en una sesión conectada de esa forma, consulta [Solicitudes de permiso en sesiones de VS Code](/docs/es/chrome#permission-prompts-in-vs-code-sessions).482Para que cada sesión se conecte a tu navegador al iniciarse, sin escribir `@browser`, consulta [Habilitar Chrome de forma predeterminada](/docs/es/chrome#enable-chrome-by-default). Para saber qué ocurre cuando Claude Code te pide confirmación antes de una acción del navegador, consulta [Solicitudes de permiso en sesiones de VS Code](/docs/es/chrome#permission-prompts-in-vs-code-sessions).

483 483 

484Para obtener instrucciones de configuración, la lista completa de capacidades y solución de problemas, consulta [Usar Claude Code con Chrome](/docs/es/chrome).484Para obtener instrucciones de configuración, la lista completa de capacidades y solución de problemas, consulta [Usar Claude Code con Chrome](/docs/es/chrome).

485 485